900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > OpenCV4图像处理算子不完全手册-入门篇(已完结)

OpenCV4图像处理算子不完全手册-入门篇(已完结)

时间:2024-02-03 06:54:44

相关推荐

OpenCV4图像处理算子不完全手册-入门篇(已完结)

目录

说明导航正文一、图像数据读写1、Mat类构造Mat对象:读写Mat对象2、图像读取与显示3、视频与摄像头4、图像保存5、视频保存6、XML与YMAL文件二、图像基本操作1、颜色空间颜色模型转换图像数据类型转换多通道图像分离多通道图像合并2、像素操作寻找像素最大值/最小值矩阵转换,变形图像平均值,表示图像整体的亮暗标准差,表示图像明暗变化的程度,越大表示明暗变化越明显比较运算逻辑运算二值化,全局阈值二值化,自适应阈值查找表,灰度值映射表3、图像变换图像连接图像尺寸变换图像翻转变换图像仿射变换透视(投影)变换极坐标变换4、图像绘制绘制圆绘制直线绘制椭圆绘制矩形绘制多边形绘制文字5、感兴趣区域ROI6、图像金字塔

说明

本文主要是记录我在学习和使用OpenCV4过程中对常用算子的记录和简单描述,如描述有误请留言指正,我会持续进行完善!示例代码为C++编写,仅供参考。注意,为节省篇幅,函数中省略了参数类型和返回值,实际使用时参考opencv的接口说明即可!因版本不同而出现的接口和参数差异问题,请以具体版本为准,作者使用的opencv版本为最新版。

导航

OpenCV4图像处理算子不完全手册-进阶篇

OpenCV4图像处理算子不完全手册-应用篇

正文

一、图像数据读写

1、Mat类

构造Mat对象:

cv::Mat mat(row,column,type)//type为数据类型,如CV_8UC1,CV_8UC3,CV_16UC1,CV_16FC1等cv::Mat mat(Size,type)//Size(row,column)cv::Mat mat(row,column,type,Scalar)//Scalar(B,G,R)则图像为3通道,Scalar与type需对应cv::Mat mat(const Mat& mat)//从已有的Mat矩阵拷贝cv::Mat::zeros(Size(w,h),type)//构造大小为Size、值为0的矩阵

读写Mat对象

单通道图像:mat.at(row,column)

三(或多)通道图像:mat.at(row,column).val[num],num为通道索引,从0开始。

2、图像读取与显示

imread(filename,flags)//flags为图像形式,如彩色、灰度nameWindow(winname,flags)//flags为窗口属性标志imshow(winname,mat)

3、视频与摄像头

构造VideoCapture对象:

VideoCapture()capture.open(filename)//filename为视频文件名称capture.open(index)//index为相机索引,0为默认相机VideoCapture(filename,apiPreference)//apiPreference为读取数据时设置的属性,如编码格式、是否调用OpenNI等VideoCapture(index,apiPreference)//读取帧Mat fram;//方法1,使用重载的运算符 >>capture >> fram;//方法2,使用read方法capture.read(fram)//成功返回true,否则返回false

4、图像保存

imwrite(filename,mat,params)//params为保存图片格式的属性设置标志,可将图像保存为指定格式

5、视频保存

构造VideoWriter对象:

VideoWriter()VideoWriter(filename,fourcc,fps,framsize,isColor)//filename应包含视频格式(mp4、avi等),fourcc为压缩帧的4字符编解码器代码,fps为帧率,framsize为帧大小,isColoe是否彩色//保存capture的帧//方法1writer.write(fram);//方法2writer << fram;

6、XML与YMAL文件

FileStorage对象:

FileStorage(filename,flags,encoding)//flags操作类型,encoding编码格式FileStorage(),open(filename,flags,encoding)write(filename,val)

当某个变量中含有多个数据或子变量时使用FileNode对象:

FileStorage Storage(filename,FileStorage::READ);FileNode node = Storage["xxx"];//FileNode迭代器FileNodeIterator NodeIterator = node.begin();//数组形式node["xxxx"][index];

二、图像基本操作

1、颜色空间

颜色模型转换

cvtColor(src,dst,code,dstCn)

参数说明:

src 输入原始图像

dst 输出目标图像

code 颜色空间转换标志,如COLOR_BGR2RGB、COLOR_BGR2GRAY、COLOR_BGR2YUV等

dstCn 目标图像的通道数(默认0,自动确认通道数)

图像数据类型转换

convertTo(m,rtype,alpha,beta)

参数说明:

m 转换类型后输出的图像

rtype 目标数据类型,如CV_8U、CV_16U、CV_16F、CV_32F

alpha 缩放因子,默认1

beta 偏置因子,默认0

多通道图像分离

方式一:split(src,mvbegin)//mvbegin为分离后的单通道图像数组,数组大小取决于src的通道数。方式二:split(m,mv)//mv为分离后的单通道图像向量(vector)

多通道图像合并

对应split方式一:merge(mv,count,dst)//mv为需要合并的单通道图像数组,count为图像数组的长度,dst为输出的多通道数组。对应split方式二:merge(mv,dst)//mv为需要合并的单通道图像向量(vector)

2、像素操作

寻找像素最大值/最小值

minMaxLoc(src,minVal,maxVal,minLoc,maxLoc,mask)

参数说明:

minVal/maxVal 图像或矩阵中的最大/最小值

minLoc/maxLoc 图像或矩阵中最大/最小值所在的坐标位置

mask 掩模,用于在指定区域寻找最大/最小值,默认值为noArray()。

矩阵转换,变形

Mat::reshape(cn,rows)//cn为转换后的通道数(设置0则不变),rows为转换后的行数(设置0则不变)

图像平均值,表示图像整体的亮暗

mean(src,mask)//src为输入图像,mask为掩模,用于标记求取指定区域的平均值

标准差,表示图像明暗变化的程度,越大表示明暗变化越明显

该函数可用时求取平均值和标准差

meanStdDev(src,mean,stddev,mask)

参数说明:

mean为图像每个通道的平均值

stddev为图像每个通道的标准差

mask为掩模

比较运算

min(src1,src2,dst)//比较src1与src2,保留对应位置较小值到dst中。尺寸、通道数、数据类型一致max(src1,src2,dst)//比较src1与src2,保留对应位置较大值到dst中

逻辑运算

bitwise_and(src1,src2,dst,mask)//与运算,mask掩模用于指定运算区域。尺寸、通道数、数据类型保持一致bitwise_or(src1,src2,dst,mask)//或运算bitwise_xor(src1,src2,dst,mask)//异或运算bitwise_not(src1,src2,dst,mask)//非运算,等于取反

二值化,全局阈值

threshold(src,dst,thresh,maxval,type)

参数说明:

src为输入,只能是CV_8U或CV_32F类型

dst为输出,与src保持相同的尺寸、数据类型、通道数

thresh为阈值

maxval为二值化过程中的最大值

type为选择二值化方法的标志。

二值化,自适应阈值

adaptiveThreshold(src,dst,maxValue,adaptiveMethod,thresholdType,blockSize,C)

参数说明:

src 只能是CV_U8C1即单通道8bit类型

maxValue 为二值化的最大值

adaptiveMethod 为自适应阈值的方法,可选均值法、高斯法

thresholdType 为选择二值化方法的标志,可选THRESH_BINARY、THRESH_BINARY_INV

blockSize 为像素邻域大小(一般为奇数),如3、5、7

C为从平均值或加权平均值中减去的常数

查找表,灰度值映射表

LUT(src,lut,dst)//src必须为CV_8U类型;lut为256个像素灰度值的查找表,1x256大小的矩阵存放像素灰度值映射后的数值

3、图像变换

图像连接

vconcat(src,nsrc,dst)//src为Mat数组,nsrc为数组大小,纵向连接。vconcat(src1,src2,dst)//将src1与src2连接合并到dst。hconcat(src,nsrc,dst)//横向连接。hconcat(src1,src2,dst)

图像尺寸变换

resize(src,dst,dsize,fx,fy,interpolation)

参数说明:

dsize为输出图像的尺寸,由Size(w,h)进行构造

fx为横轴的比例因子

fy为纵轴的比例因子

interpolation为插值方法标志,如最邻近、双线性、双三次等方法

图像翻转变换

flip(src,dst,flipCode)//flipCode为翻转方式标志,>0绕y轴翻转,=0绕x轴翻转,<0绕两个轴翻转

图像仿射变换

1、计算变换矩阵:

getRotationMatrix2D(center,angle,scale)//适用于图像旋转和缩放

center为旋转中心

angle为旋转角度

scale为两个轴的比例因子,可实现旋转过程中的缩放,1表示保持大小不变。

2、如果已知src与dst任意三个对应的点的坐标,可以计算对应的变换矩阵:

getAffineTransform(src[],dst[])

src[]为src图像中的三个点坐标的point2f数组

dst[]为dst图像中的三个点坐标的point2f数组

3、应用仿射变换

warpAffine(src,dst,M,dsize,flags,borderMode,borderValue)

M为从getRotationMatrix2D或getAffineTransform得到的2x3的变换矩阵

flags为插值方法标志

borderMode为像素边界外推方法标志

borderValue为填充边界的数值。

透视(投影)变换

1、计算变换矩阵:

getPerspectiveTransform(src[],dst[],solveMethod)

src[]是原图像中四个point2f类型的点坐标

dst[]是目标图像中四个point2f类型的点坐标

solveMethod为选择透视变换矩阵的方法。

2、应用透视变换

warpPerspective(src,dst,M,dsize,flags,borderMode,borderValue)

M为从getPerspectiveTransform中得到的3x3的变换矩阵

其他与仿射变换warpAffine相同。

极坐标变换

warpPolar(src,dst,dsize,center,maxRadius,flags)

dsize为目标图像大小

center为变换时极坐标的原点,一般指圆心

maxRadius为变换时边界元的半径,即圆形区域的半径

flags为插值方法与极坐标映射方法的标志

4、图像绘制

绘制圆

circle(img,center,radius,color,thickness,lineType,shift)

将圆绘制在img上

thinckness为圆的轮廓宽度(负值则绘制实心圆)

lineType为圆的边界类型

shift为中心坐标和半径数值的小数位数。

绘制直线

line(img,pt1,pt2,color,thickness,lineType,shift)//pt1和pt2为直线的起点和终点,数据类型为Point

绘制椭圆

ellipse(img,center,axes,angle,startAngle,endAngle,color,thickness,lineType,shift)

center为椭圆中心

axes为椭圆主轴大小的一半

angle为椭圆旋转的角度

startAngle为起始角度

endAngle为终止角度

绘制矩形

rectangle(img,pt1,pt2,color,thickness,lineType,shift)//pt1和pt2分别为矩形的左上角和右下角顶点rectangle(img,rec,color,thickness,lineType,shift)//rec为事先定义好的Rect矩形

绘制多边形

fillPoly(img,pts,npts,ncontours,color,lineType,shift,offset)

pts为point**类型的多边形顶点数组

npts为每个多边形顶点数组中顶点的个数

ncontours为绘制多边形的个数

offset为可选的所有顶点的偏移

绘制文字

putText(img,text,org,fontFace,fontScale,color,thickness,lineType,bottomLeftOrigin)

text只支持英文

org为text的左下角坐标

fontFace为字体类型

fontScale为字体大小

bottomLeftOrigin指定图像数据原点的位置,默认false为左上角,true为右上角

5、感兴趣区域ROI

以矩形区域为例:

方法1、构造矩形,从原图中裁剪

Rect rect(x, y, w, h); //定义ROI区域,坐标和宽高Mat ROI1 = img(rect); //裁剪,img为原图

方法2、构造mask矩阵,从原图中拷贝

Mat mask = Mat::zeros(Size(img.cols,img.rows), CV_8UC1);for(int row = 100; row < noobcv.rows; row++){for(int col = 0; col < noobcv.cols; col++){mask .at<unsigned char>(row, col) = 1;//值为1的点,在原图中拷贝,值为0的不拷贝}}Mat ROI2;img.copyTo(ROI2, mask);//以mask中值为1的点从img拷贝至ROI2,mask中值为0的点设置为0

6、图像金字塔

pyrDown(src, dst, dstsize, borderType)//图像下采样,即图像缩小,默认size缩小为1/2pyrUp(src, dst, dstsize, borderType)//图像上采样,即图像放大,默认size则放大2倍

参数说明:

src, dst分别为输入图像、输出图像

dstsize为输出图像的size,使用默认值则dst为src的1/2大小

borderType为像素便捷外推方法

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。