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轴。

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

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

相关文章

数据分析基础之《numpy(5)—合并与分割》

了解即可&#xff0c;用panads 一、作用 实现数据的切分和合并&#xff0c;将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

python dash 的学习笔记1

dash 用python开发web界面 https://dash.plotly.com/ 官方上支持jula F# python一类。当然我只会python只学习python中使用dash. 要做一个APP&#xff0c;用php,java以及.net都可以写&#xff0c;只所有选择python是因为最近在用这一个。同时也发现python除了慢全是优点。 资料…

桶装水送水小程序:提升服务质量的利器

随着移动互联网的发展&#xff0c;越来越多的消费者通过手机在线购物和订购商品。如果你是一名桶装水供应商&#xff0c;想要拓展线上业务&#xff0c;那么开发一个桶装水微信小程序将是一个明智的选择。本文将指导你从零开始开发一个桶装水微信小程序&#xff0c;让你轻松完成…

Java开发框架和中间件面试题(3)

14.Spring事务中的隔离级别有哪几种&#xff1f; 在TransactionDefinition接口中定义了五个表示隔离级别的常量&#xff1a; 1⃣️ISOLATION DEFAULT&#xff1a;使用后端数据库默认的隔离级别&#xff0c;Mysql默认采用的可重复读隔离级别&#xff1b;Oracle默认采用的读已提…

Linux一行命令配置jdk环境

使用方法&#xff1a; 压缩包上传 到/opt, 更换命令中对应的jdk包名即可。 注意点&#xff1a;jdk-8u151-linux-x64.tar.gz 解压后名字是jdk1.8.0_151 sudo tar -zxvf jdk-8u151-linux-x64.tar.gz -C /opt && echo export JAVA_HOME/opt/jdk1.8.0_151 | sudo tee -a …

反序列化漏洞原理、成因、危害、攻击、防护、修复方法

反序列化漏洞是一种安全漏洞&#xff0c;它允许攻击者将恶意代码注入到应用程序中。这种漏洞通常发生在应用程序从不安全的来源反序列化数据时。当应用程序反序列化数据时&#xff0c;它将数据从一种格式&#xff08;例如JSON或XML&#xff09;转换为另一种格式&#xff08;例如…

Mac版MySQL开启服务及终端进入MySQL的基本操作

Mac版MySQL开启服务及终端进入MySQL的基本操作 一、开启mysql服务 下载完成后&#xff0c;系统偏好设置->MySQL 如图显示&#xff0c;左边是绿色的&#xff0c;右边的按键显示是Stop MySQL Server&#xff0c;说明服务已经开启 二、终端进入mysql 1.输入下面语句并回车…

AI绘画中VAE压缩图像

介绍 在Stable Diffusion中,所有的去噪和加噪过程并非在图像空间直接进行,而是通过VAE模块将图像编码到一个低维空间。 这个低维空间的“分辨率”低于原始图像空间,有利于快速地完成加噪和去噪过程。 最后再将编码空间中的噪声表示解码恢复为图像空间,完成去噪或加噪操作。 …

JDBC学习,从入门到入土

JDBC引入 JDBC概念&#xff1a; JDBC是使用Java语言操作关系型数据库的一套API。全称&#xff1a;&#xff08;Java DataBase Connectivity&#xff09;Java数据库连接 JDBC的本质&#xff1a; 官方定义的一套操作所有关系型数据库的规则&#xff0c;即接口。 各个数据库厂…

c语言二分查找

前言 二分查找法算法&#xff0c;也叫折半查找算法&#xff08;对半处理会提高寻找目标数字的效率&#xff09;&#xff1b; 作用&#xff1a; 在一串有序的数字中&#xff0c;能快速寻找到你输入的数字&#xff0c;是一种很高效的查询算法。 …

医学实验室检验科LIS信息系统源码

实验室信息管理是专为医院检验科设计的一套实验室信息管理系统&#xff0c;能将实验仪器与计算机组成网络&#xff0c;使病人样品登录、实验数据存取、报告审核、打印分发&#xff0c;实验数据统计分析等繁杂的操作过程实现了智能化、自动化和规范化管理。 实验室管理系统功能介…

K8s出现问题时,如何排查解决!

K8s问题的排查 1. POD启动异常、部分节点无法启动pod2. 审视集群状态3. 追踪事件日志4. 聚焦Pod状态5. 检查网络连通性6. 审视存储配置7. 研究容器日志8. K8S集群网络通信9. 问题&#xff1a;Service 是否通过 DNS 工作&#xff1f;10. 总结1、POD启动异常、部分节点无法启动p…

【JAVA面试题】什么是对象锁,什么是类锁?

&#x1f34e; 个人博客 &#xff1a;个 人 主 页 &#x1f3c6;个人专栏&#xff1a;多线程JAVA ⛳️ 功 不 唐 捐 &#xff0c;玉 汝 于 成 目录 前言 回答 对象锁&#xff08;Object Lock&#xff09;&#xff1a; 类锁&#xff08;Class Lock&#xff09;&#xff1…

如何在Windows上搭建WebDAV服务并通过内网穿透实现公网访问

文章目录 前言1. 安装IIS必要WebDav组件2. 客户端测试3. 使用cpolar内网穿透&#xff0c;将WebDav服务暴露在公网3.1 安装cpolar内网穿透3.2 配置WebDav公网访问地址 4. 映射本地盘符访问 前言 在Windows上如何搭建WebDav&#xff0c;并且结合cpolar的内网穿透工具实现在公网访…

市场复盘总结 20231222

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整 昨日回顾: SELECT CODE,成交额排名,净流入排名,代码,名称,DDE大单金额,涨幅,主力净额,DDE大单净量,CONVERT(DATETIME, 最后封板, 120) AS 最后封板,涨停分析,_3日涨幅百…

49.网游逆向分析与插件开发-游戏反调试功能的实现-软件调试器设计的基本原理

图0&#xff1a; 下方是一个简化过的代码 做一个软件调试器最基本的是&#xff0c;首先要调试一个进程那么就要有一个进程 拿x96dbg来讲调试一个进程有两种方式&#xff0c;第一种通过附加&#xff08;如图1&#xff09;&#xff0c;通过附加可以对已经创建的进程进行调试&…

深度剖析JDK 11全新特性:编程艺术的巅峰之作

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 深度剖析JDK 11全新特性&#xff1a;编程艺术的巅峰之作 前言字符串处理方法新增http client 的增强功能ZGC&#xff08;低延迟垃圾回收器&#xff09;的改进对Stream、Optional、集合API进行增强Stre…

Ps:矩形工具

使用矩形工具 Rectangle Tool可以绘制矩形形状&#xff08;矢量形状&#xff0c;或者是基于像素的形状&#xff09;和路径&#xff08;形状轮廓&#xff09;。 快捷键&#xff1a;U Ps 2021 年 3 月版开始删除了“圆角矩形工具”。现在可通过矩形工具的“圆角半径”选项以及画布…

【WPF.NET开发】WPF中的数据绑定

本文内容 什么是数据绑定数据绑定基本概念数据绑定的示例创建绑定数据转换绑定到集合数据模板化数据验证调试机制 Windows Presentation Foundation (WPF) 中的数据绑定为应用呈现数据并与数据交互提供了一种简单而一致的方法。 元素能够以 .NET 对象和 XML 的形式绑定到不同…

postgresql|数据库|LVM快照热备冷恢复数据库的思考

一&#xff0c; LVM快照备份的意义 数据库备份一直是数据库运维工作中的重点&#xff0c;一个完备的备份不仅仅是仅有后悔药的功能&#xff0c;还可能有迁移数据库的作用。 那么&#xff0c;数据库备份系统我们需要的&#xff0c;也就是看重的是四个点&#xff0c;甚至更多的…