我想标注一个二值图的连通分量,但是第一次运行到cvFloodFill函数时,出现了未处理的异常。 有个留言框说:
命令说:
代码如下:
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;
}
}
}
}
谁能告诉我发生了什么事?谢谢!
最佳答案
这里有不止一件事是错误的:
// 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 channel 图像中。
最后但同样重要的是,resSlt 有一个指向 slt 中像素的借用指针。如果您想在 slt 超出范围后使用 resSlt,则必须使用 resSlt.clone(),否则将面临悬空指针。
关于c++ - 关于 cvFloodFill() 函数的 OpenCV 未处理异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23455239/