代码之家  ›  专栏  ›  技术社区  ›  Martin Zikmund

在opencv中复制matlab的bwconvhull

  •  0
  • Martin Zikmund  · 技术社区  · 7 年前

    我目前正在将一个matlab程序重写为opencv的过程中,我找不到一个等价于 bwconvhull 功能。

    matlab代码执行以下操作:

    H = bwconvhull(W>0.5);
    

    在哪里? W 是一个带有浮点值的矩阵(根据算法上一部分中的多个距离图计算得出)。

    我已经成功地找到了一种计算方法 W 自身在opencv中-结果 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的经验,我会感激任何指向正确方向的指针。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Martin Zikmund    7 年前

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

    我错过的是 findContours 步骤:首先检索图像的轮廓,然后运行它通过 convexHull 功能。我试过了 发现的动物 在问问题之前先打电话,但我一定是选错了参数。为了让它工作,我基本上复制了 sample code here .