0

ライブ Web カメラ フィードで手の周りに輪郭を描きたいです。次のコードを使用すると、OpenCV はノイズや影などのために他の多くの輪郭を検出します。

    cv::findContours(fgmask,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    cv::drawContours(fgimg,contours,-1,cv::Scalar(0,0,255),2);

小さな重要でない領域を削除するために、次のコードをオンラインで見つけました。

cv::findContours(fgmask,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    for(int i=0;i<contours.size();i++)
    {

                    if(contours[i].size() < 10000 && contours[i].size() > 0)
            {

            int size=cv::contourArea(contours[i]);
            if(size>5000)
            {
                            //Draw contour
                            vector<vector<Point> > tcontours;
                            tcontours.push_back(contours[i]);
                            cv::drawContours(fgimg,tcontours,-1,cv::Scalar(0,0,255),2);
                            }
                            }
            }

しかし、輪郭はまったく描画されません。if(size>5000)ステートメントの後に cout ステートメントを配置して、このステートメントが実現したかどうかを確認し、Cout 出力を取得しました。では、なぜ輪郭がないのでしょうか。push_back 関数に何か問題がありますか?

4

1 に答える 1

0
  1. を使用しますCV_RETR_EXTERNALか?
  2. if(contours[i].size() < 10000 && contours[i].size() > 0)ここでは役に立たない
  3. 一時的なベクトルvector<vector<Point> > tcontours;も意味がありません

試す:

vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(fgmask, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);

// draw contours:   
Mat newImg = Mat::zeros(fgmask.size(), CV_8UC3);
for (unsigned int i = 0; i < contours.size(); i++)
{
    if (contourArea(contours[i]) > 5000)
        drawContours(newImg, contours, i, Scalar(0,0,255), 1, 8, hierarchy, 0);
}
于 2013-11-02T10:59:42.620 に答える