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 を押しませんでした;-)