在视频OpenCV中跟踪圈子

时间:2014-08-19 17:58:42

标签: python opencv

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))。知道为什么吗?另外,如何获得圆的坐标?

1 个答案:

答案 0 :(得分:0)

你传递给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'

由于我使用的是OpenCV,主要使用的是C ++而不是Python,因此我以不同的方式解决了这个问题。我试图找到相当于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
};

这就是为什么我们可以使用以下代码段而不是预定义的常量:

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