福州大学《嵌入式系统综合设计》 实验十一:OpenCV视频解码

一、实验目的

掌握OpenCV视频解码的流程,对比和FFMPEG的区别。

二、实验内容

搭建实验开发环境,编译并运行解码程序,对编码后的视频码流通过OpenCV进行解码。

三、开发环境

开发主机:Ubuntu 20.04.6 LTS

硬件:算能SE5

四、实验器材

开发主机 + 云平台(或SE5硬件)

五、实验过程与结论

OpenCV解码原理与流程

OpenCV也支持对视频进行解码,OpenCV内部对FFMPEG进行封装,实际还是调用FFMPEG接口。

但OpenCV对外提供了简易的接口,可以快速调用实现视频的解码。

OpenCV中用mat这种数据结构来表示图片,比如利用OpenCV通过下面方法即可快速实现对视频文件的解码:

cpp 复制代码
//初始化VideoCapture类
VideoCapture cap;

//打开文件或者摄像头或者某个RTSP连接
cap.open(argv[1], CAP_FFMPEG, card); 

//读取视频帧存入image中
Mat image;
cap.read(image);   

OpenCV也支持通过VideoCapture类接口设置一些解码参数,比如输出的格式类型、长宽等:

cpp 复制代码
//设置输出的高和宽
cap.set(CAP_PROP_FRAME_HEIGHT, (double)h);  
cap.set(CAP_PROP_FRAME_WIDTH, (double)w);

//设置输出为YUV数据格式
cap.set(cv::CAP_PROP_OUTPUT_YUV, PROP_TRUE);

需要注意的是,OPENCV由于内部采用了硬件加速处理,如果需要对处理后的图片或者数据进行CPU处理,如保存文件等操作,需要执行内存同步操作,参考如下:

cpp 复制代码
//内存同步到CPU
bmcv::downloadMat(image);
for (int i = 0; i < image.avRows(); i++) {  
    fwrite((char*)image.avAddr(0)+i*image.avStep(0),1,image.avCols(),dumpfile);
}
for (int i = 0; i < image.avRows()/2; i++) {
    fwrite((char*)image.avAddr(1)+i*image.avStep(1),1,image.avCols()/2,dumpfile);
}
for (int i = 0; i < image.avRows()/2; i++) {
    fwrite((char*)image.avAddr(2)+i*image.avStep(2),1,image.avCols()/2,dumpfile);
}
实验过程

具体的实验过程与上一实验过程类似,这里不做赘述。

相关推荐
机器学习之心18 分钟前
5 个特征、2 个输出:让 DBO 替 CNN-Transformer 挑结构,再用 SHAP 把黑箱撬开
人工智能·cnn·transformer·cnn-transformer
深蓝AI1 小时前
45 万星的开源逆向 MCP:REA 让 Agent 无源码读懂任意应用,把证据和边界写进设计
人工智能·程序员
弯_弯5 小时前
AI 项目验收:别在上线那天才谈怎么算成
人工智能·企业ai落地·企业ai培训·fde
.道阻且长.5 小时前
AI 按数据模态分类:计算机视觉、NLP、语音处理,一篇理清
人工智能·计算机视觉·分类
Java后端的Ai之路5 小时前
RAG 还是 Agent 自主检索?Claude Code 删掉向量库之后,我把选型讲透了
开发语言·人工智能·prompt·agent·rag
笃行3506 小时前
用 Rokid AIUI 开发日语学习助手
人工智能
段一凡-华北理工大学8 小时前
工业智能体:从Codex/Claude到项目实战~系列文章06:一张蓝图看懂“工业智能体×高炉炼铁“
人工智能·claude·codex·工业智能体·高炉炼铁智能化·高炉智能体技术栈
怕浪猫8 小时前
十个人,630 万订阅:一张 AI 学习清单里的五种老师
人工智能
JonaHu9 小时前
5分钟搭建帮你赚钱的 AI API 网站:从品牌门户到客户 Key 交付
人工智能·api·开发者·ai创业·acedatacloud
Csvn9 小时前
模型挂了全站 502?降级链让它先保住“有响应”(R04)
人工智能·aigc·agent