2014-05-10 8 views
6

Sono estremamente nuovo alla visione artificiale e alla libreria opencv.Crea stuoia dal vettore <point2f>

Ho fatto qualche ricerca su google per cercare di trovare come creare una nuova immagine da un vettore di Point2fs e non ho trovato alcun esempio che funzioni. Ho visto vector<Point> to Mat ma quando uso quegli esempi ottengo sempre errori.

Sto lavorando dall'esempio this e qualsiasi aiuto sarebbe apprezzato.

Codice: I pass in OccludedSquare.

resize(occludedSquare, occludedSquare, Size(0, 0), 0.5, 0.5); 

    Mat occludedSquare8u; 
    cvtColor(occludedSquare, occludedSquare8u, CV_BGR2GRAY); 

    //convert to a binary image. pixel values greater than 200 turn to white. otherwize black 
    Mat thresh; 
    threshold(occludedSquare8u, thresh, 170.0, 255.0, THRESH_BINARY); 



    GaussianBlur(thresh, thresh, Size(7, 7), 2.0, 2.0); 

    //Do edge detection 
    Mat edges; 
    Canny(thresh, edges, 45.0, 160.0, 3); 

    //Do straight line detection 
    vector<Vec2f> lines; 
    HoughLines(edges, lines, 1.5, CV_PI/180, 50, 0, 0); 

    //imshow("thresholded", edges); 


    cout << "Detected " << lines.size() << " lines." << endl; 

    // compute the intersection from the lines detected... 
    vector<Point2f> intersections; 
    for(size_t i = 0; i < lines.size(); i++) 
    { 
     for(size_t j = 0; j < lines.size(); j++) 
     { 
      Vec2f line1 = lines[i]; 
      Vec2f line2 = lines[j]; 
      if(acceptLinePair(line1, line2, CV_PI/32)) 
      { 
       Point2f intersection = computeIntersect(line1, line2); 
       intersections.push_back(intersection); 
      } 
     } 

    } 

    if(intersections.size() > 0) 
    { 
     vector<Point2f>::iterator i; 
     for(i = intersections.begin(); i != intersections.end(); ++i) 
     { 
      cout << "Intersection is " << i->x << ", " << i->y << endl; 
      circle(occludedSquare8u, *i, 1, Scalar(0, 255, 0), 3); 
     } 
    } 

//Make new matrix bounded by the intersections 
... 
imshow("localized", localized); 
+0

voglio prendere i punti che devo creare un ROI e da lì creare una nuova matrice. È più chiaro? Non sono veramente sicuro di quale sia la differenza tra fare una Mat di punti e disegnare punti in una matrice. – myselfesteem

risposta

9

dovrebbe essere semplice come

std::vector<cv::Point2f> points; 
cv::Mat image(points); 
//or 
cv::Mat image = cv::Mat(points) 

La probabilmente confusione è che un cv :: Mat è un'immagine width*height*number di canali, ma anche una matrice matematica, rows*columns*other dimension.

Se si crea una stuoia da un vettore di punti "n" 2D, verrà creata una colonna 2 per matrice di righe "n". Stai passando ad una funzione che si aspetta un'immagine.

Se si dispone solo di una serie sparsa di punti 2D e si desidera visualizzarli come immagine è necessario creare un cv :: Mat di dimensioni sufficienti (qualunque sia il massimo x, punto y) e quindi disegnare il puntini utilizzando le funzioni di disegno http://docs.opencv.org/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.html

Se si desidera solo per impostare i valori dei pixel in quelle coordinate del punto di ricerca in modo da valori di pixel di impostazione OpenCV, ci sono un sacco di risposte

+3

Viene visualizzato un errore di runtime "Numero cattivo di canali (l'immagine di origine deve avere 1, 3 o 4 canali) in cvConvertImage, ...)" per entrambe le opzioni. – myselfesteem

+0

Forse non sono stato chiaro nell'istruzione del problema, ma l'ho risolto creando una ROI e poi ritagliando la mia matrice con quella. Ho fatto il ROI trovando i valori x & y più piccoli. Quindi ho potuto calcolare l'altezza e la larghezza. Ti segnalo come risposta corretta perché mi hai condotto sulla retta via. – myselfesteem

Problemi correlati