Cómo convertir BGR a YUV420
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; p>
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];
} p>
}
cvReleaseImage(&. tmp);
}
Esto obtendrá la imagen en formato yuv420 de Windows.