RGB24 <--> YUV422 convert에 관한 내용 부탁....

andro000의 이미지

"RGB24 <--> YUV422 convert하는 프로그램을 만들러 오기"

이걸 할 수 있으려면 어디서부터 무엇을 공부해야 할지... 개념 자체도 사실 잡히질 않습니다.

아무 말씀이나 좋으니 답변 부탁드립니다. "인터넷에 찾아보면 다 나온다" 이런 말씀보다 경험하신 내용 위주로 상세히 적어줬으면 합니다.

부탁드립니다.

익명 사용자의 이미지

사용법은 직접 해보세요.
만든지 오래된거라서 저도 이거 설명드리려면 다시 소스 봐야 되겠네요.

void RGB_YCbCr(int s_Red, int s_Green, int s_Blue, int *s_Y, int *s_Cb, int *s_Cr)
{ /* 변환과정에서 색감 손실이 약 5% 까지 발생 */
#if DEF_USE_RY_TYPE == 0
 /*
  Y  =  0.29900Red + 0.58700Green + 0.11400Blue =   ( 77Red/256) + (150Green/256) + ( 29Blue/256)
  Cb = -0.16874Red - 0.33126Green + 0.50000Blue = - ( 44Red/256) - ( 87Green/256) + (131Blue/256) {+128}
  Cr =  0.50000Red - 0.41869Green - 0.08131Blue =   (131Red/256) - (110Green/256) + ( 21Blue/256) {+128}
 */
 s_Red &= 0xff, s_Green &= 0xff, s_Blue  &= 0xff;
 *s_Y  = (int)(  (( 77 * s_Red) >> 8) + ((150 * s_Green) >> 8) + (( 29 * s_Blue) >> 8)       );
 *s_Cb = (int)( -(( 44 * s_Red) >> 8) - (( 87 * s_Green) >> 8) + ((131 * s_Blue) >> 8) + 128 );
 *s_Cr = (int)(  ((131 * s_Red) >> 8) - ((110 * s_Green) >> 8) - (( 21 * s_Blue) >> 8) + 128 );
 *s_Y  = (int)(  (*s_Y  > 0) ? *s_Y  : 0);  *s_Y  = (int)((*s_Y  < 255) ? *s_Y  : 255        );
 *s_Cb = (int)(  (*s_Cb > 0) ? *s_Cb : 0);  *s_Cb = (int)((*s_Cb < 255) ? *s_Cb : 255        );
 *s_Cr = (int)(  (*s_Cr > 0) ? *s_Cr : 0);  *s_Cr = (int)((*s_Cr < 255) ? *s_Cr : 255        );
#else
 /*
  Y  =  0.29900Red + 0.58700Green + 0.11400Blue =   (19595.264  Red/65536) + (38469.632  Green/65536) + (7471.104  Blue/65536)
  Cb = -0.16874Red - 0.33126Green + 0.50000Blue = - (11058.54464Red/65536) - (21709.45536Green/65536) + (32768.0   Blue/65536) {+128}
  Cr =  0.50000Red - 0.41869Green - 0.08131Blue =   (32768.0    Red/65536) - (27439.26784Green/65536) + (5328.73216Blue/65536) {+128}
 */
 s_Red &= 0xff, s_Green &= 0xff, s_Blue  &= 0xff;
 *s_Y  = (int)(  ((19595 * s_Red) >> 16) + ((38470 * s_Green) >> 16) + ((7471  * s_Blue) >> 16)       );
 *s_Cb = (int)( -((11059 * s_Red) >> 16) - ((21709 * s_Green) >> 16) + ((32768 * s_Blue) >> 16) + 128 );
 *s_Cr = (int)(  ((32768 * s_Red) >> 16) - ((27439 * s_Green) >> 16) - ((5329  * s_Blue) >> 16) + 128 );
 *s_Y  = (int)(  (*s_Y  > 0) ? *s_Y  : 0);  *s_Y  = (int)((*s_Y  < 255) ? *s_Y  : 255        );
 *s_Cb = (int)(  (*s_Cb > 0) ? *s_Cb : 0);  *s_Cb = (int)((*s_Cb < 255) ? *s_Cb : 255        );
 *s_Cr = (int)(  (*s_Cr > 0) ? *s_Cr : 0);  *s_Cr = (int)((*s_Cr < 255) ? *s_Cr : 255        );
#endif
 return;
}

void YCbCr_RGB(int s_Y, int s_Cb, int s_Cr, int *s_Red, int *s_Green, int *s_Blue)
{ /* 변환과정에서 색감 손실이 약 5% 까지 발생 */
#if DEF_USE_RY_TYPE == 0 /* 소수점 이하 3자리까지만 계산 */
 /*
  Red   = 1.00000Y + 1.40200Cr             = s_Y + (359s_Cr{-128}/256)
  Green = 1.00000Y - 0.34414Cb - 0.71414Cr = s_Y - ( 88s_Cb{-128}/256) - (183s_Cr{-128}/256)
  Blue  = 1.00000Y + 1.77200Cb             = s_Y + (454s_Cb{-128}/256)
 */
 s_Y &= 0xff, s_Cb &= 0xff, s_Cr &= 0xff;
 s_Cb -= 128, s_Cr -= 128;
 *(s_Red)   = (int)( s_Y + ((359*s_Cr)/256) );
 *(s_Green) = (int)( s_Y - ((88*s_Cb)/256) - ((183*s_Cr)/256) );
 *(s_Blue)  = (int)( s_Y + ((454*s_Cb)/256) );
#else                   /* 소수점 이하 6자리까지만 계산 */
 /*
  Red   = 1.00000Y + 1.40200Cr             = s_Y + (91881.472  s_Cr{-128}/32768)
  Green = 1.00000Y - 0.34414Cb - 0.71414Cr = s_Y - (22553.55904s_Cb{-128}/32768) - (46801.87904s_Cr{-128}/65536)
  Blue  = 1.00000Y + 1.77200Cb             = s_Y + (116129.792 s_Cb{-128}/32768)
 */
 s_Y &= 0xff, s_Cb &= 0xff, s_Cr &= 0xff;
 s_Cb -= 128;
 s_Cr -= 128;
 *(s_Red)   = (int)( s_Y + ((91881 *s_Cr)/65536) );
 *(s_Green) = (int)( s_Y - ((22554 *s_Cb)/65536) - ((46802*s_Cr)/65536) );
 *(s_Blue)  = (int)( s_Y + ((116130*s_Cb)/65536) );
#endif
 return;
}
keizie의 이미지

yuv/rgb간 변환을 담당하는 플러그인이 따로 있습니다.
그래서 rgb나 yuv로 나오는 플러그인을 변환해서 비디오 장치에 뿌리죠.
http//gnome.or.kr/gallery/view_photo.php?full=1&set_albumName=gnome-apps&id=ahs
에서 colorspace가 그 녀석입니다.

mach의 이미지

andro000 wrote:
"RGB24 <--> YUV422

저도 한참 공부할때, 칼라처리를 해본적이 있는데요. YUV422는 어떤것인가요?
궁금하네요. 상세히 말고 간단히말씀해주시면 고맙겠습니다요.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

mrchu의 이미지

사람의 눈은 색깔보다는 밝기에 더 민감합니다.
이 점을 이용하여 컬러를 표시할 때 컬러를 밝기 부분과 색상 부분으로 나누어서 다른 양의 데이터를 할당하여, 데이터의 축소를 노리는 것이 Yuv계열입니다.
Y는 밝기
uv는 각각 푸른색과 붉은색(반대였던가?)를 나타냅니다.
뒤에 붙는 422라는 숫자는 컴퍼넌트당 정보량을 나타냅니다.
즉 바이트당 밝기 정보에 4비트를 색깔정보에 각각 2비트를 사용해서 표시하는 것이죠.
TV신호에서 사용하고 JPEG, MPEG등에서도 사용합니다.
그외에 YCbCr등 여러가지 변형이 있습니다....

자세한 내용은 책을 보시는걸 추천합니다.
이미지 프로세싱책 아무거나 보시면 잘 나옵니다.

익명 사용자의 이미지

mach wrote:
andro000 wrote:
"RGB24 <--> YUV422

저도 한참 공부할때, 칼라처리를 해본적이 있는데요. YUV422는 어떤것인가요?
궁금하네요. 상세히 말고 간단히말씀해주시면 고맙겠습니다요.

422 은 4는 Y가 4bit를 사용하고 uv가 각각 2비트를 사용하여 색을 표현하는
방식이고요.

보통 색감이 사람이 구분하기 힘들정도의 표현을 가지려면
844 를 쓰는게 좋습니다. (반드시 그런것은 아니고 제 느낌입니다.)

844를 framebuffer에서 어떻게 다루는지 궁굼해 하실분이 있을듯 하여
몇자 더 적어봅니다.
모드가 여러가지 있지만 보통은 다음과 같습니다.

만약 framebuffer의 메모리 크기가 1000000 이라면
0~499999 까지 8비트씩 Y를 가집니다.
그리고 500000~1000000까지가 4/4비트를 가집니다.

ksil의 이미지

비디오를 표현하는 방법은 3가지 정도가 있습니다.
Image Processing에서 쓰이는 가장 대표적인것은 크게 RGB와 YUV가 있습니다.

이중 RGB는 빛의 삼원색을 근거로 한 픽셀을 표현하는데 Red, Green, Blue가지고 표현하는거죠.

그러나 Digital 세상에서 모든 숫자는 정밀도를 가지고 있어서 적당한 선에서 타협을 합니다.

RGB도 그래서 RGB16, RGB24 RGB32등등으로 쓰임에 따라 정보량이 차이가 납니다.

YUV도 비슷합니다. Y는 형태에 관한 정보로 (Gray로 생각하시면 됩니다. 흑백 사진 ?) UV는 색상정보입니다.

YUV 포맷도 각 쓰임에 따라 정보량에 타협을 봅니다.

RGB와 다른점은 RGB는 한 픽셀당 RGB가 각각 대응되는데 비해 YUV는 2X2의 픽셀에 대응 합니다.

YUV444는 RGB처럼 각 픽셀당 YUV값이 대응되는것이고

YUV422는 Y만 각 픽셀에 대응되고 UV는 2X1로 대응이 됩니다.
즉 이미지가 다음과 같이 4개의 픽셀로 이루어졌을때
[00][01] [
[10][11]

Y는
[00][01]
[10][11]

U는(V동일)
[00]
[10]
혹은
[01]
[11] 로 대응됩니다.

이밖에 YUV411과 YUV420등이 있습니다.

보다 자세한 정보는 다음의 링크를 참조하세요

http://www.thedirks.org/v4l2/v4l2fmt.htm
(링크안에 YUV<->RGB변환 공식도 있습니다.)

mach의 이미지

오늘도 한수배워서 ~ 제 자신에게 밥값을 한듯합니다.
감사합니다.
(andro000님께는 죄송합니다요 너그러이 이해를 :lol: )

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.