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.