2016-12-12 21 views
0

いくつかのオブジェクトを検出したいビデオを処理しています。不要な輪郭をフィルタリングする - opencv with C++

最初に、背景を削除してから、それを灰色にしてcv::thresholdとそれ以降のcv::findcontoursを使用して2値画像を作成します。

輪郭が長すぎたり短すぎたりします。 "Opencv 2 cookbook"にこのような理由でコードが見つかりました。しかし、それは私のビデオの21番目のフレームで実行時エラーがあります。

// Eliminate too short or too long contours 
    size_t cmin{ 15 }; // minimum contour length 
    size_t cmax{ 120 }; // maximum contour length 


    std::vector<std::vector<cv::Point> >:: 
     const_iterator itc = contours.begin(); 
    while (itc != contours.end()) { 
     if (itc->size() < cmin || itc->size() > cmax) 
      itc = contours.erase(itc); 
     else 
      ++itc; 
    } 

私が検索し、見つかった別のコードを、それは同じフレームで同じエラーがあります。

double min_area = 500; // area threshold 
    double max_area = 1500; // area threshold 
    for (int i = 0; i < contours.size(); i++) // iterate through each contour. 
    { 
     double area = contourArea(contours[i], false); // Find the area of contour 
     if (area < min_area || area > max_area) 
      contours.erase(contours.begin() + i); 
    } 

と私は新しいベクトルを作成して、それで受け入れられた輪郭をコピーするコードを書きました。それはまた、同じフレームで同じエラーが発生しました:

std::vector<std::vector<cv::Point> > goodcontours; 
    size_t cmin{ 15 }; 
    size_t cmax{ 120 }; 
    double contourlength = 1; 
    size_t contoursize = contours.size(); 
    for (int i = 0; i != contoursize;i++) { 
     contourlength = cv::arcLength(contours[i], true); 
     if (contourlength > cmin && contourlength < cmax) 
      goodcontours.push_back(contours.at(i)); 
    } 

私は他の動画を試してみましたが、それらのすべてが特定のフレームで同じ問題を抱えています。

エラーが発生する前に、私は依然として不要な輪郭を見ることができ、実際には除去されないことを意味します。

エラーがちょうど言う:0x75017FB2で

未処理の例外(ucrtbase.dll)

あなたが輪郭をフィルタリングするための任意の提案を持っていますか?

one of my video frames contours

+1

私は**それは 'contourAreaに一致していない輪郭に関係していること**推測'仮定(おそらく小さすぎる?)。いくつかの詳細な情報メッセージが必要です - もっと慎重に見てください – slawekwin

答えて

1

私の友人の一人は私の質問に答えて、私はあなたとそれを共有しましょう:

cv::findContours(image,contours,CV_RETR_LIST,mode,cv::Point(offset_x,offset_y)); 

    for(int i=0;i<contours.size();i++) 
    { 
     AreaContour=cv::contourArea(contours[i]); 
     if(AreaContour<MaxAreaContour && AreaContour>MinAreaContour) 
     drawContours(Result,contours,i,cv::Scalar(DrawColor),Thickness,LineType,cv::noArray(),2147483647,cv::Point(DrawOffset_x,DrawOffset_y)); 

    } 
関連する問題