У меня есть камера, которая дает 4 отдельных изображения JPEG для 4 различных каналов Bayer (B, G1, G2, R).OpenCV: объединить разделенные каналы JPEG bayer
Я хочу преобразовать это в цветное изображение.
То, что я делаю в данный момент, распаковывает jpeg, восстанавливает «оригинальное» изображение вручную и преобразует его в цветное изображение с помощью cvtColor. Но это слишком медленно. Как я мог сделать это лучше?
cv::Mat imgMat[4]=cv::Mat::zeros(616, 808, CV_8U); //height, width
for (k=0;k<4;k++) {
........
imgMat[k] = cv::imdecode(buffer, CV_LOAD_IMAGE_GRAYSCALE);
}
//Reconstruct the original image from the four channels! RGGB
cv::Mat Reconstructed=cv::Mat::zeros(1232, 1616, CV_8U);
int x,y;
for(x=0;x<1616;x++){
for(y=0;y<1232;y++){
if(y%2==0){
if(x%2==0){
//R
Reconstructed.at<uint8_t>(y,x)=imgMat[0].at<uint8_t>(y/2,x/2);
}
else{
//G1
Reconstructed.at<uint8_t>(y,x)=imgMat[1].at<uint8_t>(y/2,floor(x/2));
}
}
else{
if(x%2==0){
//G2
Reconstructed.at<uint8_t>(y,x)=imgMat[2].at<uint8_t>(floor(y/2),x/2);
}
else{
//B
Reconstructed.at<uint8_t>(y,x)=imgMat[3].at<uint8_t>(floor(y/2),floor(x/2));
}
}
}
}
//Debayer
cv::Mat ReconstructedColor;
cv::cvtColor(Reconstructed, ReconstructedColor, CV_BayerBG2BGR);
Похоже, что требуется больше времени для декодирования изображений jpeg. Есть ли у кого-нибудь совет/трюк, который я мог бы использовать для ускорения этого кода?
Вы уверены, что не можете установить камеру для вывода изображения необработанного изображения, без разделения канала и без сжатия jpg? Это может быть проблемой с точки зрения пропускной способности, но, несомненно, это ускорит последующую разработку ... – Antonio
Да. Я могу сделать это, выбрав другой режим. Но тогда частота кадров, которую я получаю, явно намного медленнее ... Я хотел бы работать с более высокой частотой кадров. –
Я бы уточнил, где действительно потрачено время. Если он находится на этапе реконструкции изображения BGGR, у вас есть надежда. Если, с другой стороны, время действительно потрачено на imdecode(), я не вижу способа, которым вы можете его оптимизировать. Если шаг реконструкции изображения BGGR - это часть, которая занимает большую часть времени в ваших вычислениях, я предполагаю, что вам нужно заглянуть в код cvtColor и переписать свое собственное преобразование с использованием разных типов ввода. Также проверьте, что вы не тратите время на перераспределение памяти (все эти нули могут быть изменены с помощью setTo (0).) – Antonio