OpenCV的highgui模块

news2024/7/4 6:23:42

Opencv把用于操作系统、文件系统以及摄像机等硬件设备交互的函数纳入到highgui(High-level Graphical User Interface)模块中,我们可以利用该模块方便地打开窗口、显示图像、读出或写入图像相关的文件(图像和视频)、处理简单的鼠标点击、鼠标移动和键盘事件等等众多功能。

图像的载入与保存

使用cv::imread()读取图片

cv::imread():
    cv::Mat cv::imread(
        const string &filename,            //Input filename
        int     flags=cv::IMREAD_COLOR     //Flags set how to interpret file
};

默认情况下,flags被设置为cv::IMREAD_COLOR,这个值表示图片将被以三通道8位的格式读取,在这种情况下,即使原始文件中的图像是灰度图像,读取到内存中的仍然有三通道,每个通道拥有相同数据的图像。

如果flags被设置为cv::IMREAD_GRAYSCALE,那么不管文件内部图像是几通道的,图片都以灰度图像的格式加载。 

flags的另外一个值是cv::IMREAD_ANYCOLOR,在此种情况下,图片的载入方式取决于其内部图像的具体情况,如果是彩色图像,就以三通道的形式载入,如果是灰度图像,则按单通道的形式载入。

CV::imread()的标志
cv::IMREAD_COLOR总是读取三通道图像
cv::IMREAD_GRAYSCALE总是读取单通道图像
cv::IMREAD_ANYCOLOR通道数由文件实际通道数决定(不超过3)
cv::IMREAD_ANYDEPTH允许加载超过8bit深度
cv::IMREAD_UNCHANGED读取图像时,将保留图像中的alpha通道
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat src= imread("C:\\Users\\32498\\Pictures\\17.png",IMREAD_COLOR);//IMREAD_COLOR 三通道读取
	imshow("src", src);

	Mat src_gray = imread("C:\\Users\\32498\\Pictures\\17.png", IMREAD_GRAYSCALE);//IMREAD_GRAYSCALE 单通道读取
	imshow("src_gray", src_gray);
    waitKey();
}

运行结果如下 

 以不同的方式读取同一幅图片,得到不同的结果。

使用cv::imwrite()保存图像

cv::imwrite()有三个输入参数

bool cv::imwrite(
    const string&    filename,                    //Input filename
    cv::InputArray    image,                    //image to write to file
    const vector<int>& params = vector<int>()    //optional for parameterized fmts
)

第一个参数给定了文件名,文件名的拓展部分用来决定以何种格式保存图像(比如常见的.jpg .png .tif .bmp等格式)

第二个参数是待存储的输入图像

第三个参数被用作特殊类型文件的写入操作时所需的数据

我们在前一个程序的基础上再增加一行语句,保存图片

imwrite("test.png", src); 
#include<iostream>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
	Mat src= imread("C:\\Users\\32498\\Pictures\\17.png",IMREAD_COLOR);//IMREAD_COLOR 三通道读取
	imshow("src", src);

	Mat src_gray = imread("C:\\Users\\32498\\Pictures\\17.png", IMREAD_GRAYSCALE);//IMREAD_GRAYSCALE 单通道读取
	imshow("src_gray", src_gray);

	imwrite("test.png", src); 
	waitKey();
}

最终我们就把这张图片保存了下来,那么保存在哪里呢?

就在当前程序的文件夹里面 

当然也可以使用绝对路径设置图片要保存的地方,比如我们这里将路径设置为

imwrite("C:\\Users\\32498\\Pictures\\test.png", src); 

就可以将图片保存到这个路径下, 

 

视频的处理

使用cv::VideoCapture对象读取视频流

        首先我们需要一个cv::VideoCapture对象 ,它包含我们从摄像机或者视频文件读取每一帧所必需的信息,根据数据源的不同,我们需要以不同的调用方式来构建cv::VideoCapture对象:

cv::videoCapture::videoCapture(
    cosnt string& filename            //Input filename
);


cv::videoCapture::videoCapture(
    int device                        // video capture device id
);


cv::videoCapture::videoCapture();

在第一个构造函数中,只需要给出视频文件的文件名就可以了,opencv会自动打开对应的视频文件,并准备后续的读取操作 。如果打开成功,那么便可以从中获取图像帧,成员函数cv::VideoCapture::isOpened()会返回true。

输入参数为整型变量的cv::VideoCapture::VideoCapture()函数,即就是第二种构造函数,我们给出一个标识符来表明我们希望使用哪个摄像机以及我们希望操作系统以何种方式与该摄像机通信。对于摄像机来说,它只是一个标识码,如果当前系统下只有以恶搞摄像机时参数为0,当有多个摄像机同时处于当前系统中时,参数递增即可。在某些平台上,你可以给cv::VideoCapture::VideoCapture()函数传入-1,这会使OpenCV弹出一个选择窗口,让你能够手动选择希望使用的相机。

创建VideoCapture()对象的最后一种方式是直接创建一个VideoCapture对象而不提供关于即将打开的硬件设备的任何信息。

cv::VideoCapture cap;
cap.open("test.avi");

这种情况下,虽然会创建一个VideoCapture对象,但无法直接使用,直到显式打开你想要读取数据的视频源。

使用cv::VideoCapture::read()从视频流中读取图像

bool cv::VideoCapture::read(
    cv::OutputArray image
);

一旦有了一个cv::VideoCapture对象,便可以从中读取图像了,最简单的一种方式是调用cv::VideoCapture::read()函数,该函数从cv::VideoCapture表示的文件中读取下一帧数据,并将数据插入到你提供的变量中。

使用cv::VideoCapture::operator>>()从视频流读取图像数据

cv::VideoCapture& cv::VideoCapture::operator>>(
    cv::Mat &image
);

也可以使用重载函数 cv::VideoCapture& cv::VideoCapture::operator>>()(输入流操作符)从VideoCapture对象中读取下一帧数据。

使用cv::VideoCapture::grab()和cv::VideoCapture::retrieve()从视频流中读取图像数据

为了取代上述的一次从相机或者视频源只读取一张图像并完成解码的操作,你可以将其拆分为一个捕获操作(类似于内存的拷贝)和恢复操作(用于实际完成对已抓取的数据进行解码)

bool cv::VideoCapture::grab(void);
bool cv::VideoCapture::retrieve(
    cv::OutputArray image,
    int  channel=0
);

grab()函数将当前可以使用的图像数据拷贝至用户看不到的一个内部缓冲区。先完成数据的抓取(grab),将数据安全放入缓存区之后再进行解码恢复(retrieve),这样做十分有意义。因为在多相机读取时,需要尽可能缩短多个相机获取的图像帧之间的时间差。

相机属性cv::VideoCapture::get()和cv::VideoCapture::set()

视频文件通常不仅仅包含一帧一帧的图像,还包括许多重要的元数据,当打开一个视频文件时,相关信息就会被拷贝到cv::VideoCapture对象内部数据区,如果能够实现对该数据区参数的读取或者写入将会非常有用,这两个函数就帮我们实现了。

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

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

相关文章

【大数据之Hadoop】二十六、生产调优-HDFS集群压测

测试上传数据到集群和拉取数据的时间。HDFS的读写性能主要受网络和磁盘影响比较大。为了方便测试&#xff0c;将hadoop102、hadoop103、hadoop104虚拟机网络的带宽都设置为100Mbps。100Mbps/812.5M/s。 1 测试HDFS写性能 写测试原理&#xff1a;   向磁盘写测试文件&#x…

MySQL数据库——MySQL下载安装

&#xff08;1&#xff09;数据库相关概念&#xff1a; &#xff08;2&#xff09;MySQL数据库下载&#xff08;windows版&#xff09;: 下载地址&#xff1a;MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/MySQL :: Download MySQL Installer…

Python小姿势 - Python中的类型检查

Python中的类型检查 在Python中&#xff0c;类型检查是通过内置函数isinstance()来实现的。 isinstance() 函数用于判断一个对象是否是一个已知的类型&#xff0c;类似 type()。 isinstance() 与 type() 区别&#xff1a; type() 不会认为子类是一种父类类型。 isinstance() 会…

【Linux下】线程概念

文章目录 【Linux下】线程概念理解线程线程操作接口线程和进程线程和进程的关系代码验证 线程优点线程缺点 【Linux下】线程概念 理解线程 一般的书上都是这么描述线程的 线程&#xff1a;是在进程内部运行的一个执行分支&#xff0c;属于进程的一部分&#xff0c;粒度要比进…

简单搭建Fabric网络

Fabric网络的搭建分为两个阶段&#xff1a;生成网络拓扑和启动网络。在这里&#xff0c;我们假设要搭建一个具有一个orderer节点和两个peer节点的Fabric网络。 在生成网络拓扑之前&#xff0c;需要准备好以下文件&#xff1a; crypto-config.yaml&#xff1a;用于生成组织和节…

什么牌子蓝牙耳机好用不贵?国产性价比高的蓝牙耳机推荐

相较于有线耳机&#xff0c;无线蓝牙耳机更便携、功能更丰富&#xff0c;不用受到耳机孔与线的限制。那么&#xff0c;什么牌子的蓝牙耳机好用不贵&#xff1f;针对这个问题&#xff0c;我给大家推荐几款国产性价比高的蓝牙耳机&#xff0c;可以当个参考。 一、南卡小音舱Lite…

JAVA代码规范审查

JAVA代码规范审查 1. 添加必要的注释 所有的类都必须添加创建者和创建日期&#xff0c;以及简单的注释描述 方法内部的复杂业务逻辑或者算法&#xff0c;需要添加清楚的注释 一般情况下&#xff0c;注释描述类、方法、变量的作用 任何需要提醒的警告或TODO&#xff0c;也要注…

python基础语法1

基本语句 判断语句 1.if语句 if 语法格式: if 要判断的条件:条件成立时&#xff0c;要做的事情 -------------------------- 执行流程:判断条件为True就执行if的语句体.条件为False就执行if以外的代码. if 案例: age int(input(请输入年龄))print(-----开始-----) if ag…

测试遵循的原则

测试遵循的原则 软件测试是在规定的条件下对程序进行操作&#xff0c;以发现程序错误&#xff0c;衡量软件质量&#xff0c;并对其是否能满足设计要求进行评估的过程。软件测试的基本原则有助于测试人员进行高质量的测试&#xff0c;尽早尽可能多的发现缺陷&#xff0c;并负责跟…

【51单片机】:串口通信基础知识详解

学习目标&#xff1a; 串口通信的基础知识和设置详解。 学习内容&#xff1a;串口通信基础知识 并行通信&#xff1a;多条数据线将数据字节的各个位同时传送*缺点&#xff1a;1.电磁干扰 2.成本高 3.由于传输线较多&#xff0c;长距离传输成本高串口通信&#xff1a;将数据字节…

STL常用梳理——STACK、QUEUE

STL——适配器篇 1、ListSTL list 容器介绍list使用 2、适配器介绍3、Deque容器Stack、Queue适配器实现 1、List STL list 容器介绍 STL list 容器&#xff0c;又称双向链表容器&#xff0c;即该容器的底层是以双向链表的形式实现的。这意味着&#xff0c;list 容器中的元素可…

Lecture 11(Preparation):领域自适应 (Domain Adaptation)

Domain shift: Training and testing data have different distributions. Transfer learning&#xff1a;在A任务上学到的技能&#xff0c;可以被用在B任务上 Domain Adaptation的技术&#xff0c;可以看作是Transfer learning的一种 Domain Adaptation: 第一种情况&#xf…

栈和队列OJ题思路分享之括号匹配(C语言实现)

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:刷题分享⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你刷更多C语言和数据结构的题!   &#x1f51d;&#x1f51d; 栈和队列刷题分享 1. 前言&…

【密码学复习】第七章 公钥加密体制

公钥加密模型 密钥生成过程&#xff1a;接收消息的端系统&#xff08;如图中的接收者Alice&#xff09;产生一对密钥(PKA ,SKA ), PKA 是公开钥&#xff08;用于加密&#xff09;&#xff0c; SKA 是秘密密钥&#xff08;用于解密&#xff09;. 加密过程&#xff1a;Bob想向…

从C出发 30 --- 指针与堆空间

数组 就是变量的有序集&#xff0c;因此只有可以动态的创建一个变量&#xff0c;就可以动态的创建多个变量了&#xff0c; 堆空间就是一片内存区域&#xff0c;用于动态创建内存变量的区域 void 类型是基础类型&#xff0c;不是基础数据类型&#xff0c;为什么&#xff1f;因为…

MySQL --- 图形化工具DDL表结构操作

一. 图形化工具 1. 介绍 前面学习了DDL中关于数据库操作的SQL语句&#xff0c;在编写这些SQL时&#xff0c;都是在命令行当中完成的。在命令行当中来敲这些SQL语句很不方便&#xff0c;主要的原因有以下 3 点&#xff1a; 没有任何代码提示。&#xff08;全靠记忆&#xff0…

行为型模式-备忘录模式

备忘录模式 概述 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便地回到一个特定的历史步骤&#xff0c;当新的状态无效或者存在问题时&#xff0c;可以使用暂时存储起来的备忘录将状态复原&#xff0c;很多软件都提供了撤销&#xff08;Undo&#xff0…

【自动化测试】Appium环境设置

启动Appium需要的环境配置有些复杂&#xff0c;这里将需要的环境配置整理出来&#xff0c;附上博主亲测有效的教程&#xff0c;有些教程有一点点老了&#xff0c;博主也做了备注&#xff0c;并且有些老一点步骤&#xff0c;博主根据现有的情况做了新的图文教程&#xff0c;大家…

近源渗透学习

一、近源渗透 近源渗透测试是网络空间安全领域逐渐兴起的一种新的安全评估手段。 它是一种集常规网络攻防、物理接近、社会工程学及无线电通信攻防等能力于一体的高规格网络安全评估行动。网络安全评估小组在签订渗透测试授权协议后&#xff0c;通过乔装、社工等方式实地物理侵…

微服务体系

目录 结构服务注册中心EurekaZookeeperConsul上面三者的对比 Ribbon 负载均衡负载均衡OpenFeign 远程服务调用Hystrix服务熔断常见的设置 Hystrix 工作流程Hystrix-DashBoard 的使用 SpringCloud Gateway核心工作流程 SpringCloud Config 分布式配置中心bootstrap.yml配置文件 …