【问题标题】:Track circles in video OpenCV在视频 OpenCV 中跟踪圆圈
【发布时间】:2014-08-20 03:10:32
【问题描述】:
import cv2
import numpy as np

cap = cv2.VideoCapture(0)

while(1):

    # Take each frame
    _, frame = cap.read()
    frame = cv2.medianBlur(frame,5)
    cimg = cv2.cvtColor(frame,cv2.COLOR_GRAY2BGR)

    circles = cv2.HoughCircles(frame,cv2.HOUGH_GRADIENT,1,20,
                                param1=50,param2=30,minRadius=0,maxRadius=0)

    circles = np.uint16(np.around(circles))

    for i in circles[0,:]:
        # draw the outer circle
        cv2.circle(cimg,(i[0],i[1]),i[2],(0,255,0),2)
        # draw the center of the circle
        cv2.circle(cimg,(i[0],i[1]),2,(0,0,255),3)

    cv2.imshow('frame',cimg)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cv2.destroyAllWindows()

我正在尝试查找圈子,但我的代码失败了 OpenCV Error: Assertion failed (scn == 1 && (dcn == 3 || dcn == 4))。知道为什么吗?另外,如何获取圆的坐标?

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    您传递给 cvt Color 的标志应该是 cv2.COLOR_BGR2GRAY 而不是 cv2.COLOR_GRAY2BGR - 您希望转换为灰度以获得单通道图像而不是 RGB 3 通道图像,这就是断言所说的。 (查看docs 以了解您需要什么参数,输入图像显然是8 位、单通道、灰度输入图像。

    其余代码看起来没问题,是您问题第二部分的答案。

    编辑:(在 OP 在传递常量时遇到另一个问题): 更改 cvtColor 常量后,我们有以下代码:

    cimg = cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
    circles = cv2.HoughCircles(cimg,cv2.HOUGH_GRADIENT,1,20,
                                param1=50,param2=30,minRadius=0,maxRadius=0)
    

    这实际上导致了另一个问题:

    AttributeError: 'module' 对象没有属性 'HOUGH_GRADIENT'

    由于我主要使用 C++ 而不是 Python 来使用 OpenCV,因此我以不同的方式解决了它。我试图找到 CV_HOUGH_GRADIENT 常数的等效数字。原来位于opencv\sources\modules\imgproc\include\opencv2\imgproc\types_c.h:

    enum
    {
        CV_HOUGH_STANDARD =0,
        CV_HOUGH_PROBABILISTIC =1,
        CV_HOUGH_MULTI_SCALE =2,
        CV_HOUGH_GRADIENT =3
    };
    

    这就是为什么我们可以使用下面的 sn-p 而不是预定义的常量:

    circles = cv2.HoughCircles(cimg,3,1,20, param1=50,param2=30,minRadius=0,maxRadius=0) 
    

    【讨论】:

    • 嗯,我现在收到OpenCV Error: Bad argument (The source image must be 8-bit, single-channel) in cvHoughCircles,。我试图通过关注stackoverflow.com/questions/22241474/… 来解决它,但失败了..
    • 你为什么不尝试在那里传递 3(字面意思是整数 3)@good_evening。所以调用看起来像 circles = cv2.HoughCircles(frame,3,1,20, param1=50,param2=30,minRadius=0,maxRadius=0)
    • 谢谢,但我仍然收到OpenCV Error: Bad argument (The source image must be 8-bit, single-channel) :(
    • Opss,因为我们传递的参数仍然相同。试试这个: circles = cv2.HoughCircles(cimg,3,1,20, param1=50,param2=30,minRadius=0,maxRadius=0)
    • 谢谢,它有效!但是,窗口中的圆圈太多了,基本上什么都看不到:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-30
    相关资源
    最近更新 更多