ConvexHull и OutputArray в OpenCvSharp выпускают проблемы из EMGU CV - PullRequest
0 голосов
/ 20 марта 2019

У меня был проект на 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, и не могу найти ничего, что действительно работает.

Заранее спасибо !!!

...