我在白板上做了一个随机绘图,NAO机器人拍了一张照片并试图重新创建相同的图纸。
我的画作:
NAO的绘图:
此时我想就此得出一些结论,特别是我想从两张图片中提取轮廓并使用OpenCV
函数cv2.matchShapes()
来匹配轮廓。
但是,我为此编写了一个小的Python
代码脚本,它给了我一些错误。这是代码:
import numpy as np
import cv2
#get the pictures from the forlder
original = cv2.imread('eightgon.jpg')
drawn = cv2.imread('eightgon1.jpg')
#make them gray
originalGray = cv2.cvtColor(original, cv2.COLOR_BGR2GRAY)
drawnGray = cv2.cvtColor(drawn, cv2.COLOR_BGR2GRAY)
#apply erosion
kernel = np.ones((2, 2),np.uint8)
originalErosion = cv2.erode(originalGray, kernel, iterations = 1)
drawnErosion = cv2.erode(drawnGray, kernel, iterations = 1)
#retrieve edges with Canny
thresh = 175
originalEdges = cv2.Canny(originalErosion, thresh, thresh*2)
drawnEdges = cv2.Canny(drawnErosion, thresh, thresh*2)
#extract contours
originalContours, Orighierarchy = cv2.findContours(originalEdges, cv2.cv.CV_RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
drawnContours, Drawnhierarchy = cv2.findContours(drawnEdges, cv2.cv.CV_RETR_CCOMP, cv2.CHAIN_APPROX_SIMPLE)
print cv2.matchShapes(drawnContours,originalContours,cv2.cv.CV_CONTOURS_MATCH_I1, 0.0)
当我运行这个简单的代码时,它会返回我的错误:
File "C:/Python27/getResults.py", line 32, in <module>
ret = cv2.matchShapes(drawnContours,originalContours,cv2.cv.CV_CONTOURS_MATCH_I1, 0.0)
TypeError: contour1 is not a numpy array, neither a scalar
由于错误告诉我轮廓应该是数组..我在代码中稍作修改:
cnt1 = np.asarray(drawnContours, np.int0)
cnt2 = np.asarray(originalContours, np.int0)
print cv2.matchShapes(cnt1,cnt2,cv2.cv.CV_CONTOURS_MATCH_I1, 0.0)
在这种情况下,它会返回此错误:ValueError: setting an array element with a sequence.
我做错了什么? 任何帮助都是折旧的!
答案 0 :(得分:3)
我遇到了类似的问题。匹配形状函数采用单个轮廓对,而不是整个轮廓容器对。
cv2.matchShapes(drawnContours[i],originalContours[i]cv2.cv.CV_CONTOURS_MATCH_I1, 0.0)
希望有所帮助。
答案 1 :(得分:2)
此处drawnContours
和originalContours
是图片中包含的轮廓列表。
使用drawnContours[i]
和originalContours[i]
使其代表特定的轮廓,其中i = 0,1,2 ... n-1,n是图像中轮廓的总数。
例如,
print cv2.matchShapes(
drawnContours[0], originalContours[0],
cv2.cv.CV_CONTOURS_MATCH_I1, 0.0)
要获取图像中的轮廓总数,请使用:
n = len(drawnContours) # n is the number of contours
print n
答案 2 :(得分:-1)
检查opencv版本,旧版本应该有不同的matchShapes或findContours API。
因为遗憾的是,一些NAO软件版本附带了一些相当旧的opencv版本。
考虑更新您的NAO软件,或尝试获得一些测试版......