У меня был проект на 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");
Как видите, это было довольно просто, у вас был бы VectorOfVectorOfPoint для контуров и для ConvexHulls, вы могли бы передавать и выводить их и легко итерировать / назначать.
Однако у меня возникла проблема с переносом этого небольшого раздела в OpenCvSharp. Это потому, что OpenCvSharp не использует VectorOfVectorOfPoint или как они называют его VectorOfVectorPoint для любого из них, и оба также различны.
Так, например, контуры - это точка [] [], например:
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, и не могу найти ничего, что действительно работает.
Заранее спасибо !!!