0

OpenCV を使用して輪郭の周りにバウンディング ボックスを描画しようとしています。これは、すべての画像がリアルタイムでカメラから取得されるリアルタイム アプリケーションです。コードの重要な部分は次のとおりです。

RTMotionDetector.h

vector<vector<Point>> *contours;
    vector<vector<Point>> *contoursPoly;

RTMotionDetector.cpp

RTMotionDetector::RTMotionDetector(void)
{
    current = new Mat();
    currentGrey = new Mat();
    canny = new Mat();
    next = new Mat();
    absolute = new Mat();

    cam1 = new VideoCapture();
    cam2 = new VideoCapture();

    contours = new vector<vector<Point>>();
    contoursPoly = new vector<vector<Point>>();
    boundRect = new vector<Rect>();

}

double RTMotionDetector::getMSE(Mat I1, Mat I2)
{
    Mat s1;

    //Find difference
    cv::absdiff(I1, I2, s1);       // |I1 - I2|
    imshow("Difference",s1);

    //Do canny to get edges
    cv::Canny(s1,*canny,30,30,3);
    imshow("Canny",*canny);

    //Find contours
    findContours(*canny,*contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
    //System::Windows::Forms::MessageBox::Show(""+contours->size());

    //Draw contours
    drawContours(*current,*contours,-1,Scalar(0,0,255),2);
    for(int i=0;i<contours->size();i++)
    {
        cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true);
        //boundRect[i] = boundingRect(contoursPoly[i]);
    }
}

次の部分が実行されるとすぐに、エラーが発生します

cv::approxPolyDP(Mat((*contours)[i]),(*contoursPoly)[i],3,true);

これが私が得ているエラーです。

ここに画像の説明を入力

そのコードをコメントアウトしても問題ありません。これがArrayIndexOutOfBounds問題であることはわかっていますが、実際には修正が見つかりません。私がWindowsプログラミングに慣れていないためかもしれません。

contoursローカル変数はプログラムを信じられないほど遅くするため、ローカル変数ではなくポインターのままにしておく ことが非常に重要です。

4

2 に答える 2

3

どのベクトルへのどのアクセスがその範囲を超えたかを見つける必要があります。

輪郭のサイズまでループし、

for(int i=0;i<contours->size();i++)

しかし、その後アクセス(*contoursPoly)[i]

私は、contoursPoly がその範囲を超えていると推測する危険があります。これは、提案されているようにデバッガーに侵入することで確認できます。

ループを

for(int i=0;i<contours->size() && i<contoursPoly->size();i++)

当面の問題を解決するかもしれません。

于 2013-07-15T08:48:24.933 に答える
1

ここ

(*contoursPoly)[i]

存在しないものにアクセスしようとします。

さらに、ドキュメントには次のように書かれています。

C++: void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed) ... approxCurve - (...) 型は入力曲線の型と一致する必要があります(...)

ここに入力 - Mat と出力 - vector< Point > があります。IDK さん、それもうまくいくかもしれません。

于 2013-07-15T08:50:47.923 に答える