使用C++编写一个程序,实现对输入图像进行仿射变换的功能。 要求: 1. 使用C++语言来实现程序。 2. 程序需提供平移、旋转、缩放、剪切,对图像进行仿射变换。 3. 程序应该显示变换后的图像。 4.调整变换参数并观察结果。
时间: 2024-02-27 07:52:37 浏览: 64
基于OpenCV与C++实现仿射变换,包括旋转,平移,缩放,偏移、组合变换
以下是一个使用 OpenCV 库实现对输入图像进行仿射变换的示例程序。该程序可以实现平移、旋转、缩放、剪切等仿射变换,并显示变换后的图像。您可以根据自己的需求进行调整变换参数并观察结果。
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
// 读取输入图像
Mat src = imread("input.jpg");
if (src.empty())
{
cout << "无法读取输入图像" << endl;
return -1;
}
// 显示原始图像
imshow("原始图像", src);
// 仿射变换参数
Point2f src_vertices[3];
Point2f dst_vertices[3];
Mat warp_mat(2, 3, CV_32FC1);
// 平移变换
src_vertices[0] = Point2f(0, 0);
src_vertices[1] = Point2f(src.cols - 1, 0);
src_vertices[2] = Point2f(0, src.rows - 1);
dst_vertices[0] = Point2f(src.cols * 0.2f, src.rows * 0.2f);
dst_vertices[1] = Point2f(src.cols * 0.8f, src.rows * 0.2f);
dst_vertices[2] = Point2f(src.cols * 0.2f, src.rows * 0.8f);
warp_mat = getAffineTransform(src_vertices, dst_vertices);
Mat warp_dst;
warpAffine(src, warp_dst, warp_mat, src.size());
imshow("平移变换", warp_dst);
// 旋转变换
src_vertices[0] = Point2f(0, 0);
src_vertices[1] = Point2f(src.cols - 1, 0);
src_vertices[2] = Point2f(0, src.rows - 1);
dst_vertices[0] = Point2f(src.cols * 0.5f, src.rows * 0.5f);
dst_vertices[1] = Point2f(src.cols * 0.5f, src.rows * 0.5f);
dst_vertices[2] = Point2f(src.cols * 0.5f, src.rows * 0.5f);
warp_mat = getAffineTransform(src_vertices, dst_vertices);
Point center = Point(src.cols / 2, src.rows / 2);
double angle = -30.0;
double scale = 1.0;
Mat rot_mat = getRotationMatrix2D(center, angle, scale);
Mat rot_dst;
warpAffine(src, rot_dst, rot_mat, src.size());
warpAffine(rot_dst, warp_dst, warp_mat, src.size());
imshow("旋转变换", warp_dst);
// 缩放变换
src_vertices[0] = Point2f(0, 0);
src_vertices[1] = Point2f(src.cols - 1, 0);
src_vertices[2] = Point2f(0, src.rows - 1);
dst_vertices[0] = Point2f(0, 0);
dst_vertices[1] = Point2f(src.cols * 2 - 1, 0);
dst_vertices[2] = Point2f(0, src.rows * 2 - 1);
warp_mat = getAffineTransform(src_vertices, dst_vertices);
Mat scale_dst;
warpAffine(src, scale_dst, warp_mat, Size(src.cols * 2, src.rows * 2));
imshow("缩放变换", scale_dst);
// 剪切变换
src_vertices[0] = Point2f(0, 0);
src_vertices[1] = Point2f(src.cols - 1, 0);
src_vertices[2] = Point2f(0, src.rows - 1);
dst_vertices[0] = Point2f(src.cols * 0.3f, src.rows * 0.2f);
dst_vertices[1] = Point2f(src.cols * 0.7f, src.rows * 0.2f);
dst_vertices[2] = Point2f(src.cols * 0.2f, src.rows * 0.8f);
warp_mat = getAffineTransform(src_vertices, dst_vertices);
Mat shear_dst;
warpAffine(src, shear_dst, warp_mat, src.size());
imshow("剪切变换", shear_dst);
waitKey(0);
return 0;
}
```
注意:程序中的输入图像为 "input.jpg",需根据实际情况进行修改。
阅读全文