#include <stdio.h>
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
// 图像矩阵
Mat src, dstWarp, dstWarpRtaiton;
// 读取图像
src = imread("road.jpg");
if (src.empty())
{
cout << "No Data!---- the error of redding imge." << endl;
return -1;
}
// 设置目标图像和源图像大小一致
dstWarp = Mat::zeros(src.rows, src.cols, src.type());
dstWarpRtaiton = Mat::zeros(src.rows, src.cols, src.type());
// 变化矩阵
Mat WarpMat(2, 3, CV_32FC1);
Mat RotationMat(2, 3, CV_32FC1);
// 两幅图像的两组点坐标
Point2f srcTri[3];
Point2f dstTri[3];
srcTri[0] = Point2f(0.0, 0.0);
srcTri[1] = Point2f(src.cols - 1.0, 0.0);
srcTri[2] = Point2f(0.0, src.rows - 1.0);
dstTri[0] = Point2f(src.cols * 0.0, src.rows * 0.33);
dstTri[1] = Point2f(src.cols * 0.85, src.rows * 0.21);
dstTri[2] = Point2f(src.cols * 0.15, src.rows * 0.7);
// 求得放射变换
WarpMat = getAffineTransform(srcTri, dstTri);
// 对源图像应用获得的放射变换矩阵
warpAffine(src, dstWarp, WarpMat, dstWarp.size());
// 计算绕图像中点顺时针旋转50度, 缩放因子为0.6的旋转矩阵
Point2f center(dstWarpRtaiton.rows * 0.5, dstWarpRtaiton.rows * 0.5);
double angel = -50;
double scale = 0.6;
RotationMat = getRotationMatrix2D(center, angel, scale);
// 旋转已扭曲图像
warpAffine(dstWarp, dstWarpRtaiton, RotationMat, dstWarpRtaiton.size());
char* source_window = "Source Image Window";
namedWindow(source_window, CV_WINDOW_AUTOSIZE);
imshow(source_window, src);
char* warp_window = "Warp Image Window";
namedWindow(warp_window, CV_WINDOW_AUTOSIZE);
imshow(warp_window, dstWarp);
char* warp_rotation_window = "Warp Rotation Image";
namedWindow(warp_rotation_window, CV_WINDOW_AUTOSIZE);
imshow(warp_rotation_window, dstWarpRtaiton);
waitKey(0);
return 0;
}
仿射变换 图像旋转
最新推荐文章于 2024-08-01 15:30:53 发布