C++ 复制Matlab';在OpenCV中创建一个新的外壳
我目前正在将一个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(
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,谢谢你为我指明了正确的方向,我已经按照这里的示例进行了操作,并使其正常工作-