Search code examples
pythonopencvimage-processingocrcontour

Drawing convexHull in OpenCV Python


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:Sample Image


Solution

  • 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: enter image description here

    CASE 2 : Now when I change the fifth line in the code segment, I obtain this: enter image description here 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 enter image description here

    Now in case 2 the contour was found based on this image enter image description here

    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.