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

本文主要是介绍计算机视觉全系列实战教程:(七)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);

这篇关于计算机视觉全系列实战教程:(七)opencv的improc模块基本介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1031912

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)

《MySQL复杂SQL之多表联查/子查询详细介绍(最新整理)》掌握多表联查(INNERJOIN,LEFTJOIN,RIGHTJOIN,FULLJOIN)和子查询(标量、列、行、表子查询、相关/非相关、... 目录第一部分:多表联查 (JOIN Operations)1. 连接的类型 (JOIN Types)

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插