在检测圆之前,我将red
通道替换为green
通道。更换通道后,我将其通过模糊过滤器,然后进行Hough变换来检测圆。但是当我这样做的时候,我得到了一个糟糕的错误信息:
OpenCV(3.4.1) Error: Assertion failed (!_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() ||
_image.isUMat())) in HoughCircles, file /io/opencv/modules/imgproc/src/hough.cpp, line 1659
Traceback (most recent call last):
File "circle_light.py", line 44, in <module>
param1=param1,param2=param2,minRadius=minRadius,maxRadius=maxRadius)
cv2.error: OpenCV(3.4.1) /io/opencv/modules/imgproc/src/hough.cpp:1659: error: (-215) !_image.empty()
&& _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat()) in function HoughCircles
我无法从中获得任何意义,因此无法理解我可能会做错事。这是我所做的事情的片段。在
^{pr2}$当我调用HoughCircles
函数时发生错误。我可能做错了什么?在
关于解释错误。它来自hough.cpp#L1659:
分解后,必须满足以下所有条件:
!_image.empty()
:输入图像不应为空_image.type() == CV_8UC1
:输入图像必须是8U
(8位无符号,np.uint8
)和{_image.isMat() || _image.isUMat()
:检查输入是Mat
还是{关于您的特定错误消息(
error: (-215) !_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat())
):CV_StsAssert
CV_8UC1
。你想知道为什么吗?你应该:)我们开始吧:CV_8UC1
CV_MAKETYPE(CV_8U,1)
::来自^{CV_MAKETYPE(0,1)
::来自^{(CV_MAT_DEPTH(0) + (((1)-1) << CV_CN_SHIFT))
::从^{(((0) & CV_MAT_DEPTH_MASK) + (((1)-1) << CV_CN_SHIFT))
::来自^{(((0) & (CV_DEPTH_MAX - 1)) + (((1)-1) << CV_CN_SHIFT))
::来自^{(((0) & ((1 << CV_CN_SHIFT) - 1)) + (((1)-1) << CV_CN_SHIFT))
::来自^{(((0) & ((1 << 3) - 1)) + (((1)-1) << 3))
::来自^{我将尝试补充@Mark Setchell的答案,仅仅因为我很好奇,我想分享:)
如果您查看文档,^{} 是imgproc模块的一部分(位于Feature Detection“子模块”)下。文档说唯一实现的方法是HOUGH_GRADIENT(又名21HT,即两阶段Hough变换),他们指出参考文献“Comparative study of Hough Transform methods for circle finding”(1990):)。如果由于付费墙而无法访问,则可以访问1989's version for free)。本文作者评论道:
后来,他们写道:
因此,如果你想坚持21小时,你基本上需要边和边方向信息。例如,您可以通过}来使用} ,则可以看到Sobel+Sobel+Canny操作here。在
Sobel
(例如,dx
和dy
)获得边缘方向信息,并使用这些已经计算的dx
和{Canny
来获得边缘。事实上,这就是OpenCV实现所做的。如果导航到^{那么,怎么了?好吧,这意味着如果你有其他方法(或者你想提出一个新的方法,为什么不呢?)它能够返回更适合您的情况的边和边方向信息(可能颜色在您的情况下有不同的含义),然后您可以用您的方法替换这3行(Sobel+Sobel+Canny),然后重用其余实现(酷,哈?)。如果你有灵感:),你可以看看“A Short History of Color Edge Detection”,然后从那里开始。在
那么,为什么我们需要单通道输入?好吧,基本上是因为我们需要边缘,它们通常被表示为单通道图像。另外,implementation目前只支持单通道边缘和边缘方向信息。然而,这些概念中的大多数可以扩展到多通道输入。我认为,因为没有通用的解决方案(可能这些概念会根据具体情况而改变),而且很少有人会从中受益,所以到目前为止没有人愿意提供任何实现。在
抱歉回答太长了。我知道TL;DR“该方法需要单通道输入”就足够了。我很好奇,想分享一下
您只能对单个通道(灰度)图像调用
cv2.HoughCircles()
,您的图像有3个通道。在Documentation。在
相关问题 更多 >
编程相关推荐