Hallo,
ich möchte mit meiner Software Zahlen in einem Bild erkennen und ausgeben, dazu verwende ich openCV und KNearest. In searchingData() wird nach Zahlen gesucht. Wurden Zahlen im Bild gefunden, wird ein Bildausschnitt als Matrix an recognize() weitergegeben. Beim Aufruf von model.findNearest(..) bekomme ich folgenden Fehler:
OpenCV Error: Assertion failed (test_samples.type() == CV_32F && test_samples.cols == samples.cols) in cv::ml::BruteForceImpl::findNearest, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\ml\src\knearest.cpp, line 325
Ich vermute, dass die Matrizen nicht zusammenpassen. Dennoch weiß ich nicht wie ich das Problem lösen soll. Wo liegt der Fehler?
ich möchte mit meiner Software Zahlen in einem Bild erkennen und ausgeben, dazu verwende ich openCV und KNearest. In searchingData() wird nach Zahlen gesucht. Wurden Zahlen im Bild gefunden, wird ein Bildausschnitt als Matrix an recognize() weitergegeben. Beim Aufruf von model.findNearest(..) bekomme ich folgenden Fehler:
OpenCV Error: Assertion failed (test_samples.type() == CV_32F && test_samples.cols == samples.cols) in cv::ml::BruteForceImpl::findNearest, file C:\builds\master_PackSlaveAddon-win64-vc12-static\opencv\modules\ml\src\knearest.cpp, line 325
Ich vermute, dass die Matrizen nicht zusammenpassen. Dennoch weiß ich nicht wie ich das Problem lösen soll. Wo liegt der Fehler?
Java:
private KNearest model;
private Mat img;
FindNumbers(Mat m) {
img = m;
learn();
searchingData();
}
private void searchingData() {
Mat img_gray = new Mat();
Mat img_blur = new Mat();
Mat img_thres = new Mat();
Imgproc.cvtColor(img, img_gray, Imgproc.COLOR_BGR2GRAY);
//Imgproc.GaussianBlur(img_gray, img_blur, new Size(5,5), 0);
//Imgproc.adaptiveThreshold(img_blur, img_thres, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 7, 5);
Imgproc.Canny(img_blur, img_thres, 10, 100);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(img_thres, contours, new Mat(), Imgproc.RETR_LIST,Imgproc.CHAIN_APPROX_SIMPLE);
for(int i=0; i< contours.size();i++){
Rect rect = Imgproc.boundingRect(contours.get(i));
if (rect.height < 50 && rect.height > 20){
System.out.println(rect.x +","+rect.y+","+rect.height+","+rect.width);
Mat subImg = new Mat();
Imgproc.resize(img.submat(rect), subImg, new Size(10,10));
//Zahlen im Bild finden und an findNearest weitergeben
recognize(subImg);
//String path = String.format(".../Documents/numbers/%d.png", i);
//Imgcodecs.imwrite(path, subImg);
}
}
}
public void learn() {
Mat sample = new Mat(), training_img = new Mat(), res = new Mat();
for (int i = 1; i < 10; i++) {
String path = String.format("..../Documents/numbers/%03d.png", i);
sample = Imgcodecs.imread(path, Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE);
training_img.push_back(prepareImg(sample));
Mat m = new Mat(new Size(1,1), CvType.CV_32FC1);
m.setTo(new Scalar(i));
res.push_back(m);
}
//Testbilder von Zahlen wurden schon vorbereitet, diese müssen nur noch angelernt werden
model = KNearest.create();
model.train(training_img, Ml.ROW_SAMPLE, res);
}
private Mat prepareImg(Mat img) {
Mat sample = new Mat(), sized = new Mat();
Imgproc.resize(img, sized, new Size(10,10));
sized.reshape(1,1).convertTo(sample, CvType.CV_32FC1);
return sample;
}
public void recognize(Mat getImg) {
Mat results = new Mat();
float result = 0;
result = model.findNearest(prepareImg(getImg), 1, results);
System.out.println(result);
}