dev-logs
[이미지포맷변환] yuv422 to gray 본문
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 |
'공부 > 영상처리' 카테고리의 다른 글
카메라에서 frame 들어오는 속도 확인하는 법 (0) | 2018.01.19 |
---|---|
3. MFC를 이용한 viewer 만들기_RGB를GRAY로 (2) | 2017.12.15 |
2. MFC를 이용한 viewer 만들기_jpg 불러오기 (1) | 2017.12.15 |
1. opencv 3.0 설치 및 세팅 (0) | 2017.12.15 |
[Android] Android에서 카메라로 동영상 녹화하기-외부저장소에 접근 (0) | 2017.12.07 |
Comments