Демозаика с помощью opencv
Я застрял, пытаясь понять, как использовать функцию демозаики opencv. У меня установлен OpenCV 4.4.0 с скомпилированной поддержкой CUDA, и пока, как мне кажется, мне нужно сделать следующее:
- Прочитать необработанные данные изображения
- Загрузить необработанные данные изображения в объект Mat
- Загрузите данные Mat в GpuMat (загрузка хоста на устройство)
- Демозаика
- Загрузите данные GpuMat (устройство для загрузки) в объект Mat
- Отобразите или запишите результат
Вот фрагмент кода, который у меня есть.
ifstream ifs("image.raw", ios_base::binary);
ifs.read(buffer, length);
// snip ...buffer contains the entire file...
Mat src_host(6464, 4860, CV_16UC1, buffer);
GpuMat dst, src;
src.upload(src_host);
// Debayer here
cv::cuda::demosaicing(src, dst, COLOR_BayerRG2BGR);
// have a look
Mat result_host;
dst.download(result_host);
namedWindow("Debayered Image", WINDOW_KEEPRATIO);
resizeWindow("Debayered Image", 6464/5, 4860/5);
imshow("Debayered Image", result_host);
waitKey(0);
У меня есть необработанные кадры с камер, которые имеют 12 бит на пиксель, RGGB, размеры 6464 x 4860. Я не уверен, как указать это для OpenCV с точки зрения ширины и высоты, какой CV_TYPE дать ему, читаю ли я и правильная загрузка данных для демозаики, какой COLOR_code дать им для демозаики и как загрузить результат для отображения и сохранения в файл (желательно подпрограмма высокого уровня для записи png или подобного).
Кто-нибудь знает, на правильном пути я или нет?
Благодаря! Джеймс
1 ответ
Да, я на правильном пути. Строки и столбцы случайно меняются местами, поэтому исправленный код:
ifstream ifs("image.raw", ios_base::binary);
ifs.read(buffer, length);
// snip ...buffer contains the entire file...
Mat src_host(4860, 6464, CV_16UC1, buffer);
GpuMat dst, src;
src.upload(src_host);
// Debayer here
cv::cuda::demosaicing(src, dst, COLOR_BayerRG2BGR);
// have a look
Mat result_host;
dst.download(result_host);
namedWindow("Debayered Image", WINDOW_KEEPRATIO);
resizeWindow("Debayered Image", 4860/2, 6464/2);
imshow("Debayered Image", result_host);
waitKey(0);
Хотя данные датчика являются 12-битными, каждые 12 бит находятся внутри 16 бит, что значительно упрощает работу с ними.