voidcv::warpAffine( InputArray src, //输入图像 OutputArray dst, //输出图像 InputArray M, //变换矩阵 Size dsize, //输出图像大小 int flags = INTER_LINEAR, //插值方式 int borderMode = BORDER_CONSTANT, //图像边缘像素模式 const Scalar& borderValue = Scalar() //边界填充值
其中M变换矩阵可以通过如下函数获得,旋转矩阵的形式如下:
1
M=cv2.getRotationMatrix2D(center, angle, scale)
由于旋转之后,图像的大小会发生变化,因此需要重新计算图像的长宽,计算方法可以参考下图:
图像旋转的示例程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
voidMyDemo::rotate_Demo(Mat& image){ Mat dst, M; int h = image.rows; int w = image.cols; M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0); //定义变换矩阵M double cos = abs(M.at<double>(0, 0)); //求cos值 double sin = abs(M.at<double>(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,255)); imshow("Rotation", dst); }