1.图像整体变换
(1)图片读取保存
//imread(string filename, int flag) 读取位于filename处文件,flag设置读取参数,默认为1 ,将图像转换为3通道BGR彩色图像
//namedWindow(string name , int flag) 创建一个名为“name” 的窗口,flag默认为1,不允许用户修改窗口大小,根据图形大小显示
//imshow(string winname, InputArray mat) 在窗口winname上显示mat,若无这个窗口,会自动调用namedWindow创建窗口
//bool imwrite( const String& filename, InputArray img,
//const std::vector<int>& params = std::vector<int>()) 三个参数,filename为存储位置与名字,img为保存名字,params设置保存属性
int main()
{
Mat img;
img = imread("D:/OpenCV/photo/1.jpg",1); //读取图像
vector<int> params;
params.push_back(IMWRITE_AVIF_QUALITY);//设置imwrite第三个参数,保存为JPEG格式
params.push_back(100); //设置图像质量为100
imwrite("D:/OpenCV/photo/2.jpg", img, params);
imshow("SHOW", img);
waitKey(0);
return 0;
}
(2)图像缩放
//CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
// Size dsize, double fx = 0, double fy = 0,
// int interpolation = INTER_LINEAR );
//scr:输入图像
//dst:输出图像
//dsize:输出大小
//fx,fy调整图像参数
//interpolation 插值方法标记
int main()
{
Mat img;
img = imread("D:/OpenCV/photo/1.jpg",1);
vector<int> params;
params.push_back(IMWRITE_AVIF_QUALITY);//设置imwrite第三个参数,保存为JPEG格式
params.push_back(100); //设置图像质量为100
Mat dst;
resize(img, dst, Size(img.cols*1.2,img.rows*1.2), 0, 0, 1);
imshow("放大", dst);
resize(img, dst, Size(img.cols * 0.5, img.rows * 0.5), 0, 0, 1);
imshow("缩小", dst);
imwrite("D:/OpenCV/photo/2.jpg", dst, params);
imshow("img", img);
waitKey(0);
return 0;
}
上述代码运行结果如下:
(3)翻转与旋转
//翻转
//void flip(InputArray src, OutputArray dst, int flipCode);
// n为0 绕x轴进行旋转
// n大于0 绕y轴进行旋转
// n为小于0 绕两个轴旋转
int main()
{
Mat img;
img = imread("D:/OpenCV/photo/1.jpg",1);
imshow("原图", img);
Mat dst;
flip(img, dst, 0);
imshow("n为0", dst);
flip(img, dst, 1);
imshow("n大于0", dst);
flip(img, dst, -1);
imshow("n小于0", dst);
waitKey(0);
return 0;
}
上述代码运行结果如下
// 旋转
// Mat getRotationMatrix2D(Point2f center, double angle, double scale)求旋转矩阵
// center : 旋转中心
// angle : 旋转角度
//scale: 缩放比例,不进行缩放则为1
//返回一个2*3的矩阵
// void warpAffine( InputArray src, OutputArray dst,
// InputArray M, Size dsize,
// int flags = INTER_LINEAR,
// int borderMode = BORDER_CONSTANT,
// const Scalar& borderValue = Scalar());
//利用warpAffine仿射变换进行旋转
//dsize:输出图像大小
//borderValue: 填充边界的颜色,默认为黑色
int main()
{
Mat img,M,dst;
img = imread("D:/OpenCV/photo/1.jpg",1);
imshow("原图", img);
int w = img.cols;
int h = img.rows;
M = getRotationMatrix2D(Point2f(w / 2, h / 2), 45, 1.0);
double sin = M.at<double>(0, 1);
double cos = M.at<double>(0, 0);
double nw = w * cos + h * sin;
double nh = sin * w + cos * h; //计算旋转后的宽高
M.at<double>(0, 2) = M.at<double>(0, 2) + (nw / 2 - w / 2);
M.at<double>(1, 2) = M.at<double>(1, 2) + (nh / 2 - h / 2);//计算旋转后图像偏移
warpAffine(img, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(124, 123, 412));
imshow("旋转45度", dst);
waitKey(0);
return 0;
}
warpAffine(img, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(124, 123, 412));
imshow("旋转45度", dst);
waitKey(0);
return 0;
}