我试图区分矩形,梯形和半圆形。所以我所做的是围绕形状绘制轮廓,然后绘制旋转的矩形。之后,我找到轮廓区域和旋转矩形区域并取其比例。使用该比率,我将确定形状,因为它对于前面提到的三种形状是不同的。
(如果有人有更强大的方法来区分这三者,我们将不胜感激。)
来到这个问题。我无法在图像周围绘制合适的轮廓。 以下是输入和输出图像:
这是我的代码
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()
提前致谢。
答案 0 :(得分:0)
我已使用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)
<强>结果:强>