我目前正在使用cv2进行一个项目,以检测图像中的不同形状。事实是,我正在计算机上工作,但一切都很好,但是我不得不切换到另一个(都使用Ubuntu 18.04),现在我遇到了一个错误,我不知道如何调试。
基本上,我现在拥有的代码是:
# filter in the image
bw = np.logical_and(img[:, :, 0] >= 230, img[:, :, 1]
< 20, img[:, :, 2] < 20).astype(np.uint8) * 255
contours = cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
# Some unrelated code and I check that a contour was found!!
contour = contours[0]
(x, y), axis, angle = cv2.fitEllipse(contour)
正如我所说,在执行最后一行代码时,出现以下错误:
OpenCV Error: Assertion failed (n >= 0 && (depth == CV_32F || depth == CV_32S)) in fitEllipse, file /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/shapedescr.cpp, line 353
Exception in Tkinter callback
Traceback (most recent call last):
File "/usr/lib/python3.6/tkinter/__init__.py", line 1705, in __call__
return self.func(*args)
File "/home/robotica/pyrobot/gui/TK.py", line 243, in loadBrain
gui.loadBrain(self)
File "/home/robotica/pyrobot/gui/__init__.py", line 513, in loadBrain
self.engine.loadBrain(f)
File "/home/robotica/pyrobot/engine/__init__.py", line 232, in loadBrain
self.brain = system.loadINIT(file, self)
File "/home/robotica/pyrobot/system/__init__.py", line 110, in loadINIT
retval = newMod.INIT(engine)
File "/home/robotica/src/BrainFinal.py", line 808, in INIT
return BrainFinal('BrainFinal', engine)
File "/home/robotica/pyrobot/brain/__init__.py", line 69, in __init__
self.setup(**kwargs)
File "/home/robotica/src/BrainFinal.py", line 741, in setup
self.shape_model = TrainShape().train()
File "/home/robotica/src/BrainFinal.py", line 83, in train
return KneighboursClassifier().fit(img_raw_list, labels)
File "/home/robotica/src/BrainFinal.py", line 89, in fit
X.append(self.contour2des(img_raw, self.img2contour(img_raw)))
File "/home/robotica/src/BrainFinal.py", line 127, in contour2des
(x, y), axis, angle = cv2.fitEllipse(contour)
cv2.error: /build/opencv-L2vuMj/opencv-3.2.0+dfsg/modules/imgproc/src/shapedescr.cpp:353: error: (-215) n >= 0 && (depth == CV_32F || depth == CV_32S) in function fitEllipse
我正在使用ROS和pyrobot来处理其他内容,但问题不在于此(据我所知)。抱歉,我无法提供更多信息,但我真的迷失了,任何帮助都会很棒!预先感谢。
(如果我看到变量轮廓的值,它是一个包含0和255的矩阵)
我已经看到其他人对同一个问题有疑问,并且基本上所有这些问题都是由findContours()函数返回的值的顺序问题。如果我这样说:
contours, _ = cv2.findContours(bw, cv2.RETR_LIST, cv2.CHAIN_APPROX_NONE)
我得到:
ValueError: too many values to unpack (expected 2)