Opencv学习笔记(最近更新2023.11.1)

news2024/11/27 9:54:51

文章目录

  • 棋盘格角点检测findChessboardCorners()
  • 亚像素角点检测cornerSubPix()
  • 棋盘格角点的绘制drawChessboardCorners()
  • 计算外参solvePnPRansac()
  • 旋转向量转旋转矩阵Rodrigues()
  • 鱼眼畸变矫正initUndistortRectifyMap()
  • 检测轮廓findContours()
  • 轮廓显示drawContours()
  • 改变图片大小resize
  • 图片颜色空间转换
  • 图像二值化threshold()
  • 计算轮廓周长
  • 多边拟合函数
  • 图像的矩moments()
  • 关键点KeyPoints
  • 多边形绘制polylines()
  • 绘制填充多边形fillPoly()

棋盘格角点检测findChessboardCorners()

findChessboardCorners(image,patternSize,corners,flags = None),此函数试图确定输入图片是否有棋盘图案,并定位棋盘板上的内角点。如果所有的角点被找到且以一定的顺序排列(一行接一行,从一行的左边到右边),该函数会返回一个非零值。另外,如果该函数没有找到所有的角点或者重新排列他们,则返回0。

亚像素角点检测cornerSubPix()

cv::goodFeaturesToTrack()提取到的角点只能达到像素级别,在很多情况下并不能满足实际的需求,这时,我们则需要使用cv::cornerSubPix()对检测到的角点作进一步的优化计算,可使角点的精度达到亚像素级别。

void cv::cornerSubPix(  cv::InputArray image, // 输入图像
						cv::InputOutputArray corners, // 角点(既作为输入也作为输出)
						cv::Size winSize, // 区域大小为 NXN; N=(winSize*2+1)
						cv::Size zeroZone, // 类似于winSize,但是总具有较小的范围,Size(-1,-1)表示忽略
						cv::TermCriteria criteria // 停止优化的标准
					 );

第五个参数用于表示计算亚像素时停止迭代的标准,可选的值有cv::TermCriteria::MAX_ITER 、cv::TermCriteria::EPS(可以是两者其一,或两者均选),前者表示迭代次数达到了最大次数时停止,后者表示角点位置变化的最小值已经达到最小时停止迭代。二者均使用cv::TermCriteria()构造函数进行指定。

棋盘格角点的绘制drawChessboardCorners()

	void cv::drawChessboardCorners( cv::InputOutputArray image, // 棋盘格图像(8UC3)即是输入也是输出
									cv::Size patternSize, // 棋盘格内部角点的行、列数
									cv::InputArray corners, // findChessboardCorners()输出的角点
									bool patternWasFound // findChessboardCorners()的返回值
								  );

计算外参solvePnPRansac()

bool cv::solvePnPRansac	(	InputArray 	objectPoints, //参考点在世界坐标系
						 	InputArray 	imagePoints,  //参考点在相机平面的坐标
						 	InputArray 	cameraMatrix,  //相机内参
						 	InputArray 	distCoeffs,    //相机畸变系数
						 	OutputArray 	rvec,      // 旋转矩阵
						 	OutputArray 	tvec,      // 平移向量
						 	bool 	useExtrinsicGuess = false,
						 	int 	iterationsCount = 100,
						 	float 	reprojectionError = 8.0,
						 	double 	confidence = 0.99,
						 	OutputArray 	inliers = noArray(),
						 	int 	flags = SOLVEPNP_ITERATIVE 
						)

旋转向量转旋转矩阵Rodrigues()

Rodrigues(src[, dst[, jacobian]]) -> dst, jacobian
输入src:旋转向量((3,1)或者(1,3))或者旋转矩阵(3,3);
输出dst:旋转矩阵(3,3)或者旋转向量((3,1)或者(1,3));
输出jacobin:可选项,输出雅克比矩阵(3x9或者9x3),输入数组对输出数组的偏导数。

鱼眼畸变矫正initUndistortRectifyMap()

的作用是根据无畸变图的像素位置(i, j),推出它对应的畸变图中的像素位置(u, v),然后把畸变图中的(u, v)复制到新图中的(i, j),就得到了矫正图像。

void initUndistortRectifyMap( InputArray cameraMatrix, InputArray distCoeffs,InputArray R, InputArray newCameraMatrix, Size size, int m1type, OutputArray map1, OutputArray map2 );

参数说明:
cameraMatrix——输入的摄像头内参数矩阵(3X3矩阵)
distCoeffs——输入的摄像头畸变系数矩阵(5X1矩阵)
R——矫正单目鱼眼相机时,R默认为单位矩阵
newCameraMatrix——输入的校正后的3X3摄像机矩阵
size——摄像头采集的无失真图像尺寸
m1type——map1的数据类型,可以是CV_32FC1或CV_16SC2
map1——输出的X坐标重映射参数
map2——输出的Y坐标重映射参数

检测轮廓findContours()

findContours( InputOutputArray image, OutputArrayOfArrays contours,  OutputArray hierarchy, int mode,  int method, Point offset=Point());  

image是单通道图像矩阵,可以是灰度图,更常用的是二值图像,一般是经过Canny、拉普拉斯等边缘检测算子处理过的二值图像。

contours的定义是vector<vector< point >> contours;向量内每个元素保存了一组由连续的点构成的点的集合向量,每一组point点集就是一个轮廓。

hierarchy,定义为“vector< Vec4i > hierarchy”,向量hiararchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同。hierarchy向量内每一个元素的4个int型变量——hierarchy[i][0] ~hierarchy[i][3],分别表示第i个轮廓的后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果当前轮廓没有对应的后一个轮廓、前一个轮廓、父轮廓或内嵌轮廓的话,则hierarchy[i][0] ~hierarchy[i][3]的相应位被设置为默认值-1。

int型的mode,定义轮廓的检索模式,int型的method,定义轮廓的近似方法,第六个参数:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值。

// 用于保存轮廓点的坐标
vector<vector<Point>> contours;

vector<Point> point;
// 存放点集间的关系
vector<Vec4i> hireachy;

// 利用二值图寻找轮廓
cv::findContours(binary, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

轮廓显示drawContours()

cv2.drawContours()
cv2.drawContours(image, contours, contourIdx, color, thickness=None, lineType=None, hierarchy=None, maxLevel=None, offset=None)
第一个参数是指明在哪幅图像上绘制轮廓;image为三通道才能显示轮廓
第二个参数是轮廓本身,在Python中是一个list;
第三个参数指定绘制轮廓list中的哪条轮廓,如果是-1,则绘制其中的所有轮廓。后面的参数很简单。其中thickness表明轮廓线的宽度,如果是-1(cv2.FILLED),则为填充模式。

改变图片大小resize

void cv::resize (InputArray src,
OutputArray dst,
Size dsize,
double fx = 0,
double fy = 0,
int interpolation = INTER_LINEAR 
)

src - 输入图像。
dst - 输出图像;它的大小为 dsize(当它非零时)或从 src.size()、fx 和 fy 计算的大小;dst 的类型与 src 的类型相同。
dsize - 输出图像大小;如果它等于零,则计算为:dsize = Size(round(fxsrc.cols), round(fysrc.rows))。dsize 或 fx 和 fy 必须为非零。
fx - 沿水平轴的比例因子;当它等于 0 时,它被计算为(double)dsize.width/src.cols
fy - 沿垂直轴的比例因子;当它等于 0 时,它被计算为(double)dsize.height/src.rows
插值 - 插值方法,请参阅 InterpolationFlags

resize(img, img, Size(642, 362));

图片颜色空间转换

cv::cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致。具体调用形式如下:

void cv::cvtColor(
	cv::InputArray src, // 输入序列
	cv::OutputArray dst, // 输出序列
	int code, // 颜色映射码
	int dstCn = 0 // 输出的通道数 (0='automatic')
);

//具体例子:
cvtColor(image, image, COLOR_RGB2GRAY);

图像二值化threshold()

图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。OpenCV中提供了函数cv::threshold();

double cv::threshold(InputArray src, OutputArray dst, double thres, double maxval, int type)

src:源图像,可以为8位的灰度图,也可以为32位的彩色图像;
dst:输出图像;
thresh:阈值;
maxval:二值图像中灰度最大值;
type:阈值操作类型,具体的阈值操作实现如下图所示:
在这里插入图片描述

计算轮廓周长

double arcLength( InputArray curve, bool closed );

参数说明
InputArray类型的curve,输入的向量,二维点(轮廓顶点),可以为std::vector或Mat类型。
bool类型的closed,用于指示曲线是否封闭的标识符,一般设置为true。

多边拟合函数

approxPolyDP 主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。

void approxPolyDP(InputArray curve, OutputArray approxCurve, double epsilon, bool closed)

参数详解;
InputArray curve:一般是由图像的轮廓点组成的点集
OutputArray approxCurve:表示输出的多边形点集
double epsilon:主要表示输出的精度,就是另个轮廓点之间最大距离数,5,6,7,,8,,,,
bool closed:表示输出的多边形是否封闭

图像的矩moments()

从图像中计算出来的矩通常描述了图像不同种类的几何特征如:大小、灰度、方向、形状等,图像矩广泛应用于模式识别、目标分类、目标识别与防伪估计、图像编码与重构等领域。moments()函数计算多边形或栅格化形状(一个矢量形状或光栅形状)的最高达三阶所有矩。

Moments cv::moments(
InputArray array,			// 光栅图像(单通道、8位或浮点二维数组)或二维点(点或点2f)的数组(1×N或N×1)
bool binaryImage = false 	// binaryImage用来指示输出图像是否为一幅二值图像,如果是二值图像,则图像中所有非0像素看作为1进行计算。
)	

结构Moments成员数据:

cv::Moments::Moments	
(
// 空间矩(10个)
double 	m00,double 	m10,double 	m01,double 	m20,double 	m11,double 	m02,double 	m30,double 	m21,double 	m12,double 	m03  
// 中心矩(7个)
double mu20, double mu11, double mu02, double mu30, double mu21 , double mu12,double mu03
// 中心归一化矩() 
double nu20, double nu11, double nu02, double nu30, double nu21, double nu12,double nu03;
)	

关键点KeyPoints

corners:包含大量本地信息的像素块,并能够在另一张图中被快速识别
**keypoints:**作为 corners 的扩展,它将像素块的信息进行编码从而使得更易辨识,至少在原则上唯一
descriptors:它是对 keypoints 进一步处理的结果。通常它具有更低的维度,从而使得图像块能够在另一幅不同的图像中被更快地识别。

class cv::KeyPoint {
public:
	cv::Point2f pt; // coordinates of the keypoint
	float size; // diameter of the meaningful keypoint neighborhood
	float angle; // computed orientation of the keypoint (-1 if none)
	float response; // response for which the keypoints was selected
	int octave; // octave (pyramid layer) keypoint was extracted from
	int class_id; // object id, can be used to cluster keypoints by object 标示关键点来自哪一个目标
	cv::KeyPoint(
		cv::Point2f _pt,
		float _size,
		float _angle = -1,
		float _response = 0,
		int _octave = 0,
		int _class_id = -1
	);
	cv::KeyPoint(
		float x,
		float y,
		float _size,
		float _angle = -1,
		float _response = 0,
		int _octave = 0,
		int _class_id = -1
	);
	...
};

多边形绘制polylines()

void cv::polylines(
         InputOutputArray  img,
         InputArrayOfArrays       pts,
         bool        isClosed,
         const Scalar &        color,
         int   thickness = 1,
         int   lineType = LINE_8,
         int   shift = 0
)

img表示绘制画布,图像
pts表示多边形的点
isClosed表示是否闭合,默认闭合
color表示颜色
thickness表示线宽,必须是正数
lineType表示线渲染类型
shift表示相对位移

绘制填充多边形fillPoly()

void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType=8, int shift=0,
Point offset=Point() );

img:在img表示的图像上绘制
pts:是指向多边形数组的指针,必须是const修饰的
npts:是多边形顶点个数的数组名
ncontours:是绘制多边形的个数
color:是填充的颜色

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

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

相关文章

Chatgpt批量改写文章网页版可多开软件-自动登录换号生成word或者TXT

Chatgpt批量改写文章网页版可多开软件介绍&#xff1a; 1、改写后生成docx格式文档和生成txt文档二选一。 2、支持原来docx文档里带图片的改写&#xff0c;改写伪原创后的docx里也带图片。 3、软件可以设置是否开启标题改写&#xff0c;可以自定义标题改写指令。 4、可以设置…

野火霸天虎 STM32F407 学习笔记_1 stm32介绍;调试方法介绍

STM32入门——基于野火 F407 霸天虎课程学习 前言 博主开始探索嵌入式以来&#xff0c;其实很早就开始玩 stm32 了。但是学了一段时间之后总是感觉还是很没有头绪&#xff0c;不知道在学什么。前前后后分别尝试了江协科技、正点原子、野火霸天虎三次 stm32 的课程学习。江协科…

Ps:魔棒工具

魔棒工具 Magic Wand Tool可以基于颜色和色调快速选择图像上相似的像素区域。 快捷键&#xff1a;W ◆ ◆ ◆ 常用操作方法与技巧 1、在单击取样之前查看和设置工具选项栏上的选项。 选项&#xff1a;取样大小 若要选取纯色区域&#xff0c;可使用“取样点”。而对于分辨率较…

ChatGPT火了:还有哪些可以做的变现项目

一、写在前面 柴特鸡皮踢 大家都不陌生了 说实话&#xff0c;Chatgpt火了后&#xff0c;正经的项目没出来多少&#xff0c;出了一大批割九菜的。 为什么说是割韭菜&#xff0c;因为一群完全不懂技术&#xff0c;只会讲讲成功学、写作学、财经的大V也敢开社群、卖课。很多人听…

设计模式之两阶段终止模式

文章目录 1. 简介 2. 常见思路3. 代码实战 1. 简介 两阶段终止模式&#xff08;Two-Phase Termination Pattern&#xff09;是一种软件设计模式&#xff0c;用于管理线程或进程的生命周期。它包括两个阶段&#xff1a;第一阶段是准备阶段&#xff0c;该阶段用于准备线程或进程…

Hadoop PseudoDistributed Mode 伪分布式

Hadoop PseudoDistributed Mode 伪分布式加粗样式 hadoop101hadoop102hadoop103192.168.171.101192.168.171.102192.168.171.103namenodesecondary namenoderecource managerdatanodedatanodedatanodenodemanagernodemanagernodemanagerjob historyjob logjob logjob log 1. …

WINCC7.5-根据时间跨度选择趋势

yyyy-MM-dd hh:mm:ss “yyyy”&#xff1a;表示四位数的年份&#xff0c;例如&#xff1a;2022。 “MM”&#xff1a;表示两位数的月份&#xff0c;从01到12。 “dd”&#xff1a;表示两位数的日期&#xff0c;从01到31。 “hh”&#xff1a;表示12小时制的小时数&#xff0c;从…

vue实现拖拽拉伸容器宽度

效果 实现逻辑 监听鼠标按下事件&#xff0c;设置滑条背景色&#xff0c;left距离&#xff0c;记录初始位置&#xff0c;捕获鼠标监听鼠标拖动事件&#xff0c;获取移动的距离&#xff0c;设置左侧区域与右侧区域的宽度&#xff0c;滑条的left值监听鼠标松开事件&#xff0c…

【算能】cmake版本不对应

fatal error: boost/numeric/ublas/matrix.hpp: No such file or directory#include <boost/numeric/ublas/matrix.hpp> 解决方法&#xff1a; 这是由于cmake版本不对应&#xff0c;应该提高版本&#xff0c;是的C的编译成功

Redis系统学习(高级篇)-Redis主从集群

目录 一、搭建主从集群 二、主从数据同步的原理 三、repl_backlog原理 四、主从同步优化 五、小结 一、搭建主从集群 为了提高高并发&#xff0c;主从集群是很有必要的&#xff0c;因为这样可以实现读写分离&#xff0c;主节点负责写&#xff0c;从节点就只负责读&#xf…

ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南续篇

作者&#xff1a;运维有术 前言 知识点 定级&#xff1a;入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ks-master-1172.16.33.1661650200KubeSp…

攻防世界-web-bug

1. 问题描述 没有额外的描述&#xff0c;仅仅是这样的一个登录界面 但是&#xff0c;我们注意到有注册&#xff08;Register&#xff09;和找回密码&#xff08;Findpwd&#xff09;这俩按钮 注册界面如下&#xff1a;需要输入用户名&#xff0c;密码&#xff0c;生日及地址 …

《 博弈论教程(罗云峰版) 》——习题二答案

前言 博弈论这门课程&#xff0c;我们主要参考的教材是《博弈论教程&#xff08;罗云峰版&#xff09;》&#xff0c;但是罗老师的课后习题并没有给出完整的答案&#xff0c;秉着学习的态度&#xff0c;本人结合教材和 PPT 在这里给出课后习题的答案。 由于我们只学了完全信息…

2.Spark的工作与架构原理

概述 目标&#xff1a; spark的工作原理spark数据处理通用流程rdd 什么是rddrdd 的特点 spark架构 spark架构相关进程spark架构原理 spark的工作原理 spark 的工作原理&#xff0c;如下图 图中中间部分是spark集群&#xff0c;也可以是基于 yarn 的&#xff0c;图上可以…

修改docker容器commit定制镜像

通过修改容器&#xff0c;然后commit提交为镜像 定制特定的镜像:在实际工作&#xff0c;公网的镜像往往不符合我们预期,因此我们需要自己定制镜像以满足业务需求。 例如:我们期望定制一个符号我们自己的Nginx镜像,并期望镜像交付就包含项目代码与我们期望的配置, 后期只需要轻…

通过Google搜索广告传送的携带木马的PyCharm软件版本

导语 最近&#xff0c;一起新的恶意广告活动被发现&#xff0c;利用被入侵的网站通过Google搜索结果推广虚假版本的PyCharm软件。这个活动利用了动态搜索广告&#xff0c;将广告链接指向被黑客篡改的网页&#xff0c;用户点击链接后下载的并不是PyCharm软件&#xff0c;而是多种…

python hashlib模块及实例

hashlib 模块密码加密密码撞库密码加盐 一&#xff0c;hashlib模块 hashlib模块是用来为字符串进行加密的模块&#xff0c;通过该作用就可以为用户的密码进行加密。 通过模块中的hash算法可以为任意长度的字符串加密成长度相同的一串hash值。该hash算法得到的hash值有一下几个…

vue(32) : win10创建vue2基础前端框架

vue2element-uiaxios 1.创建vue2项目 开发工具为HBuilderX 3.7.3 1.1.新建项目 1.2.普通项目-vue项目(2.6.10) 等待创建项目 2.安装element-ui组件 2.1右键左下角开始图标 2.2.cd进入项目目录,执行安装element-ui npm i element-ui -S 2.3.main.js引入配置 import {Paginat…

HTML样式CSS、图像

HTML样式-CSS: CSS (Cascading Style Sheets) 用于渲染HTML元素标签的样式。CSS可以通过以下方式添加到HTML中&#xff1a;1&#xff09;、内联方式&#xff1a;在HTML元素中使用“style”属性&#xff1b;2&#xff09;、内部样式表&#xff1a;在HTML文档头部<head>区…

ssh远程登录服务

目录 1.1版本协商阶段 1.2密钥和算法协商阶段 1.3认证阶段(两种认证方法): 2.1.安装ssh 2.2.配置文件分析: 3.1配置ssh监听端口号 3.2拒绝以root身份登录服务器 3.3虚拟机之间实现免密登录 3.4xshell免密登录 SSH (Secure Shell Protocol,安全壳程序协议)由IETF的网络…