使用OpenCV在Android上训练数字识别数据

时间:2015-01-30 13:18:06

标签: java android opencv ocr

我尝试使用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具有相同的列大小,这在这里没有多大意义)。

所以我的问题是:如何从多个图像创建训练数据?

1 个答案:

答案 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);
(...)

我很确定它需要一些改进,但至少现在没有抛出任何错误。