简体   繁体   English

无法获得正确的轮廓

[英]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. 我已经在评论部分中发布了代码以及Miki提供的解决方案。

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: 结果:

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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