Вот пример с OpenCV:
#include <cv.h>
#include <highgui.h>
int
main(int argc, char **argv)
{
cv::VideoCapture capture(argv[1]);
if (capture.grab())
{
cv::Mat_<char> frame;
capture.retrieve(frame);
//
// Convert to your byte array here
//
}
return 0;
}
Он не тестировался, но я убрал его из некоторого существующего рабочего кода, поэтому вам не понадобится много времени, чтобы он заработал.
cv::Mat_<unsigned char>
по сути является байтовым массивом. Если вам действительно нужно что-то явно типа unsigned char *
, то вы можете использовать malloc пространства соответствующего размера и выполнять итерации по матрице, используя
Вы можете преобразовать cv::Mat
в байтовый массив, используя позиции пикселей (cv::Mat_::at()
) или итераторы (cv::Mat_::begin()
и друзья).
Существует множество причин, по которым библиотеки редко предоставляют данные изображения в виде простого указателя, например:
- Это означает, что все изображение должно занимать непрерывное пространство в памяти. Это большое дело при работе с большими изображениями
- Требуется зафиксировать определенный порядок данных (пиксель по сравнению с неплоскими - плоскости RGB хранятся с перемежением или раздельно?) И снижает гибкость
- Разыменование указателей является причиной ошибок (переполнения буфера и т. Д.).
Так что, если вы хотите указатель, вы должны немного поработать для него.