【问题标题】:Replicating Matlab's bwconvhull in OpenCV在 OpenCV 中复制 Matlab 的 bwconvhull
【发布时间】:2018-11-05 22:30:20
【问题描述】:

我目前正在将一个 Matlab 程序重写为 OpenCV,但找不到与 bwconvhull 函数等效的函数。

Matlab 代码执行以下操作:

H = bwconvhull(W>0.5);

其中W 是一个带有浮点值的矩阵(它是从算法前面部分中的几个距离图计算得出的)。

我已经成功地找到了一种在 OpenCV 中计算 W 本身的方法 - 生成 cv::Mat 类型为 32FC1

我的第一次尝试使用了直译:

cv::convexHull(w>0.5, h);

这会崩溃并出现以下异常:

OpenCV(3.4.1) \opencv\modules\imgproc\src\convhull.cpp:137: 
error: (-215) total >= 0 && (depth == 5 || depth == 4) 
in function cv::convexHull

我检查了源代码,发现问题出在Mat 类型 - (> 运算符产生8U mat,而算法似乎只支持32F32S)。所以我尝试了转换:

cv::Mat w2;
w = (w > 0.5);
w.convertTo(w2, CV_32F);
cv::convexHull(w2, h);

但现在问题转移到total >= 0 条件,其中totalw.checkVector(2)。我无法理解如何实现这个条件。

我也尝试了以下方法,结果相同:

cv::Mat w2 = w * ( w > 0.5 );
cv::convexHull(w2, h);

我的其他尝试涉及cv::thresholdcv::findContours,但以类似的方式失败了。

我在 OpenCV 方面真的缺乏经验,如果有任何正确方向的指点,我将不胜感激。

【问题讨论】:

  • 如果您阅读documentation to cv::convexHull,您将了解到它需要一个点集作为输入,而不是图像。有很多使用这个函数的例子,包括如何提取图像中二进制对象的边界。
  • 以上评论是正确的。您可以先找到对象的轮廓,然后在轮廓点上运行convexHull()。或者,您可以只获取二进制图像的非零索引并将其推送。
  • CrisLuengo 和 AlexanderReynolds,感谢您为我指明了正确的方向,我已按照此处的示例进行操作 - docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/…

标签: c++ matlab opencv convex-hull


【解决方案1】:

@CrisLuengo 和 @AlexanderReynolds 为我指明了正确的方向,非常感谢你们。

我缺少的是findContours 步骤,它首先检索图像的轮廓,然后才通过convexHull 函数运行它。在提出问题之前我已经尝试过findContours 调用,但我一定是错误地选择了参数。为了让它工作,我基本上复制了sample code here

【讨论】:

    猜你喜欢
    • 2015-10-06
    • 1970-01-01
    • 2022-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多