文章目录
扩充边缘
函数:copyMakeBorder
函数原型:
void copyMakeBorder( const Mat& src, Mat& dst,int top, int bottom, int left, int right,int borderType, const Scalar& value=Scalar() );
功能
扩充src边缘,将图像变大,便于处理边界,该函数调用了cv::borderInterpolate,
参数:
src,dst:原图与目标图像。
top,bottom,left,right 分别表示在原图四周扩充边缘的大小。
borderType: 扩充边缘的类型,OpenCV中给出以下几种方式。
value :当borderType为BORDER_CONSTANT时,需要填充的常量像素值。
borderType的宏定义说明
/*
Various border types, image boundaries are denoted with '|'
* BORDER_REPLICATE: aaaaaa|abcdefgh|hhhhhhh
* BORDER_REFLECT: fedcba|abcdefgh|hgfedcb
* BORDER_REFLECT_101: gfedcb|abcdefgh|gfedcba
* BORDER_WRAP: cdefgh|abcdefgh|abcdefg
* BORDER_CONSTANT: iiiiii|abcdefgh|iiiiiii with some specified 'i'
*/
BORDER_REPLICATE:复制法,也就是复制最边缘像素。
BORDER_REFLECT_101:对称法,也就是以最边缘像素为轴,对称。
BORDER_CONSTANT:常量法。
Demo
copyMakeBorder(src, src, 2, 2, 2, 2,BORDER_CONSTANT,Scalar(0,0,255));
copyMakeBorder(src, dst, 8, 8, 8, 8,BORDER_REPLICATE);
旋转
函数
getRotationMatrix2D函数 求得旋转矩阵
warpAffine函数 实现仿射变换
函数原型
Mat getRotationMatrix2D(Point2f center,double angle,double scale)
void warpAffine (InputArray src,
OutputArray dst,
InputArray M,
Size dsize,
int flags = INTER_LINEAR,
int borderMode = BORDER_CONSTANT,
const Scalar & borderValue = Scalar() )
参数:
getRotationMatrix2D 参数:
Point2f center:表示旋转的中心点
double angle:表示旋转的角度 负数表示逆时针旋转
double scale:图像缩放因子
warpAffine 参数
src: 输入图像
dst: 输出图像,尺寸由dsize指定,图像类型与原图像一致
M: 2X3的变换矩阵
dsize: 指定图像输出尺寸
flags: 插值算法标识符,有默认值INTER_LINEAR,如果插值算法为WARP_INVERSE_MAP, warpAffine函数使用如下矩阵进行图像转换
borderMode: 边界像素模式(和扩展边缘一致),有默认值BORDER_CONSTANT
borderValue: 边界取值,有默认值Scalar()即0
dst(x,y) = src(M11x + M12y + M13,M21x + M22y +M23)
flags 插值算法标志符
标志符 | 含义 |
---|---|
INTER_NEAREST | 最临近插值算法 |
INTER_LINEAR | 线性插值算法 |
INTER_AREA | 区域插值 |
INTER_CUBIC | 三次样条插值 |
INTER_LANCZOS4 | Lanczos插值 |
Demo
float radian = (float)(45 / 180.0 * CV_PI);
float result = 1.00 / cos(radian);
//填充图像
int maxBorder = (int)(max(src.cols, src.rows)* result); //即为sqrt(2)*max
int dx = (maxBorder - src.cols) / 2;
int dy = (maxBorder - src.rows) / 2;
//dy, dy, dx, dx : 上下左右添加像素个数
copyMakeBorder(src, dst, dy, dy, dx, dx, IPL_BORDER_REPLICATE);
//旋转
Point2f center((float)(dst.cols / 2), (float)(dst.rows / 2));
Mat affine_matrix = getRotationMatrix2D(center, 45, 1.0);//求得旋转矩阵
warpAffine(dst, dst, affine_matrix, dst.size(),INTER_LINEAR,BORDER_REPLICATE);
//计算图像旋转之后包含图像的最大的矩形
float sinVal = abs(sin(radian));
float cosVal = abs(cos(radian));
Size targetSize((int)(src.cols * cosVal + src.rows * sinVal),(int)(src.cols * sinVal + src.rows * cosVal));
//剪掉多余边框
int x = (dst.cols - targetSize.width) / 2;
int y = (dst.rows - targetSize.height) / 2;
Rect rect(x, y, targetSize.width, targetSize.height);
dst = Mat(dst, rect);