从二值图像中检索的绘制轮廓

Posted

技术标签:

【中文标题】从二值图像中检索的绘制轮廓【英文标题】:Drawing contours retrieved from the binary image 【发布时间】:2013-03-14 10:24:53 【问题描述】:

我想将findContours 与二进制图像一起使用,但回调函数导致错误:

指定给 RtlFreeHeap 的地址无效

返回时。

当我想使用clear() 来释放vector<vector<Point> > 值时,它会导致相同的异常并且代码在free.c 中的行中崩溃:

if (retval == 0) errno = _get_errno_from_oserr(GetLastError());

例如:

void onChangeContourMode(int, void *)

    Mat m_frB = imread("3.jpg", 0);
    vector<vector<Point>> contours
    vector<Vec4i> hierarchy;
    findContours(m_frB, contours, hierarchy, g_contour_mode, CV_CHAIN_APPROX_SIMPLE);
    for( int idx = 0 ; idx >= 0; idx = hierarchy[idx][0] )
    drawContours( m_frB, contours, idx, Scalar(255,255,255), 
    CV_FILLED, 8, hierarchy );
    imshow( "Contours", m_frB );

谁能帮助我?非常感谢!

【问题讨论】:

【参考方案1】:
Mat m_frB = imread("3.jpg", CV_LOAD_IMAGE_GRAYSCALE);

3.jpg 加载为 8bpp 灰度图像,因此它不是二值图像。 findContours 函数特有 “非零像素被视为 1。零像素保持 0,因此图像被视为二进制”。另请注意,此“函数在提取轮廓的同时修改图像”

这里的实际问题是,虽然目标图像是 8bpp,但在绘制 RGB 轮廓之前,您应该使用CV_8UC3 确保它有 3 个通道。试试这个:

// find contours:
vector<vector<Point> > contours;
vector<Vec4i> hierarchy;
findContours(m_frB, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE);

// draw contours:
Mat imgWithContours = Mat::zeros(m_frB.rows, m_frB.cols, CV_8UC3);
RNG rng(12345);
for (int i = 0; i < contours.size(); i++)

    Scalar color = Scalar(rng.uniform(50, 255), rng.uniform(50,255), rng.uniform(50,255));
    drawContours(imgWithContours, contours, i, color, 1, 8, hierarchy, 0);

imshow("Contours", imgWithContours);

【讨论】:

是的,你是对的!我没有注意到 drawContours().Thx 的用法!

以上是关于从二值图像中检索的绘制轮廓的主要内容,如果未能解决你的问题,请参考以下文章

图像处理 - 计算二值图像中空白质心的算法

从二值图像中提取白色区域

从图像中删除所有轮廓

图像识别入门5 二值化处理

python-opencv获取二值图像轮廓及中心点坐标

在matlab中,怎么把图片中的图像轮廓坐标找出来?