2:OpenCV—加载显示图像

加载和显示图像

从文件和显示加载图像

在本节中,我将向您展示如何使用 OpenCV 库函数从文件加载图像并在窗口中显示图像。

首先,打开C++ IDE并创建一个新项目。然后,必须为 OpenCV 配置新项目。


#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{// 读取一个图像文件并赋给image变量Mat image = imread("lena.png");// 判断读取图像是否为空if (image.empty()) {cout << "没有发现读取图像文件";// 输入人员字符cin.get();return -1;}// 定义一个窗体的名称String winName = "lena 图像";// 创建一个窗体用于显示图像namedWindow(winName);// 把图像显示到创建窗体上面imshow(winName, image);// 等待输入字符并关闭窗口waitKey(0);destroyWindow(winName);
}

将上述代码片段复制并粘贴到 IDE 中并运行它。请注意,您必须将代码中的图像路径替换为计算机中图像的有效位置。然后,您应该会看到如下图所示的输出。

解释

让我们逐行浏览上面的OpenCV程序。

//#include "stdafx.h" 

这是由Visual Studio IDE生成的预编译头文件。如果您使用的是Visual Studio,请取消注释此行以避免编译错误。

opencv2/opencv.hpp 头文件本身将包含 OpenCV 库中所有其他必要的头文件。您必须仅包含此头文件才能编译 OpenCV 代码。

还应包含 iostream 头文件,因为我们在程序中使用 COUT 和 CIN 将错误消息打印到控制台。

所有 OpenCV 函数、类和数据结构都在 cv 命名空间内声明。因此,我们必须在程序顶部添加“**使用命名空间 cv”**行。否则,我们必须在每个 OpenCV 函数、类和数据结构之前附加 ’cv::“说明符。(例如 - cv::Mat, cv::imread() 等)。

我们还必须使用 std 命名空间,因为 cout、endl 和 cin 函数位于 std 命名空间内。

该函数从文件“*C:\Users\Desktop\lena.png*”加载图像,并将其作为 Mat 对象返回。
在你的代码中,你必须将“*C:\Users\Desktop\lena.png*”替换为计算机中图像文件的有效位置。


#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
Mat image = imread("C:\Users\Desktop\lena.png");

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

此函数从指定文件加载图像,并作为 Mat 对象返回。如果函数无法读取文件,它将返回一个空的 Mat 对象。

  1. 文件名 - 您必须提供图像文件的相对或绝对路径。如果要提供相对路径,则它应该是相对于cpp文件的。始终支持 JPEG、JPG、BMP、PNG、TIFF 和 TIF 图像文件类型。支持其他映像文件类型,具体取决于您的平台和安装的编解码器。
  2. flags - 标志参数有几个可能的值。在上面的程序中,我没有向此参数传递任何值,以便使用默认的IMREAD_COLOR参数。
    • IMREAD_UNCHANGED - 图像将按原样加载。如果要在输入图像中获取 alpha 通道(如果可用),则必须使用此标志。
  • IMREAD_GRAYSCALE - 图像将作为灰度图像加载(即 - 单通道图像,黑白图像)
  • IMREAD_COLOR - 图像将作为BGR图像加载(即 - 3通道图像,彩色图像)

 // Check for failureif (image.empty()) {cout << "Could not open or find the image" << endl;cin.get(); //wait for any key pressreturn -1;}

如果 imread() 函数无法加载图像,则返回的 Mat 对象将为空。如果 Mat 对象为空,**则 image.empty()** 函数将返回 true。在这种情况下,我们的程序会将错误消息打印到控制台并等待任何按键。当用户按键盘中的任意键时,程序将退出,返回 -1。最好检查图像是否为空并退出程序。否则,您的程序将在尝试执行 imshow() 函数时崩溃。
此函数创建一个名为“*lena*”的窗口。窗口的名称稍后将在此代码中用于标识窗口。

namedWindow(windowName); // Create a window

void namedWindow(const String&winname, int flags = WINDOW_AUTOSIZE)
此函数创建一个可用于放置图像和跟踪栏的窗口。如果已存在具有给定名称的窗口,则此函数不执行任何操作。

  1. winname - 窗口的名称。该名称将显示在新创建的窗口的标题栏中。此名称也是此窗口的标识符,它将在以后的 OpenCV 函数调用中用于标识窗口。
  2. 标志 - 确定窗口的大小。在上面的程序中,我没有向此参数传递任何值,因此将使用默认WINDOW_AUTOSIZE参数。
    • WINDOW_AUTOSIZE - 用户无法调整窗口大小。图像将以其原始大小显示。
  • WINDOW_NORMAL-用户可以调整窗口大小。
imshow(windowName, image); // Show our image inside the created window.

此函数在上一步中创建的窗口中显示图像。

void imshow(const String&winname, InputArray mat)
此函数在 winname 指定的窗口中显示图像。如果使用WINDOW_AUTOSIZE标志创建窗口,则图像将以其原始大小显示。否则,图像可能会缩放到窗口的大小。如果尚未通过调用 namedWindow() 函数创建窗口,则此函数将创建一个带有 WINDOW_AUTOSIZE 标志的窗口。

此函数调用后应遵循 waitKey(int) 函数调用,以便提供足够的时间在指定的持续时间(以毫秒为单位)内在窗口中绘制和显示图像。如果不调用waitKey(int)函数,图像将不会显示在窗口中。

  1. winname - 由 namedWindow() 函数创建的窗口的名称。
  2. mat - 保存图像的垫子对象
waitKey(0); // Wait for any keystroke in the window

waitKey(0) 函数永远等待按键。当按下任何键时,此函数返回键的 ASCII 值,您的程序将继续。

如果将正值传递给 waitKey() 函数,则它仅等待按键的持续时间,由传递的值(以毫秒为单位)指定。如果在此期间按下任何键,此函数将返回该键的 ASCII 值,您的程序将继续。如果在此期间没有按下任何键,它将返回 -1,程序将继续。

仅当程序至少打开了一个活动的 HIGHGUI 窗口时,此功能才有效。

此函数关闭以名称 windowName 标识的打开窗口,并取消分配任何关联的内存使用量。此功能对于上述程序不是必需的,因为当程序退出时,操作系统通常会关闭所有打开的窗口并取消分配任何关联的内存使用量。

destroyWindow(windowName); //destroy the created window
总结

在上面的部分中,您已经了解到,
- 如何从文件加载图像
- 如何处理图像加载失败时的错误情况
- 如何创建窗口并显示图像
- 如何在不退出程序的情况下等待,直到用户按下某个键
- 如何销毁已创建的窗口

创建空白图像和显示

以下程序也与以前的程序非常相似。唯一的区别是该程序创建一个空白图像,而不是从文件加载现有图像。

将上述简单代码片段复制并粘贴到 IDE 中并运行它。然后,您应该会看到如下图所示的输出。


#include <iostream>
#include <opencv2\opencv.hpp>
using namespace cv;
using namespace std;
int main()
{Mat image(200, 300, CV_8UC3, Scalar(200, 31, 120));// 定义一个窗体的名称String winName = "blank Image Window";// 创建一个窗体用于显示图像namedWindow(winName);// 把图像显示到创建窗体上面imshow(winName, image);// 等待输入字符并关闭窗口waitKey(0);destroyWindow(winName);
}

本节中新增的 OpenCV 函数说明
Mat image(600, 800, CV_8UC3, Scalar(100, 250, 30)); 

这是 Mat 类中可用的众多构造函数之一。它创建一个高 600 像素、宽 800 像素的图像。为图像中的每个像素分配 24 位。24 位将由三个无符号 8 位整数组成,分别代表蓝色、绿色和红色平面。三个整数的值应介于 0 到 255 之间。

然后,此构造函数使用 3 个无符号整数(100、250、30)初始化创建图像的每个像素。因此,它初始化蓝色通道为 100,绿色通道初始化为 250,红色通道初始化为 30。由于绿色通道的值明显大于其他通道的值,因此输出图像为绿色。您可以尝试这三个值的不同组合并查看输出图像。

Mat:**:Mat(int rows, int cols, int type, const Scalar& s)**
此构造函数将创建一个具有指定行数和列数的 Mat 对象,并使用 s 中给出的值初始化每个元素。

  1. row - 2D 数组中的行数(即 - 图像的高度(以像素为单位)

  2. cols - 2D 数组中的列数(即 - 图像的宽度(以像素为单位)

  3. type - 二维数组的数据类型,指定每个通道中每个元素的深度和数据类型以及通道数。(当然,如果通道数大于 2,则 1D 数组变为 2D 数组)。

    • CV_8UC1
  • CV_8UC2
  • CV_8UC3
  • CV_8UC4
  • CV_8UC(n)
  • CV_8SC1
  • CV_8SC2
  • CV_8SC3
  • CV_8SC4
  • CV_8SC(n)
  • CV_16UC1
  • CV_16UC2
  • CV_16UC3
  • CV_16UC4
  • CV_16UC(n)
  • CV_16SC1
  • CV_16SC2
  • CV_16SC3
  • CV_16SC4
  • CV_16SC(n)
  • CV_32SC1
  • CV_32SC2
  • CV_32SC3
  • CV_32SC4
  • CV_32SC(n)
  • CV_32FC1
  • CV_32FC2
  • CV_32FC3
  • CV_32FC4
  • CV_32FC(n)
  • CV_64FC1
  • CV_64FC2
  • CV_64FC3
  • CV_64FC4
  • CV_64FC(n)
  1. s - 使用 s 为每个通道给出的值初始化每个数组元素(像素)。

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

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

相关文章

python训练 60天挑战-day31

知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 昨天我们已经介绍了如何在不同的文件中&#xff0c;导入其他目录的文件&#xff0c;核心在于了解导入方式和python解释器检索目录的方式。 搞清楚了这些&#xff0c;那我们就可以来看看&#x…

构建自动收集并总结互联网热门话题的网站

构建自动收集并总结互联网热门话题的网站的具体方案&#xff1a; 一、系统架构设计 数据采集层 • 使用Python的Scrapy或BeautifulSoup抓取新闻网站/社交媒体API # 示例&#xff1a;微博热点爬虫 import requests def fetch_weibo_hot():url "https://weibo.com/ajax/st…

pycharm无需科学上网工具下载插件的解决方案

以下是两种无需科学上网即可下载 PyCharm 插件的解决思路&#xff1a; 方法 1&#xff1a;设置 PyCharm 代理 打开 PyCharm选择菜单&#xff1a;File → Settings → Appearance & Behavior → System Settings → HTTP Proxy在代理设置中进行如下配置&#xff1a; 代理地…

机器学习自然语言处理

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;词向量&#xff08;Word Embedding&#xff09;是将人类语言转化为计算机可理解形式的关键技术。它通过数学空间中的向量表示&#xff0c;捕捉词语的语义和语法信息&#xff0c;有效解决了传统离散表示的 “维数灾难…

如何自学FPGA设计?

众所周知&#xff0c;FPGA设计自学难度不小&#xff0c;更不存在速成的捷径。这里简单说一下学习的规划&#xff0c;希望能给入门者提供一些方向。 学会相应的知识 不论是科班毕业还是理工科专业出身&#xff0c;想要入行FPGA开发&#xff0c;基础知识必须扎实。尤其是在高校…

南航无人机大规模户外环境视觉导航框架!SM-CERL:基于语义地图与认知逃逸强化学习的无人机户外视觉导航

作者&#xff1a; Shijin Zhao, Fuhui Zhou, Qihui Wu单位&#xff1a;南京航空航天大学电子信息工程学院论文标题&#xff1a; UAV Visual Navigation in the Large-Scale Outdoor Environment: A Semantic Map-Based Cognitive Escape Reinforcement Learning Method论文链接…

Linux-进程间通信

1.进程间通信介绍 1.1通信目的 数据传输&#xff1a;⼀个进程需要将它的数据发送给另⼀个进程 资源共享&#xff1a;多个进程之间共享同样的资源。 通知事件&#xff1a;⼀个进程需要向另⼀个或⼀组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发⽣了某种事…

精益数据分析(69/126):最小可行化产品(MVP)的设计、验证与数据驱动迭代

精益数据分析&#xff08;69/126&#xff09;&#xff1a;最小可行化产品&#xff08;MVP&#xff09;的设计、验证与数据驱动迭代 在创业旅程中&#xff0c;从需求洞察到产品落地的关键一跃是打造最小可行化产品&#xff08;MVP&#xff09;。今天&#xff0c;我们结合《精益…

从JavaScript快速上手Python:关键差异与核心技巧

引言 如果你是JavaScript开发者&#xff0c;可能会对Python的简洁语法和丰富的生态感兴趣。但两种语言的设计哲学和实现细节存在显著差异。本文将通过对比JS与Python的核心概念&#xff0c;帮助你快速过渡&#xff0c;避免“踩坑”。 一、语法差异&#xff1a;告别大括号&#…

TransmittableThreadLocal实现上下文传递-笔记

1.TransmittableThreadLocal简介 com.alibaba.ttl.TransmittableThreadLocal&#xff08;简称 TTL&#xff09;是阿里巴巴开源的一个工具类&#xff0c;旨在解决 ThreadLocal 在线程池中无法传递上下文变量 的问题。它是对 InheritableThreadLocal 的增强&#xff0c;尤其适用…

TDengine 安全部署配置建议

背景 TDengine 的分布式、多组件特性导致 TDengine 的安全配置是生产系统中比较关注的问题。本文档旨在对 TDengine 各组件及在不同部署方式下的安全问题进行说明&#xff0c;并提供部署和配置建议&#xff0c;为用户的数据安全提供支持。 安全配置涉及组件 TDengine 包含多…

在Cursor中启用WebStorm/IntelliJ风格快捷键

在Cursor中启用WebStorm/IntelliJ风格快捷键 方法一&#xff1a;使用预置快捷键方案 打开快捷键设置 Windows/Linux: Ctrl K → Ctrl SmacOS: ⌘ K → ⌘ S 搜索预设方案 在搜索框中输入keyboard shortcuts&#xff0c;选择Preferences: Open Keyboard Shortcuts (JSON) …

python打卡day30@浙大疏锦行

知识点回顾&#xff1a; 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑&#xff1a;找到根目录&#xff08;python解释器的目录和终端的目录不一致&#xff09; 作业&#xff1a;自己新建几个不同路径文件尝试下如何导入 具体操作步骤&#xff1a; 在桌面…

【kafka】基本命令

创建 Kafka Topic 的命令 以下是创建 Kafka Topic 的几种常用方法&#xff1a; 1. 使用 kafka-topics.sh 基础命令&#xff08;Kafka 自带工具&#xff09; bin/kafka-topics.sh --create \--bootstrap-server <broker地址:端口> \--topic <topic名称> \--parti…

编程速递:适用于 Delphi 12.3 的 FMX Linux 现已推出

Embarcadero非常高兴地宣布&#xff0c;用于使用Delphi构建Linux客户端应用程序的FMX Linux UI库再次在RAD Studio 12.3版本以及RAD Studio 12.2版本中提供支持&#xff0c;同时也适用于更早的版本。 作为RAD Studio的一个附加库&#xff0c;FMX Linux为开发面向Linux的图形用…

通过实例讲解螺旋模型

目录 一、螺旋模型的核心概念 二、螺旋模型在电子商城系统开发中的应用示例 第 1 次螺旋:项目启动与风险初探

vue3 vite 路由

如路由是这种格式 http://localhost:7058/admin/product/brand路由配置如下 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue import NProgress from nprogress; import nprogress/nprogress.css; import {errorRour…

【Redis】Hash 存储相比 String 存储的优势

在 Redis 中&#xff0c;Hash 存储相比 String 存储具有以下 优势&#xff0c;特别适用于某些特定场景&#xff1a; ✅ 1. 更节省内存&#xff08;尤其适合存储对象&#xff09; Hash 内部使用压缩列表&#xff08;ziplist&#xff09;或哈希表实现&#xff0c;在数据量较小时…

CSS详解:特性、选择器与优先级

CSS详解&#xff1a;特性、选择器与优先级 目录 CSS详解&#xff1a;特性、选择器与优先级一、CSS的核心特性1. 层叠性&#xff08;Cascading&#xff09;2. 继承性&#xff08;Inheritance&#xff09;3. 优先级&#xff08;Specificity&#xff09;4. 响应式设计5. 动画与过渡…

《算法导论(第4版)》阅读笔记:p86-p90

《算法导论(第4版)》学习第 19 天&#xff0c;p83-p85 总结&#xff0c;总计 3 页。 一、技术总结 无。 二、英语总结(生词&#xff1a;2) 1. inkling (1)inkling: inclen(“utter in an undertone&#xff0c;低声说话”) c. a hint(提示)&#xff1b;a slight knowledg…