C++结合OpenCV:掌握图像基础与处理

        本文详细介绍了使用 OpenCV4 进行图像处理的基础知识和操作。内容包括图像的基础概念、色彩空间理解、以及如何在 C++ 中进行图像读取、显示和基础操作。

1.图像的基本概念与术语

        图像表示

        在计算机视觉中,图像通常表示为一个二维或三维的数组。二维数组表示灰度图像,其中每个元素代表一个像素的亮度。三维数组表示彩色图像,通常使用 RGB(红、绿、蓝)色彩模型,如图1。

图1  RGB色彩模型

        首先,我们可以将一幅图像定义为一个二维函数ƒ(x,y),其中x和y是空间(平面)的坐标,f是图像在点(x,y)处具有某种性质的F的值,而任何一对空间标点(x,y)处的幅值f,即为图像在该点的强度和灰度。

接下来,我们对坐标点(x,y)使用整数值表示:x=0,1,2,…M-1和y =0,1,2...N-1,图像可表示为如下所示RaC矩阵形式,其中,R是图像的行数,C为图像的列数,而矩阵中的每个元素即为像素。

根据每个像素所代表的信息不同,可将图像分为二值图像、灰度图像和彩色图像。

注:基础术语

  1. 像素(Pixel):图像的基本单位。
  2. 分辨率(Resolution):图像的宽度和高度(例如,1920x1080)。
  3. 位深度(Bit Depth):每个像素可以使用的色彩范围(例如,8位表示256种可能的值

2.图像读取与显示

在opencv中,图像可以轻易地读取和显示。                 

#include <opencv2/opencv.hpp>  
#include <opencv2/highgui/highgui.hpp>  
int main() {  // 读取图像  cv::Mat img2 = cv::imread("img.jpg");    // 创建一个名为 "lesson" 的窗口  cv::namedWindow("lesson", cv::WINDOW_NORMAL);    // 在 "lesson" 窗口内显示图像  cv::imshow("lesson", img2);  // 等待用户按键,然后关闭窗口  cv::waitKey(0);  return 0;  
}

在本程序运行中:

1、在C++中,我们使用cv::Mat来表示图像。cv::imread()函数用于读取图像,返回一个cv::Mat对象。

2、cv::namedWindow()函数用于创建一个窗口,第一个参数是窗口名称,第二个参数是窗口标志。在这里,我们使用cv::WINDOW_NORMAL来允许窗口大小被调整。

3、cv::waitKey()函数用于等待用户按键。参数0表示无限等待,直到用户按下一个键。这个函数在显示图像时通常很有用,因为它允许用户看到图像,直到他们决定关闭它。如果用户按下了ESC键(ASCII码为27),那么程序将退出,在结束时返回0,表示程序正常退出。

运行上述程序,得到的运行结果如图2所示。

图2  程序的运行结果

        在实际使用中,可以先通过函数cv::namedWindow()来创建一个窗口,再让函数 cv::imshow()引用该窗口来显示图像。也可以不创建窗口,直接使用函数 cv::imshow()引用一个并不存在的窗口,并在其中显示指定图像,这样函数 cv::imshow()实际上会完成如下两步操作。

        第1步:函数 cv::imshow()创建一个指定名称的新窗口。

        第2步:函数 cv::imshow()将图像显示在刚创建的窗口内。

3.基础图像操作:像素读写与算术运算  

在OpenCV中可以读取和修改图像中的特定像素。

c++代码示例:       

cv::Vec3b value = image.at<cv::Vec3b>(100, 100);image.at<cv::Vec3b>(100, 100) = cv::Vec3b(255, 0, 0);

        第一行代码读取一个像素的值,第二行行代码将位于(100, 100)位置的像素值设置为(255, 0, 0),这是一个BGR值,对应于红色(因为蓝色和绿色通道的值都是0,而红色通道的值是255)。cv::Vec3b(255, 0, 0)创建了一个新的cv::Vec3b对象,其BGR值分别为255、0和0。然后,我们使用at<cv::Vec3b>(100,100)将这个位置的像素值设置为新创建的颜色值。注意,在图像处理中,(x, y)坐标通常表示列和行,而不是传统的数学坐标系统中的x和y轴。

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

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

相关文章

vue3.0 通用管理页面封装

bmTable使用方法 <BmTable url"/project/list":columns"columns":formItem"formItem":formConfig"formConfig":isPagination"true"postData"postData"preData"preData"ref"bmTable">&…

[SQL]实验 视图和索引的应用

实验目的&#xff1a; [实验目的和要求] 1、掌握视图的创建、修改和重命名的方法 2、掌握视图中数据的操作 3、了解索引的作用 4、掌握索引的创建方法 实验步骤&#xff1a; 1、在销售管理数据库中&#xff0c;创建一个女职工视图&#xff0c;包括员工的编号、姓名、性别、雇佣…

JavaScript 数组去重 ES6 方法总结

JavaScript 数组去重 ES6 方法 方法一 new Set()生成出来的数据是Set数据结构&#xff0c;需要自行转换成对应结构 let array [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 3, 3, 9, 8, 9, s, o, o]; Array.from(new Set(array));方法二 let array [0, 1, 2, 3, 4, 5, 6, 7, 8,…

网站怎么才能做好SEO?网站SEO指引!!

在当今互联网的激烈竞争中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已成为提升网站流量和吸引更多用户的关键手段。为了帮助您更好地掌握SEO网站优化技巧&#xff0c;本文将深入探讨以下几个方面&#xff1a; 一、关键词策略 关键词策略是SEO优化的基石。正确选择…

【WPF.NET开发】创建样式

本文内容 创建样式隐式应用样式显式应用样式以编程方式应用样式扩展样式TargetType 属性与 x:Key 属性之间的关系 使用 Windows Presentation Foundation (WPF)&#xff0c;可以使用自己的可重用样式自定义现有控件的外观。 可以对应用、窗口和页面全局应用样式&#xff0c;也…

linux同步文件到百度云盘

背景 由于个人项目预算有限&#xff0c;把mysql和应用程序都跑在同一台阿里云ECS机器上面&#xff0c;就在昨天(2023年12月21日) &#xff0c;服务器突然出现问题 进程全部挂掉了&#xff0c;服务器也无法重启&#xff0c;找工程师排查后发现是系统磁盘挂载出现了问题&#xf…

Ansible的脚本---Playbook剧本编写

playbook的组成部分 1、 tasks&#xff1a;任务 在目标主机上需要执行的操作。使用模块定义这些操作。每个任务都是一个模块的调用。 2、 variables&#xff1a;变量 用于存储和传递数据。类似于shell脚本中的变量。变量可以自定义。可以在playbook当中定义为全局变量&…

基于Vite+Vue3 给项目引入Axios

基于ViteVue3 给项目引入Axios,方便与后端进行通信。 系列文章指路&#x1f449; 系列文章-基于Vue3创建前端项目并引入、配置常用的库和工具类 文章目录 安装依赖新建src/config/config.js 用于存放常用配置进行简单封装解决跨域问题调用尝试 安装依赖 npm install axios …

VisualVM监控远程服务SpringBoot

1.启动参数 java -jar \ -Djava.rmi.server.hostname192.168.14.11 \ -Dcom.sun.management.jmxremote \ -Dcom.sun.management.jmxremote.port2622 \ -Dcom.sun.management.jmxremote.sslfalse \ -Dcom.sun.management.jmxremote.access.file/usr/jmxremote.access \ -Dcom.s…

PIL/Pillow

Abstract PIL(Python Imaging Library)是一个用于图像处理的 Python 库。它提供了广泛的功能&#xff0c;包括图像加载、保存、调整大小、裁剪、旋转、滤镜应用等。 由于 PIL 的开发停止在 2009 年&#xff0c;因此推荐使用其后续的维护版本 Pillow。Pillow 是一个兼容 PIL 接…

Springboot启动异常 OgnlException: sqlSelect [java.lang.NoSuchMethodError

完整的日志如下&#xff1a; Invocation of init method failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression ew ! null and ew.sqlSelect ! null. Cause…

不忍学弟学妹受苦受难!!!逐一讲解发动机原理实验报告(1)

固体火箭发动机侵蚀燃烧测试实验 经过了愉快迷糊——哦不瑟瑟发抖——哦不痛不欲生的两天&#xff0c;终于和小伙伴们协力完成了西北工业大学航天学院发动机原理实验报告。具体的实验指导书均可在本人博客资源站下载。 固体火箭发动机侵蚀燃烧测试实验&#xff0c;嗯哼—— 实…

MySQL 事务的ACID特性

MySQL事务是什么&#xff0c;它就是一组数据库的操作&#xff0c;是访问数据库的程序单元&#xff0c;事务中可能包含一个或者多个 SQL 语句。这些SQL 语句要么都执行、要么都不执行。我们知道&#xff0c;在MySQL 中&#xff0c;有不同的存储引擎&#xff0c;有的存储引擎比如…

c++学习笔记-提高篇-STL标准模板库3(stack容器、queue容器以及list容器)

目录 Stack容器 一、Stack容器介绍 二、stack常用接口 三、栈的示例 queue&#xff08;队列&#xff09;容器 一、queue容器介绍 二、queue常用接口 三、queue示例 list容器 一、list容器介绍 二、list常用接口及示例 &#xff08;一&#xff09;list构造函数 &am…

使用Swift Package Manager (SPM)实现xcframework分发

Swift Package Manager (SPM) 是苹果官方提供的用于管理 Swift 项目的依赖关系和构建过程的工具。它是一个集成在 Swift 编程语言中的包管理器&#xff0c;用于解决在开发过程中管理和构建包依赖项的需求。 1、上传xcframework.zip到服务端 压缩xcframeworks成一个zip包&…

【flink】状态清理策略(TTL)

flink的keyed state是有有效期(TTL)的&#xff0c;使用和说明在官网描述的篇幅也比较多&#xff0c;对于三种清理策略没有进行横向对比得很清晰。 全量快照清理(FULL_STATE_SCAN_SNAPSHOT)增量清理(INCREMENTAL_CLEANUP)rocksdb压缩清理(ROCKSDB_COMPACTION_FILTER) 注意&…

MySQL数据管理————外键

方式一&#xff1a;在创建表的时候&#xff0c;增加约束&#xff08;麻烦&#xff0c;比较复杂&#xff09; CREATE TABLE grade( gradeid INT(10) NOT NULL AUTO_INCREMENT COMMENT 年级id, gradename VARCHAR(50) NOT NULL COMMENT 年级名称, PRIMARY KEY(gradeid) )ENGINEI…

国图公考:公考常识题如何复习更高效?

公务员考试是许多人求职的首选之一&#xff0c;而公考常识题作为公务员考试的重要组成部分&#xff0c;对于考生来说具有很高的分值。在这一模块的复习中&#xff0c;有以下几点可以帮助考生提高学习效率&#xff0c;一起来看一下吧! 一、明确复习目标 了解自己在各个知识点上…

gitee版本回退本地和仓库的执行步骤(后悔药,无副作用,按说明书使用)

目录 1.本地回退 1.打开项目文件夹 3.回退到指定版本 4.选择回退模式并确认 5.本地回退成功 2.回退仓库版本 1.在git上面找到项目的提交记录 2.找到提交错误的版本​编辑 3.双击新页面这个版本进去 点击操作再点击revert​编辑 4.确认回退 ​5.仓库回退成功 在使用…

融资项目——代码生成器

public void GenCode(){// 1、创建代码生成器AutoGenerator mpg new AutoGenerator();// 2、全局配置GlobalConfig gc new GlobalConfig();String projectPath System.getProperty("user.dir");gc.setOutputDir(projectPath "/src/main/java");gc.setA…