opencv 读取MP4文件并且获取YUV数据的方法

参考文档:https://blog.csdn.net/qq_35859033/article/details/76725390

可以通过这种方法直接解码MP4文件中的视频,除此之外也可以也可以先手动提取MP4中的H.264码流,用于自己分析视频码流或者解码器解码

代码:

int main()  
{  
    Mat edge;  
    VideoCapture dst("zoo.mp4"); 
	FILE *pfOut = NULL;
	int Cnt = 0;
	if((pfOut=fopen("zoo.yuv","wb")) == NULL)
	{
		printf("open in file fail\n");
		return -1;
	}
    while (1)  
    {  
        Mat pic;  
        dst >> pic;  
        if (pic.empty())  
        {  
            break;  
        }  
	Mat yuvImg;
	cvtColor(pic, yuvImg, CV_BGR2YUV_I420);
	fwrite(yuvImg.data,pic.cols*pic.rows*3/2,1,pfOut);
        imshow("mp4", pic);  
       // waitKey(30);
    } 
    fclose(pfOut);
    return 0;  
}

OpenCV可以通过cv::VideoCapture读取常见的视频文件格式,如.avi和.mp4等。然而,在某些应用场景中,我们需要读取yuv格式的原始视频数据,例如压缩算法的研究或像处理的探索。在这种情况下,OpenCV提供了一个cv::VideoCapture类,可以读取yuv格式的视频数据。 使用cv::VideoCapture::open()打开yuv文件时,需要指定文件的路径,并设置四个参数:视频宽度、视频高度、帧率和视频格式。对于yuv文件,格式通常是YUV 4:2:0或YUV 4:2:2。例如: cv::VideoCapture capture; std::string filename = "path/to/yuvfile.yuv"; int width = 1920; int height = 1080; int fps = 30; int format = CV_8UC1; // YUV格式通常为单通道 bool success = capture.open(filename, cv::CAP_ANY); if (!success) { std::cerr << "Error: Failed to open the video file." << std::endl; return -1; } 读取yuv文件时,每个帧通常由Y、U和V三个分量组成。因此,我们需要使用不同的函数读取不同的分量。例如: cv::Mat yuv_image; cv::Mat y_plane(height, width, format); cv::Mat u_plane(height / 2, width / 2, format); cv::Mat v_plane(height / 2, width / 2, format); while (capture.read(yuv_image)) { // 分离y、u、v分量 cv::extractChannel(yuv_image, y_plane, 0); cv::extractChannel(yuv_image, u_plane, 1); cv::extractChannel(yuv_image, v_plane, 2); // 处理y分量 // ... // 将分量合并以重构原始像 cv::Mat bgr_image; cv::merge(std::vector<cv::Mat>{y_plane, u_plane, v_plane}, bgr_image); // 显示像 cv::imshow("Video", bgr_image); cv::waitKey(1); } 需要注意的是,由于yuv文件的像素值通常不是8位,而是10位,12位等,因此需要根据实际情况对像素值进行缩放和偏移。此外,在将Y、U和V三个分量合并以重构原始像之前,需要将U和V分量上采样到与Y分量相同的分辨率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值