OpenCV:Canny 边缘检测器获取 minEnclosureCircle
Posted
技术标签:
【中文标题】OpenCV:Canny 边缘检测器获取 minEnclosureCircle【英文标题】:OpenCV: Canny edge detector get minEnclosingCircle 【发布时间】:2019-05-13 19:55:04 【问题描述】:我正在使用 Canny 边缘检测器检测白色背景上的对象,并想在其周围绘制一个矩形和一个圆形。我可以获取边界矩形的坐标,但不能获取 OpenCV 函数 minAreaRect
和 minEnclosingCircle
。
import cv2
import numpy as np
img = cv2.imread(image.path, 0)
edges = cv2.Canny(img, 100, 200)
#Bounding Rectangle works
x, y, w, h = cv2.boundingRect(edges)
#This does not work
(x,y),radius = cv2.minEnclosingCircle(edges)
#This also does not work
rect = cv2.minAreaRect(edges)
错误:
Traceback (most recent call last): File "/home/hschneider/workspace/onspiration/website/venv/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3296, in run_code exec(code_obj, self.user_global_ns, self.user_ns) File "<ipython-input-28-f9e34ac01335>", line 1, in <module> cv2.minEnclosingCircle(edges) cv2.error: OpenCV(4.1.0) /io/opencv/modules/imgproc/src/shapedescr.cpp:160: error: (-215:Assertion failed) count >= 0 && (depth == CV_32F || depth == CV_32S) in function 'minEnclosingCircle'
我猜,这是因为 Canny 边缘检测器的结果格式错误,但我不知道如何对其进行转换以使其正常工作。
【问题讨论】:
【参考方案1】:这些函数之间的区别在于boundingRect
作用于图像,而minEnclosingCircle
和minAreaRect
作用于二维点集。要从Canny
的输出中获得一个点集,您可以按照this tutorial 中的建议使用findCountours
:
# im2, contours, hierarchy = cv.findContours(thresh, 1, 2) # OpenCV 3.x
contours, hierarchy = cv.findContours(thresh, 1, 2) # OpenCV 4.x
cnt = contours[0]
rect = cv.minAreaRect(cnt)
(x,y),radius = cv.minEnclosingCircle(cnt)
【讨论】:
我只是想补充一点,提供的cv.findContours
函数调用对 OpenCV 版本 3.x.x 有效。从 OpenCV 4.0.0 开始,改为contours, hierarchy = cv.findContours(...)
,参考the doc。
感谢@Hans,我已将其包含在答案中。以上是关于OpenCV:Canny 边缘检测器获取 minEnclosureCircle的主要内容,如果未能解决你的问题,请参考以下文章
OpenCV | OpenCV实战从入门到精通系列三 --canny边缘检测