【发布时间】:2014-07-13 09:40:50
【问题描述】:
我正在用 C++ 实现 Matlab 的代码。在 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 中一样。
【问题讨论】:
-
为了与 MATLAB 等效,您的代码应类似于
distanceTransform(test,test_result,CV_DIST_L2,CV_DIST_MASK_PRECISE );。但是,我也不能让它在 OpenCV 上运行;这可能是一个错误。 -
不,它也不能使用它。它给出与测试相同的结果。 [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]
-
是的,这就是我在评论中所说的;即使使用正确的参数,它也不起作用。
-
对于这个问题还有其他解决方案吗?
-
大声笑;没有问题。 MATLAB 的
bwdist查找该像素与最近的非零像素之间的距离,而OpenCV 的distanceTransform查找每个像素到最近的零像素的距离。所以按照@agrum的代码,你应该没问题。
标签: c++ matlab opencv euclidean-distance