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.