мой код 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);
как предположил Мика, у меня больше нет исключения. однако значения не похожи на ожидаемые.
Взгляните на этот вопрос, который имеет аналогичную проблему с тем, с чем вы сталкиваетесь: 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
с маской усреднения, которая является четной, вы все равно не сможете получить одинаковые результаты вдоль границ изображения. Если вокруг границ вашего изображения нет важных контуров, то, надеюсь, это даст вам правильный результат.
Удачи!
findContours
, но взять эти результаты и использовать расположение пикселей, чтобы нарисовать их на пустое изображение. Так что используйте drawContours
.
dst
.