dev-logs

[이미지포맷변환] yuv422 to gray 본문

공부/영상처리

[이미지포맷변환] yuv422 to gray

두룹두두 2018. 7. 17. 15:57


yuv422 (yuyv)

yuv 포맷은 Packed 포맷(yuv420, yuv444)과 Planner 포맷(yuv422)으로 나뉜다.






Packed 포맷은 y성분, u성분, v성분이 번갈아가면서 섞인채로 존재 한다. (RGB처럼!)





Planner 포맷은 각 성분의 영역(Plane) 이 따로 존재한다.

그림의 UV Plane에서는 u와 v가 같이 존재하지만, U Plane, V Plane 따로 존재할 수 도 있다.



처음엔 이부분이 헷갈려서 포맷변환 함수를 만드는게 너무 어려웠다.

지금도 어렵지만.... 데이터 구조만 잘 파악하고 있다면, 점점 익숙해질 것 같다.

다음 함수는 yuv422를 1/2배 한 후, 원하는 영역을 crop하여 gray포맷으로 바꾸는 함수이다.  다음에 또 헤메지 않기 위해 저장!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
src : 1920 x 1080 yuyv (1920*1080 *2)
dst : dstW x dstH gray (dstW*dstH)
dst : dstW x dstH gray (dstW*dstH)
dstX : roi의 left top x좌표
dstY : roi의 left top y좌표
dstW : roi의 너비
dstH : roi의 높이
 
 
void cvtYUYY2GRAY(unsigned char *src, unsigned char *dst, int dstX, int dstY, int dstW, int dstH){
    //1920x1080 yuyv를 1/2하고, 원하는 영역을 crop 한다. (960x540 yuyv에서 원하는 영역 crop)
 
    int sum=0;
    int i,j;
    int src_idx, dst_idx=0;
 
    dstX *= 2;//입력밭은 값은 960x540 기준 좌표이므로, 2배 해서 1920x1080 기준으로 맞춘다.
    dstY *= 2;
    dstW *= 2;
    dstH *= 2;
    
    for(i=dstY; i<dstY+dstH; i+=2){
        for(j=dstX; j<dstX+dstW; j+=2){
            sum=0;
            src_idx = (i*1920+j)*2;
            
            sum = src[src_idx] + src[src_idx+2+ src[src_idx+3840+ src[src_idx+3842]; //4개 픽셀의 평균
            sum /= 4;
            
            dst[dst_idx] = sum;
 
            dst_idx++;
        }
    }
}
cs




Comments