我有一些不完美的矩形在图像中,我需要一套坐标为每个矩形在python使用opencv
我尝试过Canny边缘检测和使用的findContours,但它给出的坐标比所需的多,因为矩形没有直线
我读过类似的问题,但我没有得到正确的结果。你能提供解决方案的代码?
原始图像
Canny边缘检测后
如何从Canny Edges中只获取矩形的内边框?由于每个矩形都有双边框,所以它提供了比所需更多的矩形。
image = cv2.imread(OUTPUT_FILE)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = cv2.blur(gray, (5,5))
kernel = np.ones((5, 5), np.uint8)
closing = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, kernel)
edged = cv2.Canny(closing, 30, 200)
cv2.imshow("Canny", edged)
contours, hierarchy = cv2.findContours(edged, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))
for c in contours:
rect = cv2.minAreaRect(c)
box = cv2.boxPoints(rect)
for p in box:
pt = (p[0],p[1])
plt.scatter(p[0],p[1])
plt.show()
1条答案
按热度按时间oyxsuwqo1#
我认为这个问题可以使用findContours来解决(),根据OpenCV的版本,它返回几个值,但其中一个总是contours,这是一个轮廓上所有点的列表。我经常使用的一点建议是计算所有轮廓点的质心。这意味着我将沿着x的所有点相加。坐标对它们求和,并除以此特定轮廓的轮廓列表的长度,并且对y坐标执行相同的操作。
你也可以使用boundingRect()函数,它会给予你边界框左上角的x,y坐标,以及它的宽度和高度。在上面的链接中,你可以找到一个关于这个主题的非常好的教程。我认为这个函数更适合你的问题。
祝你好运!