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 pressedreturn 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 pressedreturn 0;
}

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

  

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

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

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

相关文章

理想汽车迎来新算力平台负责人,内部化名为张一粟;王者荣耀在抖音直播全面开放;陈楚生等人现身央视春晚彩排

今日精选 • 理想汽车迎来新算力平台负责人,内部化名为张一粟。目前理想内部暂未公布其内部职级• 王者荣耀在抖音直播全面开放• 陈楚生等人现身央视春晚彩排 投融资 • 2023年12月份&#xff0c;中国社会融资规模增量为1.94万亿元• OpenAI 支持的人形机器人公司 1X 完成 …

oracle-事务一系列理解

一个事务开始后&#xff0c;会被分配一个唯一的id号&#xff0c;xid&#xff0c;xid不仅是一个编号也是一个地址。 事务表 存在undo表空间的某一个段的段头块&#xff0c;最多存放47个事务&#xff0c;事务开始的时候&#xff0c;先将信息写入这个表&#xff0c;所以一个undo段…

css宽度适应内容

废话不多说,看如下demo,我需要将下面这个盒子的宽度变成内容自适应 方法有很多,如下 父元素设置display:flex 实现子元素宽度适应内容 如下给父元素设置flex能实现宽度自适应内容 <!DOCTYPE html><html lang"en"><head><meta charset"U…

我开源了一个 Go 学习仓库

前言 大家好&#xff0c;这里是白泽&#xff0c;我是21年8月接触的 Go 语言&#xff0c;学习 Go 也正好两年半&#xff0c;我决定重启我之前未完成的计划&#xff0c;继续阅读《The Go Programing Language》&#xff0c;一年多前我更新至第五章讲解的时候&#xff0c;工作的忙…

基于springboot+vue2的灾区物资管理系统(Java毕业设计)

大家好&#xff0c;我是DeBug&#xff0c;很高兴你能来阅读&#xff01;作为一名热爱编程的程序员&#xff0c;我希望通过这些教学笔记与大家分享我的编程经验和知识。在这里&#xff0c;我将会结合实际项目经验&#xff0c;分享编程技巧、最佳实践以及解决问题的方法。无论你是…

java中多线程

文章目录 多线程进程和线程进程线程 继承Thread类方式实现多线程设置线程名字的两个方式获取正在运行的线程线程调度模型和线程优先级设置两种调度模型优先级设置 线程控制sleepjoin守护线程 线程生命周期 多线程 进程和线程 进程 进程&#xff1a;是正在运行的程序 是系统进…

LeetCode刷题:142. 环形链表 II

题目&#xff1a; 是否独立解决&#xff1a;否&#xff0c;参考了解题思路解决问题&#xff0c;思考了用快慢指针&#xff0c;栈&#xff0c;统计链表数量定位尾巴节点&#xff08;因为是环形链表所以是死循环&#xff0c;链表数量用while循环统计不出来&#xff09;都没解决 解…

如何将.NET 8.0的ASP.NET Core Web API部署成Windows服务

写在前面 前面写了一篇关于将.NET应用转换成Windows服务的方法&#xff0c;其实真正的目的是为了探索如何将Asp.Net Core Web Api 部署成Windows 服务。基于上一篇的基础&#xff0c;只需把创建 WebApplication 的代码放到 BackgroundService 的ExecuteAsync方法中即可。 其中…

脱离于ASP.NET 和Visual Studio编辑Razor脚本

Razor Pad是一个编辑Razor脚本的工具&#xff0c;脱离于ASP.NET 和Visual Studio。 github地址&#xff1a;https://github.com/RazorPad/RazorPad 如果在编译源码时出现&#xff1a;签名时出错: 未能对 bin\Debug\app.publish\RazorPad.exe 签名。SignTool Error: No certifi…

JavaScript数据类型、判断、检测

JavaScript数据类型 number、string、boolean、null、undefined、symbol、bigint Object【Array、RegExp、Date、Math、Function】 存储方式 1. 基础类型存储在栈内存中&#xff0c;被引用或者拷贝时&#xff0c;会创建一个完全相同的变量。 2. 引用类型存放在堆内存中&…

深度学习笔记(五)——网络优化(1):学习率自调整、激活函数、损失函数、正则化

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 通过学习已经掌握了主要的基础函数之后具备了搭建一个网络并使其正常运行的能力&#xff0c;那下一步我们还…

【Linux笔记】自定义一个简单的shell

一、命令行解释器shell的原理 我们已经知道Linux给我们提供了一系列由exec开头的系统调用接口&#xff0c;可以让我们在自己所写的程序中调用各种指令或者我们自己写的其他程序&#xff1a; 而我们的shell命令行解释器也是接收用户输入的指令&#xff0c;然后执行&#xff1a;…

腾讯滑块(1-13,js逆向)

前言&#xff1a;之前打算写的猿人学比赛题系列因为种种原因耽搁了&#xff0c;主要还是比完赛之后热情就少了很多&#xff0c;看到评论区有人说做了这么久才做出一题&#xff0c;这里需要狡辩一下&#xff0c;我虽然菜但是还没到那种地步&#xff0c;比赛两天时间里我跟队友是…

CH341 SPI方式烧录BK7231U

CH341是一个USB总线的转接芯片&#xff0c;通过USB总线提供异步串口、打印口、并口以及常用的2线和4线等同步串行接口。 BK7231U Wi-Fi SOC芯片&#xff0c;内嵌处理器。1. 符合802.11b/g/n 1x1协议 2. 17dBm 输出功率3. 支持20/40 MHz带宽和STBC 4. 支持Wi-Fi STA、AP、…

ftp安装与配置 云服务器 CentOS7

1、FTP的安装 #安装 yum install -y vsftpd#设置开机启动 systemctl enable vsftpd.service#启动 systemctl start vsftpd.service#停止 systemctl stop vsftpd.service#查看状态 systemctl status vsftpd.service 2、配置FTP #修改前先进行备份文件 cp /etc/vsftpd/vsftpd…

腾讯云怎么领取免费云服务器?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM&#xff0c;轻量配置可选2核2G3M、2核8G7M和4核8G12M&#xff0c;CVM云服务器可选2核2G3M和2核4G3M配置&#xff0c;腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

弟12章 1 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165 网络协议概述 p164 ipv4&#xff1a;十进制点分制 ipv6&#xff1a;十六进制冒号分隔 TCP协议与UDP协议的区别 p165 tcp协议的三次握手&#xff1a;

行为型设计模式——备忘录模式

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

【教程】微信小程序如何拍摄图片及视频并上传到后台进行存储

需求分析 在微信小程序中需要使用手机拍摄照片以及视频上传到后台进行进一步的操作&#xff0c;需要解决以下两个问题&#xff1a; 微信小程序如何拍摄照片及视频如何将拍摄的照片及视频上传到后台进行存储 解决方案 前端开发&#xff1a;微信小程序原生 后端开发&#xf…

sentinel熔断与限流

文章目录 一、sentinel简介Sentinel 是什么&#xff1f;Sentinel安装 二、sentinel整合工程新建cloudalibaba-sentinel-service8401微服务引入依赖yml配置主启动类添加EnableDiscoveryClient业务类测试 三、sentinel流控规则基本介绍流控模式直接&#xff08;默认&#xff09;关…