使用带有3通道输入的HoughCircles时出错

2024-07-05 09:41:09 发布

您现在位置:Python中文网/ 问答频道 /正文

在检测圆之前,我将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函数时发生错误。我可能做错了什么?在


Tags: inioimagesrcmodulestypeopencvcpp
2条回答

关于解释错误。它来自hough.cpp#L1659

CV_Assert(!_image.empty() && _image.type() == CV_8UC1 && (_image.isMat() || _image.isUMat()));

分解后,必须满足以下所有条件:

  • !_image.empty():输入图像不应为空
  • _image.type() == CV_8UC1:输入图像必须是8U(8位无符号,np.uint8)和{}(单通道)
  • _image.isMat() || _image.isUMat():检查输入是Mat还是{}(在Python中,它必须是一个numpy数组)

关于您的特定错误消息(error: (-215) !_image.empty() && _image.type() == (((0) & ((1 << 3) - 1)) + (((1)-1) << 3)) && (_image.isMat() || _image.isUMat())):

  • 错误代码(-215)来自here:它是通用的CV_StsAssert
  • 然后这些数字:它们代表CV_8UC1。你想知道为什么吗?你应该:)我们开始吧:
    1. CV_8UC1
    2. CV_MAKETYPE(CV_8U,1)::来自^{}
    3. CV_MAKETYPE(0,1)::来自^{}
    4. (CV_MAT_DEPTH(0) + (((1)-1) << CV_CN_SHIFT))::从^{}
    5. (((0) & CV_MAT_DEPTH_MASK) + (((1)-1) << CV_CN_SHIFT))::来自^{}
    6. (((0) & (CV_DEPTH_MAX - 1)) + (((1)-1) << CV_CN_SHIFT))::来自^{}
    7. (((0) & ((1 << CV_CN_SHIFT) - 1)) + (((1)-1) << CV_CN_SHIFT))::来自^{}
    8. (((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)。本文作者评论道:

The HT method of shape analysis uses a constraint equation relating points in a feature space to possible parameter values of the searched for shape. For each feature point, invariably edge points, votes are accumulated for all parameter combinations which satisfy the constraint. [...]

后来,他们写道:

If edge direction information is available, then one way to reduce the storage and computational demands of circle finding is to decompose the problem into two stages [...]

因此,如果你想坚持21小时,你基本上需要边和边方向信息。例如,您可以通过Sobel(例如,dxdy)获得边缘方向信息,并使用这些已经计算的dx和{}来使用Canny来获得边缘。事实上,这就是OpenCV实现所做的。如果导航到^{},则可以看到Sobel+Sobel+Canny操作here。在

那么,怎么了?好吧,这意味着如果你有其他方法(或者你想提出一个新的方法,为什么不呢?)它能够返回更适合您的情况的边和边方向信息(可能颜色在您的情况下有不同的含义),然后您可以用您的方法替换这3行(Sobel+Sobel+Canny),然后重用其余实现(酷,哈?)。如果你有灵感:),你可以看看“A Short History of Color Edge Detection”,然后从那里开始。在

那么,为什么我们需要单通道输入?好吧,基本上是因为我们需要边缘,它们通常被表示为单通道图像。另外,implementation目前只支持单通道边缘和边缘方向信息。然而,这些概念中的大多数可以扩展到多通道输入。我认为,因为没有通用的解决方案(可能这些概念会根据具体情况而改变),而且很少有人会从中受益,所以到目前为止没有人愿意提供任何实现。在

抱歉回答太长了。我知道TL;DR“该方法需要单通道输入”就足够了。我很好奇,想分享一下

您只能对单个通道(灰度)图像调用cv2.HoughCircles(),您的图像有3个通道。在

Documentation。在

相关问题 更多 >