c++, open cv,图像旋转任意度数
时间: 2024-09-25 21:19:42 浏览: 47
在C++中,尤其是结合OpenCV库(Open Source Computer Vision Library),可以方便地处理图像并进行各种操作,包括图像旋转到任意角度。OpenCV提供了丰富的函数和矩阵操作支持,如`getRotationMatrix2D()` 和 `warpAffine()`。
`getRotationMatrix2D()` 函数用于创建一个二维旋转矩阵,该矩阵基于中心点、旋转角度和缩放因子。例如:
```cpp
cv::Point2f center; // 图像的中心点
double angle; // 旋转角度 (弧度)
double scale = 1.0; // 可选的缩放比例,默认为1
cv::Mat rotation_matrix = getRotationMatrix2D(center, angle, scale);
```
然后你可以使用 `warpAffine()` 函数将源图像应用这个旋转矩阵:
```cpp
cv::Mat src_image, rotated_image;
// ...加载或读取源图像
cv::warpAffine(src_image, rotated_image, rotation_matrix, src_image.size());
```
这里,`rotated_image` 就是原始图像按照指定角度旋转后的结果。
相关问题
c++, open cv,图像旋转任意度数,给出完整的代码和注释
在C++中,OpenCV库是一个强大的计算机视觉库,可以方便地处理图像和视频操作。如果你需要对图像进行旋转到任意角度,你可以利用OpenCV中的`getRotationMatrix2D()`函数生成旋转矩阵,然后结合`warpAffine()`函数实现旋转。以下是使用OpenCV进行图像旋转的完整示例代码:
```cpp
#include <opencv2/opencv.hpp> // 引入OpenCV头文件
#include <iostream>
cv::Mat rotateImage(const cv::Mat& src, double angle, int centerPt = {}, bool scale = true)
{
// 检查输入是否为空
if (src.empty())
throw std::runtime_error("Input image is empty");
// 获取图像宽度、高度
int rows = src.rows;
int cols = src.cols;
// 如果未提供中心点,则默认为中心点在原点
if (centerPt == {})
{
centerPt.x = cols / 2; // 行方向
centerPt.y = rows / 2; // 列方向
}
// 计算旋转矩阵
cv::Point2f center(centerPt);
double rad = angle * CV_PI / 180.0; // 将角度转换为弧度
cv::Mat rotMat = cv::getRotationMatrix2D(center, rad, scale);
// 创建一个新的与源图像大小相同的空矩阵
cv::Mat rotatedImage(rows, cols, src.type());
// 使用仿射变换将源图像旋转并复制到新矩阵
cv::warpAffine(src, rotatedImage, rotMat, rotatedImage.size(), cv::INTER_LINEAR + cv::WARP_INVERSE_MAP); // INTER_LINEAR用于插值
return rotatedImage;
}
int main()
{
try
{
// 加载图像
cv::Mat inputImage = cv::imread("path_to_your_image.jpg", cv::IMREAD_COLOR); // 替换为实际图片路径
// 设置旋转角度
double rotationAngle = 45.0; // 例如45度
// 进行旋转
cv::Mat rotatedImage = rotateImage(inputImage, rotationAngle);
// 显示原图和旋转后的图像
std::cout << "Original Image:\n";
cv::imshow("Original", inputImage);
std::cout << "Rotated Image (" << rotationAngle << " degrees):\n";
cv::imshow("Rotated", rotatedImage);
// 等待用户按键,然后关闭所有窗口
cv::waitKey(0);
cv::destroyAllWindows();
}
catch (const std::exception& e)
{
std::cerr << "Error: " << e.what() << std::endl;
}
return 0;
}
```
c++使用opencv使图像旋转任意角度
在C++中使用OpenCV库使图像旋转任意角度,可以通过以下步骤实现:
1. 计算旋转矩阵:使用`cv::getRotationMatrix2D`函数计算图像旋转指定角度后的旋转矩阵。这个函数需要三个参数:图像中心点坐标、旋转角度和缩放因子。
2. 应用旋转矩阵:使用`cv::warpAffine`函数应用上一步得到的旋转矩阵来旋转图像。`warpAffine`函数需要原图像、旋转矩阵以及输出图像的尺寸作为参数。
下面是一个示例代码:
```cpp
#include <opencv2/opencv.hpp>
int main() {
// 加载原始图像
cv::Mat src = cv::imread("path_to_image.jpg");
if (src.empty()) {
std::cerr << "Error loading image." << std::endl;
return -1;
}
// 图像中心点
cv::Point2f center(src.cols / 2.0F, src.rows / 2.0F);
// 旋转角度
double angle = 30.0; // 旋转30度
// 缩放因子,1.0表示不缩放
double scale = 1.0;
// 计算旋转矩阵
cv::Mat rot = cv::getRotationMatrix2D(center, angle, scale);
// 存储旋转后的图像
cv::Mat dst;
// 应用旋转矩阵
cv::warpAffine(src, dst, rot, src.size());
// 显示图像
cv::imshow("Rotated Image", dst);
// 等待按键
cv::waitKey(0);
return 0;
}
```
在这段代码中,首先包含了OpenCV的头文件,并在`main`函数中加载了图像。然后计算了旋转矩阵,并将其应用到原图上以获取旋转后的图像。最后显示了旋转后的图像。
阅读全文