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

       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.mfbz.cn/a/317972.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

飞桨分子动力学模拟-论文复现第六期:复现TorchMD

飞桨分子动力学模拟-论文复现第六期&#xff1a;复现TorchMD Paddle for MD 飞桨分子动力学模拟科学计算 复现论文-TorchMD: A deep learning framework for molecular simulations 本项目可在AIStudio一键运行&#xff1a;飞桨分子动力学模拟PaddleMD-复现TorchMD 【论文复…

【STM32】HAL库的RCC复位状态判断及NVIC系统软件复位

【STM32】HAL库的RCC复位状态判断及NVIC系统软件复位 在实际开发中 有时候会遇到复位状态不同 导致结果不同的情况 比如在上电复位时 电压不稳定 可能导致一些外部芯片无法正常工作 从而导致进行了错误的操作流程 所以 可以在程序运行后 加一个复位状态判断 用来检测是否正常复…

linux 如何创建文件

我们在写一些教程的时候&#xff0c;经常会需要创建一些用于演示的文档&#xff0c;这些文档往往需要填充一些不特定的内容。那么如何快速的创建演示用的文档呢&#xff1f; docfaker.py docfaker.py是一个py脚本&#xff0c;用于创建一个简单的txt文档&#xff0c;docfaker.…

力扣每日一练(24-1-13)

如果用列表生成式&#xff0c;可以满足输出的型式&#xff0c;但是不满足题意&#xff1a; nums[:] [i for i in nums if i ! val]return len(nums) 题意要求是&#xff1a; 你需要原地修改数组&#xff0c;并且只使用O(1)的额外空间。这意味着我们不能创建新的列表&#xff…

vivado 指定顶部模块和重新排序源

指定顶部模块和重新排序源 文件夹默认情况下&#xff0c;Vivado Design Suite会自动确定设计的顶层添加到的源文件的层次结构和细化、合成和模拟的顺序项目这可以通过右键单击中的“层次更新”设置进行控制“源”窗口的菜单。请参阅中的“源”窗口中的“层次更新”命令Vivado …

从AAAI 2024看人工智能研究的最新热点

图 1 由AAAI 2024论文列表生成的词云 AAAI会议作为全球AI领域的顶级学术盛会&#xff0c;被中国计算机学会&#xff08;CCF&#xff09;评为A类会议。AAAI2024的会议论文投稿量达到了历史新高&#xff0c;主赛道收到了12100篇投稿论文&#xff0c;9862篇论文经过严格评审后共有…

基于Python的二氧化碳排放量数据分析系统

项目背景&#xff1a; 随着全球气候变化问题日益严重&#xff0c;减少温室气体排放已成为全球共识。我国作为全球最大的碳排放国&#xff0c;承担着重要的国际责任。为了更好地控制和减少碳排放&#xff0c;需要对全国的碳排放情况进行深入研究和分析。本项目旨在构建一个基于P…

腾讯云优惠券(代金券)领取方法及最新优惠活动汇总

腾讯云作为国内领先的云计算服务提供商&#xff0c;一直致力于为用户提供优质、高效、安全可靠的云计算服务。为了回馈广大用户&#xff0c;腾讯云会不定期地推出各种优惠活动&#xff0c;其中包括优惠券的发放。本文将分享腾讯云优惠券的领取方法并汇总最新优惠活动&#xff0…

uniapp小程序当页面内容超出时显示滚动条,不超出时不显示---样式自定义

使用scroll-view中的show-scrollbar属性 注意:需要搭配enhanced使用 否则无效 <scroll-view class"contentshow" scroll-y :show-scrollbartrue :enhancedtrue><view class"content" :show-scrollbartrue><text>{{vehicleCartinfo}}<…

阿里云云服务器u1实例和e实例有什么区别?

阿里云服务器u1和e实例有什么区别&#xff1f;ECS通用算力型u1实例是企业级独享型云服务器&#xff0c;ECS经济型e实例是共享型云服务器&#xff0c;所以相比较e实例&#xff0c;云服务器u1性能更好一些。e实例为共享型云服务器&#xff0c;共享型实例采用非绑定CPU调度模式&am…

【python入门】day26: 模拟高铁售票系统

界面 代码 #-*- coding:utf-8 -*- import prettytable as pt#---------导入漂亮表格 import os.path filename ticket.txt#更新座位状态 def update(row_num):#------更新购票状态with open(filename,w,encodingutf-8) as wfile:for i in range(row_num):lst1 [f{i1},有票,有…

代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点面试题 02.07. 链表相交、142.环形链表II

文档讲解&#xff1a;虚拟头节点&#xff0c;三指针&#xff0c;快慢指针&#xff0c;链表相交&#xff0c;环形链表&#xff0c; 技巧&#xff1a; 1、对于指针的操作要画图&#xff0c;明确步骤后好做了 2、使用虚拟头节点可以避免对头节点单独讨论&#xff0c;且方便对头节点…

Linux 系统之部署 ZFile 在线网盘服务

一、ZFile 介绍 1&#xff09;ZFile 简介 官网&#xff1a;https://www.zfile.vip/ GitHub&#xff1a;https://github.com/zfile-dev/zfile ZFile 是一款基于 Java 的在线网盘程序&#xff0c;支持对接 S3、OneDrive、SharePoint、又拍云、本地存储、FTP 等存储源&#xff0…

oracle 19c容器数据库data dump数据泵传输数据(3)---完全传输

目录 查看pdb1 创建pdb2 从pdb1 中导出元数据 在pdb2中导入元数据&#xff08;dmp文件&#xff09; Full Transportable Export/Import: Example 只传输除了system&#xff0c;sysaux&#xff0c;temp&#xff0c;undo以外的用户表空间&#xff0c;這種方式傳輸的是用戶自定…

xtu oj 1329 连分式

题目描述 连分式是形如下面的分式&#xff0c;已知a,b和迭代的次数n&#xff0c;求连分式的值。 输入 第一行是一个整数T(1≤T≤1000)&#xff0c;表示样例的个数。 每行一个样例&#xff0c;为a,b,n(1≤a,b,n≤9) 输出 每行输出一个样例的结果&#xff0c;使用x/y分式表达…

计算机网络NCEPU复习资料

目录 一&#xff0e;概述&#xff1a; 计算机网络组成&#xff1a; 计算机网络分类&#xff1a; 计算机网络体系结构&#xff1a; C/S架构与P2P架构区别&#xff1a; OSI开放式系统互连参考模型&#xff1a; OSI开放式系统互连参考模型 相关协议&#xff1a; 五层协议网…

UML-类图和类图转化为代码

提示&#xff1a;文章详细的讲解了类图的四种关系&#xff0c;以及每种关系如何转化为对应的代码。 UML-类图和类图转化为代码 一、类于类之间的关系1.依赖关系2.关联关系(1) 单向关联(2) 双向关联(3) 自关联(4) 聚合关联(has-a)(5) 组合关联&#xff08;contains-a&#xff09…

Windows Server 2019配置多用户远程桌面登录服务器

正文共&#xff1a;1234 字 21 图&#xff0c;预估阅读时间&#xff1a;2 分钟 很久之前&#xff0c;在介绍显卡直通的时候我们简单介绍过RDP&#xff08;Remote Desktop Protocol&#xff0c;远程桌面协议&#xff09;&#xff08;前人栽树&#xff1a;失败的服务器显卡操作&a…

day17 平衡二叉树 二叉树的所有路径 左叶子之和

题目1&#xff1a;110 平衡二叉树 题目链接&#xff1a;110 平衡二叉树 题意 判断二叉树是否为平衡二叉树&#xff08;每个节点的左右两个子树的高度差绝对值不超过1&#xff09; 递归遍历 递归三部曲 1&#xff09;确定递归函数的参数和返回值 2&#xff09;确定终止条…

【LabVIEW FPGA入门】LabVIEW FPGA实现I2S解码器

该示例演示了如何使用 LabVIEW FPGA 解码 IS 信号。该代码可用于大多数支持高速数字输入的LabVIEW FPGA 目标&#xff08;例如R 系列、CompactRIO&#xff09;。IS 用于对系统和组件内的数字音频数据进行编码。例如&#xff0c;MP3 播放器或 DVD 播放器内部的数字音频通常使用 …