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

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

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

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

inputData = videoFrame;

Спасибо.


person E_learner    schedule 26.09.2012    source источник


Ответы (1)


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

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? (скорее всего это уголь). Что, если он не хранится в памяти постоянно (может случиться)? ...

person Sam    schedule 26.09.2012
comment
Уважаемый Василий, большое спасибо за ответ. Предложенный вами метод неплохой, но я боюсь играться с распределением памяти. Как вы упомянули, это может быть небезопасно, и у меня уже было много проблем с памятью (не для этого случая). Так может быть другое решение? Я действительно не надеюсь, что мой код может снова умереть из-за проблем с памятью. Еще раз спасибо. - person E_learner; 26.09.2012
comment
Безопасный способ — вообще не использовать inputData. Посмотрите на свой алгоритм и посмотрите, можете ли вы просто использовать только видеофрейм. Дублирование данных иногда является признаком плохого кода. - person Sam; 26.09.2012
comment
При работе с базовыми данными cv::Mat напрямую помните о любых дополнениях, которые может ввести OpenCV, особенно при передаче их другим функциям, которые ожидают непрерывных данных. OpenCV может (и по умолчанию будет) вводить дополнительные отступы между строками, чтобы выровнять их по границам 4 (или 8) байтов. Хотя для 32-битного целого числа (и/или такой круглой ширины строки), вероятно, не будет никакого заполнения, в целом следует помнить об этом. - person Christian Rau; 26.09.2012
comment
Будьте осторожны, чтобы не перепутать ширину и высоту! При указании размеров двумерного массива или cv::Mat его высота предшествует ширине. Итак, с ответом @sammy (и исходным вопросом) мы фактически имеем дело с изображением 400x600, а не с изображением 600x400. - person Efreeto; 09.06.2016