在openCV2 Python中绘制convexHull
Posted
技术标签:
【中文标题】在openCV2 Python中绘制convexHull【英文标题】:Drawing convexHull in openCV2 Python 【发布时间】:2017-05-21 09:32:40 【问题描述】:所以我试图从 python 中的轮廓绘制凸包,但是当我打印图像时它没有改变。
roi=mask[y:y+h,x:x+w]
roi = cv2.fastNlMeansDenoisingColored(roi,None,15,15,7,21)
hull = cv2.convexHull(cnt)
cv2.drawContours(roi,[hull],0,(147,0,255),2)
cv2.imshow(str(i),roi)
blank_image[y:y+h,x:x+w] = roi
但是,如果我不包含代码,则显示的图像完全相同。我在网上看了,但似乎找不到答案。 这是一个示例图片:
【问题讨论】:
有人知道吗?仍然找不到修复程序。 你能上传你正在使用的图片吗? @JeruLuke 这是很多图像,每个图像都被阈值化了。我正在创建一个 OCR 平台,因此每个 ROI 都是不同的角色。 @JeruLuke 我刚刚添加了一个示例图像。这就是它通常的样子;但是字符周围的空白被扩大了一点。 【参考方案1】:我使用以下代码为您提供的图像获取凸包:
import cv2
import numpy as np
img = cv2.imread('2.png')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 127, 255, 0)
contours,hierarchy = cv2.findContours(thresh,2,1)
print len(contours)
cnt = contours[0]
hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(img,start,end,[0,255,0],2)
cv2.circle(img,far,5,[0,0,255],-1)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
由于轮廓是基于图像中的白色区域,我可以通过更改 line 5 获得两种 轮廓代码。
案例 1:
我能够得到这个:
案例 2:
现在,当我更改代码段中的 fifth 行时,我得到: 当我反转二进制图像时ret, thresh = cv2.threshold(img_gray, 127, 255, 1)
这是因为在案例1中,轮廓是根据这张图片找到的
现在在案例2中,轮廓是根据这张图片找到的
如您所见,轮廓是根据二值图像中的白色区域找到的。
希望这会有所帮助。
我使用THIS LINK获取代码和参考。
【讨论】:
很高兴我能帮上忙。请记住,正如我之前所说,第 5 行可以决定您要寻找的轮廓。以上是关于在openCV2 Python中绘制convexHull的主要内容,如果未能解决你的问题,请参考以下文章