matlab — функция замены bwdist в переполнении стека

Я реализую код Matlab в C ++. В Matlab они использовали bwdist рассчитать евклидово расстояние.

Я использую функцию distanceTransform получить тот же результат, что и в Matlab, но результаты резко отличаются.

float tests[5][5] = {{0, 0, 0, 0,0},{0, 0, 0, 0,0},{0, 0, 1, 0,0},{0, 0, 0, 0,0},{0 , 0 , 0 , 0,0}};
Mat test(5,5,CV_8UC1,&tests);
Mat test_result = Mat::zeros(5,5,CV_32FC1);
distanceTransform(test,test_result,CV_DIST_L1,3);

Результат C ++ приведен ниже.

test_result = [0, 0, 0, 0, 0; 0, 0, 0, 0, 0; 0, 0, 0, 0, 0; 0, 0, 0, 0, 0; 0, 0, 0, 0, 0]

Все нули при использовании в OpenCV.
Тогда как результат Matlab — это нечто иное.

  2.8284    2.2361    2.0000    2.2361    2.8284
2.2361    1.4142    1.0000    1.4142    2.2361
2.0000    1.0000         0    1.0000    2.0000
2.2361    1.4142    1.0000    1.4142    2.2361
2.8284    2.2361    2.0000    2.2361    2.8284

Пожалуйста, предложите мне какой-нибудь способ получить такой же результат в C ++ / OpenCv, как в Matlab.

2

Решение

Смею сказать, функция работает. В следующий раз кормите свои матрицы правильными данными.

uchar tests[5][5] = { //You create a 8UC1, so your data set type should match
{1, 1, 1, 1, 1},
{1, 1, 1, 1, 1},
{1, 1, 0, 1, 1},
{1, 1, 1, 1, 1},
{1 ,1, 1, 1, 1}};
Mat test(5, 5, CV_8UC1, tests); //tests is already a pointer
Mat test_result;
distanceTransform(test, test_result, CV_DIST_L2, 3); //You want euclidian distance
4

Другие решения


По вопросам рекламы [email protected]