Контуры рисования, извлеченные из бинарного изображения

Я хочу использовать 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 );
}

Может кто-нибудь мне помочь? Большое спасибо!


person YeCong Lu    schedule 14.03.2013    source источник


Ответы (1)


Mat m_frB = imread("3.jpg", CV_LOAD_IMAGE_GRAYSCALE);

загружает 3.jpg как изображение в градациях серого 8bpp, поэтому это не двоичное изображение. Это относится к функции findContours, которая "не- нулевые пиксели обрабатываются как 1. Нулевые пиксели остаются 0, поэтому изображение рассматривается как двоичное". Также обратите внимание, что эта "функция изменяет изображение при извлечении контуров".

Фактическая проблема здесь заключается в том, что, хотя целевое изображение имеет 8 бит на пиксель, вы должны убедиться, что оно имеет 3 канала, используя CV_8UC3, прежде чем рисовать в нем контуры RGB. Попробуй это:

// 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);
person LihO    schedule 14.03.2013
comment
Да, вы правы! Я не заметил использования drawContours(). Спасибо! - person YeCong Lu; 16.03.2013