2016-01-17 88 views
0

我正在嘗試檢測一個球並繪製它的邊界。它顯示了錯誤findcontours中的段錯誤opencv

segmentation fault (core dumped) 

的錯誤是這裏的某個地方,

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

    Mat itt = Mat::zeros(imgThresholded.size(), CV_8UC1); 
itt = imgThresholded*255; 

Canny(itt ,itt, 10, 30, 3); 
vector<vector<Point> > contours_poly(contours.size()); 
vector<Point2f>center(contours.size()); 
vector<float>radius(contours.size()); 
vector<Rect> boundRect(contours.size()); 
imshow("canny", itt); 
//CIRCLE HOUGH 
//vector<Vec3f> circles; 
findContours(itt, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
for(int i = 0; i < contours.size(); i++) 
    { 
     Scalar color = Scalar(255,255,255); 

     if(contours[i].size() > points) 
     {approxPolyDP(Mat(contours[i]), contours_poly[i], 3, true); 
     boundRect[i] = boundingRect(Mat(contours_poly[i])); 
     minEnclosingCircle((Mat)contours_poly[i], center[i], radius[i]); 
     circle(imgOriginal, center[i], (int)radius[i],color, 2, 8, 0); 
    } 
    } 

我無法理解那裏有段錯誤。

+0

*我無法理解哪裏有段錯誤。* - 那麼如果出現問題,您還沒有準備好調試您的應用程序?哪一行代碼會產生分段錯誤? – PaulMcKenzie

+0

for條件有問題,評論時沒有問題。而且,沒有評論它..它的作品,但是當我把球帶到屏幕上,代碼剛剛退出並顯示此段錯誤。即;如果有任何東西被檢測到,則代碼停止。無法理解問題的位置 –

+0

如果'findCountours'通過引用獲取'contour',並且在該函數中,它將項目移除或添加到'countours'向量,則其他向量的大小沒有適當調整。 – PaulMcKenzie

回答

1

在findContours之後聲明其他向量,如下所示。有關進一步的參考,你可以看到here。希望這可以解決你的錯誤。我遇到了同樣的錯誤,並在我提到的鏈接中獲得瞭解決方案。

findContours(itt, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0)); 
vector<vector<Point> > contours_poly(contours.size()); 
vector<Point2f>center(contours.size()); 
vector<float>radius(contours.size()); 
vector<Rect> boundRect(contours.size()); 
1

你先做 vector boundRect(contours.size()); 在這裏,輪廓仍然是空的。 然後你調用findContours,它計算和設置輪廓的大小, 然後你試着直接寫它到boundRect [i]。只需調用boundRect.push_back(boundingRect(Mat(contours_poly [i])));相反,那麼你應該沒問題。

如果你正在做原型代碼,調試使用boundRect.at(i)= ...通常會更好,因爲這會給你一個可理解的錯誤,比如「超出範圍」。