3

我正在编写一个使用 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;
        }
    }
}

请注意,在第一次迭代期间和崩溃之前,for 循环中的角具有正确的值(相同角的 3 倍)。如果我不使用我的 Corner 类型作为 std::vector 我使用 Point2f (并且我忘记了响应字段),则该示例按预期工作。如果我不使用 OutputArray 而不是使用 std::vector &_corners 它也可以正常工作。这是怎么回事??我觉得可能我需要在某处注册我的类型 Corner 以便它可以与 OutputArray 一起使用,但我在 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 回答