OpenCV 基于C++图像读取及存储API函数

news2024/11/13 16:36:07

       OpenCV可以从存储介质中读入图像,也可以将摄像头(Camera)抓取的图像载入内存,然后进行处理。而存储图像就是将内存中的图像数据写入存储介质中,如写入硬盘、优盘等。

       OpenCV要读入图像、操作图像。首先要用到Mat类,并且需创建Mat对象。要用Camera抓取图像需用到VideoCapture 类,并构建VideoCapture对象。

       从档案读入图像 

       读入图像 需用到imread()函数,其基于的原型如下:

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

        参数filename为需读入图像的完整名称,包含文件路径、文件名、及扩展名。扩展名必须是OpenCV支持的图像类型。OpenCV支持的图像类型如下:

       参数 flags包含以下几种:

        IMREAD_COLOR           为缺省值,读入图像时,将图像装换为3通道 BGR 色彩图像。

        IMREAD_UNCHANGED 读入图像时按原样返回加载的图像(如果原图存在alpha通道,否则会被裁                                              剪)。忽略 EXIF方向。

         IMREAD_GRAYSCALE 读入图像时,把图像转换为单通道的灰度图像。

         IMREAD_ANYDEPTH  如果原图为16bit/32bit,读入时保留原图像深度,其余的转换为8bit。 

        IMREAD_ANYCOLOR  以任何可能的颜色格式读取图像。也就是保留原图像格式。

        IMREAD_LOAD_GDAL 读入图像时, 使用gdal驱动程序加载图像。

        IMREAD_REDUCED_GRAYSCALE_2  读入图像时,将图像转换为单通道灰度图像,图像大小减小1/2。

        IMREAD_REDUCED_COLOR_2  读入图像时,将图像转换为3通道BGR色彩图像,并且图像大小减1/2。

        IMREAD_REDUCED_GRAYSCALE_4  读入图像时,将图像转换为单通道灰度图像,图像大小减小1/4。

        IMREAD_REDUCED_COLOR_4  读入图像时,将图像转换为3通道BGR色彩图像,并且图像大小减1/4。

        IMREAD_REDUCED_GRAYSCALE_8  读入图像时,将图像转换为单通道灰度图像,图像大小减小1/8。

        IMREAD_REDUCED_COLOR_8   读入图像时将图像转换为3通道BGR色彩图像,并且图像大小减1/8。

        IMREAD_IGNORE_ORIENTATION 读入图像时,不会根据EXIF的方向标志旋转图像。

       显示图像  

      要显示读入图像则需用到imshow()函数,imshow()函数的原型如下:

      void cv::imshow(const String & winname, InputArray mat)

      winname 为显示图像窗口的名称,如果输入的名称为一个建好的窗口,图像将显示在该窗口上,如果不存在输入名的窗口,则以输入名新建一个窗口,并将图像显示在该窗口上。

       mat 为装载有欲显示图片的Mat对象。

       存储图像

       要存储图像需用到 imwrite()函数,imwrite()函数的原型如下:

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

      参数filename 为存储到介质中的完整文件名,需包含存储路径、文件名、扩展名。扩展名必须是OpenCV支持的图像类型。

      参数img为载有需存储图像的Mat对象。最后一个参数,通常保持缺省状态不予理会。

      图像读入、显示、存储示例

      下面以一个实例来演示OpenCV图像读入、显示、存储操作。

      1. 新建一个VC2022控制台空项目,将需操作的图片Copy到该项目文件夹下(这里略去OpenCV4.8在VS2022中的配置操作介绍)。

      2. 在解决方案源文件夹中添加新建项main.cpp

       3. 在main.cpp中添加源代码,所加代码如下:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
	Mat src1 = imread("1.jpg", IMREAD_UNCHANGED);
	namedWindow("src1", WINDOW_AUTOSIZE);
	imshow("src1", src1);
	Mat src2 = imread("1.jpg", IMREAD_GRAYSCALE);
	namedWindow("src2", WINDOW_AUTOSIZE);
	imshow("src2", src2);
	Mat src3 = imread("1.jpg", IMREAD_COLOR);
	namedWindow("src3", WINDOW_AUTOSIZE);
	imshow("src3", src3);
	Mat src4 = imread("1.jpg", IMREAD_ANYDEPTH);
	namedWindow("src4", WINDOW_AUTOSIZE);
	imshow("src4 ", src4);
	Mat src5 = imread("1.jpg", IMREAD_ANYCOLOR);
	namedWindow("src5", WINDOW_AUTOSIZE);
	imshow("src5", src5);
	Mat src6 = imread("1.jpg", IMREAD_LOAD_GDAL);
	namedWindow("src6", WINDOW_AUTOSIZE);
	imshow("src6 ", src6);
	Mat src7 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_2);
	namedWindow("src7", WINDOW_AUTOSIZE);
	imshow("src7", src7);
	Mat src8 = imread("1.jpg", IMREAD_REDUCED_COLOR_2);
	namedWindow("src8", WINDOW_AUTOSIZE);
	imshow("src8", src8);
	Mat src9 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_4);
	namedWindow("src9", WINDOW_AUTOSIZE);
	imshow("src9", src9);
	Mat src10 = imread("1.jpg", IMREAD_REDUCED_COLOR_4);
	namedWindow("src10", WINDOW_AUTOSIZE);
	imshow("src10", src10);
	Mat src11 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_8);
	namedWindow("src11", WINDOW_AUTOSIZE);
	imshow("src11", src11);
	Mat src12 = imread("1.jpg", IMREAD_REDUCED_COLOR_8);
	namedWindow("src12", WINDOW_AUTOSIZE);
	imshow("src12", src12);
	Mat src13 = imread("1.jpg", IMREAD_IGNORE_ORIENTATION);
	namedWindow("src13", WINDOW_AUTOSIZE);
	imshow("src13", src13);

	moveWindow("src1", 10, 50);
	moveWindow("src2", 10, src1.rows + 100);
	moveWindow("src3", src1.cols  + 10, 50);
	moveWindow("src4", src1.cols  + 10, src1.rows + 100);
	moveWindow("src5", src1.cols * 2 + 10, 50);
	moveWindow("src6", src1.cols * 2 + 10, src1.rows + 100);

	moveWindow("src7", src1.cols * 3 + 10, 50);
	moveWindow("src8", src1.cols * 3+ 10, src1.rows + 100);
	moveWindow("src9", src1.cols * 4 + 10, 50);
	moveWindow("src10", src1.cols * 4 + 10, src1.rows + 100);
	moveWindow("src11", src1.cols * 5 + 10, 50);
	moveWindow("src12", src1.cols * 5 + 10, src1.rows + 100);
	moveWindow("src13", src1.cols * 6 + 10, 50);
	imwrite("1.bmp", src2);
	waitKey(0); // wait till any key is pressed
	return 0;
}

    4. 试运行 按ctrl+F5,结果如下:

打开项目文件夹,可以看到多出了一个1.bmp文件。

双击这个文件,用Win10照片打开。

结果如下:

是一张灰度图片说明存储正确。 

从摄像头获取图像

将前面的部分代码注释掉,加入如下代码:


#include <iostream>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
	/*
	Mat src1 = imread("1.jpg", IMREAD_UNCHANGED);
	namedWindow("src1", WINDOW_AUTOSIZE);
	imshow("src1", src1);
	Mat src2 = imread("1.jpg", IMREAD_GRAYSCALE);
	namedWindow("src2", WINDOW_AUTOSIZE);
	imshow("src2", src2);
	Mat src3 = imread("1.jpg", IMREAD_COLOR);
	namedWindow("src3", WINDOW_AUTOSIZE);
	imshow("src3", src3);
	Mat src4 = imread("1.jpg", IMREAD_ANYDEPTH);
	namedWindow("src4", WINDOW_AUTOSIZE);
	imshow("src4 ", src4);
	Mat src5 = imread("1.jpg", IMREAD_ANYCOLOR);
	namedWindow("src5", WINDOW_AUTOSIZE);
	imshow("src5", src5);
	Mat src6 = imread("1.jpg", IMREAD_LOAD_GDAL);
	namedWindow("src6", WINDOW_AUTOSIZE);
	imshow("src6 ", src6);
	Mat src7 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_2);
	namedWindow("src7", WINDOW_AUTOSIZE);
	imshow("src7", src7);
	Mat src8 = imread("1.jpg", IMREAD_REDUCED_COLOR_2);
	namedWindow("src8", WINDOW_AUTOSIZE);
	imshow("src8", src8);
	Mat src9 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_4);
	namedWindow("src9", WINDOW_AUTOSIZE);
	imshow("src9", src9);
	Mat src10 = imread("1.jpg", IMREAD_REDUCED_COLOR_4);
	namedWindow("src10", WINDOW_AUTOSIZE);
	imshow("src10", src10);
	Mat src11 = imread("1.jpg", IMREAD_REDUCED_GRAYSCALE_8);
	namedWindow("src11", WINDOW_AUTOSIZE);
	imshow("src11", src11);
	Mat src12 = imread("1.jpg", IMREAD_REDUCED_COLOR_8);
	namedWindow("src12", WINDOW_AUTOSIZE);
	imshow("src12", src12);
	Mat src13 = imread("1.jpg", IMREAD_IGNORE_ORIENTATION);
	namedWindow("src13", WINDOW_AUTOSIZE);
	imshow("src13", src13);

	moveWindow("src1", 10, 50);
	moveWindow("src2", 10, src1.rows + 100);
	moveWindow("src3", src1.cols  + 10, 50);
	moveWindow("src4", src1.cols  + 10, src1.rows + 100);
	moveWindow("src5", src1.cols * 2 + 10, 50);
	moveWindow("src6", src1.cols * 2 + 10, src1.rows + 100);

	moveWindow("src7", src1.cols * 3 + 10, 50);
	moveWindow("src8", src1.cols * 3+ 10, src1.rows + 100);
	moveWindow("src9", src1.cols * 4 + 10, 50);
	moveWindow("src10", src1.cols * 4 + 10, src1.rows + 100);
	moveWindow("src11", src1.cols * 5 + 10, 50);
	moveWindow("src12", src1.cols * 5 + 10, src1.rows + 100);
	moveWindow("src13", src1.cols * 6 + 10, 50);
	imwrite("1.bmp", src2);
	*/
	VideoCapture cp;
	Mat frCamera;
	cp.open(0);
	if (!cp.isOpened())
		cout << "Camera Cann't be opened!" << endl;
	else
	{
		  cp >> frCamera;
		  imshow("Camera Image", frCamera);
	}
	waitKey(0); // wait till any key is pressed
	return 0;
}

 试运行  按Ctrl+F5结果如下:

  

可以看出,摄像头抓取的图片已传入Mat对象,并显示在窗口中。

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

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

相关文章

yolov5口罩检测模型

1 项目背景及意义 全球范围内的公共卫生安全和人脸识别技术的发展。在面对新型冠状病毒等传染病的爆发和传播风险时&#xff0c;佩戴口罩成为一种重要的防护措施。然而&#xff0c;现有的人脸识别系统在识别戴口罩的人脸时存在一定的困难。 通过口罩识别技术&#xff0c;可以…

C程序训练:与输入有关的错误

在录入程序时有时稍不注意就可能录入错误的字符导致程序运行结果出现错误&#xff0c;下面举例说明。 下面程序的运行结果是错的&#xff0c;但程序又没有错&#xff0c;到底问题出现在哪呢&#xff1f; #include <stdio.h> int main() {FILE *fp;int i, k, n;fpfopen(…

Curl命令POST请求

curl工具介绍&#xff1a; CURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;被广泛应用在Unix、Linux发行版中&#xff0c;并且有DOS和Win32、Win64的移植版本。同时它还支持诸多的通信协议&#xff08;我们常用的有HTTP、HTTPS、FTP、SMTP、TELNET等&#xff0…

山西电力市场日前价格预测【2024-01-14】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-14&#xff09;山西电力市场全天平均日前电价为415.13元/MWh。其中&#xff0c;最高日前电价为851.84元/MWh&#xff0c;预计出现在18:15。最低日前电价为198.87元/MWh&#xff0c;预计…

对于软件测试的认识和了解

对软件测试的认识&#xff1a; 软件测试要求开发人员避免测试自己开发的程序。从心理学角度讲&#xff0c;这是很有道理的。特别是一个相对复杂的系统&#xff0c;开发人员在刚刚开发完成的时候&#xff0c;尚沉浸于对自己设计的回味之中。此时去测试的话往往会侧重于程序本身的…

U盘抜太快打不开恢复方法

U盘是一种常用的存储设备&#xff0c;由于其便携性和大容量等特点&#xff0c;被广泛应用于数据存储和传输。然而&#xff0c;有时候我们会遇到U盘拔出后无法再次使用的问题&#xff0c;这通常是由于U盘拔出太快导致的。本文将深入探讨U盘拔太快打不开的原因&#xff0c;并提供…

单例模式的八种写法、单例和并发的关系

文章目录 1.单例模式的作用2.单例模式的适用场景3.饿汉式静态常量&#xff08;可用&#xff09;静态代码块&#xff08;可用&#xff09; 4.懒汉式线程不安全&#xff08;不可用&#xff09;同步方法&#xff08;线程安全&#xff0c;但不推荐用&#xff09;同步代码块&#xf…

Java初学习

Java代码示例&#xff1a; public class helloworld {public static void main(String[] args){System.out.println("hello world");} } Java程序的名字需要和文件名字一致&#xff0c;就是那个helloworld Java程序需要对类有深度的认识&#xff1a; 对象是类的…

猫狗大战(猫狗识别)

1.问题简介 1.1问题描述 在这个问题中&#xff0c;你将面临一个经典的机器学习分类挑战——猫狗大战。你的任务是建立一个分类模型&#xff0c;能够准确地区分图像中是猫还是狗。 1.2预期解决方案 你的目标是通过训练一个机器学习模型&#xff0c;使其在给定一张图像时能够准…

kafka之java客户端实战

1. kafka的客户端 Kafka提供了两套客户端API&#xff0c;HighLevel API和LowLevel API。 HighLevel API封装了kafka的运行细节&#xff0c;使用起来比较简单&#xff0c;是企业开发过程中最常用的客户端API。 而LowLevel API则需要客户端自己管理Kafka的运行细节&#xff0c;Pa…

UniRepLKNet实战:使用 UniRepLKNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

【数模百科】距离美赛还有20天,不要忘了阅读往年获奖论文(附04-23年美赛获奖论文)

之前发了很多数模相关的知识&#xff0c;受到了一些人的关注&#xff0c;也有很多人私下问我&#xff0c;距离美赛还有20几天了&#xff0c;还来不来得及。 对此我想说&#xff0c; 来不来得及重要吗&#xff1f; 你名都报了&#xff0c;钱也交了&#xff0c;还是笔不小的钱…

Vue.js设计与实现阅读-3

Vue设计与实现阅读-3 1、声明式描述UI2、渲染器3、组件4、模板的工作原理5、Vue.js 是各个模块组成的有机整体 前言 前面一章我们了解了&#xff0c;开发体验是衡量一个框架的重要指标之一。提供友好的警告信息至关重要&#xff0c;但是越详细的警告信息&#xff0c;意味着框架…

前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承 继承之间的叫法 A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 子类 ---》派生类 基类 ---》超类&#xff08;父类&#xff09; // 继承之间的叫法 // A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 // 子类 ---》派生类 // 基类 …

性能瓶颈分析定位

用vmstat、sar、iostat检测是否是CPU瓶颈 用free、vmstat检测是否是内存瓶颈 用iostat、dmesg 检测是否是磁盘I/O瓶颈 用netstat检测是否是网络带宽瓶颈 1 首先进行OS层面的检查确认 首先要确认当前到底是哪些进程引起的负载高&#xff0c;以及这些进程卡在什么地方&#x…

sectigo ip证书种类买一年送一月

Sectigo旗下的IP证书是专为只有公网IP地址的网站准备的。Sectigo旗下的数字证书大多是域名证书&#xff0c;例如&#xff0c;单域名SSL证书、多域名SSL证书、通配符SSL证书等。这些证书申请时必须验证域名所有权&#xff0c;申请者需要有一个拥有管理全的域名网站&#xff0c;那…

SpringIOC之support模块GenericGroovyApplicationContext

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

RAG代码实操之斗气强者萧炎

&#x1f4d1;前言 本文主要是【RAG】——RAG代码实操的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句&#x…

京东宣布启动鸿蒙原生应用开发,全力支持鸿蒙生态 | 百能云芯

华为常务董事、终端BG CEO、智能汽车解决方案BU董事长余承东于1月10日在微博上发布了一条令人振奋的消息&#xff1a;京东即将启动鸿蒙原生应用的开发。这一消息在科技圈掀起了不小的波澜&#xff0c;也为鸿蒙系统的发展注入了新的动力。 京东集团首席执行官兼执行董事许冉和余…

10年果粉拯救老掉牙Mac心得(没错我是标题党)

连续两周了&#xff0c;当我不能用Mac,或者说当我闲置了近10年隔三差五的用Mac时&#xff0c;成功发现我的AppleID已经无法登录了。事情是这样的&#xff0c;当我踌躇满志地准备改一篇稿子&#xff08;潜在的稿费啊亲&#xff01;&#xff09;时&#xff0c;发现Pages竟然没有W…