我尝试使用OpenCV在Android上进行数字识别。我使用OpenCV的k-Nearest Neighbor(kNN)函数对我发现on this blog的图像进行采样(基本上每个数字.png
+一个多位数的图像用于测试目的)。< / p>
当我尝试创建培训数据时,我遇到了一些问题。到目前为止,这是我的代码:
Mat trainData = new Mat();
Mat img = new Mat();
for (int i = 0; i < 10; i++) {
String path = Environment.getExternalStorageDirectory().toString() + "/Pictures/ocr/" + i + ".png";
img = Highgui.imread(path);
img.convertTo(img, CvType.CV_32FC1);
Mat imgResized = preProcessImage(img);
trainData.push_back(imgResized);
myint[i] = i;
}
trainResponses.put(0,0,myint);
CvKNearest knn = new CvKNearest();
knn.train(trainData, trainResponses);
(preProcessImage(Mat img)
一次返回单个数字的Mat中的裁剪图像。)
我的问题发生在trainData.push_back(imgResized);
,我实际上是在尝试将Mat(imgResized)推送到另一个Mat(trainData)。我有一个错误导致我认为我做了一些非常错误的事情(push_back显然正在等待2个Mats具有相同的列大小,这在这里没有多大意义)。
所以我的问题是:如何从多个图像创建训练数据?
答案 0 :(得分:2)
我终于找到了为什么它不起作用。训练图像必须大小相同。现在它看起来像这样:
(...)
imgResized = preProcessImage(img);
Size dsize = new Size(20,30);
Imgproc.resize(imgResized, imgResized, dsize);
imgResized.convertTo(imgResized, CvType.CV_32FC1);
imgResized = imgResized.reshape(1, 1);
train_samples.push_back(imgResized);
(...)
我很确定它需要一些改进,但至少现在没有抛出任何错误。