OPenCV高级编程——OpenCV常见的API及绘图知识详解

news2024/9/17 9:03:42

目录

引言

一、Mat类详解

1. Mat类的基本结构

2. Mat类的数据类型

3. Mat类的创建与初始化

4. Mat类的使用技巧

二、OpenCV核心功能模块

1. 基本的图像读取与显示

2. 图像的保存

3. 矩阵操作

4. 等待键盘输入与销毁窗口

5. 命名窗口

三、图像处理模块

1. 色彩空间转换

2. 图像写入

3. 图像变换

4. 图像滤波

四、绘图与交互

1. 绘制基本图形

  2. 文本绘制

  3. 鼠标与键盘事件

4. 示例:在图像上绘制并响应鼠标事件

五、结论


引言

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像处理、视频分析、对象检测等功能。本文将详细介绍OpenCV中常见的API以及绘图相关的知识,帮助开发者更好地理解和使用OpenCV。

一、Mat类详解

Mat类是OpenCV中C++版本的矩阵类,它替代了原来C版本的矩阵结构体CvMat和图像结构体IplImage。Mat类具有许多优势,特别是与STL(Standard Template Library)的兼容性很好,提供了许多类似于STL的操作,并且是一种高效的数据类型,对内存进行动态管理,无需用户手动管理内存。

1. Mat类的基本结构

Mat类定义于OpenCV的core.hpp中,主要包含两部分数据:

  1. 矩阵头(matrix header):这部分的大小是固定的,包含了矩阵的大小(行数和列数)、存储方式、矩阵存储的地址等信息。
  2. 数据指针(data pointer):一个指向矩阵包含像素值的指针,用于访问矩阵的实际数据。

Mat类的定义大致如下(简化版):

class CV_EXPORTS Mat {  
public:  
    int flags; // 包含矩阵的多个标志位,如深度、通道数等  
    int dims;   // 数组的维度,>= 2  
    int rows, cols; // 矩阵的行数和列数  
    uchar* data; // 指向数据的指针  
    int* refcount; // 指向引用计数器的指针  
    // 其他成员...  
};

2. Mat类的数据类型

Mat类支持多种数据类型,这些数据类型决定了矩阵中元素的存储方式。常见的数据类型包括:

  • CV_8U:8位无符号整数(0~255)
  • CV_8S:8位有符号整数(-128~127)
  • CV_16U:16位无符号整数(0~65535)
  • CV_16S:16位有符号整数(-32768~32767)
  • CV_32S:32位有符号整数
  • CV_32F:32位浮点数
  • CV_64F:64位浮点数

在OpenCV中,可以通过特定的模板类(如Mat_<uchar>Mat_<int>等)或类型标识符(如CV_8UC1CV_32FC3等)来指定Mat的数据类型。

3. Mat类的创建与初始化

Mat类可以通过多种方式创建和初始化:

  1. 使用构造函数

    • Mat::Mat():默认构造函数,创建一个空的Mat对象。
    • Mat::Mat(int rows, int cols, int type):指定行数、列数和类型创建Mat对象。
    • Mat::Mat(Size size, int type):使用Size结构体指定尺寸和类型创建Mat对象。
    • Mat::Mat(const Mat& m):拷贝构造函数,创建一个与已有Mat对象相同的Mat对象(但注意,这种方式只是复制了矩阵头,数据是共享的)(浅拷贝)
  2. 使用create函数:可以在不重新创建Mat对象的情况下改变其大小和类型。

  3. 使用其他函数:如zerosoneseye等,用于创建全零、全一或单位矩阵。

4. Mat类的使用技巧

  1. 元素访问
    • 使用at函数:M.at<type>(i, j),其中type是元素的数据类型,ij是行和列的索引。
    • 使用迭代器:通过MatIterator_迭代器遍历矩阵元素。
    • 使用指针:直接操作data指针访问矩阵数据(注意边界和步长)。
  2. 矩阵操作
    • 支持多种数学运算,如加法、减法、乘法等。
    • 支持矩阵变换,如转置、缩放、旋转等。
  3. 内存管理
    • Mat类自动管理内存,无需用户手动释放。
    • 使用clone函数可以复制整个Mat对象(包括数据),避免数据共享问题。(深拷贝)

二、OpenCV核心功能模块

1. 基本的图像读取与显示

  • cv::imread:用于读取图像文件。其原型为cv::Mat cv::imread(const String& filename, int flags = IMREAD_COLOR)。其中,filename是图像文件的路径,flags是读取图像的方式,例如IMREAD_COLOR表示以彩色模式读取图像,IMREAD_GRAYSCALE表示以灰度模式读取图像。

  • cv::imshow:用于在窗口中显示图像。其原型为void cv::imshow(const String& winname, InputArray mat)。其中,winname是窗口的名称,mat是要显示的图像数据。

2. 图像的保存

  • cv::imwrite:用于将图像写入文件。其原型为bool cv::imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>())。其中,filename是保存图像的路径,img是要保存的图像数据,params是保存图像时的一些可选参数。

3. 矩阵操作

  • cv::Mat:是OpenCV中用于存储图像数据和其他多维数组的数据结构。提供了丰富的矩阵操作函数,如加法、减法、乘法、除法、归一化等。

4. 等待键盘输入与销毁窗口

  • cv::waitKey:等待键盘输入。函数原型为int cv::waitKey(int delay = 0)delay参数表示等待时间(毫秒),如果设置为0,则表示无限等待。常用于在显示图像时等待用户按键。
  • cv::destroyAllWindows:销毁所有由OpenCV创建的窗口。

5. 命名窗口

  • cv::namedWindow:用于创建窗口并指定窗口类型。函数原型为void cv::namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE)winname是窗口名称,flags用于指定窗口类型,如WINDOW_AUTOSIZE表示窗口大小自动调整。

三、图像处理模块

1. 色彩空间转换

  • cv::cvtColor:用于图像的色彩空间转换。其原型为void cv::cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0)。其中,src是输入图像,dst是输出图像,code是转换代码,如COLOR_BGR2GRAY表示将BGR图像转换为灰度图像。

2. 图像写入

  • cv::imwrite:用于将图像写入文件。函数原型为bool cv::imwrite(const String& filename, InputArray img, const std::vector<int>& params = std::vector<int>())filename是输出文件的路径,img是要写入的图像数据。

3. 图像变换

  • cv::resize:用于改变图像的大小。支持多种插值方法,如线性插值、立方插值等。

  • cv::warpAffinecv::warpPerspective:分别用于图像的仿射变换和透视变换。

4. 图像滤波

  • cv::blurcv::GaussianBlur:分别用于图像的均值模糊和高斯模糊。

四、绘图与交互

1. 绘制基本图形

  • cv::line:用于绘制直线。其原型为void cv::line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)。其中,img是绘制图形的载体,pt1pt2是线段的起点和终点,color是线条的颜色,thickness是线条的粗细。

  • cv::rectangle:用于绘制矩形。其原型为void cv::rectangle(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)。其中,pt1pt2分别是矩形的左上顶点和右下顶点。

  • cv::circle:用于绘制圆形。其原型为void cv::circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)。其中,center是圆心的坐标,radius是圆的半径。

  • cv::ellipse:用于绘制椭圆。其原型为void cv::ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, double endAngle, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)。其中,center是椭圆的圆心坐标,axes是椭圆的长轴和短轴的长度,angle是椭圆的旋转角度。

  • cv::polylines:用于绘制多边形。其原型为void cv::polylines(InputOutputArray img, InputArrayOfArrays pts, bool isClosed, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0)。其中,pts是多边形的顶点坐标,isClosed表示多边形是否闭合。

  2. 文本绘制

  • cv::putText:用于在图像上绘制文本。其原型为void cv::putText(InputOutputArray img, const String& text, Point org, int fontFace, double fontScale, const Scalar& color, int thickness = 1, int lineType = LINE_8, bool bottomLeftOrigin = false)。其中,img是绘制文本的图像,text是要绘制的文本字符串,org是文本左下角的坐标(如果bottomLeftOriginfalse,则为左下角的坐标,否则为基线的起点),fontFace是字体的类型,fontScale是字体大小的缩放比例,color是文本的颜色,thickness是文本的线条粗细。

  3. 鼠标与键盘事件

OpenCV提供了创建窗口并响应鼠标和键盘事件的功能,这在交互式应用中非常有用。你可以使用cv::namedWindow来创建一个窗口,然后使用cv::setMouseCallbackcv::setKeyboardCallback来分别设置鼠标和键盘的回调函数。

  • cv::namedWindow:创建一个窗口。
  • cv::setMouseCallback:为指定的窗口设置鼠标回调函数。
  • cv::setKeyboardCallback:为指定的窗口设置键盘回调函数。

4. 示例:在图像上绘制并响应鼠标事件

#include <opencv2/opencv.hpp>  
  
void onMouse(int event, int x, int y, int flags, void* param) {  
    cv::Mat* image = (cv::Mat*)param;  
    if (event == cv::EVENT_LBUTTONDOWN) {  
        cv::circle(*image, cv::Point(x, y), 5, cv::Scalar(0, 255, 0), -1);  
    }  
}  
  
int main() {  
    cv::Mat image = cv::imread("path_to_image.jpg");  
    if (image.empty()) {  
        std::cerr << "Could not read the image" << std::endl;  
        return 1;  
    }  
  
    cv::namedWindow("Image Window", cv::WINDOW_AUTOSIZE);  
    cv::setMouseCallback("Image Window", onMouse, &image);  
  
    while (true) {  
        cv::imshow("Image Window", image);  
        if (cv::waitKey(20) >= 0) break;  
    }  
  
    return 0;  
}

在这个示例中,我们创建了一个窗口并在其中显示一张图像。通过cv::setMouseCallback设置了一个鼠标回调函数onMouse,该函数会在鼠标左键点击时在图像上绘制一个绿色的圆点。

五、结论

OpenCV提供了丰富的API用于图像处理、图像分析以及绘图等任务。通过本文的介绍,你应该对OpenCV中常见的API以及绘图相关的知识有了更深入的了解。希望这些信息能够帮助你在实际的项目中更加高效地利用OpenCV。

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

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

相关文章

一个简单的车辆目标检测和跟踪示例

点击下方卡片&#xff0c;关注“小白玩转Python”公众号 介绍 目标检测&#xff1a;目标检测是指在图像或视频帧中识别和定位特定目标&#xff0c;并使用边界框来确定它们的位置。YOLO&#xff08;You Only Look Once&#xff09;是一种高效的单阶段目标检测算法&#xff0c;以…

普冉Puya 超高性价比M0 MCU 工业电子解决方案

普冉半导体(上海)股份有限公司成立于2016年&#xff0c;总部位于上海张江高科&#xff0c;公司目前主要产品包括微控制器芯片、非易失性存储器芯片及模拟产品。产品广泛应用于物联网、智能手机及周边、可穿戴、服务器、光模块、工业控制、汽车电子、安防等领域。公司在深圳、韩…

Spring Boot集成udp通讯

Spring Boot集成udp通讯 加入依赖编辑配置文件配置相关属性具体业务类客户端调试 加入依赖 <!--加入UDP通信所需依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId&…

GD32 MCU电源复位和系统复位有什么区别

GD32 MCU的复位分为电源复位和系统复位&#xff0c;电源复位又称为冷复位&#xff0c;相较于系统复位&#xff0c;上电复位更彻底&#xff0c;下面为大家详细介绍上电复位和系统复位的实现以及区别。 电源复位包括上电/掉电复位或者从standby模式唤醒产生的复位&#xff0c;电…

HarmonyOS NEXT——奇妙的调用方式

注解调用一句话总结Extend抽取特定组件样式、事件&#xff0c;可以传递参数Style抽取公共样式、事件&#xff0c;不可以传递参数Builder抽取结构、样式、事件&#xff0c;可以传递参数BuilderParams自定义组件中传递UI组件多个BuilderParams自定义组件中传递多个UI组件 Extend…

echarts加载区域地图,并标注点

效果如下&#xff0c;加载了南海区域的地图&#xff0c;并标注几个气象站点&#xff1b; 1、下载区域地图的JSON&#xff1a;DataV.GeoAtlas地理小工具系列 新建nanhai.json&#xff0c;把下载的JSON数据放进来 说明&#xff1a;如果第二步不打勾&#xff0c;只显示省的名字&a…

全新微软语音合成网页版源码,短视频影视解说配音网页版系统-仿真人语音

源码介绍 最新微软语音合成网页版源码&#xff0c;可以用来给影视解说和短视频配音。它是TTS文本转语言&#xff0c;API接口和PHP源码。 这个微软语音合成接口的源码&#xff0c;超级简单&#xff0c;就几个文件搞定。用的是官方的API&#xff0c;试过了&#xff0c;合成速度…

InnoDB存储引擎(1)

InnoDB存储引擎的优点 InnoDB在设计时考虑到了处理大数据量时的性能&#xff0c;支持事务&#xff0c;回滚和崩溃修复的能力&#xff0c;通过多版本并发控制来减少锁定(降低了锁的争用),同时还支持外键的约束&#xff1b;通过缓冲池在内存中缓存数据来提高查询的性能&#xff…

内容营销专家刘鑫炜:驾驭AI为品牌服务,从成为卓越投喂师开始!

在这个信息爆炸、注意力稀缺的时代&#xff0c;品牌内容营销已成为企业连接消费者、塑造品牌形象的关键途径。而人工智能&#xff08;AI&#xff09;技术的融入&#xff0c;更是为内容营销带来了前所未有的变革与机遇。然而&#xff0c;要让AI真正为你的品牌内容营销高效服务&a…

vue3后台管理系统 vue3+vite+pinia+element-plus+axios上

前言 项目安装与启动 使用vite作为项目脚手架 # pnpm pnpm create vite my-vue-app --template vue安装相应依赖 # sass pnpm i sass # vue-router pnpm i vue-router # element-plus pnpm i element-plus # element-plus/icon pnpm i element-plus/icons-vue安装element-…

WebWorker处理百万数据

Home.vue <template><el-input v-model"Val" style"width: 400px"></el-input><el-button click"imgHandler">过滤</el-button><hr /><canvas id"myCanvas" width"500" height&quo…

不懂就问:EI论文真的很水吗?如何快速水一篇EI论文呢?

最近在有刷到一个这样的话题&#xff0c;发表一篇EI论文容易吗&#xff1f; 很多人可能会觉得EI没有什么用&#xff0c;但其实EI的含金量也很高。 比如目前有很多单位的老师在评选职称的时候&#xff0c;EI会议中的iee系列依然比发表一篇北大核心还高。 那发表EI论文到底容…

springboot家校共育平台-计算机毕业设计源码54235

摘 要 采用高效的SpringBoot框架&#xff0c;家校共育平台为家长与教师提供了便捷的沟通渠道。该平台整合了丰富的教育资源&#xff0c;实现了家校之间的即时信息互通&#xff0c;从而助力协同教育。 为进一步方便用户访问和使用&#xff0c;平台与微信小程序进行了深度整合。家…

WPF ViewBox,Canva之SVG

ViewBox Viewbox是WPF中的一个内容控件&#xff0c;它可以自动调整其内部子元素的大小以适应其自身的尺寸。Viewbox通过保持子元素原有的宽高比&#xff0c;对内容进行均匀的缩放&#xff0c;使其完全填充控件的空间。 Stretch Stretch属性决定了Viewbox如何缩放其内容。它可…

IMU用于野外动作质量评估

近期&#xff0c;来自日本的研究者开发出一个名为MMW-AQA的创新性数据集&#xff0c;该数据集融合了多种传感器信息&#xff0c;专门设计用于用于客观评价人类在复杂环境下的动作质量&#xff0c;这一突破为运动分析和智能安全系统的优化提供了新的可能。 MMW-AQA数据集结合了毫…

MVC软件设计模式及QT的MVC架构

目录 引言 一、MVC思想介绍 1.1 MCV模型概述 1.2 Excel的处理数据 1.3 MVC模式的优势 二、QT中的MVC 1.1 模型&#xff08;Model&#xff09; 1. QAbstractItemModel 2. QStringListModel 3. QStandardItemModel 4. QSqlTableModel 和 QSqlQueryModel 5. QAbstract…

为什么建议使用 for…of 循环而不是 foreach 循环呢

在 JavaScript 和 TypeScript 的世界里&#xff0c;遍历数组是一项常见任务。许多开发者因为 .forEach 的简单和熟悉而习惯使用它。 然而&#xff0c;有一个更强大且更灵活的替代方案&#xff1a;for…of 循环。&#x1f52e; 本文将深入探讨为什么你应该考虑切换到 for…of 以…

JAVA文档注释

文档注释&#xff0c;它以 /** 开始&#xff0c;以 */ 结束。 你可以使用 javadoc 工具软件来生成信息&#xff0c;并输出到 HTML 文件中。 文档注释&#xff0c;使你更加方便的记录你的程序信息。 javadoc标签 在开始的 /** 之后&#xff0c;第一行或几行是关于类、变量和方…

全渠道AI数字化商品管理 零售品牌增长“超级引擎”

随着“流量红利”时代的终结 品牌面临增速放缓、利润下滑的双重挑战。 消费者的诉求日益理性和个性化&#xff0c; 国内外品牌角逐市场份额 A1、大数据等先进技术迅猛发展 品牌商品计划管理变得更加复杂而多维。 零售品牌正加速数字化与全渠道融合以应对挑战。 可持续盈利…

深度技术Win10系统免费下载,正式版/精简版任选!

深度技术Win10系统是非常受欢迎的操作系统版本之一&#xff0c;拥有丰富的系统功能&#xff0c;无论是日常办公、学习娱乐还是专业设计&#xff0c;它都能轻松应对。但是&#xff0c;许多新手用户不知道在哪里可以下载到深度技术Win10版本系统&#xff1f;接下来系统之家小编给…