我正在製作一個android應用程序,它能夠拍攝正在進行的檯球遊戲的圖像並檢測各種球的位置。圖片是從某人的手機拍攝的,所以當然我沒有桌面的完美俯視圖。現在我正在用houghcircles來找球,而且它做得很好,但它似乎錯過了幾個球,然後就有誤報。用OpenCV檢測檯球
我現在最大的問題是,我該如何減少在表格外發現的誤報?我使用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。你有沒有完成這個項目?你是否開源代碼?我只是自己開始做類似的事情。 – m1ket