2013-07-23 1 views
-2

Je veux obtenir tous les vecteurs de points dans une matrice comme:de std :: vector <std :: vector <cv::Point>> pour cv :: Mat

std::vector<std::vector<cv::Point>> vec; 
...................... 
for (int i ; i < vec.size();i++){ 
    imshow("stuff", cv::Mat(vec[i]); /// this crashes !!! 
} 

toute idée comment faire? merci d'avance

+0

S'il vous plaît copier coller soigneusement! La parenthèse après imshow n'est pas fermée! – hivert

+0

Peut-être qu'il y a quelque chose qui ne va pas dans votre constructeur de copie de cv :: Mat, votre paramètre est passé par référence? – minicaptain

+0

si vous voulez juste les voir la réponse est là-bas. – Khashayar

Répondre

3

imshow recherche une image complète.

en projetant un contour sur un tapis, vous n'aurez pas d'image. ce que vous pouvez faire est: (src est votre image)

src = imread(argv[1], 1); 

    /// Convert image to gray and blur it 
    cvtColor(src, src_gray, CV_BGR2GRAY); 
    blur(src_gray, src_gray, Size(3,3)); 

    Mat canny_output; 
    vector<vector<Point> > contours; 
    vector<Vec4i> hierarchy; 

    /// Detect edges using canny 
    Canny(src_gray, canny_output, thresh, thresh*2, 3); 
    /// Find contours 
    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 



    /// Draw contours 

    for(int i = 0; i< contours.size(); i++) 
    { 
     Mat test_image = Mat::zeros(canny_output.size(), CV_8UC3); 
     Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255)); 
     drawContours(test_image, contours, i, color, 2, 8, hierarchy, 0, Point()); 
     imshow("test",test_image); 
     waitKey(); 
    } 
+0

comment dois-je définir la hiérarchie le et le dernier paramètre Point ??? – Engine

+0

modifié la réponse avec le code complet – Khashayar

0

Vous pouvez le faire comme ceci:

void draw_contour(cv::Mat &dst_img, const std::vector<cv::Point> &contour, const cv::Scalar &color) 
{ 
    for (auto &point: contour) 
    { 
    dst_img.at<unsigned char>(point) = color; 
    } 
} 

Ou si vous utilisez rapprochement des contours:

void draw_contour(cv::Mat &dst_img, const std::vector<cv::Point> &contour, const cv::Scalar &color) 
{ 
    for (unsigned i = 0; i < contour.size(); ++i) 
    { 
    cv::line(dst_img, contour[i], contour[(i + 1) % contour.size(), color); 
    } 
} 
Questions connexes