从EMGU CV移植OpenCvSharp中的ConvexHull和OutputArray问题

时间:2019-03-20 19:21:58

标签: c# opencv emgucv opencvsharp

我有一个C#项目,使用EMGU CV可以正常工作。但是,EMGU有一些问题和局限性,而OpenCvSharp显然没有。因此,我一直在移动所有现有代码以使用OpenCvSharp而不是EMGU,这具有挑战性,因为OpenCvSharp调用与OpenCV更相似,因此与EMGU有很大不同。

这些差异之一是如何获取ConvexHull,这就是我遇到的问题。这是一个跟踪移动物体的系统。使用EMGU,我首先获取轮廓,然后获得轮廓,然后迭代轮廓以获取每次迭代的ConvexHull。 EMGU为所有这些使用了一个称为VectorOfVectorOfPoint的对象。 EMGU看起来像这样:

Mat imgThreshCopy = imgThresh.Clone();

VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();

CvInvoke.FindContours(imgThreshCopy, contours, null/* TODO Change to default(_) if this is not a reference type */, RetrType.External, ChainApproxMethod.ChainApproxSimple);

drawAndShowContours(imgThresh.Size(), contours, "imgContours");

VectorOfVectorOfPoint convexHulls = new VectorOfVectorOfPoint(contours.Length);

for (int i = 0; i <= contours.Length - 1; i++)
    CvInvoke.ConvexHull(contours[i], convexHulls[i]);

drawAndShowContours(imgThresh.Size(), convexHulls, "imgConvexHulls");

如您所见,这非常简单,对于轮廓和ConvexHulls,您将拥有VectorOfVectorOfPoint,您可以将它们传入和传出,并轻松地进行迭代/分配。

但是,将这个小部分移植到OpenCvSharp时遇到了问题。这是因为OpenCvSharp不使用VectorOfVectorOfPoint或因为它们中的任何一个都使用VectorOfVectorPoint,而且两者也有所不同。

例如,轮廓是这样的Point [] []:

OpenCvSharp.Point[][] contours;
HierarchyIndex[] hierarchyIndices;

Cv2.FindContours(imgThreshCopy, out contours, out hierarchyIndices, RetrievalModes.External, ContourApproximationModes.ApproxSimple);

drawAndShowContours(new Size(imgThreshCopy.Width, imgThreshCopy.Height), contours, "Contours");

我认为这适用于轮廓。但是,ConvexHull调用是InputArray和OutputArray吗?我不知道如何将Point [] []轮廓投射到InputArray中以传递给ConvexHull,此外,输出的正确OutputArray是什么?我有一件事情接近工作,但我的for循环迭代无法工作。

我已经使用OpenCvSharp搜索并搜索了countours和复杂船体的示例/示例,但找不到任何有效的方法。

提前谢谢!

0 个答案:

没有答案