目录
自由旋转-getRotationMatrix2D&warpAffine
缩放尺寸-resize
CV_EXPORTS_W void resize( InputArray src,
OutputArray dst,
Size dsize, //比例
double fx=0, double fy=0,
int interpolation=INTER_LINEAR
);
其中 interpolation为插值类型
·CV_INTER_NN - 最近-邻居插补
·CV_INTER_LINEAR - 双线性插值(默认方法)
·CV_INTER_AREA - 像素面积相关重采样。当缩小图像时,该方法可以避免波纹的出现。当放大图像时,类似于方法CV_INTER_NN。
·CV_INTER_CUBIC - 双三次插值。
Mat zoomin1, zoomin2, zoomin3, zoomin4;
Mat zoomout;
int h = image.rows;
int w = image.cols;
//缩小
resize(image, zoomin1, Size(w / 2, h / 2), 0, 0, INTER_NEAREST);
imshow("1", zoomin1);
resize(image, zoomin2, Size(w / 2, h / 2), 0, 0, INTER_LINEAR);
imshow("2", zoomin2);
resize(image, zoomin3, Size(w / 2, h / 2), 0, 0, INTER_AREA);
imshow("3", zoomin3);
resize(image, zoomin4, Size(w / 2, h / 2), 0, 0, INTER_CUBIC);
imshow("4", zoomin4);
//放大
resize(image, zoomout, Size(w * 1.5, h * 1.5), 0, 0, INTER_LINEAR);
imshow("zoomout", zoomout);
翻转-flip
flip(image, dst, flipcode);
0、-1、1:分别代表不同的翻转方式
Mat dst;
imshow("原图",image);
flip(image, dst, 0); // 上下翻转
imshow("上下翻转", dst);
flip(image, dst, 1); // 左右翻转
imshow("左右翻转", dst);
flip(image, dst, -1); // 180°旋转
imshow("180翻转", dst);
自由旋转-getRotationMatrix2D&warpAffine
M=cv2.getRotationMatrix2D(center, angle, scale)
旋转中心点
角度
缩放比例
其实getRotationMatrix2D的是一个旋转的矩阵数列
首先将旋转中心点P平移至坐标原点O,然后进行旋转、缩放(如果需要进行),最后再将坐标原点平移至旋转中心!
将图像的旋转中心P平移至坐标原点O,对应的变换矩阵为:
图像绕O旋转角度,对应的变换矩阵为:
将图像缩放为原来的S倍,对应的变换矩阵为:
将坐标原点O平移回至旋转中心P,对应的变换矩阵为:
将坐标原点O平最终的变换矩阵即为 F = Z * S * R * T
经过旋转后尺寸需要改变公式如图
相应尺寸和中心点皆需调整
int nw = cos * w + sin * h;
int nh = sin * w + cos * h;
Mat dst, M;
int w = image.cols;
int h = image.rows;
M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);
double cos = abs(M.at<double>(0, 0)); //提取矩阵位置(0,0) cos
double sin = abs(M.at<double>(0, 1));//提取矩阵位置(0,1) sin
//调整画布尺寸
int nw = cos * w + sin * h;
int nh = sin * w + cos * h;
//调整中心点位置
M.at<double>(0, 2) += (nw / 2 - w / 2);
M.at<double>(1, 2) += (nh / 2 - h / 2);
warpAffine(image, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(255, 255, 0));
imshow("旋转演示", dst);