Как мне использовать OutputArray в OpenCvSharp?

#c# #opencvsharp

#c# #opencv

Вопрос:

Я пытаюсь использовать функцию Cv2.ApproxPolyDP в OpenCvSharp. Он должен возвращать List<Point> ( Vector<Point> на C ) для параметра approxCurve. Этот параметр имеет тип OutputArray . Кажется, я не могу разобраться в этом, а документация скудна.

Кажется, для OutputArray конструктора нет, и я не могу преобразовать его в List<Point> . Может кто-нибудь сообщить мне (желательно с кодом), как я могу вызвать Cv2.ApproxPolyDP и получить List<Point> ответ для параметра approxCurve?

Спасибо!

Комментарии:

1. Какую версию OpenCvSharp вы используете? версия 4.1.0.20190416 имеет следующую подпись: public static Point[] approxPolyDP (кривая IEnumerable<Point>, двойной эпсилон, bool закрыт);

Ответ №1:

В текущей версии говорится, что «Тип должен соответствовать типу входной кривой».

Вы должны быть в состоянии преобразовать OutputArray в Mat, а затем использовать toArray() для получения списка точек.

Работает ли это?

 OutputArray output;
Cv2.ApproxPolyDP(..., output, ...);
var list = output.ToMat().ToArray();
  

Редактировать: Только что понял, что toArray() — это метод расширения, который мы написали. Это может помочь (без преобразования в CV_64F).

     public static double[,] To2DArray(this Mat mat)
    {
        mat.ConvertTo(mat, MatType.CV_64F);
        if (mat.Rows <= 1)
        {
            m_Log.WarnFormat("1D Mat converted to 2D array, size={0}x{1}", mat.Rows, mat.Cols);
        }
        double[,] arr = new double[mat.Rows, mat.Cols];
        mat.GetArray(0, 0, arr);

        return arr;
    }

    public static double[] ToArray(this Mat mat)
    {
        double[,] array2d = mat.To2DArray();

        int rowCount = array2d.GetLength(0);

        double[] array = new double[rowCount];
        for (int i = 0; i < rowCount; i  )
        {
            array[i] = array2d[i, 0];
        }
        return array;
    }