Ошибка: (-13: неправильный шаг изображения) Шаг должен быть кратным esz1 в функции 'cv :: Mat :: Mat' - PullRequest
1 голос
/ 10 июля 2020

В настоящее время я работаю над фрагментом кода, который должен выполнять матричное умножение двух матриц [3x4] * [4x1], чтобы получить матрицу [3x1]. Для этого я использую Java и OpenCV, поскольку работаю в контексте обработки изображений.

Вот упрощенный фрагмент кода, который я использовал:

Mat projectionMat = new Mat(3,4,CvType.CV_32FC1);
Mat pointI = new Mat(1,4,CvType.CV_32FC1);
Mat transPointI = new Mat(4,1,CvType.CV_32FC1);
Core.transpose(pointI, transPointI);
Mat sUV = new Mat(3,1,CvType.CV_32FC1);

I ' Я избавлю вас от того, как я заполняю матрицы, но когда я выгружаю (распечатываю) их после заполнения, вот что я получаю на терминале: projectionMatrix и transPointI

Итак У меня есть матрицы [3x4] и [4x1], следующим шагом является умножение матриц, которое я пытаюсь достичь с помощью функции openCv Core.gemm, как показано ниже - матрица sUV - это матрица назначения-:

Core.gemm(projectionMat, transPointI, 1, new Mat(), 0, sUV);

Из того, что я понял, здесь все должно работать, но когда я выполняю код, eclipse выдает ошибку, указывающую на строку Core.gemm:

Caused by: CvException [org.opencv.core.CvException: cv::Exception: OpenCV(3.4.10) C:\build\3_4_winpack-bindings-win64-vc14-static\opencv\modules\core\include\opencv2/core/mat.inl.hpp:607:
error: (-13:Image step is wrong) Step must be a multiple of esz1 in function 'cv::Mat::Mat']
at org.opencv.core.Core.gemm_1(Native Method)
at org.opencv.core.Core.gemm(Core.java:3702)

Я немного огляделся и могу Кажется, я не наткнулся на кого-нибудь, кто сталкивался с такой же проблемой. Даже когда возникают ошибки шага изображения, они обычно не вызваны функцией Core.gemm. В любом случае я немного заблудился, поэтому любое решение / подсказка к решению будет более чем приветствоваться, спасибо! :)

1 Ответ

1 голос
/ 10 июля 2020

Ок, оказывается, я нашел ответ на свой вопрос! На самом деле это был вопрос конфликтов типов, все мои матрицы были созданы, чтобы содержать числа с плавающей запятой, что было нормально до последнего умножения, поскольку оно приводило к двойным. Поэтому мне просто пришлось изменить свои матрицы, чтобы они содержали двойные. Для этого я изменил следующее:

Mat projectionMat = new Mat(3,4,CvType.CV_64F);
Mat pointI = new Mat(1,4,CvType.CV_64F);
Mat transPointI = new Mat(4,1,CvType.CV_64F);
Core.transpose(pointI, transPointI);
Mat sUV = new Mat(3,1,CvType.CV_64F);

После этого умножение было выполнено успешно!

...