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

标签 c++ opencv

我想标注一个二值图的连通分量,但是第一次运行到cvFloodFill函数时,出现了未处理的异常。 有个留言框说:enter image description here

命令说: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;
           }
        }
    }
}

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

最佳答案

这里有不止一件事是错误的:

// 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/

相关文章:

c++ - Visual Studio 2012 Ultimate 中的反汇编

c++ - 唯一指针的迭代 vector

python - 模板使用opencv匹配屏幕截图

c - Opencv:RGB 到 HSV

python - img [y:y + h,x:x + w]坐标系的工作方式

C++ 设计模式

c++ - 一个变量或对象的内存在程序结束时自动终止,而不是为什么我们使用析构函数?

c++ - 在 std::vector 中释放 Mat

c++ - view_as 在 Boost Polygon 库中的使用

python - 是否可以使用pytesseract从图像的特定部分提取文本