android java opencv 2.4 凸壳凸缺陷

Posted

技术标签:

【中文标题】android java opencv 2.4 凸壳凸缺陷【英文标题】:android java opencv 2.4 convexhull convexdefect 【发布时间】:2012-06-13 06:27:54 【问题描述】:

Open-CV 2.4 Android-Java:

我已经搜索过这样的轮廓(MatofPoint 列表):

Imgproc.findContours(roi_mat, contours, hierarchy, cfg.retMode, cfg.apxMode);

然后是凸包(必须是 MatofInt 的列表)

for (int k=0; k < contours.size(); k++)

     Imgproc.convexHull(contours.get(k), hull.get(k));

convexhull 想要一个 MatofInt,而 drawcontours 想要一个 MatofPoint.. 那该怎么办呢?

提前谢谢..


编辑:@OpenCV4android

for (int k=0; k < contours.size(); k++)
    Imgproc.convexHull(contours.get(k), hullInt);

    for(int j=0; j < hullInt.toList().size(); j++)
        hullPointList.add(contours.get(k).toList().get(hullInt.toList().get(j)));
    

    hullPointMat.fromList(hullPointList);
    hullPoints.add(hullPointMat);   


Imgproc.drawContours( mROI, hullPoints, -1,  new Scalar(255,0,0, 255), 1);

【问题讨论】:

【参考方案1】:

看起来 OpenCV Java API 缺少另一个 convehull() 签名:

convexHull(MatOfPoint points, MatOfPoint hull);

就像可以用 C++ 调用一样。

虽然我们没有添加它,但您需要手动创建 MatOfPoint 格式的 hull

使用MatOfPoint::toArray()MatOfPoint::toList() 获取轮廓点 使用MatOfInt::toArray()MatOfInt::toList() 获取船体索引 创建一个新的 Point[]List&lt;Point&gt; 仅包含船体点 通过MatOfPoint::fromArray()MatOfPoint::fromList() 将其转换为MatOfPoint 致电Core.drawContours()

【讨论】:

好吧,我试过这样(有问题的编辑):我不确定它是否完全正确,因为我没有得到好的结果.. 大多数时候只有很多红色凸包线穿过 img.. 或者这是因为 findcontour(我在 findcontour 之前尝试了一个精明和/或阈值和高斯滤波器)【参考方案2】:

在为轮廓添加列表点之前,我们需要 clear hullPointList

hullPointList .clear();
for(int j=0; j < hullInt.toList().size(); j++)
        hullPointList.add(contours.get(k).toList().get(hullInt.toList().get(j)));
    

【讨论】:

以上是关于android java opencv 2.4 凸壳凸缺陷的主要内容,如果未能解决你的问题,请参考以下文章

opencv使用convexityDefects计算轮廓凸缺陷

使用凸壳坐标提取字符 - opencv - python

使用 OpenCV 凸包和凸缺陷函数的手指跟踪/计数

发现凸缺陷?在 OpenCV 2.3 中,c++ 与 MS Visual Studio 2010

在opencv中找到凸性缺陷? [根据给定的输入图像崩溃..]

opencv 9 -- 轮廓 其他操作