Opencv学习----图像处理-几何图像变换-cv::getAffineTransform(仿射变换)

Opencv 专栏收录该内容
34 篇文章 3 订阅

6.2.1 cv::getAffineTransform

6.2.1.1 仿射变换

(1)一个任意的仿射变换都能表示为乘以一个矩阵(线性变换)接着再加上一个向量(平移)。
所以,我们能够用仿射变换来表示:

  • 旋转(线性变换)
  • 平移(向量加)
  • 缩放操作(线性变换)

仿射变换代表的是两幅图之间的联系。
我们通常使用矩阵来表示仿射变换。

                                                                  

考虑到我们要使用矩阵对二维向量做变换, 所以也能表示为下列形式:

                                                               Or                 

                                               

(2)求仿射变换
       上文有提到过仿射变换基本表示的就是两幅图片之间的联系。关于这种联系的信息大致可从以下两种场景获得:
       我们已知 和T而且我们知道他们是有联系的。接下来我们的工作就是求出矩阵 
       我们已知 and T。要想求得 。我们只要应用算式即可。对于这种联系的信息可以用矩阵清晰的表达(即给出明确的2×3矩阵)或者也可以用两幅图片点之间几何关系来表达.
       因为矩阵联系着两幅图片,我们以其表示两图中各三点直接的联系为例。见下图:

                                                 

        点1,2和3(在图一中形成一个三角形)与图二中三个点一一映射, 仍然形成三角形,但形状已经大大改变。如果我们能通过这样两组三点求出仿射变换(你能选择自己喜欢的点), 接下来我们就能把仿射变换应用到图像中所有的点。

6.2.1.2 Opencv接口

Mat cv::getAffineTransform(const Point2f src[],
		const Point2f dst[] 
		)	
参数
src	源图像中三角形顶点的坐标。
dst	目标图像中相应三角形顶点的坐标。

从三对对应点计算仿射变换。
该函数计算2×3矩阵的仿射变换为:
                                                            

                                            

void ES::ImageProcessing::affineTransformOper(cv::Mat* dst)
{
	Mat src = imread("lena.jpg", IMREAD_COLOR);
	cv::resize(src, src, Size(src.rows / 4 * 3, src.cols / 4 * 3));
	ImageProcessingParams* img_params = static_cast<ImageProcessingParams*>(m_params);
	//源图像和目标图像上分别一一映射的三个点
	Point2f srcTri[3];
	Point2f dstTri[3];
	srcTri[0] = Point2f(0, 0);
	srcTri[1] = Point2f(src.cols - 1, 0);
	srcTri[2] = Point2f(0, src.rows - 1);
// 	dstTri[0] = Point2f(src.cols*0.0, src.rows*0.33);
// 	dstTri[1] = Point2f(src.cols*0.85, src.rows*0.25);
// 	dstTri[2] = Point2f(src.cols*0.15, src.rows*0.7);
	for (int index = 0; index < img_params->m_ptScales.size() / 2; ++index)
	{
		dstTri[index] = Point2f(img_params->m_ptScales[2 * index] * src.cols, 
			img_params->m_ptScales[2 * index + 1] * src.rows);
	}
	//通过这两组点, 使用getAffineTransform来求出仿射变换
	Mat warp_mat(2, 3, CV_32FC1);
	warp_mat = getAffineTransform(srcTri, dstTri);
	//求得的仿射变换应用到源图像
	Mat mat;
	warpAffine(src, mat, warp_mat, mat.size());
	//
	Mat mergeMat(src.rows, src.cols + mat.cols, src.type());
	Mat submat = mergeMat.colRange(0, src.cols);
	src.copyTo(submat);
	submat = mergeMat.colRange(src.cols, src.cols + mat.cols);
	mat.copyTo(submat);
	mergeMat.copyTo(*dst);
}

  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

charce_you

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值