Wie kann ich jedes Bild in separate Bild mit C++ extrahieren? (My OpenCV Version 2.4.10)Extrahieren Sie abgeschnittene Teile des Bildes in separate Bilder mit OPENCV
Ich habe die Konturen gefiltert, um die gewünschte Größe Breite/Höhe-Verhältnis eines Kfz-Kennzeichen zu entsprechen. (drittes Bild - Rechtecke 3)
Jetzt muss ich alle gefundenen Kandidaten in "i" separate Bilder extrahieren, die die gleiche Größe wie der "i" Kandidat haben, damit ich die Zeichen segmentieren und OCR-Algorithmus verwenden kann.
Die gewünschte Ausgabe von diesem Bild wird:
Zwei Bilder jeweils beschnittene Version (idealerweise mit einiger zusätzlichen hinzugefügt Breite/Höhe extrahierte, wie in der Abbildung dargestellt ist) der gefundene Bounding-Box.
Es mir fraglich ist, ob ich separate Bilder benötigen oder kann ich einfach mit dem ganzen Bild nur die abgeschnittenen Teile enthalten, arbeiten (und schwarzen Hintergrund, wie in gezeigt, Bilder) zu segmentieren Zeichen um.
Ich bin Teil meines Codes bietet sich hier:
findContours(crop, contours, hierarchy, CV_RETR_TREE,
CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<Point2f> ContArea(contours.size());
for (int i = 0; i < contours.size(); i++) {
approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true);
boundRect[i] = boundingRect(Mat(contours_poly[i]));
}
// Draw polygonal contour + filled bonding rects
Mat drawing4 = Mat::zeros(src_gray.size(), CV_8UC3);
for (int i = 0; i < contours.size(); i++) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255),
rng.uniform(0, 255));
rectangle(drawing4, boundRect[i].tl(), boundRect[i].br(), color,
CV_FILLED, 1, 0);
}
imshow("Rectangles4", drawing4);
float ratio;
Mat drawing3 = Mat::zeros(crop.size(), CV_8UC3);
// Draw bonding rects
for (int i = 0; i < contours.size(); i++) {
Scalar color = Scalar(0, 255, 0);
double a = contourArea(contours[i]);
ratio = (float) boundRect[i].width/(float) boundRect[i].height;
//check for min, max size of area and its ratios
if ((a > 200 && a < 2600) && ((ratio >= 1.3) && (ratio <= 10))) {
printf("a: %f ratios: %f", a, ratio);
//drawContours(drawing3, contours_poly, (int) i, color, 1, 8,
vector<Vec4i>(), 0, Point());
rectangle(drawing3, boundRect[i].tl(), boundRect[i].br(), color,
CV_FILLED, 1, 0);
}
}
imshow("Rectangles3", drawing3);
Für jeden Begrenzungskasten: 'Mat cropped_image_i (original_image (bbox))', oder für tiefe Kopie: 'Mat cropped_image_i = original_image (bbox) .clone () ' – Miki
Das scheint wunderbar zu funktionieren! Danke vielmals! Das einzige Problem besteht darin, das Bild anzuzeigen, dass die nächste Ernte die letzte Ernte zu überlappen scheint. Liegt es daran, dass ich es so zeige? imshow ("Feldfrüchte", Feldfrüchte [j]); Getestet, es überlappt nur das Bild als solches in imshow Ich werde eine Antwort hinzufügen. :) – Whatever