Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Преобразование между матрицей OpenCV и матрицей int

Автор вопроса: E_learnerОтветов: 1

Я пытаюсь читать видеокадры с помощью openCV, сохранять данные в форме cv::Mat. затем я хочу использовать другой мой код, который принимает "матрицу типа int" для этого видеокадра. Я знаю, что "cvMat" и "матрица типа int" несовместимы. Может быть, я не знаком с opencv, но могу ли я сделать какое-либо преобразование между "cvMat" и "int mat", чтобы я мог использовать свой код для захваченных видеокадров? Я говорю "инт мат", может это и не правильно, но я имею в виду вот что:

cv::Mat videoFrame;
int inputData[600][400];

Я хочу сделать что-то вроде:

inputData = videoFrame;

Спасибо.

c++opencvtype-conversionvideomatrix

Ответы

Ответ 1 · рейтинг 6 · Sam

Быстрый способ - поделиться памятью: копия не нужна. Хотя, если вы измените одну матрицу, другая будет изменена (очевидно!)

int inputData[600][400];
cv::Mat videoFrame(600, 400, CV_32UC1, inputData);

Обратите внимание, что любой дальнейший вызов OpenCV для видеофрейма, который изменяет его тип/размер, будет выделять новый участок памяти, где будет храниться результат.

Если вы хотите иметь отдельные матрицы данных, вы можете использовать memcpy - это самый быстрый способ дублировать данные:

memcpy((char*)inputData, (char*)videoFrame.data, 600*400*sizeof(int) );

Проблема с этим подходом в том, что он совсем не безопасен. Что, если videoFrame не имеет типа int? (скорее всего это уголь). Что, если он не хранится в памяти постоянно (может случиться)? ...

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы