计算机图形学图形二维变换vsC++实现代码
时间: 2023-07-16 19:16:02 浏览: 110
二维图形变换(VC++)
4星 · 用户满意度95%
以下是C++实现的图形二维变换代码,包括平移、旋转、缩放和对称。这里使用了OpenCV库。
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
/**
* 平移变换
* @param src 原图像
* @param dst 结果图像
* @param x 水平方向平移量
* @param y 垂直方向平移量
*/
void translate(Mat& src, Mat& dst, int x, int y) {
Mat trans_mat = (Mat_<double>(2, 3) << 1, 0, x, 0, 1, y);
warpAffine(src, dst, trans_mat, src.size());
}
/**
* 旋转变换
* @param src 原图像
* @param dst 结果图像
* @param angle 旋转角度
* @param center 旋转中心
*/
void rotate(Mat& src, Mat& dst, double angle, Point center) {
Mat rot_mat = getRotationMatrix2D(center, angle, 1.0);
warpAffine(src, dst, rot_mat, src.size());
}
/**
* 缩放变换
* @param src 原图像
* @param dst 结果图像
* @param sx 水平方向缩放比例
* @param sy 垂直方向缩放比例
*/
void scale(Mat& src, Mat& dst, double sx, double sy) {
Mat scale_mat = (Mat_<double>(2, 3) << sx, 0, 0, 0, sy, 0);
warpAffine(src, dst, scale_mat, src.size());
}
/**
* 对称变换
* @param src 原图像
* @param dst 结果图像
* @param axis 对称轴(0表示水平轴,1表示垂直轴)
*/
void flip(Mat& src, Mat& dst, int axis) {
cv::flip(src, dst, axis);
}
int main() {
Mat src = imread("lena.jpg"); // 读取图像
if (src.empty()) {
std::cout << "Failed to load image!" << std::endl;
return -1;
}
Mat dst;
// 平移变换
translate(src, dst, 50, 50);
imshow("Translation", dst);
// 旋转变换
rotate(src, dst, 45, Point(src.cols / 2, src.rows / 2));
imshow("Rotation", dst);
// 缩放变换
scale(src, dst, 0.5, 0.5);
imshow("Scaling", dst);
// 对称变换
flip(src, dst, 0); // 水平对称
imshow("Flip_Horizontal", dst);
flip(src, dst, 1); // 垂直对称
imshow("Flip_Vertical", dst);
waitKey(0);
return 0;
}
```
注意:这里只是演示了基本的二维变换,实际应用中还需要考虑更多因素,比如边界处理、插值方法等。
阅读全文