【发布时间】:2011-11-17 04:44:06
【问题描述】:
我正在制作一个 android 应用程序,它会拍摄正在进行的台球游戏的图像并检测各种球的位置。这张图片是从某人的手机上拍摄的,所以我当然没有一张完美的桌子俯视图。现在我正在使用 houghcircles 来寻找球,它的工作还不错,但它似乎在这里和那里错过了一些球,然后是误报。
我现在最大的问题是,如何减少在表外发现的误报?我使用 ROI 来切掉图像的顶部,因为它主要是浪费空间,但我不能让它变得更小,或者我冒着切掉桌子的一部分的风险,因为它是一个梯形形状。我目前的想法是将用户在拍照时看到的指南覆盖在图像之上,但问题是我不知道他们相机的分辨率是多少,因此覆盖可能会覆盖错误的地方。理想情况下,我想我会想使用 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);
【问题讨论】:
-
嘿vince88。你曾经完成过这个项目吗?你开源代码了吗?我自己也差不多要开始做类似的了。
标签: android opencv computer-vision