版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dashujua/article/details/82377390
简单示例代码:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
void on_Remapping(int, void*);
void on_Affine();
int g_mapType = 0;
int g_maxMapType = 3;
const char* mapTypeStr = "重映射操作";
Mat srcMap, dstMap;
Mat map_x, map_y;
int main()
{
srcMap = imread("cat.jpg");
imshow("原图", srcMap);
map_x.create(srcMap.size(), CV_32FC1);
map_y.create(srcMap.size(), CV_32FC1);
namedWindow("重映射效果图", WINDOW_AUTOSIZE);
createTrackbar(mapTypeStr, "重映射效果图", &g_mapType, g_maxMapType, on_Remapping);
on_Remapping(0, 0);
on_Affine();
waitKey(0);
return 0;
}
void on_Remapping(int, void*)
{
for (int i = 0; i < srcMap.rows; i++)
for (int j = 0; j < srcMap.cols; j++)
{
switch (g_mapType)
{
case 0:
{
map_x.at<float>(i, j) = float(j);
map_y.at<float>(i, j) = float(srcMap.rows - i);
break;
}
case 1:
{
map_x.at<float>(i, j) = float(srcMap.cols - j);
map_y.at<float>(i, j) = float(i);
break;
}
case 2:
{
map_x.at<float>(i, j) = float(srcMap.cols - j);
map_y.at<float>(i, j) = float(srcMap.rows - i);
break;
}
case 3:
{
if (i > (0.25 * srcMap.rows) && i< (0.75 * srcMap.rows) && j >(0.25 * srcMap.cols) && j < (0.75*srcMap.cols))
{
map_x.at<float>(i, j) = 2 * (j - 0.25f * srcMap.cols) + 0.5f;
map_y.at<float>(i, j) = 2 * (i - 0.25f * srcMap.rows) + 0.5f;
}
else {
map_x.at<float>(i, j) = 0;
map_y.at<float>(i, j) = 0;
}
break;
}
default:
break;
}
}
remap(srcMap, dstMap, map_x, map_y, INTER_LINEAR);
imshow("重映射效果图", dstMap);
}
void on_Affine()
{
Mat srcAffineImage, dstWarpImage, dstRotateImage;
//源图像和目标图像中对应的任意三个点
Point2f srcTriangle[3], dstTriangle[3];
//旋转矩阵
Mat rotMat(2, 3, CV_32FC1);
//仿射变换矩阵 【线性变换+平移向量】
Mat warpMat(2, 3, CV_32FC1);
srcAffineImage = imread("cat.jpg");
imshow("原图", srcAffineImage);
dstWarpImage = Mat::zeros(srcAffineImage.size(), srcAffineImage.type());
//自定义三对坐标点
srcTriangle[0] = Point2f(0, 0);
srcTriangle[1] = Point2f(static_cast<float>(srcAffineImage.cols - 1), 0);
srcTriangle[2] = Point2f(0, static_cast<float>(srcAffineImage.rows - 1));
dstTriangle[0] = Point2f(static_cast<float>(srcAffineImage.cols*0.05), static_cast<float>(srcAffineImage.rows*0.33));
dstTriangle[1] = Point2f(static_cast<float>(srcAffineImage.cols*0.65), static_cast<float>(srcAffineImage.rows*0.35));
dstTriangle[2] = Point2f(static_cast<float>(srcAffineImage.cols*0.15), static_cast<float>(srcAffineImage.rows*0.62));
//根据源图像和目标图像中对应的三个点,求出仿射变换矩阵
warpMat = getAffineTransform(srcTriangle, dstTriangle);
//仿射变换
warpAffine(srcAffineImage, dstWarpImage, warpMat, dstWarpImage.size());
//计算旋转矩阵
Point center = Point(dstWarpImage.cols / 2, dstWarpImage.rows / 2);
double angle = -30.0;
double scale = 0.8;
rotMat = getRotationMatrix2D(center, angle, scale);
//旋转经过放射后的矩阵
warpAffine(dstWarpImage, dstRotateImage, rotMat, dstRotateImage.size());
imshow("仿射变换后的图像", dstWarpImage);
imshow("又经过旋转的图像", dstRotateImage);
}
代码运行结果: