Blackmagic frame: конвертировать из yuv в RGB для использования в openCV

У меня проблема с преобразованием изображения, полученного с камеры в формате YUV, в формат RGB.

Для этого используется следующая функция:

int uwidth = 1920;
int uheight= 1080;

int i = 0,j = 0, r = 0, g = 0, b = 0;
typedef unsigned char BYTE;
IplImage* m_RGB = cvCreateImage(cvSize(uwidth, uheight), IPL_DEPTH_8U, 3);
unsigned char* pData = (unsigned char *) frameBytes;

for(i = 0, j=0; i < uwidth * uheight*3 ; i+=6, j+=4)
{
   unsigned char u = pData[j];
   unsigned char y = pData[j+1];
   unsigned char v = pData[j+2];

   b = 1.0*y + 8 + 1.402*(v-128);
   g = 1.0*y - 0.34413*(u-128) - 0.71414*(v-128);
   r = 1.0*y + 1.772*(u-128);

   if(r>255) r =255;
   if(g>255) g =255;
   if(b>255) b =255;
   if(r<0)   r =0;
   if(g<0)   g =0;
   if(b<0)   b =0;

   m_RGB->imageData[i] = (BYTE)(r*220/256);
   m_RGB->imageData[i+1] = (BYTE)(g*220/256);
   m_RGB->imageData[i+2] =(BYTE)(b*220/256);

}

cvNamedWindow("ck", CV_WINDOW_AUTOSIZE);
cvShowImage( "ck", m_RGB );
cvReleaseImage(&m_RGB);

Проблема в том, что у нас на экране не одно, а два изображения, и у нас хорошие цвета, но не хорошее соотношение.

У кого-нибудь есть идеи по поводу этих проблем?

Изменить: вывод изображения

2 ответа

Давайте предположим imageData определяется как

BYTE* imageData;

В этом случае этот цикл говорит о многом:

for(i = 0, j=0; i < uwidth * uheight*3 ; i+=6, j+=4)

i+=6 означает, что каждый раз, когда вы устанавливаете пиксель, вы пропускаете следующий пиксель (или то, что вы ожидали сделать, устанавливайте 2 пикселя за раз).

j+=4
unsigned char u = pData[j];
unsigned char y = pData[j+1];
unsigned char v = pData[j+2];

Означает, что формат вашей камеры - UYVY:

  • Он описывает два последовательных пикселя P0 и P1
  • Канал цветности одинаков для P0 и P1.U = U0 = U1 а также V = V0 = V1
  • Канал просвета другой. первый для P0, второй для P1.

Вам нужно установить 2 пикселя итерациями:

m_RGB->imageData[i] = r1;
m_RGB->imageData[i+1] = g1;
m_RGB->imageData[i+2] =b1;
m_RGB->imageData[i+3] = r2;
m_RGB->imageData[i+4] = g2;
m_RGB->imageData[i+5] =b2;

Разница между r1 а также r2 (и другие), что вы используете два разных Y в формуле преобразования.

Если вы программируете для Mac, взгляните на последние добавления в библиотеку преобразования vImage в OSX 10.9 и даже 10.10. Вещи там действительно потрясающие. Я делал свои собственные 24-битные в 32-битные преобразования и отточил их до 6 мс / кадр (1920x1080). Быстро выдувается из воды с помощью изображения более 15X.

Другие вопросы по тегам