计算机视觉全系列实战教程:(七)opencv的improc模块基本介绍

1.颜色转换

  • A.函数转换函数原型:
void cv::cvtColor(cv::InputArray src, // 输入序列cv::OutputArray dst, // 输出序列int code, // 颜色映射码int dstCn = 0 // 输出的通道数 (0='automatic')
);
  • B.基本使用:
cv::Mat imGray;
cv::cvtColor(imBGR, imGray, cv::COLOR_BGR2GRAY); //转为灰度图像
cv::Mat imHsv;
cv::cvtColor(imBGR, imHsv, cv::COLOR_BGR2HSV); //转为HSV图像
  • C.参数介绍:
// BGR和RGB相互转换
cv::COLOR_BGR2RGB
cv::COLOR_RGB2BGR
cv::COLOR_RGBA2BGRA
cv::COLOR_BGRA2RGBA
// 添加和去除alpha通道
cv::COLOR_BGR2BGRA
cv::COLOR_RGB2RGBA
cv::COLOR_BGRA2BGR
cv::COLOR_RGBA2RGB

2.绘制基本图形

(1)绘制矩形

void cv::rectangle	(	InputOutputArray 	img, //在img中绘制矩形Point 	PLeftTop, //矩形的左上角Point 	PRgtBtm, //矩形的右下角const Scalar & 	color, //矩形框的颜色int 	thickness = 1, //线的宽度int 	lineType = LINE_8, //线的类型int 	shift = 0 //坐标中的小数位数
)

(2)绘制圆形

void circle( Mat img, cv::Point center, //圆形int radius, //半径cv::Scalar color, //圆形线条的颜色 int thickness=1,  //圆形线条的宽度,负数表示填充,正数表示宽度int line_type=8, //线条的种类int shift=0 //圆心和半径的小数位数);

(3)绘制椭圆

void ellipse(Mat img,Point PCenter, //椭圆中心Size size, //长轴和短轴的长度double angle, //椭圆旋转角度double startAngle, //开始角度double endAngle, //终止角度Scalar &color, //椭圆线条的颜色int thickness = 1, //椭圆线条的宽度,负数表示填充int line_type = 8, //线条类型int shift = 0 //圆心和轴坐标的精度(小数的位数))

(4)绘制线段

void line(Mat img,Point PStart, //线段起点坐标Point PEnd, //线段终点坐标Scalar &color, //线段颜色int thichness = 1, int line_type = 8, int shift =  0)

(5)绘制文字

void putText(Mat &img,const string &text,Point POrigin, //文本框的左下角int fontFace, //字体,如FONT_HERAHEY_PLAINdouble fontScale, //尺寸因子,越大则文字越大Scalar color, //文字颜色int thickness = 1, //线条粗细int lineType = 8, //线条类型(8邻域和4领域)boo

3.随机数使用

  • (1)基本用法
//创建RNG对象 RNG rng(uint64 seed);
cv::RNG rng(time(NULL));
int iNum01 = rng; //返回第一个随机数
int iNum02 = rng.next(); //返回下一个随机数
int iNum03 = rng.operator()(); //等价于next()
int iNum04 = rng.operator()(100); //[0,100)范围内的随机数
double dNum05 = rng.operator double(); //返回下一个double数值
  • (2)生成分布数据
double a = rng.uniform(0,1);//产生一个均匀分布的double数据
double b = rng.gaussian(0.f, 1.f);//高斯分布的double数据,均值为0,方差为1.0

(3)使用随机数填充矩阵

  • A.函数原型
void fill(Mat img,int distType, //均匀分布(UNIFORM),高斯分布(NORMAL)InputArray a, InputArray b, //与对应的分布有关,如均匀分布表示均匀分布的区间bool saturateRange = false //只针对均匀分布有效);
  • B.使用方法
// 均匀分布cv::Mat_<double> matTmp(5, 5);cv::RNG rng;rng.fill(matTmp, cv::RNG::UNIFORM, 1 , 3);
// 正态分布
cv::Mat_<float> matTmp02(5, 5);
rng.fill(matTmp02, cv::RNG::NORMAL, 1, 3);

4.为图像添加边框

  • A.函数原型
void copyMakeBorder(cv::Mat &imSrc, //输入图像cv::Mat &imDst, //输出图像int top, //顶部填充像素数量int bottom,int left, int right,int borderType, //填充类型,如BORDER_REPLICATE, BORDER_REFLECT_101, BORDER_CONSTANT等const Scalar &value = Scalar() //默认值即可);
  • B.参数介绍(borderType)
		BORDER_CONSTANT    = 0, //!< `iiiiii|abcdefgh|iiiiiii`  with some specified `i`BORDER_REPLICATE   = 1, //!< `aaaaaa|abcdefgh|hhhhhhh`BORDER_REFLECT     = 2, //!< `fedcba|abcdefgh|hgfedcb`BORDER_WRAP        = 3, //!< `cdefgh|abcdefgh|abcdefg`BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba`BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno`

5.查找轮廓

(1)概述

对灰度图像、二值图像进行边缘提取(通常是二值图像)进行轮廓提取。

void findContours(Mat &imGray, //单通道图像vector<vector<Point>> &vCntsOut, //轮廓组(输出参数)OutputArray &hierarchy, //包含抽取图像的拓扑信息int mode, //轮廓提取模式,如CV_RETR_EXTERNAL, CV_RETR_LIST, CV_RETR_CCOMP等int method, //轮廓的近似方法,如CV_CHAIN_APPROX_NONE, CV_CHAIN_APPROX_SIMPLE等Point offset=Point() //轮廓的偏移量);

(2)使用

//读取图像
cv::Mat imRead = cv::imread("xxx.jpeg");
//高斯去噪
cv::GaussianBlur(imread, imread, cv::Size(3,3), 0);
//提取图像边缘
cv::Mat imEdge;
cv::Canny(imRead, imEdge, 30, 100);
//提取轮廓
std::vector<std::vector<cv::Point>> vCnts;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(imEdge,vCnts,hierarchy,RETR_TREE,CHAIN_APPROX_SIMPLE);

(3)绘制轮廓

void cv::drawContours(cv::Mat &imSrc,InputArrayOfArrays vCnts,int contourIdx, //绘制轮廓向量中哪一个索引,负数表示绘制所有轮廓const cv::Scalar &color, //绘制的颜色int thickness = 1, //宽度,负数表示填充轮廓int lineType =8, InputArray hierarchy = noArray(), //findContours输出的向量int maxLevel = INT_MAX, //绘制轮廓的最高等级,有heirarchy时才生效cv::Point offset);

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

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

相关文章

域环境信息收集

背景 一个具有一定规模的企业&#xff0c;每天都可能面临员工入职和离职&#xff0c;因此网络管理部门经常需要对域成员主机进行格式化消除磁的文件&#xff0c;然后重装系统及软件&#xff0c;以提供给新员工使用;因此&#xff0c;为了便于后期交接&#xff0c;大多网络管理员…

21、matlab生成脉冲序列:pulstran()函数

1、pulstran()函数 1&#xff09;语法 语法1&#xff1a;y pulstran(t,d,func,fs) 基于连续函数的采样产生脉冲序列。 语法2&#xff1a;y pulstran(t,d,p) 生成一个脉冲序列&#xff0c;该脉冲序列是向量p中原型脉冲的多个延迟插值的总和。 语法3&#xff1a;y pulstran…

USB HOST DWC3 初始化

https://www.cnblogs.com/newjiang/p/15675746.html 如果dr_mode为device&#xff0c;则初始化gadget。 如果dr_mode为host&#xff0c;需要初始化xHCI驱动。在dwc3_host_init函数的最后调用platform_device_add(xhci)添加platform device&#xff08;xhci-hcd&#xff09;&a…

【GIC400】——驱动代码实现

文章目录 驱动代码实现IRQ 中断处理GIC 驱动GIC 使用使用示例系列文章 【ARMv7-A】——异常与中断 【ARMv7-A】——异常中断处理概述 【ARMv7-A】——进入和退出异常中断的过程 【GIC400】——PLIC,NVIC 和 GIC 中断对比 【GIC400】——GIC 简介 【GIC400】——GIC 相关的 CP1…

如何避免在for循环中对数据库操作

避免在循环中频繁进行数据库操作可以显著提高程序的性能。有几种方法可以优化此类情况&#xff1a; 批量查询&#xff1a;将多次单独的数据库查询操作合并为一次批量查询操作。通过构建一个合适的查询条件&#xff0c;将需要查询的数据一次性从数据库中取出&#xff0c;然后在内…

免费生物蛋白质的类chatgpt工具助手copilot:小分子、蛋白的折叠、对接等

参考: https://310.ai/copilot 可以通过自然语言对话形式实现小分子、蛋白质的相关处理:生成序列、折叠等 应该是agent技术调用不同工具实现 从UniProt数据库中搜索和加载蛋白质。使用ESM Fold方法折叠蛋白质。使用310.ai基础模型设计新蛋白质。使用TM-Align方法比较蛋白质…

Oracle数据库面试题-3

41. 请解释Oracle数据库中的内存顾问&#xff08;Memory Advisor&#xff09;的作用。 Oracle 数据库中的内存顾问&#xff08;Memory Advisor&#xff09; Oracle 数据库中的内存顾问是一个功能&#xff0c;它可以分析数据库的内存使用情况&#xff0c;并提供优化建议&#…

算法每日一题(python,2024.05.26) day.8

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 双指针&#xff0b;交换&#xff0c;使用left和right两个指针&#xff0c;right指针向右移动&#xff0c;left从数组首位开始&#xff0c;当right找到非…

【GIC400】——GIC 相关的 CP15 寄存器

文章目录 GIC 相关的 CP15 寄存器C1(System Control Register)C12(Vector Base Address Registe)C15( Configuration Base Address Register)参考系列文章 【ARMv7-A】——异常与中断 【ARMv7-A】——异常中断处理概述 【ARMv7-A】——进入和退出异常中断的过程 【GIC400…

Vue.js 动画与过渡效果实战

title: Vue.js 动画与过渡效果实战 date: 2024/6/4 updated: 2024/6/4 description: 这篇文章介绍了如何在网页设计中使用过渡动画和组件效果&#xff0c;以及如何利用模式和列表展示信息。还提到了使用钩子实现组件间通信的方法。 categories: 前端开发 tags: 过渡动画组件…

解决使用gets(getchar)函数无法输入字符(字符串)和scanf_s函数显示缺少“scanf_s”整型参数的问题

一.函数介绍 gets函数&#xff1a; 该函数就是读取字符串&#xff0c;遇到空格不会停止&#xff0c;直到遇到换行字符&#xff0c;但是也会读取最后的换行字符&#xff08;这也就是我在写代码的时候遇到的一个问题&#xff09; getchar函数&#xff1a; 和gets函数类似&#x…

C语言王国——字符函数和字符串函数(2)

目录 5 strtok函数 5.1 函数的表达式 5.2 函数模拟 6 strstr函数 6.1 函数表达式 7 strerror函数 7.1 函数表达式 7.2 例子 7.3 perror 8 strncpy、strncat、strncmp函数 四 结论 5 strtok函数 strtok函数我的理解是他是一个分割字符串的函数 5.1 函数的表达式 cha…

020、有序集合_编码

有序集合类型的内部编码有两种: ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplist-entries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时,Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用…

StartAI:AI扩图功能,让设计更高效

在数字设计领域&#xff0c;图像的清晰度和细节至关重要。StartAI作为领先的AI设计工具&#xff0c;不断推出创新功能&#xff0c;以满足设计师们对高质量图像处理的需求。最新推出的扩图功能&#xff0c;结合了“创成式填充”技术和“PS插件”的便捷&#xff0c;为设计师们带来…

Linux安装ActiveMQ

Linux安装ActiveMQ Docker安装ActiveMQ 官网地址&#xff1a;https://activemq.apache.org/ 简介&#xff1a; ActiveMQ 是Apache出品&#xff0c;最流行的&#xff0c;能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规…

常见的设计模式

软件设计模式&#xff08;Software Design Pattern&#xff09;&#xff0c;又称设计模式&#xff0c;是一套被反复使用、多数人知晓 的、经过分类编目的、代码设计经验的总结。它描述了在软件设计过程中的一些不断重复发生的问题&#xff0c; 以及该问题的解决方案。也就是说&…

深度神红网络——什么是 CNN(卷积神经网络)?

Facebook和Instagram自动检测图像中的面孔&#xff0c;Google通过上传照片搜索相似图片的功能&#xff0c;这些都是计算机视觉技术的实例&#xff0c;它们背后的核心技术是卷积神经网络&#xff08;CNN&#xff09;。那么&#xff0c;CNN究竟是什么呢&#xff1f;接下来&#x…

思维导图-vb.net开发带进度条的复制文件夹功能c#复制文件夹

你们谁写代码会用流程图来做计划&#xff0c;或者写项目总结报告&#xff1f; .net带进度条复制文件夹 方案 列出所有子文件夹&#xff0c;再创建&#xff0c;复制文件 大文件可以单独做进度条 缺点&#xff1a;设计会更复杂 直接…

如何用结构化写好GPT的Prompt提示词

背景 最早接触 Prompt engineering 时, 学到的 Prompt 技巧都是: 你是一个 XX 角色…你是一个有着 X 年经验的 XX 角色…你会 XX, 不要 YY…对于你不会的东西, 不要瞎说!… 对比什么技巧都不用, 直接像使用搜索引擎一样提问, 上面的技巧对于回复的效果确实有着 明显提升. 在看…

统一终端管理解决方案有哪些?必须收藏的统一终端管理软件

统一终端管理解决方案&#xff0c;是一种综合性的管理策略&#xff0c;旨在通过集中化的方式&#xff0c;对企业或组织的各种终端设备进行统一的管理、监控、保护和优化。以下是对统一终端管理解决方案的详细介绍。 一、方案概述 统一终端管理解决方案涵盖了从硬件到软件、从网…