OpenCV学习之路(十六) 重映射与仿射

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);


}

代码运行结果:

猜你喜欢

转载自blog.csdn.net/dashujua/article/details/82377390
今日推荐