2016-05-12 9 views
3

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

enter image description here

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.

enter image description here

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); 
+0

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

+0

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

Antwort

1

Dank Miki für die Antwort zu geben! nur einige Zeilen Code

//outside the loop 
    int j=0; 
      Mat crops[10]; 


//inside the loop  
    Mat cropx(src_resized(boundRect[i])); 
        crops[j]=cropx; 
     j++; 

Das Ergebnis (nicht zu größeren Bereich noch verkleinert) wird gezeigt, hier

Das Zuschneiden im bearbeiteten Teil des Codes

float ratio; 
    int j=0; 
    Mat crops[10]; 
    Mat drawing3 = Mat::zeros(crop.size(), CV_8UC3); 

    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; 
        if ((a > 200 && a < 2600)&&((ratio>=1.3)&&(ratio<=10))){ 
      printf(" a: %f ratios: %f image%d",a,ratio,i); 

      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); 

      Mat cropx(src_resized(boundRect[i])); 
      crops[j]=cropx; 

      imshow("crops",crops[0]); 
      if (j==1) imshow("crops1",crops[1]); 
      j++; 
      waitKey(0); 

     } 
    } 
     imshow("Rectangles3", drawing3); 

basicaly gezeigt: verwenden Crops

zu vergrößern, nur (oder ähnliche Attribute, muss diese mehr Tests)

boundRect[i].x=boundRect[i].x -boundRect[i].width/4; 
boundRect[i].y=boundRect[i].y -boundRect[i].height/4; 
boundRect[i].width=boundRect[i].width +boundRect[i].width/2; 
boundRect[i].height=boundRect[i].height +boundRect[i].height/2; 

Vergrößerte Ergebnisse hier zu sehen ist: enter image description here

Verwandte Themen