关于cvFloodFill()函数的OpenCV未处理异常

时间:2014-05-04 10:40:11

标签: c++ opencv

我想标记二进制图片的连接组件,但是当我第一次运行cvFloodFill函数时,会出现未处理的异常。 有一个消息框说:enter image description here

cmd说:enter image description here

以下是代码:

Mat resSlt = Mat(IMG_HEIGHT, IMG_WIDTH, CV_8UC1, slt, IMG_WIDTH * sizeof(uchar));
cvNamedWindow("resSlt");

imshow("resSlt",resSlt);
waitKey(60000);

int color = 254;
int colorsum[255] = {0};
for (int r = 0; r < resSlt.rows; r++)
{
    for (int c = 0; c < resSlt.cols; c++)
    {
        if (color > 0)
        {
           if (resSlt.at<Vec3b>(r, c)[0] == 255)
           {
               cvFloodFill(&resSlt, cvPoint(c, r), CV_RGB(color, color, color));
               --color;
           }
        }
    }
}

谁能告诉我发生了什么?谢谢!

1 个答案:

答案 0 :(得分:1)

这里有不止一件事:

// buffer overflow:
resSlt.at<Vec3b>(r, c)[0] 
// it's a CV_8U image, so use 
resSlt.at<uchar>(r, c)[0] 

请不要混用c ++和c api来电,坚持使用c ++ api。

使用:

cv::floodFill(resSlt, cv::Point(c, r), cv::Scalar(color, color, color));

(cv :: Mat的地址不是IplImage *)

另请注意,您无法将颜色绘制为8位1通道图像。

最后但并非最不重要的是,resSlt有一个借用指向slt中像素的指针。如果你想在slt超出范围后使用resSlt,你将不得不使用resSlt.clone(),或者面对一个悬空指针。