2015-10-28 3 views
0

Я использовал определение canny edge, и я нашел контуры на изображении, которое я пытаюсь обработать. Я хочу найти пять самых больших контуров, а затем посмотреть, есть ли контуры в пяти крупнейших контурах изображения. Возможно ли это? Я новичок в OpenCV.Найти наибольшие контуры OpenCV

+0

Вы хотите найти, если есть контуры _inside_ 5 по величине? – Miki

+0

Да. У меня есть фотография из пяти бутылок, и я хочу посмотреть, есть ли на них этикетки. Самые крупные контуры обозначают каждую бутылку, и если у бутылки есть этикетка, внутри нее есть дополнительные контуры. Надеюсь, это имеет смысл. – Boots2014

+0

Ну, да, это имеет смысл. Можете ли вы показать, что вы пробовали до сих пор? – Miki

ответ

8

Вы можете найти самые крупные контуры N, проверяющие их длину. Вы должны позаботиться о том, чтобы он перешел на findContours для параметра CHAIN_APPROX_NONE, чтобы это нормально работало.

Затем вы можете проверить внутри каждой маски, если есть другие контуры.

Изображение:

enter image description here

N = 5 крупные контуры, с внутренними контурами для каждого из них.

enter image description here

Код:

#include <opencv2\opencv.hpp> 
#include <vector> 
#include <numeric> 
using namespace cv; 
using namespace std; 


int main() 
{ 
    Mat3b img = imread("path_to_image"); 

    Mat1b gray; 
    cvtColor(img, gray, COLOR_BGR2GRAY); 

    Mat1b edges; 
    Canny(gray, edges, 200, 50); 

    vector<vector<Point>> contours; 
    findContours(edges.clone(), contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); 

    vector<int> indices(contours.size()); 
    iota(indices.begin(), indices.end(), 0); 

    sort(indices.begin(), indices.end(), [&contours](int lhs, int rhs) { 
     return contours[lhs].size() > contours[rhs].size(); 
    }); 

    int N = 5; // set number of largest contours 
    N = min(N, int(contours.size())); 

    Mat3b res = img.clone(); 

    // Draw N largest contours 
    for (int i = 0; i < N; ++i) 
    { 
     Scalar color(rand() & 255, rand() & 255, rand() & 255); 
     Vec3b otherColor(color[2], color[0], color[1]); 

     drawContours(res, contours, indices[i], color, CV_FILLED); 

     // Create a mask for the contour 
     Mat1b res_mask(img.rows, img.cols, uchar(0)); 
     drawContours(res_mask, contours, indices[i], Scalar(255), CV_FILLED); 

     // AND with edges 
     res_mask &= edges; 

     // remove larger contours 
     drawContours(res_mask, contours, indices[i], Scalar(0), 2); 

     for (int r = 0; r < img.rows; ++r) 
     { 
      for (int c = 0; c < img.cols; ++c) 
      { 
       if (res_mask(r, c)) 
       { 
        res(r,c) = otherColor; 
       } 
      } 
     } 
    } 

    imshow("Image", img); 
    imshow("N largest contours", res); 
    waitKey(); 

    return 0; 
} 
Смежные вопросы