python - OpenCV 霍​​夫圆的回溯

标签 python opencv

这里是第二篇文章(我认为) 我得到了一个 回溯(最近一次调用最后一次): 文件“c:\Users\bala006\OneDrive - St John's Anglican College\Desktop\Personal\Torch\lick.py”,第 30 行,位于 圆圈 = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1.2, 100) cv2.error:OpenCV(4.5.1) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-kh7iq4w7\opencv\modules\imgproc\src\hough.cpp:2253:错误:( -215:断言失败) !_image.empty() && _image.type() == CV_8UC1 && (_image.isMat() || _image.isUMat()) 在函数'cv::HoughCircles'

错误。希望一切顺利...谢谢。 我使用 Cascade Trainer 创建了一个级联,并用它来检测乒乓球。

import cv2 as cv
import numpy as np 

camera = cv.VideoCapture(0, cv.CAP_DSHOW)

cascade = cv.CascadeClassifier('cascade.xml')



while(1):
    _,img = camera.read()
    img = cv.flip(img,1)

    hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

    detector = cv.SimpleBlobDetector()

    LowerRegion = np.array([4,142,149],np.uint8)
    upperRegion = np.array([33,255,255],np.uint8)

    redObject = cv.inRange(hsv,LowerRegion,upperRegion)

    kernal = np.ones((1,1),"uint8")

    red = cv.morphologyEx(redObject,cv.MORPH_OPEN,kernal)
    red = cv.dilate(red,kernal,iterations=1)

    res1=cv.bitwise_and(img, img, mask = red)
    
    circles = cv.HoughCircles(img, cv.HOUGH_GRADIENT, 1.2, 100)
    if circles is not None:
        circles = np.round(circles[0, :]).astype("int")

        for (x, y, r) in circles:
            cv.circle(img, (x, y), r, (0, 255, 0), 4)



    cv.imshow("Masking ",res1)
    cv.imshow("please work", img)

    if cv.waitKey(10) & 0xFF == ord('q'):
        camera.release()
        cv.destroyAllWindows()
        break

最佳答案

HoughCircles 不支持彩色图像。

在执行HoughCircles之前,您需要将img转换为灰度:

gray_frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
circles = cv.HoughCircles(gray_frame, cv.HOUGH_GRADIENT, 1.2, 100)

异常消息包含由 OpenCV 代码引发的 C++ 语句(该代码是用 C++ 实现的)。


异常消息看起来像是乱码,但仔细一看就暗示了原因:

(-215:Assertion failed)

表示“断言”(C++) 表达式为 false

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

上述陈述在 3 个术语之间应用了逻辑
如果三者之一为 false,则表达式的计算结果为 false(并且引发 false 和异常):

  • !_image.empty() is false 表示图像为空,但我们知道图像不为空。
  • 如果图像类型不是 CV_8UC1
  • _image.type() == CV_8UC1false
  • (_image.isMat() || _image.isUMat()) 从 Python 执行时不会为 false(忽略它)。

我们可以得出结论:_image.type() == CV_8UC1false


CV_8UC1的含义是什么?

OpenCV 图像类型有命名约定。

  • 8U 每个组件应用 8 位(每个元素为 uint8 类型)。
  • C1 应用 1 颜色 channel 。

对于 BGR 颜色格式的彩色图像,类型为 CV_8UC3(C3 应用 3 颜色 channel )。

您可以验证 img 的类型是否为 uint8 NumPy 数组。
验证 img.dtype 是否为 dtype('uint8') (可能是)...

您可以通过检查 img.shape 来检查颜色 channel 的数量。
您将看到 img.shape(cols, rows, 3)(3 应用 3 个颜色 channel )。
对于灰度图像(一个颜色 channel ),我们需要形状为(列,行)

关于python - OpenCV 霍​​夫圆的回溯,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67155677/

相关文章:

c++ - 在 opencv (c++) 中对所有像素运行方法的最快方法是什么

c++ - RGB 到 HSI 和 HSI 到 RGB 转换

python - 如何在 Codeanywhere 中运行 python?

python - 如何在 VsCode 上解决 Python 3.7 和 OpenCV 4.1.1 中的 "import cv2, ImportError: DLL load failed "?

python - 如何匹配字符串中任意位置的两个字符

python - 我文本中的分隔符是什么

opencv - OpenCV Codebook方法-背景模型

Python Sphinx 包含指令 : ignore the header from included file

python - OpenCV:去除背景噪音并增加信号强度

c++ - 如何使用带有 Code::Blocks 的 OpenCV 2.4.3 编译程序?