我想找到一个图像的轮廓然后画出它的凸包。我正在做的是加载图像,阈值,找到它的轮廓,然后绘制凸包。
gray = cv2.imread(test_paths[i], 0)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
检测到的轮廓数等于1。 当我尝试绘制轮廓时,问题就出现了,如果我这样做的话
cv2.drawContours(cnt_dst, cnt, -1, (255, 0, 0), 3)
plt.imshow(cnt_dst)
如果我将代码更改为以下内容:
cv2.drawContours(cnt_dst, contours, 0, (255, 0, 0), 3)
plt.imshow(cnt_dst)
轮廓不同:
请注意,我得到的结果相同(不错):
cv2.drawContours(cnt_dst, contours, -1, (255, 0, 0), 3)
有关为何发生这种情况的任何想法?
答案 0 :(得分:5)
cv2.drawContours(cnt_dst, contours, 0, (255, 0, 0), 3)
或cv2.drawContours(cnt_dst, contours, -1, (255, 0, 0), 3)
是相同的
-1
告诉opencv绘制所有轮廓数组的轮廓,0
告诉它绘制轮廓数组的第一个轮廓。
由于只有一个轮廓,结果是相同的。
另一个电话cv2.drawContours(cnt_dst, cnt, -1, (255, 0, 0), 3)
可能是伪造的/应该在opencv方面进行更好的检查。
在this blog中表示:
现在你要绘制" cnt"只要。它可以如下完成:
cv2.drawContours(1M,[CNT],0,(255,0,0), - 1) 注意" cnt"周围的方括号。第三个参数设置为0,表示仅绘制特定轮廓。