首页 > 解决方案 > 为什么我不能在 python 函数中使用 HoughCircles?

问题描述

不知道我做错了什么,但我不能让 HoughCircles 在函数内部运行......

import cv2
import numpy as np

def test(image):
    circles = cv2.HoughCircles(image, cv2.HOUGH_GRADIENT, 4, 70, minRadius=70, maxRadius=74)
    if circles is not None:
        circles = np.uint16(np.around(circles))
    for x, y, r in circles:
        cv2.circle(image, (x, y), r, [0, 0, 255], 2)
    return image
img = cv2.imread('initial_frame.png')
image2 = test(img)

cv2.imshow('test', image2)
cv2.waitKey(0)
cv2.destroyAllWindows()

这导致...

circles = cv2.HoughCircles(image, cv2.HOUGH_GRADIENT, 4, 70, minRadius=70, maxRadius=74)
cv2.error: OpenCV(4.5.3) C:\Users\runneradmin\AppData\Local\Temp\pip-req-build-1i5nllza\opencv\modules\imgproc\src\hough.cpp:2253: error: (-215:Assertion failed) !_image.empty() && _image.type() == CV_8UC1 && (_image.isMat() || _image.isUMat()) in function 'cv::HoughCircles'

如果我删除对 的调用HoughCirclesimage2则按要求显示。

标签: python-3.xopencv

解决方案


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

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

分解它,以下所有条件都必须为真:

  • !_image.empty():输入图像不应为空;
  • _image.type() == CV_8UC1: 输入图像必须是8U(8-bit unsigned, np.uint8) 和C1(single-channel);
  • _image.isMat() || _image.isUMat():检查输入是否为MatUMat(在 Python 中,它必须是一个 numpy 数组);

影响您的问题是您只能调用cv2.HoughCircles()单通道(灰度)图像,您的图像有 3 个通道。将图像转换为灰度,然后重试。


推荐阅读