图像翻转
在OpenCV中,图像翻转可以使用cv::flip()函数来实现。cv::flip()函数可以将图像在水平或垂直方向进行翻转操作。
flip( )
void cv::flip
cv::InputArray src, // 输入图像,可以是单通道或多通道的图像。
cv::OutputArray dst, // 输出图像,用于存储翻转后的结果。
int flipCode // 翻转方式
);
flipCode:翻转方式,指定了图像翻转的方向。可以选择以下三种方式:
- 0:沿x轴翻转(垂直翻转)。
- 1:沿y轴翻转(水平翻转)。
- -1:同时沿x轴和y轴翻转(水平垂直翻转)
#include <opencv2/opencv.hpp>
int main() {
// 读取图像
cv::Mat image = cv::imread("image.jpg");
if (image.empty()) {
std::cout << "无法读取图像文件!" << std::endl;
return -1;
}
// 在水平方向翻转图像
cv::Mat flippedImage;
cv::flip(image, flippedImage, 1);
// 显示原始图像和翻转后的图像
cv::imshow("Original Image", image);
cv::imshow("Flipped Image", flippedImage);
cv::waitKey(0);
return 0;
}
图像旋转
warpAffine( )
用于执行二维仿射变换的函数,它的作用是将输入图像按照指定的仿射变换矩阵进行变换,并输出变换后的图像。
void cv::warpAffine(
cv::InputArray src, // 输入图像
cv::OutputArray dst, // 输出图像
cv::InputArray M, // 变换矩阵
cv::Size dsize, // 输出图像的大小
int flags = cv::INTER_LINEAR, // 插值方法,默认为线性插值
int borderMode = cv::BORDER_CONSTANT, // 边界填充模式,默认为常数边界填充
const cv::Scalar& borderValue = cv::Scalar() // 常数边界填充的颜色,默认为黑色
);
cv::getRotationMatrix2D()
getRotationMatrix2D是OpenCV中用于生成二维旋转变换矩阵的函数
cv::Mat cv::getRotationMatrix2D(
cv::Point2f center, // 旋转中心点
double angle, // 旋转角度(逆时针为正)
double scale // 缩放因子
);
cv::getRotationMatrix2D()函数的参数有以下几个:
- center:旋转中心点,指定旋转中心的坐标。可以使用cv::Point2f结构或cv::Point结构指定。
- angle:旋转角度,表示以旋转中心为基准进行逆时针旋转的角度。正值表示逆时针旋转,负值表示顺时针旋转。
- scale:缩放因子,表示对图像进行缩放的比例。默认值为1.0,表示不进行缩放。
这个函数返回一个2x3的仿射变换矩阵,可以用于后续的图像变换操作。通过调整center、angle和scale参数,可以生成不同的旋转变换矩阵,实现图像的旋转和缩放效果。
在图像处理和计算机视觉应用中,getRotationMatrix2D函数通常与warpAffine函数结合使用,用于对图像进行旋转、缩放等操作。
代码示例:
// 使用cv::getRotationMatrix2D()函数和cv::warpAffine()函数配合进行旋转
cv::Mat srcImage = cv::imread("image.jpg");
double angle = 45.0; // 旋转角度,单位为度
cv::Point2f center(srcImage.cols / 2.0, srcImage.rows / 2.0); // 旋转中心
cv::Mat rotMat = cv::getRotationMatrix2D(center, angle, 1.0); // 旋转矩阵
cv::Mat dstImage;
cv::warpAffine(srcImage, dstImage, rotMat, srcImage.size());
图像混合
addWeighted 是 OpenCV 中用于图像混合的函数之一。
这个函数可以用于将两个图像按照一定的权重进行线性组合,生成一个新的图像。
通常情况下,这个函数可以用于图像融合、图像叠加等操作。
基本语法:
void cv::addWeighted(InputArray src1, //第一个输入数组,即第一个图像。
double alpha, InputArray src2, //第二个输入数组,即第二个图像。
double beta, //第二个输入数组的权重
double gamma, //标量值,用于将加权和截断到特定范围内。通常情况下为0。
OutputArray dst, //输出数组,用于存储结果图像。
int dtype = -1 //输出数组的数据类型,默认为-1表示与输入数组相同。
);
代码示例:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
Mat image1 = imread("image1.jpg");
Mat image2 = imread("image2.jpg");
double alpha = 0.5; // 第一个输入图像的权重
double beta = 0.5; // 第二个输入图像的权重
Mat blendedImage;
addWeighted(image1, alpha, image2, beta, 0.0, blendedImage);
imshow("Blended Image", blendedImage);
waitKey(0);
return 0;
}