Bayer 변환과 카메라 제어
2021. 1. 6. 20:03ㆍ장비제어개발관한이야기
반응형
안녕하세요. 초보 장비개발자 입니다. 오늘 포스팅 할 내용은 카메라제어 부분에서 BayerConversion 부분입니다. 이 부분은 간단히 말하자면 일종의 압축해제 입니다. 카메라는 BayerPattern 이라는 압축된 형태의 컬러포맷을 프레임그레버쪽으로 전송하게 되고 그것을 다시 RGB 형태로 변환하는 작업을 해야 합니다.
그 BayerPattern 다음과 같습니다.
Bayer변환을 해보자!
이 형태를 기존 데이터의 3배 RGB 형태로 변환하게 됩니다.
변환하는 방법에 따라 여러가지로 나뉘어 집니다.
- Pixel Doubling Interpolation
- Bilinear Interpolation
각 방법에는 속도와 화질에 상관 관계가 있습니다.
자세한 내용은 비전관련 책을 참조 하면 잘 설명이 되있습니다. 저의 목표는 제대로된 영상이 나오는 것이기 때문에 넘어 가도록 하겠습니다.
그리고 각 카메라에 따라 픽셀의 위치가 다음과 같이 여러 포맷이 존재 할 수 있습니다. RGB에 위치차이 만 있을 뿐입니다.
- BayerType - GR
- BayerType - RG
- BayerType - BG
- 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 컬러 영상으로 변환 되는 소스 입니다.
더 자세히 하고 싶지만, 전문 분야가 아니라 여기까지만 설명하고 다음에 기회가 되면 더 자세히 설명해 드리겠습니다.
반응형
'장비제어개발관한이야기' 카테고리의 다른 글
간단한 장비제어를 위한 시리얼 통신(C++/MFC) (3) | 2021.01.07 |
---|---|
[UTIL] Beyond Compare 없으면 안됩니다. (1) | 2021.01.07 |
장비제어에서 소켓통신이 필요한 순간... (1) | 2021.01.06 |
심플하고 강력한 MFC,C++ 용 XML 파서(CMarkup) (0) | 2021.01.05 |
카메라 제어하자 - 공통인터페이스 (0) | 2021.01.05 |