2015-05-13 195 views
2

比方說,我有以下的輸出圖像:獲取輪廓座標OpenCV的

enter image description here

基本上,我有視頻流,我想只有在輸出圖像來獲得矩形的座標。這是我的C++代碼:

while(1) 
    { 
     capture >> frame; 

     if(frame.empty()) 
      break; 

     cv::cvtColor(frame, gray, CV_BGR2GRAY); // Grayscale image 

     Canny(gray, canny_output, thresh, thresh * 2, 3); 

     // Find contours 
     findContours(canny_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 

     // Draw contours 
     Mat drawing = Mat::zeros(canny_output.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)); 
      drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point()); 
     } 

     cv::imshow("w", drawing); 

     waitKey(20); // waits to display frame 

    } 

謝謝。

+0

請把你的矩形在2周或3的輪廓分割(你看,因爲他們有不同的顏色)。看起來像你的輸入材料不夠好(例如邊緣圖像或某物中的小孔)。 – Micka

回答

3

看看,看看參數(link):

void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point()) 

參數:here

看輪廓,就像拉法說的那樣,每個輪廓都存儲在一個點的向量中,每個點的向量都被存儲在一個向量中,所以,通過在外部向量中行走,然後在內部向量中行走,你會找到你想要的點。但是,如果只想檢測較大輪廓,則可能需要使用CV_RETR_EXTERNAL作爲模式參數,因爲它只會檢測大多數外部輪廓(大矩形)。

如果仍然希望保持較小的輪廓,那麼你可能會使用CV_RETR_TREE,並隨層級結構工作了:Using hierarchy contours

2

看着documentationOutputArrayOfArrays contours是關鍵。

輪廓 - 檢測到的輪廓。每個輪廓都存儲爲一個點的矢量。

所以,你有一個vector< vector<Point> > contoursvector<Point>(內部)是輪廓的座標,每個輪廓都存儲在vector中。

因此,舉例來說,要知道5個載體,它是vector<Point> fifthcontour = contours.at(4);

,你必須在向量的座標。

您可以訪問到這些座標爲:在OpenCV的文檔中找到等高線函數的定義

for (int i = 0; i < fifthcontour.size(); i++) { 
    Point coordinate_i_ofcontour = fifthcontour.size(); 
    cout << endl << "contour with coordinates: x = " << coordinate_i_ofcontour.x << " y = " << coordinate_i_ofcontour.y; 
}