1 RotateArbitrarilyAngle(Mat src, Mat &dst, float angle) 2 { 3 float radian = (float)(angle / 180.0 * CV_PI); 4 5 //填充图像 6 int maxBorder = (int)(max(src.cols, src.rows)* 1.414); //即为sqrt(2)*max 7 int dx = (maxBorder - src.cols) / 2; 8 int dy = (maxBorder - src.rows) / 2; 9 copyMakeBorder(src, dst, dy, dy, dx, dx, BORDER_CONSTANT); 10 11 //旋转 12 Point2f center((float)(dst.cols / 2), (float)(dst.rows / 2)); 13 Mat affine_matrix = getRotationMatrix2D(center, angle, 1.0);//求得旋转矩阵 14 warpAffine(dst, dst, affine_matrix, dst.size()); 15 16 //计算图像旋转之后包含图像的最大的矩形 17 float sinVal = abs(sin(radian)); 18 float cosVal = abs(cos(radian)); 19 Size targetSize((int)(src.cols * cosVal + src.rows * sinVal), 20 (int)(src.cols * sinVal + src.rows * cosVal)); 21 22 //剪掉多余边框 23 int x = (dst.cols - targetSize.width) / 2; 24 int y = (dst.rows - targetSize.height) / 2; 25 Rect rect(x, y, targetSize.width, targetSize.height); 26 dst = Mat(dst, rect); 27 }