1

私は、4 つの異なるベイヤー チャンネル (B、G1、G2、R) に対して 4 つの分離した JPEG 画像を提供するカメラを持っています。

これをカラー画像に変換したい。

私が現在行っているのは、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 画像のデコードであることは明らかです。このコードを高速化するために使用できるアドバイス/トリックはありますか?

4

1 に答える 1

1

まず、プロファイルを作成して、時間がほとんどどこに向かっているのかを確認する必要があります。imdecode()「明確に見える」ように、すべてが含まれている可能性がありますが、間違っている可能性があります。

そうでない場合.at<>()は、少し遅いです (そして、400 万回近く呼び出しています)。画像をより効率的にスキャンすることで、速度を上げることができます。また、必要はありませんfloor()-これにより、intをdoubleに変換してから再度戻すことを回避できます(200万回)。このようなものはより速くなります:

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++;
        }
    }
}
于 2013-07-11T14:18:55.857 に答える