我正在制作一个Android应用程序,它正在拍摄正在进行的台球游戏的图像,并检测各种球的位置。图像来自某人的手机,所以我当然没有完美的桌面俯视图。现在我正在使用houghcircles找到球,并且它做得很好,但它似乎在这里和那里错过了几个球,然后有误报。
我现在最大的问题是,如何减少在牌桌外发现的误报?我正在使用投资回报率来切断图像的顶部,因为它主要是浪费空间,但是我不能让它变得更小或者我冒着切掉桌子部分的风险,因为它是一个梯形形状。我目前的想法是覆盖用户在拍摄图像顶部时看到的指南,但问题是我不知道他们的相机的分辨率是多少,因此叠加可能会覆盖错误的地方。理想情况下,我想我会想要使用houghlines但是当我尝试它时,我的应用程序因我认为缺乏记忆而崩溃。有什么想法吗?
以下是我收到的结果的链接:
http://graphiquest.com/cvhoughcircles.html
这是我的代码:
IplImage img = cvLoadImage("/sdcard/DCIM/test/picture"+i+".jpg",1);
IplImage gray = opencv_core.cvCreateImage( opencv_core.cvSize( img.width(), img.height() ), opencv_core.IPL_DEPTH_8U, 1);
cvCvtColor(img, gray, opencv_imgproc.CV_RGB2GRAY );
cvSetImageROI(gray, cvRect(0, (int)(img.height()*.15), (int)img.width(), (int)(img.height()-(img.height()*.20))));
cvSmooth(gray,gray,opencv_imgproc.CV_GAUSSIAN,9,9,2,2);
Pointer circles = CvMemStorage.create();
CvSeq seq = cvHoughCircles(gray, circles, CV_HOUGH_GRADIENT, 2.5d, (double)gray.height()/30, 70d, 100d, 0, 80);
for(int j=0; j<seq.total(); j++){
CvPoint3D32f point = new CvPoint3D32f(cvGetSeqElem(seq, j));
float xyr[] = {point.x(),point.y(),point.z()};
CvPoint center = new CvPoint(Math.round(xyr[0]), Math.round(xyr[1]));
int radius = Math.round(xyr[2]);
cvCircle(gray, center, 3, CvScalar.GREEN, -1, 8, 0);
cvCircle(gray, center, radius, CvScalar.BLUE, 3, 8, 0);
}
String path = "/sdcard/DCIM/test/";
File photo=new File(path, "picture"+i+"_2.jpg");
if (photo.exists())
{
photo.delete();
}
cvSaveImage("/sdcard/DCIM/test/picture"+i+"_2.jpg", gray);
答案 0 :(得分:4)
您可以应用一些非常有用的约束。除了做一个感兴趣的矩形区域,你应该用池桌的实际梯形形状掩盖你的结果。使用图像的颜色信息查找池表区域。您知道台球桌是纯色。它不必是绿色的 - 你可以在HSV色彩空间中使用一些histogram技术来找到图像中最流行的颜色,也许有利于像素朝向中心。它很可能检测到台球桌的颜色。选择与此颜色匹配的像素,执行形态学操作以消除噪声,然后您可以将蒙版视为轮廓,并找到其convexHull。填充船体以移除池球产生的孔。
到目前为止我所说的应该提出一种与霍夫圈不同的方法。由于台球没有均匀照明,霍夫圈可能效果不佳。因此,找到台球的另一种方法是从其convexHull中减去池表颜色掩码。你会留下桌子上被球遮挡的区域。
答案 1 :(得分:0)
我也在考虑解决这个问题,因为我玩游泳池和斯诺克。
几点:
修改强> 我正在阅读另一篇StackOverflow帖子并阅读本文。这篇论文将为您提供更加全面的介绍我建议过滤边缘点的技术(第8项)。
Rad,Faez和Qaragozlou的“使用梯度对矢量进行快速圆检测” http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.121.9956
我自己还没有实现过他们的算法,但看起来很有希望。这是提到论文的帖子: