天天看点

旋转,放大用以保证旋转不会造成图片切割

旋转时,有时容易造成旋转图片被切割掉一部份,所以需要一个放大到足以放下旋转后的图片的MAT进行保存。

通过角度算出最小尺寸,然后创建一个MAT,划出ROI,将srcImg 赋值给新建创的MAT完成区域放大,然后再进行旋转

double a = sin(angle), b = cos(angle);

int width = srcImg.size().width;

int height = srcImg.size().height;

保证原图可以任意角度旋转的最小尺寸  你以为及显示的位置

int tempLength = sqrt((double)width * width + (double)height *height) + 10;    //sqrt()开平方根

int tempX = (tempLength + 1) / 2 - width / 2;

int tempY = (tempLength + 1) / 2 - height / 2;

Mat RoiSrcImg(Size(tempLength, tempLength), srcImg.type());

cout << "size" << "= " << srcImg.size().width << "=" << tempLength << " " << tempLength << endl << "angle" << angle;

//将原图复制到临时图像tmp中心  

Mat ROI = RoiSrcImg(Rect(tempX, tempY, width, height));   //

srcImg.copyTo(ROI);

imshow("放大图1", RoiSrcImg);

旋转 注意CENTER 我改成了MAT的中心点

//创建一个旋转后的图像  

Mat RatationedImg(RoiSrcImg.rows, RoiSrcImg.cols, RoiSrcImg.type());

// RatationedImg.setTo(0);

//对RoiSrcImg进行旋转  

Point _center = Point(RoiSrcImg.rows / 2, RoiSrcImg.cols / 2);

Point2f center = _center; //中心点  

Mat M2 = getRotationMatrix2D(center, angle, 1);//计算旋转加缩放的变换矩阵 

warpAffine(RoiSrcImg, RatationedImg, M2, RoiSrcImg.size(), 1, 0, Scalar(0));//仿射变换