简体   繁体   中英

Unable to get a Proper contour

I was trying to differentiate between a rectangle, trapezium and a semicircle. So what I did was drew a contour around the shape and then a rotated rectangle. After that, I find the area of the contour and of the rotated rectangle and take their ratio. Using this ratio I'll determine the shape as it'll be different for the three shapes mentioned previously.

(It'll be appreciated if anyone has a more robust method to differentiate between these three.)

Coming to the problem. I'm unable to draw a proper contour around the image. Here are the input and the output image:

输入图像

输出图像

Here's my code

import cv2
import numpy as np

img = cv2.imread('h4.JPG')
cv2.imshow('Input',img)
#img = cv2.resize(img, None, fx=0.2,fy=0.2)
img = cv2.GaussianBlur(img, (11,11), 0)
img = cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21)
im = img.copy()

imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,0,255,cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

max = 0

for c in contours:
    area = cv2.contourArea(c)
    print area
    if(np.any(max <= area)):
        max = c


A, B, C = cv2.minAreaRect(c)
rotrect = cv2.minAreaRect(c)
box = cv2.cv.BoxPoints(rotrect)
box = np.int0(box)
cv2.drawContours(im, contours, 0, (0,255,0), 2)
cv2.drawContours(im, [box], 0, (0,0,255), 2)

areaS = cv2.contourArea(contours[0])
areaR = B[0]*B[1]

Ratio = areaS/areaR

print "Shape Area: ",areaS
print "Shape Rect: ",areaR
print "Ratio: ",Ratio

cv2.imshow('Output',im)

if cv2.waitKey() and 0xff == 27:
    cv2.destroyAllWindows()

Thanks in advance.

I have posted the code with the solution provided by Miki in the comments' section.

CODE:

im = cv2.imread('Figure.jpg', 1)
gray_img = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
im1 = im.copy()                       #---copy of the original image----

ret, thresh = cv2.threshold(gray_img, 127, 255, 0)   
blur_img = cv2.GaussianBlur(thresh, (11,11), 0)

#---Finding and drawing contours---
_, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(im1, contours, -1, (0, 255, 0), 3)

#----Drawing a rotated rectangle----
cnt = contours
rect = cv2.minAreaRect(cnt[0])  #---I used cnt[0] since there is only one contour, if there are more you can assign this within a for loop----
box = cv2.boxPoints(rect)
box = np.int0(box)
im = cv2.drawContours(im1, [box], 0, (0,0,255), 2)

cv2.imshow("Final_Image.jpg", im1)

RESULT:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM