我有一个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和复杂船体的示例/示例,但找不到任何有效的方法。
提前谢谢!