Red de conocimiento informático - Material del sitio web - Cómo convertir BGR a YUV420

Cómo convertir BGR a YUV420

Primero use la función opencv para abrir este dispositivo y obtener la imagen

CvCapture* m_pCapture;

IplImage* m_pFrameImage;

m_pCapture = cvCaptureFromCAM(0);

m_pFrameImage = cvQueryFrame(m_pCapture);

// Utilice el software RawPlayer.exe para guardar el formato yuv420 convertido como un archivo. exe para comprobar si el formato del archivo se ha convertido correctamente

int fd;

fd = open(" file420.yuv",O_WRONLY|O_CREAT|O_APPEND);

Esto se obtendrá una imagen en formato 640*480 bgr;

Para convertir a formato 240*320 yuv420

img_cvsize.width = 320;

img_cvsize.height = 240 ;

IplImage*dst=cvCreateImage(img_cvsize,m_pVideoInfor->m_pFrameImage->profundidad,m_pVideoInfor->m_ pFrameImage->nChannels);

cvResize(m_pVideoInfor ->m_pFrameImage, dst, CV_INTER_LINEAR);

Comenzar a convertir el formato yuv420

uchar * yuv;

yuv = (unsigned char *)malloc(srcwidth*srcheight *3/2);

Llamar a la función para convertir

ipimage_to_yuv420(dst,yuv);

Escribir en el archivo después de la conversión exitosa.

write(fd,yuv,srcwidth*srcheight*3/2);

La función de conversión es la siguiente:

void MainWindow::iplimage_to_yuv420(IplImage * dst, uchar * yuv)

{

uchar *out_y = yuv;

uchar *out_u = yuv+320*240;

uchar *out_v = out_u +(320*240)/4; m_pFrameImage->nChannels);

cvCvtColor(dst,tmp,CV_RGB2YCrCb);

int idx_in = 0;

int idx_out = 0;

int idx_out = 0;

int idx_out_y = 0;

int idx_out_u = 0;

int idx_out_v = 0;

for(int j = 0; j < dst-> altura;j+=1){

idx_in = j*dst-> widthStep;

for(int i = 0; i < dst->widthStep;i+=12){

out_y[idx_out_y] = tmp->imageData[idx_in +i +0 ];

idx_out_y++ )

out_y[idx_out_y] = tmp->imageData[idx_in +i +3];

idx_out_y++;

out_y[ idx_out_y] = tmp->imageData[idx_in +i +6];

idx_out_y++;

out_y[idx_out_y] = tmp->imageData[idx_in +i +9] ;

idx_out_y++;

p>

idx_out_y++;

if ((j % 2) == 0){

out_u[idx_out _u++] = tmp->imageData[idx_in+i+1] ;

out_u[idx_out_u++] = tmp->imageData[idx_in+i+7];

out_v [idx_out_v++] = tmp->imageData[idx_in+i+2];

out_v[idx_out_v++] = tmp->imageData[idx_in+i+8];

}

}

cvReleaseImage(&. tmp);

}

Esto obtendrá la imagen en formato yuv420 de Windows.