opencv学习笔记(3):图像和视频的读取(C++)

我们知道,OpenCV是一个计算机视觉的开源库,它最基本也最重要的功能肯定是对图像和视频的处理。这个章节学习基本的图像和视频的读取。

1. 图像读取与保存:

1.1 图像读取:

在OpenCV中,使用cv::imread()函数来读取和加载图像,该函数的形式如下。

Mat cv::imread(const String & filename, int flags = IMREAD_COLOR)

可以看到,imread()函数的定义非常简单,其解析如下。

返回值Mat 类型:返回读取的图像,读取图像失败时返回一个空的矩阵对象(Mat::data == NULL)。
参数filename:读取图像的文件名,可以使用相对路径或者绝对路径,但必须带完整的文件扩展名(图像格式后缀)。
参数flags:一个读取标记,用于选择读取图像的方式,默认值为IMREAD_COLOR,flags值的设定与用什么颜色格式读取图像有关。

下面举例

(确保你已经配置好了opencv环境)

//使用VS时的头文件
#include <opencv2/opencv.hpp>
#include <iostream>using namespace std;
using namespace cv;//使用Qt时的头文件
#include <iostream>#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace cv;
using namespace std;void test01()
{// 1.读取图像// cv::imread 功能是加载图像文件成为一个Mat对象。Mat image = imread("C:/Users/27844/Desktop/icon.jpg",IMREAD_GRAYSCALE);if (image.empty()){cout << "图片为空!" << endl;return;}// 2.显示图像// cv::namedWindow的功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,用户无需销毁它。namedWindow("window", WINDOW_AUTOSIZE);imshow("window", image);// waitKey(0); 等待键盘输入,不加这句,窗口会一闪而逝waitKey(0);
}

下面为代码中用到的函数做解释: 

  • imshow():用来显示图像的函数。函数定义为cv::imshow ( const String & winname, InputArray mat )。参数const String & winname为显示的窗口名,可以使用cv::namedWindow()函数创建窗口,如不创建,imshow()函数将自动创建;参数InputArray mat为待显示的图像。需要注意的是,imshow()函数之后必须有waitKey()函数,否则显示窗口将一闪而过,不会驻留屏幕。inputArray这个接口类可以是Mat、Mat_<T>、Mat_<T, m, n>、vector<T>、vector<vector<T>>、vector<Mat>,也就意味着函数的参数类型是InputArray型时,把上述几种类型作为参数都可以。另外,OutputArrayOfArrays、InputOutputArray、InputOutputArrayOfArrays都是OutputArray的别名。
  • waitKey():OpenCV中的内置函数,语句waitKey(0)表示“暂停程序,等待一个按键输入”,也就是说,当程序执行到waitKey(0)时暂停运行,只有当用户按下一个按键时,它才会继续运行。参数中的 0 表示等待时间,0表示无限等待。

1.2 图像保存:   

同图像读取类似,OpenCV中使用cv::imwrite()函数实现将图像保存到指定的文件,该函数定义如下。

bool cv::imwrite(const String & filename,
InputArray img,
const std::vector<int> & params = std::vector<int>() );

imwrite()函数的参数解析如下。

  • const String & filename:需要保存图像的文件名,要保存图像为哪种格式,就带什么扩展名。
  • InputArray img:要保存的图像。
  • const Std::Vector <int> & params:表示为特定格式保存的参数编码。

举例: 

    Mat image(2,2,CV_8UC3,Scalar(0,255,255));cout<<"矩阵元素"<<endl<<image<<endl;//   将图像保存if(imwrite("D:/test.jpg",image)){cout<<"图片保存成功!"<<endl;}else{cout<<"图片保存失败!"<<endl;}

2. 视频读取与保存:

 2.1视频的读取:

 opencv使用 cv::VideoCapture类来读取视频。

视频是由一帧一帧的画面构成,读取视频的过程就是一帧一帧地读取视频帧,读一帧,放到一个Mat对象里面,然后在进行显示。

视频的读取操作步骤如下:

(1)创建cv::VideoCapture的对象。

(2)验证视频读取是否成功。
(3)验证完成,开始读取视频。

VideoCapture对象的创建方式有三种,如下面代码所示: 

// VideoCapture对象创建// (1)从文件读取视频VideoCapture capture("");// (2)从视频捕捉设备读取//  这种情况下,可以给出一个标识符,用于表示想要访问的视频捕捉设备,及其与操作系统的握手方式。//  对于视频捕捉设备而言,这个标识符就是一个标识数字——如果只有一台视频捕捉设备,那么就是0,//  如果系统中有多台视频捕捉设备,那么增加标识数字的值即可。VideoCapture capture2(0);// (3)仅创建一个捕获对象,而不提供任何关于打开的信息。// 对象创建以后通过成员函数open()来设定打开的信息。open()操作也有以下两种方式。VideoCapture cap;cap.open( "my_video.avi"); //第一种方式打开视频文件cap.open(0); //第二种方式打开视频捕捉设备// 打开视频后,需要将视频帧读取到cv::Mat矩阵中,共有两种方式,一种是read()操作,另一种是>>操    // 作。示例如下。cv::Mat frame;cap.read(frame); //读取方式一cap >> frame; //读取方式二

示例代码:

//(1)创建cv::VideoCapture的对象。cv::VideoCapture capture("D:/images/test1.mp4");
//参数类型为const string&,即从文件中读取,若设置为0则读取视频捕捉设备。//(2)验证视频读取是否成功。if (!capture.isOpened())
{std::cout << "Vidoe open failed!" << std::endl;return -1;
}
//(3)验证完成,开始读取视频。cv::Mat frame;
capture >> frame;

 2.2视频的保存:

opencv一般使用 cv::VideoWirter类来保存视频。视频的保存也是一帧一帧来保存的。

(VideoWirter与VideoCapture一般配合使用,类似于文件的读写操作)

cv::VideoWriter类的对象的创建有两种方式,第一种是使用构造函数,第二种是使用open()函数,具体示例如下。

第一种方式:

     cv::VideoWriter out(const string& filename, // 输出文件名int fourcc, // 编码形式,使用 CV_FOURCC()宏double fps, // 输出视频帧率cv::Size frame_size, // 单帧图像的大小bool is_color = true // 如果是false,则可传入灰度图像,true为彩色图像
);


第二种方式:

     cv::VideoWriter out;out.open("my_video.mpg", //输出文件名CV_FOURCC('D','I','V','X'), // MPEG-4 编码30.0, // 输出视频帧率 cv::Size( 640, 480 ), // 单帧图像分辨率为 640像素×480像素true // 只可传入彩色图像,false为灰度图像
);


其中需要注意的是FOURCC编码形式,操作时常用以下函数把4个字符连接起来形成一个FOURCC 码,形式为cv::VideoWriter::fourcc(char c1,char c2,char c3,char c4)。

常用的格式有如下几种。

CV_FOURCC('P','I','M','1') = MPEG-1 codec。
CV_FOURCC('M','J','P','G') = motion-jpeg codec。
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec。
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec。
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec。


向创建的cv::VideoWriter对象写入图像也有两种方式,即write()操作和<<操作,示例如下。

cv::VideoWriter::write(const Mat& image // 写入图像作为下一帧
);
out << frame;

示例:

#include <iostream>#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>using namespace cv;
using namespace std;void function()
{
VideoCapture video("C:/Users/27844/Desktop/video1.mp4");if(!video.isOpened()){cout<<"video open false"<<endl;return;}Mat img;namedWindow("video test");int frame_num = video.get(CAP_PROP_FRAME_COUNT);cout<<"this video frame conut:"<<frame_num<<endl;// 1.5.2 VideoWriter对象创建// cv::VideoWriter类用于写入视频,该类使用起来比cv::VideoCapture类稍微复杂一些。// (1)构造函数VideoWriter out("C:/Users/27844/Desktop/out.mp4",VideoWriter::fourcc('D','I','V','X'),video.get(CAP_PROP_FPS),Size(video.get(CAP_PROP_FRAME_WIDTH),video.get(CAP_PROP_FRAME_HEIGHT)),true);while(1){video.read(img);if(img.empty()){cout<<"over"<<endl;return;}//显示帧图像imshow("video test",img);if (waitKey(10) == 'q') break;//保存图像out<<img;}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

成品气楼参考图集有哪些?盘点5本实用图集,你都知道哪几本

成品气楼也被称为通风天窗、自然通风器、屋顶通风器&#xff0c;是帮助厂房、商业建筑体等建筑通风换气的大型设备&#xff0c;被广泛应用在各行各业。想要成品气楼的通风、采光、排烟作用得到充分发挥&#xff0c;需选型合理&#xff0c;配置合适&#xff0c;安装得当&#xf…

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。(AI)

Docker是一种开源的容器化平台&#xff0c;可以将应用程序和其依赖项打包成一个独立的可运行的容器。Docker的基本概念包括以下几个方面&#xff1a; 1. 容器&#xff1a;容器是一个独立的、可运行的软件包&#xff0c;包含应用程序和其依赖项。容器化可以将应用程序与底层操作…

v4.7+版本用户充值在交易统计中计算双倍的问题修复

app/services/statistic/TradeStatisticServices.php 文件中 $whereInRecharge[recharge_type] no_system; $whereInRecharge[recharge_type] system; app/model/user/UserRecharge.php 中 修改此搜索器内容 public function searchRechargeTypeAttr($query, $value){ if…

二百七十一、Kettle——ClickHouse增量导入数据清洗记录表

一、目的 在完成错误数据表任务后&#xff0c;需要对每条错误数据的错误字段及其字段值进行分析 Hive中原有SQL语句和ClickHouse现有SQL语句很大不同 二、Hive中原有代码 2.1 表结构 --31、静态排队数据清洗记录表 create table if not exists hurys_db.dwd_data_clean_…

python编程-装饰器

目录 一、装饰器的概念 装饰器与设计模式的关联 二、装饰器的基本结构和语法 1. 函数装饰器 定义装饰器函数&#xff1a; 应用装饰器到函数&#xff1a; 方式一&#xff1a;使用符号&#xff08;语法糖&#xff09; 方式二&#xff1a;手动调用装饰器函数 函数装饰器的…

vue3+ts实时播放视频,视频分屏

使用vue3以及播放视频组件Jessibuca Jessibuca地址 使用循环个数来实现分屏 效果图&#xff0c;四屏 九屏 dom代码 <div class"icon"><div class"icon-box"><span class"text">分屏&#xff1a;</span><el-icon …

银行信贷风控专题:Python、R 语言机器学习数据挖掘应用实例合集:xgboost、决策树、随机森林、贝叶斯等

全文链接&#xff1a;https://tecdat.cn/?p38026 原文出处&#xff1a;拓端数据部落公众号 分析师&#xff1a;Fanghui Shao 在当今金融领域&#xff0c;风险管控至关重要。无论是汽车贷款违约预测、银行挖掘潜在贷款客户&#xff0c;还是信贷风控模型的构建&#xff0c;以及…

NF和C-BRUNO的区别

C-BRUNO与标准化流&#xff08;Normalizing Flow&#xff09;模型有一定的相似性&#xff0c;但它们在目标、应用和实现细节上存在明显的区别。以下是两者之间的主要区别&#xff1a; 1. 目标和应用领域 标准化流模型&#xff1a;标准化流的目标是通过一系列可逆变换将复杂的…

解决ElasticSearch启动成功却无法在浏览器访问问题

目录 前言&#xff1a; 问题复现 &#xff1a; 解决问题&#xff1a; 1、修改sysctl.conf文件 2、在sysctl.conf文件增加这段东西 3、 然后保存退出&#xff0c;输入以下命令使其生效 结语&#xff1a; 前言&#xff1a; 这篇文章是小白我今天突然启动es&#xff0c;发现e…

【华为HCIP实战课程二十五】中间到中间系统协议IS-IS配置实战续系统ID区域ID,网络工程师

上章简单讲解了ISIS基本配置,本章继续详细讲解ISIS配置及实施 IS-IS配置拓扑 1、R1进行配置IS-IS [R1]display current-configuration configuration isis isis 1 network-entity 49.0124.1111.1111.1111.00 //配置NET地址,由三部分组成,区域ID、系统ID和固定的SEL 00 i…

微服务之网关、网关路由、网关登录校验

简介&#xff1a;来源&#xff1a;SpringCloud微服务开发与实战&#xff0c;java黑马商城项目微服务实战开发&#xff08;涵盖MybatisPlus、Docker、MQ、ES、Redis高级等&#xff09; 认识网关 前端请求不能直接访问微服务&#xff0c;而是要请求网关&#xff1a; 网关可以做…

pytest执行用例时从conftest.py抛出ModuleNotFoundError:No module named ‘XXX‘异常的解决办法

问题描述 本地运行正常&#xff0c;集成到Jenkins后使用执行 Windows 批处理命令运行测试用例时报错&#xff1a; D:\PycharmProject\ZeppAndroid>pytest -vs testcase\test_login.py --alluredirreport/allure_json --clean-alluredir ImportError while loading conft…

手机收银云进销存管理软件,商品档案Excel格式批量导入导出,一键导入Excel的商品档案

如果您有Excel的商品档案&#xff0c;那么就可以批量导入到我们的手机云进销存软件系统里&#xff0c;就不需要人工手工一个个商品的新建商品档案&#xff0c;大大提高工作效率。如果您看下面的步骤不会操作&#xff0c;可以联系我们技术支持&#xff0c;来帮您把商品档案导入。…

DDRPHY数字IC后端设计实现系列专题

在对 LPDDR3 物理层接口模块进行后端设计之前&#xff0c;需要对该模块的功能结 构以及后端物理设计流程的相关理论进行深入的分析和研究。本章第一节详细分 析了本次 LPDDR3 物理层接口模块的结构&#xff0c;为该模块的布图布局的合理规划奠 定了理论基础&#xff0c;并且分析…

python机器人编程——一种3D骨架动画逆解算法的启示(上)

目录 一、前言二、fabrik 算法三、python实现结论PS.扩展阅读ps1.六自由度机器人相关文章资源ps2.四轴机器相关文章资源ps3.移动小车相关文章资源ps3.wifi小车控制相关文章资源 一、前言 我们用blender等3D动画软件时&#xff0c;会用到骨骼的动画&#xff0c;通过逆向IK动力学…

大数据之VIP(Virtual IP,虚拟IP)负载均衡

VIP&#xff08;Virtual IP&#xff0c;虚拟IP&#xff09;负载均衡是一种在计算机网络中常用的技术&#xff0c;用于将网络请求流量均匀地分散到多个服务器上&#xff0c;以提高系统的可扩展性、可靠性和性能。以下是对VIP负载均衡的详细解释&#xff1a; 一、VIP负载均衡的基…

想要音频里的人声,怎么把音频里的人声和音乐分开?

在音频处理领域&#xff0c;将音频中的人声和音乐分开是一个常见需求&#xff0c;尤其对于音乐制作、影视后期以及个人娱乐应用来说&#xff0c;这种分离技术显得尤为重要。随着科技的发展&#xff0c;现在已经有多种方法可以实现这一目的。 一、使用专业音频处理软件 市面上有…

快速学会C 语言基本概念和语法结构

&#x1f600;前言 本篇博文是关于C 语言的基本概念和语法结构&#xff0c;希望你能够喜欢 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&a…

动态规划 —— 路径问题-不同路径 ||

1. 不同路径 || 题目链接&#xff1a; 63. 不同路径 II - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/unique-paths-ii/description/ 2. 算法原理 状态表示&#xff1a;以莫一个位置位置为结尾 dp[i]表示&#xff1a;以[i&#xff0c;j]位置为结尾时…

C++学习,冒泡排序

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的&#xff0c;直到没有再需要交换的元素为止&#xff0c;这意…