OpenCV(C++版)入门

article/2025/9/28 14:13:54

了解Opencv

Opencv是一个开源的计算机视觉编程程序库,可在windows,Linux,Mac,Android,iOS上面运行。目前Opencv已经到了第3版,增加了许多功能,API也全部迁移到了C++,当然也有Python版本。并且第三版还增加一个独立的最新算法库(contrib库),其中包含一些最新的算法,可能需要收费,但这些算法仍然在开发中,经常会被修改,没有特殊需求一般不需要使用。

Opencv包含多个模块,core模块包含核心功能,imgproc模块包含图像处理,highgui模块包含读写图像和视频的一些函数,在使用这些模块之前,需要包含头文件。

#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include<opencv2/imgproc.hpp>

图像对象

在Opencv中,图像对象的数据是由Mat来表示的。对计算机来说,图像就是一个矩阵,因此Mat最主要的部分就是一个矩阵数据。除此之外,Mat还包括一些图像的属性,比如图像的长度、宽度、通道数等,我们可以用rows,cols,channels()来获取这些属性。

Mat image1(240, 320, CV_8U, 100);
cout << image1.cols << image1.rows << image1.channels();

除了图像的属性外,图像的像素也有它自己的格式。像素就是矩阵中的一个数据,这个数据的大小就表示了颜色的深浅。由于图像的通道包括单通道的和多通道的,所以像素也分为两种,单通道的就是一个数据就可以,多通道的需要多个数字组成一个像素。最常见的像素格式就是CV_8U,这表示这是单通道的像素格式,或者说为一个灰度图像,它的像素值为8个字节,用C++中unsigned char数据类型表示。另一个彩色图像的像素可以用CV_8UC3来表示,8U含义与单通道的一样,C3表示三个通道(channels),表示彩色像素类型,由三个数据RGB表示。若是灰度图像,则这三个RGB数据都相等。

opencv还能够进行图像的读取、展示、保存,读取图像使用imread()函数,保存图像使用imwrite(),展示图像使用imshow()。在读取时,还能够自行选择图像的读取格式,常用的有IMREAD_GRAYSCALE和IMREAD_COLOR,前一个表示灰度图像,后一个表示RGB图像。

Mat image = imread("demo.jpg",IMREAD_COLOR);
imshow("Image", image); // show the image
imwrite("test.jpg", image);
waitKey(0); // wait for a key pressed

waitKey(0)则表示在展示图像的时候,在等待规定时间内接受一个按键再进行下一步的操作,如果等待时间设为0,则表示一直等待下去。

Mat是Opencv经过高度优化的数据结构,它自带了内存管理,可以通过检测引用数来释放不需要的内存。同时它的赋值操作也分为浅赋值和深复制,浅赋值能够不必复制大量的数据,从而提高程序的性能,最好只在需要深复制时在进行深复制。

在赋值或者初始化时,使用的是浅赋值,这样变量的指针指向的是同一个数据。

cv::Mat image2(image1);
image3 = image2;

如上所示,image1,image2,image3指向的都是内存中同一块数据,所以只要修改其中一个任意一个变量,其他的都会改变。

而在进行深赋值时,需要使用函数copyTo(),或者clone(),这样复制出来的就是两个不同的内存数据块,这样就可以随意修改数据也不会影响其他的了。

其他对象

Point表示点类型,常用来表示坐标。Size表示尺寸,常用来表示图像的大小。Scalar表示色彩,用来表示图像的颜色。还有InputArray表示一个输入数组的代理,由于使用Mat可能会造成参数不兼容,所以Opencv中的函数使用的都是InputArray,同时还有OutputArray对象,表示输出数组的代理。

有时候还会遇到需要小矩阵的情况,这时候可以使用模板类Matx和它的子类。例如定义一个3*3的双精度型的浮点数矩阵可以使用Matx33d,定义一个3元素的向量可以使用Matx31d。这些矩阵还支持矩阵之间的操作,比如相乘相加等。

cv::Matx33d matrix(3.0, 2.0, 1.0,2.0, 1.0, 3.0,1.0, 2.0, 3.0);
cv::Matx31d vector(5.0, 1.0, 3.0);
cv::Matx31d result = matrix*vector;

获取ROI

ROI就是Region of Interest,表示感兴趣的区域。有时候我们只想获取一部分区域,那就需要用到ROI了。ROI实际上就是一个Mat对象,同时他和他的父图像指向的是同一个数据缓冲区,所以改变ROI也就能改变它的父图像了。

imageROI= image(cv::Rect(image.cols-logo.cols,image.rows-logo.rows,logo.cols,logo.rows));

如上代码所演示,ROI可以直接使用Rect来定义,我们可以使用图像的大小和logo的大小来确定ROI的大小,接下来改变imageROI就会改变原始图像image。

另一种定义ROI的方式是使用Range结构,即从开始索引到结束索引的一片连续区域,但是行和列需要分别来定义。

imageROI = image(cv::Range(image.rows-logo.rows,image.rows),cv::Range(image.cols-logo.cols,image.cols));

还能直接定义行和列组成的ROI,这样只能选择由特定区域的行或者列,但不是特别灵活。

imageROI = image.rowRange(start,end);
imageROI = image.colRange(start,end);

上面主要介绍了opencv的一些基础知识,不过想熟练使用,还得多加练习才是。

欢迎大家关注公众号“计算机视觉与机器学习”
计算机视觉和机器学习


http://chatgpt.dhexx.cn/article/eNg38ODB.shtml

相关文章

OpenCV

1. 图像读取与显示 知识点&#xff1a;imread -- 读取图像 imshow -- 显示图像 imshow只支持浮点数类型跟字节类型图像显示 示例&#xff1a; #include<iostream> #include<opencv2\opencv.hpp>using namespace cv; using namespace std;int main(int argc, …

OpenCV入门【C++版】

OpenCV基础入门【C语言】 Chapter1 读取图片/视频/摄像头从文件读取图片从文件读取视频读摄像头 Chapter2 基础函数Chapter3 调整和剪裁Chapter4 绘制形状和文字Chapter5 透视变换Chapter6 颜色检测Chapter7 形状/轮廓检测Chapter8 人脸检测Project1 虚拟画家Project2 文档扫描…

windows使用opencc中文简体和繁体互转

OpenCC git项目地址 一、OpenCC介绍 OpenCC是一款开源的中文处理工具&#xff0c;支持字符级别的转换&#xff0c;可以在中文简体和繁体以及香港、台湾之间相互转换。git上提供了在Debian、Ubuntu、Fedora、Arch Linux、Mac OS以及Node.js的安装方法&#xff0c;并没有提供在…

【自然语言处理】opencc:中文繁体☞中文简体的转换

在看蚂蚁金服人工智能团队写的一篇关于中文的NLP的论文时&#xff0c;才知道有opencc这么个库&#xff0c;可以将中文繁体转为中文简体&#xff0c;大大简化了处理过程。 如果用的pycharm直接点开解释器&#xff0c;搜opencc&#xff0c;然后install openCC即可。也可以在Termi…

任务,行动,目标、绩效管理,计划

http://blog.hiddenwangcc.com/archives/3098?utm_sourcetuicool&utm_mediumreferral 但凡要给自己定目标&#xff0c;考虑时间管理、效能提升的人&#xff0c;都绕不开这三个概念&#xff1a;任务、目标和计划。 弄不清楚三者关系并且各种混用的大有人在&#xff0c;比如…

20款免费项目管理系统推荐

通过本篇文章您将了解&#xff1a;1、国内外20款最佳项目管理软件&#xff1b;2、使用免费项目管理工具可能面临的风险。 一、项目管理软件的重要性 根据 Capterra 的数据研究&#xff0c;项目管理软件即将成为人们最需要的软件。一个项目无论大小&#xff0c;都需要一款高效且…

一款开源免费的任务日程管理工具ToDoList

推荐给大家一款开源免费的任务日程管理工具ToDoList&#xff0c;是适合职场人尤其是程序员的经典任务管理软件&#xff0c;使用好的话会让大家在工作中事半功倍。 1.软件介绍 ToDoList是一款小众但功能强大的开源免费任务管理软件&#xff0c;它可以帮助你把要做的事情一项一项…

团队管理25--任务执行之轻重缓急

本文来谈一下我对任务执行中轻重缓急的理解&#xff0c;希望对大家有启发。 对于技术管理者来说&#xff0c;技术管理中任务执行是最得心应手的。因为我们大部分技术管理者都是从实干起家的&#xff0c;管理上的积累可能不够&#xff0c;但是任务执行的积累是最强的。任务执行…

Activiti6自学之路(七)——个人任务和组任务

Activiti6 任务有个人任务和组任务之分&#xff0c;理解两者的区别并且知道如何操作对应的任务是学习activiti重要一步。 本章承接上文章节&#xff0c;这里就不详细描述了 一、个人任务与组任务区别 个人任务&#xff1a;流程中的某个任务由指定的user来执行 组任务&#…

个人财务管理系统设计与实现

个人财务管理系统设计与实现 这里是分享个人的一份“个人财务管理系统”的设计报告,详细的介绍了整个项目的各个部分。 1 绪论 1.1 个人财务管理系统的研究背景与意义 随着中国经济的快速发展,无论是企业或是个人,各个环节都已经进入了金融化领域。在经济化潮流和金融危机的…

iSpace PIM 3.6.0.2027 个人任务管理系统发布

iSpace PIM是一款使用简单、设计灵巧、功能多样化的个人任务管理软件&#xff0c;包括待办事务管理、联系人管理等模块&#xff0c;可作为工作分解和任务管理的工具&#xff0c;实现高效的任务管理和工作过程知识记录和管理。 iSpace PIM 特色 支持树形结构式的父子任务分解…

如何做好项目管理任务分配

TL;DR 常见项目管理工具介绍项目管理最重要的内容谁来撰写以及分配任务如何有效地分配任务项目管理工具 在我工作的10多年中,使用过不少的项目管理系统,Excel, Microsoft Project, dotProject, Redmine, Jira, Teambition, Worktile, Tello…。比我谈过的女朋友还多。

ToDoList-简单有效的个人任务管理器

是否觉得日常工作很无序&#xff0c;经常工作杂乱无章&#xff0c;丢三落四&#xff0c;不能很好地控制每样工作的进度&#xff1f; (点击放大下图) 我一直在关注 ToDoList这个开源项目&#xff0c;它是一个简单有效的个人任务管理器&#xff0c;一树状结构显示所有任务。 □…

软件开发过程与项目管理(5.软件项目任务分解)

软件开发过程与项目管理&#xff08;5.软件项目任务分解&#xff09; 任务分解WBS工作包分解方法任务分解的基本步骤检验分解结果的标准WBS任务分解建议小结例题&#xff1a;简答题自练 任务分解 任务分解过程&#xff1a;将一个项目分解为更多的工作细目或者子项目&#xff0…

Activiti 学习笔记12:分配个人任务

一、流程图 二、分配个人任务方式一&#xff08;直接指定办理人&#xff09; 1、流程图中任务节点的配置 2、测试代码 ProcessEngine processEngine ProcessEngines.getDefaultProcessEngine(); //部署流程定义&#xff0c;启动流程实例Testpublic void testTask() throw…

分布式定时任务开源方案

目录 1、quartz1.1 架构1.2 优缺点 2、elastic-job2.1 架构2.2 优缺点 3、xxl-job3.1 架构3.2 优缺点 4、Saturn4.1 架构4.2 优缺点 5、antares5.1 架构5.2 优缺点 6、opencron6.1 优缺点 方案对比 1、quartz quartz的集群方案是使用数据库来实现的。通过在数据库中配置定时器…

做好目标管理和任务管理,提高办公协同效率

工作一段时间后&#xff0c;或者参与一个项目后&#xff0c;你会发现团队里每个人都非常优秀&#xff0c;工作也充满热情&#xff0c;但是整体的效率就是上不去&#xff1f;因为&#xff0c;一个团队的整体效率&#xff0c;并不是每个人效率的相加。因为这里面有协作成本。 如…

基于javaweb个人记账管理系统设计与实现(项目源码+论文+毕业设计任务书)

摘 要 随着互联网的快速发展&#xff0c;人们生活节奏日益加快&#xff0c;关于过度消费是大多数人头疼问题&#xff0c;导致出现不少的月光族&#xff0c;如我们定期花点时间去记录生活中的主要消费记录&#xff0c;掌握自己的收入和支出情况&#xff0c;这样你就会发现一些规…

计算机的任务管理器在哪,怎么打开任务管理器 多种方法详细教学

我们在使用电脑的过程中&#xff0c;任务管理器是我们经常会使用到的程序&#xff0c;可以在任务管理器里面查看所有正在服务的程序&#xff0c;还可以在任务管理器里面知道正在运行的有哪些服务于应用程序&#xff0c;同时我们也可以通过任务管理器来结束一些进程&#xff0c;…

《印象笔记留给你的空间》第5章 建立个人任务管理系统 / 第6章 记录你的人生轨迹

学习笔记内容来自&#xff1a; 《印象笔记留给你的空间-李参》 《用印象笔记做个人知识管理-李参个人成长课堂 》 第5章 建立个人任务管理系统 5.1关于任务管理 5.1.1任务的定义 5.1.2任务的组成 1.行动清单 2.参考资料 5.1.3任务管理的三个关注层面 工作流、经验库、…