3

OpenCV 2.4.3 で画像処理を行う関数をコーディングしています。パラメーターの型として InputArray と OutputArray を使用しています。Visual Studio 2008 Express を使用したデバッグ ビルドでは、次のコード (最小限のテスト ケース) で、for(;;) ループの最初の繰り返しの後に、この非常に奇妙なエラーが発生します。

"HEAP[Test.exe]: 0032F5D0 で変更された 0032F598 のヒープ ブロックは、要求されたサイズが 30 を超えました。読み込まれた DLL のいずれかです。これは、Test.exe にフォーカスがあるときにユーザーが F12 キーを押したことが原因である可能性もあります。」

struct Corner
{
    float x;
    float y;
    float response;
};


void my_CornerDetector(InputArray _image, OutputArray _corners)
{
    vector<Corner> corners;
    Corner c;
    c.x = 150; c.y = 200; c.response = 0.1485;
    corners.push_back(c);
    corners.push_back(c);
    corners.push_back(c);
    Mat(corners).copyTo(_corners);
}

void main()
{
    Mat frame, frame_gray;    
    namedWindow("Output", CV_WINDOW_AUTOSIZE ); 

    VideoCapture capture;
    capture.open(0);
    for (;;)
    {
        capture >> frame;
        if (frame.empty())
            break;

        cvtColor( frame, frame_gray, CV_BGR2GRAY );

        vector<Corner> corners;
        my_CornerDetector( frame_gray, corners);

        for( int i = 0; i < corners.size(); i++ )
            circle( frame, Point2f(corners[i].x, corners[i].y), 4, CV_RGB(255,0,0), -1, 8, 0 ); 

        imshow("Output", frame);

        char key = (char)waitKey(2);
        switch (key)
        {
        case 27:
        case 'q':
          return;
          break;
        }
    }
}

最初の反復中およびクラッシュ前に for ループ内でコーナーが正しい値 (同じコーナーの 3 倍) を持っていたことに注意してください。std::vector に Corner 型を使用する代わりに Point2f を使用した場合 (そして応答フィールドを忘れた場合)、例は期待どおりに機能します。また、OutputArray を使用する代わりに std::vector &_corners を使用しても問題なく動作します。どうしたの??OutputArray で動作するように、タイプ Corner をどこかに登録する必要があるのではないかと感じていますが、OpenCV のドキュメントではそのようなことは見たことがありません。

ところで、私は F12 を押しませんでした;-)

4

1 に答える 1

2

問題は、ベクトル コーナーでの通過にあります。OutputArray にキャストされません。

ブロックを置き換えます。

vector<Corner> corners;
my_CornerDetector( frame_gray, corners);    
for( int i = 0; i < corners.size(); i++ )
circle(frame, Point2f(corners[i].x, corners[i].y), 4, CV_RGB(255,0,0), -1, 8, 0 );

と:

Mat corners;
my_CornerDetector( frame_gray, corners);        
for( int i = 0; i < corners.rows; i++ )
{
  Corner c = corners.at<Corner>(i, 0);
  circle(frame, Point2f(c.x, c.y), 4, CV_RGB(255,0,0), -1, 8, 0 );
}
于 2012-12-14T05:24:12.067 に答える