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