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

说明

本文主要是记录我在学习和使用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的帧
//方法1
writer.write(fram);
//方法2
writer << 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/2
pyrUp(src, dst, dstsize, borderType)//图像上采样,即图像放大,默认size则放大2倍

参数说明:
src, dst分别为输入图像、输出图像
dstsize为输出图像的size,使用默认值则dst为src的1/2大小
borderType为像素便捷外推方法

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值