【问题标题】:Substitute function of bwdist in C++C++中bwdist的替换函数
【发布时间】: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


【解决方案1】:

我敢说这个功能有效。下次为您的矩阵提供适当的数据。

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

【讨论】:

  • 它不工作。我检查了它。现在它给出的结果是 [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]
  • 我没有注意到您使用 CV_DIST_L1 而不是 CV_DIST_L2。另外我没有安装opencv,也没有使用过它。到目前为止,答案只是基于文档所说的。
  • 它不再工作了。实际上文件说该函数将计算欧几里得距离,但它没有这样做。 [0, 0, 0, 0, 0; 0, 0, 0, 0, 0; 0, 0, 0.95432, 0, 0; 0, 0, 0, 0, 0; 0 ,0 ,0 ,0, 0] 这是从 CV_DIST_L1 改为 CV_DIST_L2 后的结果。
  • 因为它计算最接近零的距离。如文档中所写。你的输入矩阵是错误的。如果你期望和 MatLab 一样的结果,中间应该是 0,周围是 1。
  • @agrum:+1 - 好收获!
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2011-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多