目录
引言
在图像处理和计算机视觉领域,图像的翻转和旋转是两种常见的变换操作。这些操作不仅能够帮助我们调整图像的观察角度,还能实现镜像效果或进行数据增强。OpenCV是一个强大的计算机视觉库,提供了丰富的函数来实现这些变换。本文将详细解析OpenCV中用于图像翻转和旋转的函数,并给出具体的代码示例。
图像翻转
图像翻转是将图像在水平或垂直方向上进行反转。OpenCV中,图像翻转可以使用cv::flip()
函数来实现。该函数可以将图像在水平或垂直方向上进行翻转,或者同时进行水平和垂直翻转。
函数原型
void cv::flip(InputArray src, OutputArray dst, int flipCode)
src
: 输入图像,可以是单通道或多通道的图像。dst
: 输出图像,用于存储翻转后的结果。flipCode
: 翻转模式,指定了图像翻转的方向。0
: 沿x轴翻转(垂直翻转)。1
: 沿y轴翻转(水平翻转)。-1
: 同时沿x轴和y轴翻转(水平垂直翻转,等价于旋转180°)。
示例代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat msrc = imread("C:/Users/Administrator/Desktop/444.jpg");
if (msrc.empty())
{
cout << "读取图像失败!" << endl;
return -1;
}
imshow("原图像:", msrc);
Mat dstx, dsty, dstxy;
flip(msrc, dstxy, -1);
imshow("水平垂直翻转:", dstxy);
flip(msrc, dstx, 0);
imshow("垂直上下翻转:", dstx);
flip(msrc, dsty, 1);
imshow("水平左右翻转:", dsty);
waitKey(1000000000);
return 0;
}
图像旋转
图像旋转是指将图像围绕某一点(通常是图像的中心)按指定角度进行旋转。OpenCV中,图像旋转通常通过cv::getRotationMatrix2D()
函数生成旋转矩阵,然后使用cv::warpAffine()
函数应用该矩阵来实现。
函数原型
1. cv::getRotationMatrix2D
Mat cv::getRotationMatrix2D(Point2f center, double angle, double scale)
-
center
: 旋转中心点,指定旋转中心的坐标。 -
angle
: 旋转角度,表示以旋转中心为基准进行逆时针旋转的角度。正值表示逆时针旋转,负值表示顺时针旋转。 -
scale
: 缩放因子,表示对图像进行缩放的比例。默认值为1.0,表示不进行缩放。 -
cv::warpAffine
2. cv::warpAffine
void cv::warpAffine(InputArray src, OutputArray dst, InputArray M, Size dsize, int flags=INTER_LINEAR, int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())
src
: 输入图像。dst
: 输出图像。M
: 变换矩阵,由getRotationMatrix2D
生成。dsize
: 输出图像的大小。flags
: 插值方法,默认为线性插值(INTER_LINEAR
)。borderMode
: 边界填充模式,默认为常数边界填充(BORDER_CONSTANT
)。borderValue
: 边界填充的颜色,默认为黑色。
示例代码
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void ImageRotateFunc(cv::Mat& srcImage, cv::Mat& dstImage, cv::Point2f ctr, double aggle, double dscale)
{
// 函数功能: 专门用于计算
// 参数一:旋转矩阵中心
// 参数二:旋转角度
// 参数三:缩放比例
cv::Mat MC = cv::getRotationMatrix2D(ctr, aggle, dscale);
// 函数功能: 专用于仿射计算
cv::warpAffine(srcImage, dstImage, MC, Size(srcImage.cols, srcImage.rows));
}
int main(int argc, char* argv[])
{
cv::Mat msrc = imread("C:/Users/Administrator/Desktop/444.jpg");
cv::Mat dsrc;
imshow("原图像", msrc);
int iCol = msrc.cols;
int iRow = msrc.rows;
cv::Point2f pcenter(iCol / 2, iRow / 2);
double aggles = 45;
double dscales = 0.5;
ImageRotateFunc(msrc, dsrc, pcenter, aggles, dscales);
imshow("旋转45度并缩放0.5倍的图像", dsrc);
waitKey(0);
return 0;
}
总结
OpenCV提供了强大的图像翻转和旋转功能,通过简单的函数调用即可实现复杂的图像变换。这些功能在图像处理、计算机视觉和机器学习等领域具有广泛的应用前景。希望本文的解析和示例代码能够帮助读者更好地理解和应用这些技术。