一、图像旋转
算子:transpose(src, src);
transpose()可以实现像素下标的x和y轴坐标进行对调:dst(i,j)=src(j,i),接口形式
transpose(
InputArray src, // 输入图像
OutputArray dst, // 输出
)
算子:flip(src, src, 1);
flip()函数可以实现对图像的水平翻转、垂直翻转和双向翻转
void flip(
InputArray src, // 输入图像
OutputArray dst, // 输出
int flipCode = 0 // >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转
);
flip(img1,0)#水平轴翻转(上下翻转)
flip(img1,1)#垂直轴翻转(左右翻转)
flip(img1,-1)#双向翻转
二、代码显示
#if 1 // 旋转角度
Mat rotate_img(Mat src, int idx) {
//旋转90度
if (idx == 1) {
transpose(src, src);
flip(src, src, 1);
return src;
}
//旋转180度
else if (idx == 2) {
flip(src, src, 0);
flip(src, src, 1);
return src;
}
//旋转270度
else if (idx == 3) {
transpose(src, src);
flip(src, src, 0);
return src;
}
else {
return src;
}
}
int main() {
Mat src = imread("C:\\Users\\19473\\Desktop\\opencv_images\\33.jpg");
if (!src.data)
{
printf("could not load image....\n");
}
imshow("原图", src);
Mat m1= rotate_img(src,1); //90度
imshow("90度", m1);
Mat m2 = rotate_img(src, 2); //180度
imshow("180度", m2);
Mat m3 = rotate_img(src, 3); //270度
imshow("270度", m3);
waitKey(0);
return 0;
}
#endif
三、饶中任一点旋转
我这里写的是绕着图像的中心旋转
// 旋转图片 旋转一定的角度
void RotateImage(Mat& image, const double angle)
{
Mat M;
int w = image.cols;
int h = image.rows;
// 获取旋转矩阵 旋转中心 角度 缩放比例 1
M = getRotationMatrix2D(Point2f(w/2,h/2),angle,1);
double cos = abs(M.at<double>(0,0));
double sin = abs(M.at<double>(0,1));
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,image,M,Size(nw,nh),INTER_LINEAR,0);
}