C++ 复制Matlab';在OpenCV中创建一个新的外壳

C++ 复制Matlab';在OpenCV中创建一个新的外壳,c++,matlab,opencv,convex-hull,C++,Matlab,Opencv,Convex Hull,我目前正在将一个Matlab程序改写成OpenCV,我找不到与bwconvhull函数等效的程序 Matlab代码执行以下操作: H = bwconvhull(W>0.5); 其中,W是一个带有浮点值的矩阵(该值是从算法前面部分中的几个距离映射计算得出的) 我已经成功地找到了一种在OpenCV中计算W自身的方法,结果是cv::Mat类型为32FC1 我的第一次尝试使用了直截了当的翻译: cv::convexHull(w>0.5, h); 这会崩溃,但出现以下异常: OpenCV(

我目前正在将一个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方面真的没有经验,如果有任何指向正确方向的指针,我将不胜感激。

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


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

如果您阅读了,您将了解到它以点集作为输入,而不是图像。有很多使用这个函数的例子,包括如何提取图像中二进制对象的边界。上面的评论是正确的。您可以先找到对象的轮廓,然后在轮廓点上运行
convexHull()
。或者,你可以只获取二值图像的非零索引,并将其通过。CrisLuengo和AlexanderReynolds,谢谢你为我指明了正确的方向,我已经按照这里的示例进行了操作,并使其正常工作-