2013-07-11 3 views
1

У меня есть камера, которая дает 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. Есть ли у кого-нибудь совет/трюк, который я мог бы использовать для ускорения этого кода?

+0

Вы уверены, что не можете установить камеру для вывода изображения необработанного изображения, без разделения канала и без сжатия jpg? Это может быть проблемой с точки зрения пропускной способности, но, несомненно, это ускорит последующую разработку ... – Antonio

+0

Да. Я могу сделать это, выбрав другой режим. Но тогда частота кадров, которую я получаю, явно намного медленнее ... Я хотел бы работать с более высокой частотой кадров. –

+0

Я бы уточнил, где действительно потрачено время. Если он находится на этапе реконструкции изображения BGGR, у вас есть надежда. Если, с другой стороны, время действительно потрачено на imdecode(), я не вижу способа, которым вы можете его оптимизировать. Если шаг реконструкции изображения BGGR - это часть, которая занимает большую часть времени в ваших вычислениях, я предполагаю, что вам нужно заглянуть в код cvtColor и переписать свое собственное преобразование с использованием разных типов ввода. Также проверьте, что вы не тратите время на перераспределение памяти (все эти нули могут быть изменены с помощью setTo (0).) – Antonio

ответ

1

Во-первых, вы должны сделать профиль, чтобы узнать, где в основном идет время. Возможно, это все в imdecode(), так как «кажется ясным», но вы можете ошибаться.

Если нет, .at<>() немного медленнее (и вы вызываете его почти 4 миллиона раз). Вы можете получить ускорение благодаря более эффективному сканированию изображения. Также вам не нужно floor() - это позволит избежать преобразования int, чтобы удвоить и снова вернуться (2 миллиона раз). Что-то вроде этого будет быстрее:

int x , y; 
for(y = 0; y < 1232; y++){ 
    uint8_t* row = Reconstructed.ptr<uint8_t>(y); 
    if(y % 2 == 0){ 
     uint8_t* i0 = imgMat[0].ptr<uint8_t>(y/2); 
     uint8_t* i1 = imgMat[1].ptr<uint8_t>(y/2); 

     for(x = 0; x < 1616;){ 
      //R 
      row[x] = i0[x/2]; 
      x++; 

      //G1 
      row[x] = i1[x/2]; 
      x++; 
     } 
    } 
    else { 
     uint8_t* i2 = imgMat[2].ptr<uint8_t>(y/2); 
     uint8_t* i3 = imgMat[3].ptr<uint8_t>(y/2); 

     for(x = 0; x < 1616;){ 
      //G2 
      row[x] = i2[x/2]; 
      x++; 

      //B 
      row[x] = i3[x/2]; 
      x++; 
     } 
    } 
} 
+0

Спасибо! Это было замечательно. После более точного наблюдения времени я узнал времена для кадра образца были: Время чтения изображения: 0,008328 Время восстановления изображения: 0,041352 Время Debayering: 0,004263 После использования вы раз кода были: Время чтения изображения: 0.008466 Время восстановления изображения: 0,008402 Время Debayering: 0,004364 Это в 4 раза быстрее, восстанавливающего изображения и сохраняет 3 сотых секунды! Я не думаю, что теперь я могу стать лучше! –

Смежные вопросы