OpenCV: исключение findContours

0

мой код matlab:

h = fspecial('average', filterSize);
imageData = imfilter(imageData, h, 'replicate');
bwImg = im2bw(imageData, grayThresh);

cDist=regionprops(bwImg, 'Area');
cDist=[cDist.Area];

Код opencv:

cv::blur(dst, dst,cv::Size(filterSize,filterSize));
dst = im2bw(dst, grayThresh);

cv::vector<cv::vector<cv::Point> > contours;
cv::vector<cv::Vec4i> hierarchy;
cv::findContours(dst,contours,hierarchy,CV_RETR_CCOMP, CV_CHAIN_APPROX_NONE);

вот моя функция image2blackand white

cv::Mat AutomaticMacbethDetection::im2bw(cv::Mat src, double grayThresh)
{
    cv::Mat dst;
    cv::threshold(src, dst, grayThresh, 1, CV_THRESH_BINARY);
    return dst; 
}

Я получаю исключение в исключении findContours() C++: cv :: Исключение в ячейке памяти 0x0000003F6E09E0A0.

Не могли бы вы объяснить, что я делаю неправильно. dst is cv :: Mat, и я использовал его все вместе, у меня есть мои первоначальные значения.

Обновление здесь - это моя матрица, записанная в *.txt файл: http://www.filedropper.com/gili

ОБНОВЛЕНИЕ 2: Я добавил dst.convertTo(dst,CV_8U); как предположил Мика, у меня больше нет исключения. однако значения не похожи на ожидаемые.

  • 0
    Вы пробовали с другими изображениями? Это происходит с любым изображением, которое вы вставляете, или только с конкретным изображением? Я хочу сказать, что эта ошибка воспроизводима? Пожалуйста, поднимите изображение, которое вы используете, а также весь код, необходимый для создания dst .
  • 2
    Ваше входное изображение 8UC1 (один канал 1 байт)?
Показать ещё 2 комментария
Теги:
opencv
image-processing

1 ответ

1
Лучший ответ

Взгляните на этот вопрос, который имеет аналогичную проблему с тем, с чем вы сталкиваетесь: Matlab и OpenCV вычисляют разный момент m00 изображения для одного и того же изображения.

В принципе, OP в связанном столбце пытается найти момент нулевого изображения для x и y всех замкнутых контуров - это фактически только область, используя findContours в OpenCV и regionprops в MATLAB. В MATLAB, к которому можно получить доступ свойство Area из regionprops, и, судя по вашему коду MATLAB, вы хотите найти такое же количество.

От поста, безусловно, есть разница между тем, как OpenCV и MATLAB находит контуры в изображении. Это сводится к тому, как обе платформы рассматривают, что такое "подключенный пиксель". OpenCV использует только 4-пиксельный район, в то время как MATLAB использует восемь пикселей.

Таким образом, нет ничего плохого в вашей реализации, и преобразование в 8UC1 является хорошим. Однако области (и, в конечном счете, общее количество подключенных компонентов и самих контуров) между обоими контурами, найденными с MATLAB и OpenCV, не совпадают. Единственный способ получить точно такой же результат - это вручную рисовать контуры, найденные findContours на черном изображении, и использовать функцию cv::moments прямо на этом изображении.

Однако из-за различных реализаций cv::blur() по сравнению с fspecial с маской усреднения, которая является четной, вы все равно не сможете получить одинаковые результаты вдоль границ изображения. Если вокруг границ вашего изображения нет важных контуров, то, надеюсь, это даст вам правильный результат.


Удачи!

  • 0
    Вы написали мне нужно найти контуры вручную? не используете findcontours?
  • 0
    Нет нет. Да, вы можете использовать findContours , но взять эти результаты и использовать расположение пикселей, чтобы нарисовать их на пустое изображение. Так что используйте drawContours .
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню