我编写了以下程序来实时检测圆圈。但它不起作用。 编译器没有显示任何错误,但问题是程序甚至没有检测到圆圈。我该如何解决? 这是我的代码 使用namespace cv;
int main()
{
VideoCapture cap(0);
namedWindow("main",CV_WINDOW_AUTOSIZE);
namedWindow("blur",CV_WINDOW_AUTOSIZE);
Mat img;
Mat img2;
int c;
float radius;
while(1)
{
cap>>img;
imshow("main",img);
cvtColor(img,img2,CV_BGR2GRAY);
GaussianBlur(img2,img2,Size(9,9),2,2);
imshow("blur",img2);
vector <Vec3f> circles;
HoughCircles(img2,circles,CV_HOUGH_GRADIENT,1,img2.rows/8,200,100,0,0);
for(size_t i=0;i<circles.size();i++)
{
Point center(cvRound(circles[i][0]),cvRound(circles[i][1]));
radius = cvRound(circles[i][2]);
circle(img,center,3,Scalar(0,255,0),-1,8,0);
circle(img,center,radius,Scalar(0,0,255),3,8,0);
}
c = waitKey(33);
if(c==27)
break;
}
destroyAllWindows();
return 0;
}
答案 0 :(得分:0)
我检查了你的程序,似乎你忘了在检测后使用imshow()
将其可视化。您只能在检测之前绘制图像,这样,您就无法看到圆圈(可能这会错误地让您认为没有检测到圆圈),即使它确实检测到了一些圆圈。
尝试添加
imshow("main", img);
在c = waitKey(33);
之前。
如果检测到某些圆圈,您会看到圆圈。
编辑:回答您对实时圈子检测的评论:
以while
循环样式执行此操作将使其适用于视频帧。但是,它是否是实时取决于HoughCircles()
的工作速度以及循环内的其他内容,尽管您为waitKey()
设置了适当的时间。