【发布时间】:2014-02-17 17:14:59
【问题描述】:
我正在尝试创建一个可以自动识别彩票号码的程序。
我已经识别出平局的时刻,将球分开,现在我的问题是我无法识别球上的数字。
这是原图:
这是我找到轮廓后的照片:
现在对于每个轮廓,我尝试确定它是否是一个数字以及它是什么数字。这就是我的应用失败的地方。
*重要的是,球可以有多个角度/灯光可以不同,这都会影响图片的质量。
这是我的 prog 找到的轮廓 img 的示例:
这是我识别号码的代码:
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 数据集的作品。
-
我正在尝试使用 K_nearest,就像我在这里看到的那样:blog.damiles.com/2008/11/basic-ocr-in-opencv。他们说我应该用每个数字的许多样本来“教”prog,但在我的情况下,我应该只给 prog 几个天使的每个数字吗?
标签: java opencv image-processing image-recognition