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

时间:2013-03-14 10:24:54

标签: c++ visual-c++ opencv drawing contour

我希望对二进制映像使用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 个答案:

答案 0 :(得分: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);