【发布时间】: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,而算法似乎只支持32F 和32S)。所以我尝试了转换:
cv::Mat w2;
w = (w > 0.5);
w.convertTo(w2, CV_32F);
cv::convexHull(w2, h);
但现在问题转移到total >= 0 条件,其中total 是w.checkVector(2)。我无法理解如何实现这个条件。
我也尝试了以下方法,结果相同:
cv::Mat w2 = w * ( w > 0.5 );
cv::convexHull(w2, h);
我的其他尝试涉及cv::threshold 和cv::findContours,但以类似的方式失败了。
我在 OpenCV 方面真的缺乏经验,如果有任何正确方向的指点,我将不胜感激。
【问题讨论】:
-
如果您阅读documentation to
cv::convexHull,您将了解到它需要一个点集作为输入,而不是图像。有很多使用这个函数的例子,包括如何提取图像中二进制对象的边界。 -
以上评论是正确的。您可以先找到对象的轮廓,然后在轮廓点上运行
convexHull()。或者,您可以只获取二进制图像的非零索引并将其推送。 -
CrisLuengo 和 AlexanderReynolds,感谢您为我指明了正确的方向,我已按照此处的示例进行操作 - docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/…
标签: c++ matlab opencv convex-hull