#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;
}