2014-05-10 12 views
6

Jestem niezmiernie nową wizją komputerową i biblioteką opencv.Stwórz matę z wektora <point2f>

Zrobiłem trochę wyszukiwania w celu znalezienia sposobu, aby utworzyć nowy obraz z wektora Point2fs i nie znalazłem żadnych przykładów, które działają. Widziałem vector<Point> to Mat, ale kiedy używam tych przykładów, zawsze dostaję błędy.

Pracuję z przykładu this i każda pomoc będzie mile widziana.

Kod: Przechodzę w 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

chcę wziąć punkty muszę utworzyć ROI i stamtąd stworzyć nową matrycę. Czy to jest bardziej jasne? Nie jestem do końca pewien, na czym polega różnica pomiędzy tworzeniem Maty punktów i punktów rysowania w macierzy. – myselfesteem

Odpowiedz

9

powinno być tak proste, jak

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

prawdopodobnie zamieszanie jest to, że cv :: Mat jest obraz width*height*number kanałów ale również matematycznym macierz, rows*columns*other dimension.

Jeśli utworzysz matę z wektora "n" punktów 2D, utworzy on 2 kolumnę za pomocą macierzy wierszy "n". Przechodzisz to do funkcji, która oczekuje obrazu.

Jeśli masz po prostu rozproszony zestaw punktów 2D i chcesz wyświetlić je jako obraz, musisz zrobić pustą cv :: Mat o wystarczająco dużym rozmiarze (niezależnie od twojego maksymalnego punktu x, y), a następnie narysuj kropki użyciem funkcji rysowania http://docs.opencv.org/doc/tutorials/core/basic_geometric_drawing/basic_geometric_drawing.html

Jeśli tylko chcesz ustawić wartości pikseli na te współrzędne punktów wyszukiwanie SO dla wartości pikseli ustawień OpenCV, istnieje wiele odpowiedzi

+3

Występuje błąd runtime "Zła liczba kanałów (Obraz źródłowy musi mieć 1, 3 lub 4 kanały) w cvConvertImage, ...)" dla obu tych opcji. – myselfesteem

+0

Mogłem być niejasny w opisie problemu, ale naprawiłem go, tworząc ROI, a następnie przycinając moją matrycę. Zrobiłem ROI, znajdując najmniejsze wartości x i y. Potem mogłem obliczyć wysokość i szerokość. Zaznaczam cię jako poprawną odpowiedź, ponieważ doprowadziłeś mnie do właściwej ścieżki. – myselfesteem

Powiązane problemy