编程语言
首页 > 编程语言> > python-在3通道输入中使用HoughCircles时出错

python-在3通道输入中使用HoughCircles时出错

作者:互联网

在检测圈子之前,我将红色通道替换为绿色通道.替换通道后,我将其通过模糊滤镜,然后进行霍夫变换以检测圆.但是当我这样做时,我得到了一个糟糕的错误消息:

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

我对此一无所知,因此无法理解我可能做错了什么.这是我所做的片段.

import cv2

img = cv2.imread("images/{}".format("img.png"), 1)

b,g,r = cv2.split(img)
img = cv2.merge([b,g,g])
img = cv2.GaussianBlur(img,(5,5),0)

minDist = 11
param1 = 20
param2 = 20
minRadius = 10
maxRadius = 20

circles = cv2.HoughCircles(
    img, cv2.HOUGH_GRADIENT, 1, minDist,
    param1=param1, param2=param2, minRadius=minRadius, maxRadius=maxRadius
)

当我调用HoughCircles函数时发生错误.我可能做错了什么?

解决方法:

关于解释错误.它来自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)和C1(单通道);
> _image.isMat()|| _image.isUMat():检查输入是Mat还是UMat(在Python中,它必须是一个numpy数组);

关于您的特定错误消息(错误:(-215)!_image.empty()& _image.type()==(((0)&(((1<< 3)-1)))( ((1)-1)<< 3))&&((_image.isMat()|| _image.isUMat())):
>错误代码(-215)来自here:它是通用CV_StsAssert;
>然后这些数字:它们代表CV_8UC1.您想知道为什么吗?您应该:)我们开始:

> CV_8UC1
> CV_MAKETYPE(CV_8U,1)::从#define CV_8UC1 CV_MAKETYPE(CV_8U,1)
> CV_MAKETYPE(0,1)::从#define CV_8U 0
>(CV_MAT_DEPTH(0)((((1)-1)<< CV_CN_SHIFT)))::从#define CV_MAKETYPE(depth,cn) (CV_MAT_DEPTH(depth) + (((cn)-1) << CV_CN_SHIFT))
>((((0)& CV_MAT_DEPTH_MASK)((((1)-1)<< CV_CN_SHIFT)))::从#define CV_MAT_DEPTH(flags) ((flags) & CV_MAT_DEPTH_MASK)开始
>((((0)&(CV_DEPTH_MAX-1))((((1)-1)<< CV_CN_SHIFT)))::从#define CV_MAT_DEPTH_MASK (CV_DEPTH_MAX - 1)开始
>((((0)&((1< CV_CN_SHIFT)-1))((((1)-1)<< CV_CN_SHIFT))::从#define CV_DEPTH_MAX (1 << CV_CN_SHIFT)开始
>((((0)&((1<< 3)-1))((((1)-1)<< 3))::从#define CV_CN_SHIFT 3

我会尝试补充@Mark Setchell的答案,只是因为我很好奇并且想分享一下:)

如果您查看文档,则cv2.HoughCircle()imgproc模块的一部分(在Feature Detection“子模块”下).该文档说,唯一实现的方法是HOUGH_GRADIENT(又名21HT,即两阶段霍夫变换),它们指出了参考文件“ 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 […]

因此,如果要坚持使用21HT,则基本上需要边缘和边缘方向信息.例如,您可以通过Sobel获取边缘方向信息(例如dx和dy),然后使用这些已经计算出的dx和dy通过Canny获取边缘.实际上,这就是OpenCV实现的功能.如果导航到modules/imgproc/src/hough.cpp,则可以看到Sobel Sobel Canny操作here.

所以呢?好吧,这意味着如果您有另一种方法(或者您想提出一种新方法,为什么不呢?),则该方法能够返回更适合您的情况的边缘和边缘方向信息(也许颜色在其中具有不同的含义).然后使用您的方法替换这三行代码(Sobel Sobel Canny),然后重复使用其余的实现(很酷,对吧?).如果您觉得自己受启发了:),则可以看看“ A Short History of Color Edge Detection”,然后从那里开始.

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

很抱歉,答案很长.我知道TL; DR“该方法需要单通道输入”就足够了.我很好奇,想分享=]

标签:hough-transform,opencv,image-processing,computer-vision,python
来源: https://codeday.me/bug/20191024/1923406.html