我正在嘗試創建一個能夠自動識別彩票號碼的程序。OpenCV - 樂透號碼識別
我已經認識到了平局,分球,現在我的問題是我無法識別球上的數字。
這是原來的畫面:
這是我的照片後,我找到了輪廓:
現在對於每個輪廓我試圖確定它的數以及它是多少。這是我的應用失敗的地方。
*重要的是說,球可以在很多角度/照明可以是不同的,這一切都會影響圖片的質量。
這是發現了一個輪廓的img我PROG的例子:
這是我認識的數字代碼:
private void identifyNumber(Mat inFile) {
System.out.println("\nRunning identifyNumber");
System.out.println("-------------------------");
int match_method = Imgproc.TM_SQDIFF;
Mat img = inFile;
Mat bestImage = new Mat(), rotImg;
int bestDegree = 0, bestNumber = 0;
double lowerstFornumber, lowest = 1E30;
String templateNumber;
for (int k=0 ; k<=9; k++) {
lowerstFornumber = 1E30;
for(int i=-90; i<=90; i=i+5){
templateNumber = "C:\\pics\\drawProcessing\\numbers\\" + k + ".png";
Mat templ = Highgui.imread(templateNumber);
rotImg = rotateImage(img, i);
int result_cols = rotImg.cols() - templ.cols() + 1;
int result_rows = rotImg.rows() - templ.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
Imgproc.matchTemplate(rotImg, templ, result, match_method);
MinMaxLocResult mmr = Core.minMaxLoc(result);
Point matchLoc;
if (match_method == Imgproc.TM_SQDIFF || match_method == Imgproc.TM_SQDIFF_NORMED) {
matchLoc = mmr.minLoc;
} else {
matchLoc = mmr.maxLoc;
}
double minValue = mmr.minVal;
// System.out.println(i+",maxVal:" +maxValue);
if(lowerstFornumber > minValue){
lowerstFornumber = minValue;
}
if(lowest > minValue){
lowest = minValue;
bestImage = rotImg;
bestDegree = i;
bestNumber = arr[k];
}
}
System.out.println("lowerstFornumber " + arr[k] + " :" + lowerstFornumber);
}
System.out.println("bestDegree:" + bestDegree);
System.out.println("bestNumber:" + bestNumber);
System.out.println("_lowest:" + lowest);
Highgui.imwrite("C:\\pics\\drawProcessing\\out-best.jpg", bestImage);
}
有時它找到的號碼,有時沒有。 這是可能嗎?(我需要100%的準確性) 我是否錯誤?
我會尋找更多的elabote OCR算法,而不是使用matchTemplate。您可以搜索使用MNIST數據集的作品。 – GilLevi
我嘗試使用K_nearest,因爲我在這裏看到:http://blog.damiles.com/2008/11/basic-ocr-in-opencv/。他們說我應該用每個數字的許多樣品「教」編,但在我的情況下,我應該只給幾個天使的編號每個數字? – susparsy