使用 OpenCV 在 Android 上进行数字识别的训练数据
Training data for digit recognition on Android with OpenCV
我正在尝试使用 OpenCV 在 Android 上进行数字识别。我在我发现 on this blog 的样本图像上使用 OpenCV 的 k-最近邻 (kNN) 函数(基本上每个数字一个 .png
+ 一个具有多个数字的图像用于测试目的)。
我在尝试创建训练数据时遇到了一些问题 运行。到目前为止,这是我的代码:
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)
returns Mat 中一次裁剪一个数字的图像。)
我的问题出现在 trainData.push_back(imgResized);
,我实际上是在尝试将一个 Mat (imgResized) 推入另一个 Mat (trainData)。我有一个错误让我认为我做错了一些事情(push_back 显然是在等待 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);
(...)
我很确定它需要一些改进,但至少现在没有抛出任何错误。
我正在尝试使用 OpenCV 在 Android 上进行数字识别。我在我发现 on this blog 的样本图像上使用 OpenCV 的 k-最近邻 (kNN) 函数(基本上每个数字一个 .png
+ 一个具有多个数字的图像用于测试目的)。
我在尝试创建训练数据时遇到了一些问题 运行。到目前为止,这是我的代码:
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)
returns Mat 中一次裁剪一个数字的图像。)
我的问题出现在 trainData.push_back(imgResized);
,我实际上是在尝试将一个 Mat (imgResized) 推入另一个 Mat (trainData)。我有一个错误让我认为我做错了一些事情(push_back 显然是在等待 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);
(...)
我很确定它需要一些改进,但至少现在没有抛出任何错误。