Bayer 변환과 카메라 제어

2021. 1. 6. 20:03장비제어개발관한이야기

반응형

안녕하세요. 초보 장비개발자 입니다. 오늘 포스팅 내용은 카메라제어 부분에서 BayerConversion 부분입니다. 부분은 간단히 말하자면 일종의 압축해제 입니다. 카메라는 BayerPattern 이라는 압축된 형태의 컬러포맷을 프레임그레버쪽으로 전송하게 되고 그것을 다시 RGB 형태로 변환하는 작업을 해야 합니다.

 

BayerPattern 다음과 같습니다.

 

Bayer변환을 해보자!

 

 

형태를 기존 데이터의 3 RGB 형태로 변환하게 됩니다.

 

변환하는 방법에 따라 여러가지로 나뉘어 집니다.

  1. Pixel Doubling Interpolation
  2.  Bilinear Interpolation

 

방법에는 속도와 화질에 상관 관계가 있습니다.

자세한 내용은 비전관련 책을 참조 하면 설명이 되있습니다. 저의 목표는 제대로된 영상이 나오는 것이기 때문에 넘어 가도록 하겠습니다.

 

그리고 카메라에 따라 픽셀의 위치가 다음과 같이 여러 포맷이 존재 있습니다. RGB 위치차이 있을 뿐입니다.

 

  1. BayerType - GR
  2. BayerType - RG
  3. BayerType - BG
  4. BayerType - GB

 

 

소스코드

 소스를 보면 어떻게 하는 건가 알꺼라 생각됩니다. 가장 간단한 형태의 베이어 컨버전을 구현한 것입니다.

 

int BayerConversionAvg_GB_Normal(BAYER_CONVERSION_INFO tInfo)
{
    int iW = tInfo.iImageW;
    int iH = tInfo.iImageH;
    int iSize = iW*iH;
    unsigned char* pucBayer = tInfo.pucBayer;
    unsigned char* pucR = tInfo.pucR;
    unsigned char* pucG = tInfo.pucG;
    unsigned char* pucB = tInfo.pucB;
 
    int iOddX, iOddY;
    int iPos, iPos0, iPos1, iPos2, iPos3, iPos4, iPos5, iPos6, iPos7; // colok-wise
    int iYM, iYC, iYP, iXM, iXC, iXP; // minus, current, plus
 
    for(int y=0; y<iH; y++)
    {
        iYC = y*iW;
        iYM = iYC-iW;
        iYP = iYC+iW;
        if(iYM<0) iYM = iYP;
        if(iYP>=iSize) iYP = iYM;
 
        iOddY = y%2;
 
        for(int x=0; x<iW; x++)
        {
            iXC = x;
            iXM = iXC-1;
            iXP = iXC+1;            
            if(iXM<0) iXM = iXP;
            if(iXP>=iW) iXP = iXM;
 
            iPos = iYC + iXC;
            iOddX = x%2;
            
            if(!iOddX && !iOddY)
            {
                iPos1 = iYM + iXC;
                iPos3 = iYC + iXP;
                iPos5 = iYP + iXC;
                iPos7 = iYC + iXM;
 
                pucR[iPos] = (unsigned char)( (pucBayer[iPos1] + pucBayer[iPos5])/2.0f + 0.5f );
                pucG[iPos] = pucBayer[iPos];
                pucB[iPos] = (unsigned char)( (pucBayer[iPos7] + pucBayer[iPos3])/2.0f + 0.5f );
            }
            else if(!iOddX && iOddY)
            {
                iPos0 = iYM + iXM;
                iPos1 = iYM + iXC;
                iPos2 = iYM + iXP;
                iPos3 = iYC + iXP;
                iPos4 = iYP + iXP;
                iPos5 = iYP + iXC;
                iPos6 = iYP + iXM;
                iPos7 = iYC + iXM;
 
                pucR[iPos] = pucBayer[iPos];
                pucG[iPos] = (unsigned char)( (pucBayer[iPos1] + pucBayer[iPos3] + 
                    pucBayer[iPos5] + pucBayer[iPos7])/4.0f + 0.5f );
                pucB[iPos] = (unsigned char)( (pucBayer[iPos0] + pucBayer[iPos2] + 
                    pucBayer[iPos4] + pucBayer[iPos6])/4.0f + 0.5f );
            }
            else if(iOddX && !iOddY)
            {
                iPos0 = iYM + iXM;
                iPos1 = iYM + iXC;
                iPos2 = iYM + iXP;
                iPos3 = iYC + iXP;
                iPos4 = iYP + iXP;
                iPos5 = iYP + iXC;
                iPos6 = iYP + iXM;
                iPos7 = iYC + iXM;
 
                pucR[iPos] = (unsigned char)( (pucBayer[iPos0] + pucBayer[iPos2] + 
                    pucBayer[iPos4] + pucBayer[iPos6])/4.0f + 0.5f );
                pucG[iPos] = (unsigned char)( (pucBayer[iPos1] + pucBayer[iPos3] + 
                    pucBayer[iPos5] + pucBayer[iPos7])/4.0f + 0.5f );
                pucB[iPos] = pucBayer[iPos];
            }
            else
            {
                iPos1 = iYM + iXC;
                iPos3 = iYC + iXP;
                iPos5 = iYP + iXC;
                iPos7 = iYC + iXM;
 
                pucR[iPos] = (unsigned char)( (pucBayer[iPos7] + pucBayer[iPos3])/2.0f + 0.5f );
                pucG[iPos] = pucBayer[iPos];
                pucB[iPos] = (unsigned char)( (pucBayer[iPos1] + pucBayer[iPos5])/2.0f + 0.5f );
            }
        }
    }
 
    return 0;
}

 

 

주위에 픽셀을 통해 기존 12M카메라의 Raw 영상의 3 36M 컬러 영상으로 변환 되는 소스 입니다.

자세히 하고 싶지만, 전문 분야가 아니라 여기까지만 설명하고 다음에 기회가 되면 자세히 설명해 드리겠습니다.

반응형