Я пытаюсь читать видеокадры с помощью openCV, сохранять данные в форме cv::Mat. затем я хочу использовать другой мой код, который принимает "матрицу типа int" для этого видеокадра. Я знаю, что "cvMat" и "матрица типа int" несовместимы. Может быть, я не знаком с opencv, но могу ли я сделать какое-либо преобразование между "cvMat" и "int mat", чтобы я мог использовать свой код для захваченных видеокадров? Я говорю "инт мат", может это и не правильно, но я имею в виду вот что:
cv::Mat videoFrame;
int inputData[600][400];
Я хочу сделать что-то вроде:
inputData = videoFrame;
Спасибо.
Ответ 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? (скорее всего это уголь). Что, если он не хранится в памяти постоянно (может случиться)? ...