Laex / Delphi-OpenCV

Project Delphi-OpenCV. Translation of OpenCV library header files in Delphi
500 stars 226 forks source link

cvTransform Why is there an error when executing this function? Help! #163

Closed DimaFantasy closed 1 year ago

DimaFantasy commented 1 year ago

uses ocv.core.types_c;

procedure TransformPoint; var SourcePoint: TCvPoint2D32f; AffineMatrix: pCvMat; TransformedPoint: TCvPoint2D32f; begin // Set the coordinates of the source point SourcePoint.x := 2; SourcePoint.y := 3;

// Create and fill the affine transformation matrix AffineMatrix := cvCreateMat(2, 3, CV_32FC1); cvSetReal2D(AffineMatrix, 0, 0, 1.2); cvSetReal2D(AffineMatrix, 0, 1, 0.3); cvSetReal2D(AffineMatrix, 0, 2, 2.5); cvSetReal2D(AffineMatrix, 1, 0, -0.5); cvSetReal2D(AffineMatrix, 1, 1, 0.8); cvSetReal2D(AffineMatrix, 1, 2, 1.0);

// Perform the transformation of the point cvTransform(@SourcePoint, @TransformedPoint, AffineMatrix);

// Display the results of the transformation Writeln('Source point: (', SourcePoint.x, ', ', SourcePoint.y, ')'); Writeln('Transformed point: (', TransformedPoint.x, ', ', TransformedPoint.y, ')');

// Release resources cvReleaseMat(@AffineMatrix); end;

Why is there an error when executing this function? How can I resolve the problem? Help!

Laex commented 1 year ago

procedure TransformPoint; begin // Точка для преобразование (3D) Var SourcePoint: TCvPoint3D32f; SourcePoint.x := 20; SourcePoint.y := 30; SourcePoint.z := 1;

// Массив (матрица 1х1, т.к. только одна точка) с точками для преобразования // Тип каждого элемента матрицы - CV_32FC3 Var src: TcvMat := cvMat(1, 1, CV_32FC3, @SourcePoint);

// Точка, в которую будет помещен результат (2D)

Var TransformedPoint: TCvPoint3D32f; // Тип каждого элемента матрицы - CV_32FC2 (т.к. выполняет прелбразование из 3D в 2D) Var dst: TcvMat := cvMat(1, 1, CV_32FC2, @TransformedPoint);

//Матрица преобразования 3D в 2D, поэтому размер матрицы 2х3 Var aMatrix: TArray := [1.2, 0.3, 2.5, -0.5, 0.8, 1.0]; // строки матрицы Var AffineMatrix: TcvMat := cvMat(2, 3, CV_32F, @aMatrix[0]);

// Выполняем преобразование точки

cvTransform(@src, @dst, @AffineMatrix); // Выводим результаты преобразования Writeln('Исходная точка: (', SourcePoint.x, ', ', SourcePoint.y, ')'); Writeln('Преобразованная точка: (', TransformedPoint.x, ', ', TransformedPoint.y, ')');

// Т.к. матрицы созданы по ссылкам на точки и массивы - освобождать ничего не надо end;

DimaFantasy commented 1 year ago

Доброго времени суток. Вот код: ///////////////////////////////////////////////////////////////////////////// procedure TransformPoint; var SourcePoint: TCvPoint3D32f; TransformedPoint: TCvPoint2D32f; src: TcvMat; dst: TcvMat; AffineMatrix: TcvMat; AMatrix: array of array of Single; // Multidimensional dynamic array a,b: Integer; begin // Инициализируем исходную точку SourcePoint.x := 10; SourcePoint.y := 10; SourcePoint.z := 1;

// Инициализируем матрицу для исходной точки src := cvMat(1, 1, CV_32FC3, @SourcePoint);

// Инициализируем матрицу для результирующей точки dst := cvMat(1, 1, CV_32FC2, @TransformedPoint);

// Инициализируем матрицу преобразования 3D в 2D (матрица размерности 2x3) SetLength(AMatrix, 2, 3); AMatrix[0, 0] := 2.2; AMatrix[0, 1] := 2.3; AMatrix[0, 2] := 2.5; AMatrix[1, 0] := -1.5; AMatrix[1, 1] := 2.8; AMatrix[1, 2] := 2.0;

AffineMatrix := cvMat(2, 3, CV_32F, @AMatrix[0, 0]);

// Выполняем преобразование cvTransform(@src, @dst, @AffineMatrix);

Writeln('Исходная точка: (', SourcePoint.x, ', ', SourcePoint.y, ')'); Writeln('Преобразованная точка: (', TransformedPoint.x, ', ', TransformedPoint.y, ')'); End; /////////////////////////////////////////////////////////////////////////////////////////////////

Благодарю за ответ! Пропала ошибка при вызове cvTransform(@src, @dst, @AffineMatrix); Осталась она проблема, преобразуется только X. Y всегда НОЛЬ. Есть ли у вас мнение почему? Заранее благодарен за ответ!

Laex commented 1 year ago

Надо задавать Var aMatrix: TArray := [1.2, 0.3, 2.5, -0.5, 0.8, 1.0];

Если задавать aMatrix: array of array of Single; Каждая строчка храниться в своем участке памяти и располагается в памяти не одна за другой. Это похоже на язык С, когда объявляют двумерный массив в виде int** aMatrix;

DimaFantasy commented 1 year ago

Доброго времени суток. Вот модифицированный код по вашему совету: /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TForm1.Button3Click(Sender: TObject); var SourcePoint: TCvPoint3D32f; TransformedPoint: TCvPoint2D32f; src: TcvMat; dst: TcvMat; AffineMatrix: TcvMat; AMatrix: array of float; a,b: Integer; begin

// Инициализируем исходную точку SourcePoint.x := 10; SourcePoint.y := 20; SourcePoint.z := 1;

// Инициализируем матрицу для исходной точки src := cvMat(1, 1, CV_32FC2, @SourcePoint);

// Инициализируем матрицу для результирующей точки dst := cvMat(1, 1, CV_32FC2, @TransformedPoint); // Do not pass @TransformedPoint here

// Инициализируем матрицу преобразования 2D (матрица размерности 2x3) SetLength(AMatrix, 6); AMatrix := [1.2, 0.3, 2.5, -0.5, 0.8, 1.0];

AffineMatrix := cvMat(2, 3, CV_32F, @AMatrix[0]);

// Выполняем преобразование cvTransform(@src, @dst, @AffineMatrix);

WritelnToMemo(MemoCONSOLE, 'Исходная точка: %.15f %.15f', [SourcePoint.x, SourcePoint.y]); WritelnToMemo(MemoCONSOLE, 'Преобразованная точка: %.15f %.15f', [TransformedPoint.x, TransformedPoint.y]); end; ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Этот код работает безупречно!

Дорогой Laentir Valetov,

Я хочу выразить огромную благодарность за вашу помощь в решении проблемы с проектом Delphi-OpenCV. Без вашей помощи я бы, вероятно, так и не справился с этой задачей!

Ваш титанический труд с проектом и профессиональные знания в сфере Delphi-OpenCV являются поистине впечатляющими. Вы помогли мне найти правильное решение!

Я очень признателен за ваше терпение и доброту во время нашего общения!

Желаю вам огромных успехов в ваших проектах и достижения новых высот. Ваш вклад в сообщество программистов неоценим, и я уверен, что ваша помощь будет вдохновлять многих других так же, как и меня.

Пусть удача всегда сопутствует вам во всех ваших начинаниях!

Еще раз огромное спасибо за вашу доброту, отзывчивость и помощь!

С наилучшими пожеланиями и искренней благодарностью, Дима aka Fantasy