问题
So I am trying to draw the convexHull from a contour in python, however when i print the image it is not changing.
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
However, the images that show are the exact same if I did not include the code. I looked online, but cannot seem to find the answer. Here is a sample Image:
回答1:
I used the following code to obtain convex hull for the image given by you:
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()
Since contours are based on the white region in an image, I was able to obtain two types of contours by altering line 5 in the code.
CASE 1 :
I was able to obtain this:
CASE 2 :
Now when I change the fifth line in the code segment, I obtain this: when I invert the binary image ret, thresh = cv2.threshold(img_gray, 127, 255, 1)
This is because in case 1 the contour was found based on this image
Now in case 2 the contour was found based on this image
As you can see, contours are found based on the white region in the binary image.
Hope this helps.
I used THIS LINK for obtaining the code and for reference.
来源:https://stackoverflow.com/questions/41508775/drawing-convexhull-in-opencv2-python