我有一个图像如下:
我需要找出矩形的数量,每个矩形的中心,并测量平行于矩形的长边通过中心的轴之间的Angular ,并测量从水平方向逆时针方向的Angular 。我发现了图像中矩形的数量。我在找出中心和反射角时感到震惊。通过矩找到中心并没有给我正确的答案。
我的代码:
import cv2
import numpy as np
import sys
img = cv2.imread(str(sys.argv[1]),0)
ret,thresh = cv2.threshold(img,127,255,0)
contours,hierarchy = cv2.findContours(thresh,1,2)
for contour in contours:
area = cv2.contourArea(contour)
if area>100000:
contours.remove(contour)
cnt = contours[0]
epsilon = 0.02*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)
print 'No of rectangles',len(approx)
#finding the centre of the contour
M = cv2.moments(cnt)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
print cx,cy
3条答案
按热度按时间lf5gs5x21#
这就是你如何使用openCV的minAreaRect函数来完成它。它是用C++编写的,但您可能很容易适应,因为几乎只使用了OpenCV函数。
导致了这个图像:
正如您所看到的,Angular 可能不是您想要的(因为它们随机使用较长或较短的线作为参考)。您可以提取矩形的较长边并手动计算Angular 。
如果你选择旋转矩形的长边并计算它的Angular ,它看起来像这样:
给出这个结果,这应该是你正在寻找的!
编辑:看起来操作并没有使用他发布的输入图像,因为参考矩形中心将位于图像之外。
使用此输入(手动重新缩放,但可能仍不是最佳):
我得到了这些结果(蓝点是操作提供的参考矩形中心):
比较参比品与检测结果:
我很想看到真实的的输入图像虽然,也许结果会更好。
cgvd09ve2#
下面是你如何做到这一点:
1.连接的组件标记,以检测每个模式(在您的例子中,矩形)
1.分离不同图像中的图案
1.(可选)如果图案不全是矩形,则使用形状索引来区分它们
1.使用主成分分析(PCA)计算主轴,它会给予你你正在寻找的Angular 。
gorkyyrv3#
approx = cv2.approxPolyDP(cnt,epsilon,True)创建给定闭合轮廓的近似多边形。多边形中的线段具有可变长度,这会导致不正确的矩计算,因为它期望从规则网格中采样点以给予正确的中心。
您的问题有三种解决方案:
1.在调用多边形近似方法之前使用原始轮廓的矩。
1.使用drawContours生成每个闭合轮廓内区域的遮罩,然后使用生成的遮罩的矩来计算中心。
1.沿着闭合多边形的每条线段以单位距离采样点,并使用生成的点集合自行计算矩。这应该给予你相同的中心。