2016-05-12 2 views
3

Как я могу извлечь КАЖДОЕ растение в отдельное изображение с помощью C++? (Моя OpenCV версия 2.4.10)Извлечь обрезанные части изображения на отдельные изображения с помощью OPENCV

enter image description here

Я фильтруют контуры, чтобы соответствовать желаемого размера соотношение ширина/высота номерного знака. (третье изображение - прямоугольники 3)

Теперь мне нужно извлечь все найденные кандидаты в «i» отдельные изображения, которые будут иметь тот же размер, что и «i», поэтому я могу сегментировать символы и использовать алгоритм OCR.

Нужный Выход из этого изображения будет:

Два изображения каждая из которых содержит обрезанное версия (в идеале экстрагируют с некоторой дополнительной добавленной ширина/высота, как показано на рисунке) найденного ограничивающей рамки.

enter image description here

Это сомнительно мне, если мне нужно раздельные изображения или я могу просто работать со всем изображением, содержащим только обрезанные части (и черным фоном, как в показанных изображениях) для того, чтобы символы сегмента.

я обеспечиваю часть моего кода здесь:

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

Для каждого ограничивающего параллелепипеда: 'Mat cropped_image_i (original_image (BBox))', или для глубокой копии: 'Mat cropped_image_i = original_image (BBox) .clone () ' – Miki

+0

Это, кажется, работает прекрасно! Большое спасибо! Единственная проблема заключается в показе изображения, что следующий урожай, похоже, перекрывает последний урожай. Это потому, что я показываю это как это? imshow («культуры», культуры [j]); Протестировано, оно перекрывается только при показе изображения как такового в imshow Я собираюсь добавить ответ. :) – Whatever

ответ

1

Благодаря Miki для предоставления ответа!

обрезанного показано в редактируемой части кода

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 всего несколько строк кода

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


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

Результат (не изменен большей площади еще) показано здесь:

Чтобы увеличить, просто используйте (или аналогичные атрибуты, это требует дополнительных испытаний)

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; 

Увеличенные результаты можно увидеть здесь: enter image description here

Смежные вопросы