繁体   English   中英

追溯 OpenCV 霍夫圆

[英]Traceback on OpenCV Hough Circles

2nd post here (I think) I got an Traceback (last recent call last): File "c:\Users\bala006\OneDrive - St John's Anglican College\Desktop\Personal\Torch\lick.py", line 30, in circles = 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:Assertion failed)._image.empty() && _image.type() == CV_8UC1 && (_image.isMat() || _image:isUMat() ) 在 function '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:断言失败)

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

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

上述语句适用于逻辑之间的 3 个术语。
如果三者之一是false ,则表达式被评估为false (并且false引发和异常):

  • ._image.empty()false表示图像为空,但我们知道图像不为空。
  • _image.type() == CV_8UC1在图像类型不是CV_8UC1的情况下为false
  • (_image.isMat() || _image.isUMat())从 Python 执行时不会为false (忽略它)。

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


CV_8UC1是什么意思?

OpenCV 图像类型具有命名约定。

  • 8U每个组件应用 8 位(每个元素都是uint8类型)。
  • C1应用1颜色通道。

对于 BGR 颜色格式的彩色图像,类型为CV_8UC3C3应用3颜色通道)。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM