我正在编写一个使用OpenCV 2.4.3进行图像处理的函数,我使用InputArray和OutputArray作为参数类型。在使用Visual Studio 2008 Express的Debug构建中,下面的代码(最小测试用例)在for(;;)循环的第一次迭代之后给出了这个非常奇怪的错误:
“HEAP [Test.exe]:0032F598处的堆块修改为0032F5D0,过去请求的大小为30 Windows已触发Test.exe中的断点。 这可能是由于堆的损坏,这表明Test.exe或它已加载的任何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;
}
}
}
请注意,在第一次迭代期间和崩溃之前,角落中的角落具有正确的值(相同角落的3倍)。如果不使用我的Corner类型作为std :: vector,我使用Point2f(我忘记了响应字段)示例按预期工作。如果不使用OutputArray我使用std :: vector&amp; _corners它也可以正常工作。这是怎么回事??我感觉可能我需要在某个地方注册我的类型角落,以便它可以与OutputArray一起使用但我在OpenCV文档中没有看到这样的东西。
顺便说一句,我没有按F12; - )答案 0 :(得分:2)
问题在于传递Vector角落。它不会被强制转换为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 );
}