OpenCV学习笔记 02
三、基本图像变换
3.1 图像拼接
opencv提供两种拼接的方式
①将存放于一个Mat类矩阵中的对象进行拼接
②将两个Mat类对象进行拼接
//纵向拼接
void cv::vconcat(const Mat * input, //数组的指针
size_t numof_Input, //所输入的数组中Mat类型的数目
OutputArray output
)
void cv::vconcat(InputArray input1, //数组的指针 //所输入的数组中Mat类型的数目
InputArray input2,
OutputArray output
)
//横向拼接仅举例,参数与纵向一致
void cv::hconcat()
3.2 图像尺寸变换 resize()
void cv::resize(InputArray input,
OutputArray output,
Size dsize, //指定输出图像尺寸
double fx, //x,y方向缩放比例
double fy,
int interpolation = INTER_LINEAR //插值算法标志
)
dsize和fx/fy在使用时只需要使用一类即可,两者同时使用时以dsize为准
3.3 图像翻转 flip()
void cv::flip(InputArray input,
OutputArray output,
int flipCode //>0绕y轴翻转,=0绕x轴翻转,<0绕x,y都翻转
)
3.4 极坐标变换 warpPolar()
圆形图像转变为矩形图像,用于处理钟表、圆盘等图像。将圆形图像的边缘文字排列在新的矩形图像的边缘
void cv::warpPolar(InputAray input,OutputArray output,Size dsize,
Point2f center, //极坐标图的原点
double maxRadius, //极坐标图半径
int flag //插值方法
)
四、使用变换矩阵的图像变换
4.1 图像仿射变换 warpAffine()
4.1.1 图像的旋转
getRotationMatrix2D()函数通过输入旋转中心、旋转角度、旋转过程两轴的比例因子,获得一个Mat类型的旋转矩阵对象:
Mat cv::getRotationMatrix2D(Point2f center,
double angle,
double scale //两轴的比例因子,输入1则不缩放
)
旋转变换是仿射变换的一个特殊情况,将此矩阵用于仿射变换函数即可仅作图像旋转
4.1.2 仿射变换
仿射变换又称为三点变换。如果知道目标变换前后的三个像素点坐标之间的关系,即可求出仿射变换矩阵M。
opencv提供了getAffineTransform函数用于计算仿射变换矩阵:
Mat cv::getAffineTransform(const Point2f src[],
const Point2f dst[] //输入点类数组
)
void cv::warpAffine(InputArray src,
OutputArray dst,
InputArray M, //仿射变换矩阵M
Size dsize,
int flags = INTER_LINEAR, //插值方法
int borderMode = BORDER_CONSTANT, //像素边界外推方法
const Scalar & nprderValue = Scalar()
)
仿射变换的矩阵M是2×3的矩阵
4.2 透视变换 warpPerspective()
透视变换:按照物体的成像投影规律将图像重新投影。常见用例是修正镜头与拍摄目标存在斜角时产生的图像畸变。
使用getPerspectiveTransform()函数获取变换矩阵
Mat cv::getPerspectiveTransform(const Point2f src[],
const Point2f dst[],
int solveMethod = DECOMP_LU //求解方法
)
使用warpPerspective()函数应用透视变换
void cv::warpPerspective(InputArray src,
OutputArray dst,
InputArray M, //变换矩阵M
Size dsize,
int flags = INTER_LINEAR, //插值方法
int borderMode = BORDER_CONSTANT, //像素边界外推方法
const Scalar & nprderValue = Scalar()
)
五、深拷贝与浅拷贝
5.1 感兴趣区域 ROI
为了减轻内存负担,通常会从原始图中截取一部分区域后再进行处理,所截取的这一部分成为感兴趣区域(Region of Interest)。
OpenCV提供两种截取ROI的方式
Mat img,ROI1,ROI2;
//截图方式1
//首先需要定义ROI区域
Rect_(_Tp _x,_Tp _y,_Tp _width,_Tp _height)//_Tp为模板类型,可用int,double, float类型替换
Rect rect(300,300,500,500);
ROI1 = img(rect);
//截图方式2
ROI2 = img(Range(300,500),Range(300,500)); //img(行范围,列范围)
5.2 浅拷贝深拷贝
浅拷贝:创建了一个能够访问数据的变量,原始数据改变后浅拷贝对象也会改变
深拷贝:创建变量的同时,在内存中分配新的地址存储该变量
//浅拷贝方式
Mat img1 = img2;
//深拷贝1
void cv::Mat::copyTo(OutputArray m)const
//例如 img1.copyTo(img2) 将img1深拷贝进入img2中
void cv::Mat::copyTo(OutputArray m,InputArray mask)const
//带遮罩选择的版本
//深拷贝2
void cv::copyTo(InputArray src,OutputArray dst,InputArray mask)
//例如 copyTo(img1,img2,img1) 应用img1作为遮罩范围将img1深拷贝到img2
六、图像金字塔
6.1 上采样pyrUp(),下采样pyrDown()
功能上与resize()函数相同,均为改变原始图片的尺寸,但是内部的算法不同
void cv::pyrUp(InputArray src,OutputArray dst,
const Size & dst_size = Size(), //可指定,默认为原始的两倍
int borderType = BORDER_DEFAULT
)
void cv::pyrDown(InputArray src,OutputArray dst,
const Size & dst_size = Size(), //可指定,默认为原始的1/2
int borderType = BORDER_DEFAULT
)
6.2 高斯金字塔
构建高斯金字塔是通过下采样不断的将图像缩小,包含多个尺寸的金字塔排列图像。底层为图像的原图,每往上一层就会通过下采样缩小一次图像的尺寸,默认为缩小为当前的1/2。
6.3 拉普拉斯金字塔
**拉普拉斯金字塔具有预测残差的作用**
拉普拉斯金字塔通过上层小尺寸的图像构建下层大尺寸的图像,需要与高斯金字塔联合使用。
第i层拉普拉斯图像的计算方法:
Ps:临时看的flowchart.js的使用方法,参考: