opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移

本文详细介绍了如何在OpenCV中进行图像的仿射变换,包括旋转、缩放和平移,并讨论了旋转中心、缩放因子对图像的影响。重点在于如何计算变换后特征点的新坐标,特别是在使用最新OpenCV库时的函数应用。文中通过实例代码展示了计算过程,并探讨了如何根据变换确定新图像的合适大小。
摘要由CSDN通过智能技术生成

常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标。


仿射变换在:http://blog.csdn.net/xiaowei_cqu/article/details/7616044 这位大牛的博客中已经介绍的非常清楚。

关于仿射变换的详细介绍,请见上面链接的博客。

我这里主要介绍如何在已经知道原图像中若干特征点的坐标之后,计算这些特征点进行放射变换之后的坐标,然后做一些补充。


** 在原文中,很多功能函数都是使用的cvXXX,例如cv2DRotationMatrix( center, degree,1, &M);  这些都是老版本的函数,在opencv2以后,应该尽量的使用全新的函数,所以在我的代码中,都是使用的最新的函数,不再使用 cvMat, 而是全部使用 Mat 类型。 **


1. 特征点对应的新的坐标计算

假设已经有一个原图像中的特征点的坐标 CvPoint point;  那么计算这个point的对应的仿射变换之后在新的图像中的坐标位置,使用的方法如下函数:

// 获取指定像素点放射变换后的新的坐标位置
CvPoint getPointAffinedPos(const CvPoint &src, const CvPoint ¢er, double angle)
{
	CvPoint dst;
	int x = src.x - center.x;
	int y = src.y - center.y;

	dst.x = cvRound(x * cos(angle) + y * sin(angle) + center.x);
	dst.y = cvRound(-x * sin(angle) + y * cos(angle) + center.y);
	return dst;
}

要特别注意的是,在对一个原图像中的像素的坐标进行计算仿射变换之后的坐标的时候,一定要按照仿射变换的基本原理,将原来的坐标减去仿射变换的旋转中心的坐标,这样仿射变换之后得到的坐标再加上仿射变换旋转中心坐标才是原坐标在新的仿射变换之后的图像中的正确坐标。


下面给出计算对应瞳孔坐标旋转之后的坐标位置的示例代码:

// AffineTransformation.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "iostream"

#include "opencv2/opencv.hpp"

using namespace std;
using namespace cv;

// 获取指定像素点放射变换后的新的坐标位置
CvPoint getPointAffinedPos(const CvPoint &src, const CvPoint ¢er, double angle);
Mat ImageRotate(Mat & src, const CvPoint &_center, double angle);
Mat ImageRotate2NewSize(Mat& src, const CvPoint &_center, double angle);

int _tmain(int argc, _TCHAR* argv[])
{
	string image_path = "D:/lena.jpg";
	Mat img = imread(image_path);
	cvtColor(img, img, CV_BGR2GRAY);

	Mat src;
	img.copyTo(src);


	CvPoint Leye;
	Leye.x = 265;
	Leye.y = 265;
	CvPoint Reye;
	Reye.x = 328;
	Reye.y = 265;

	// draw pupil
	src.at<unsigned char>(Leye.y, Leye.x) = 255;
	src.at<unsigned char>(Reye.y, Reye.x) = 255;

	imshow("src", src);

	//
	CvPoint center;
	center.x = img.cols / 2;
	center.y = img.rows / 2;

	double angle = 15L;

	Mat dst = ImageRotate(img, center, angle);

	// 计算原特征点在旋转后图像中的对应的坐标
	CvPoint l2 = getPointAffinedPos(Leye, center, angle * CV_PI / 180);
	CvPoint r2 = getPointAffinedPos(Reye, center, angle * CV_PI / 180);

	// draw pupil
	dst.at<unsigned char>(l2.y, l2.x) = 255;
	dst.at<unsigned char>(r2.y, r2.x) = 255;

	//Mat dst = ImageRotate2NewSize(img, center, angle);
	imshow("dst", dst);


	waitKey(0);
	return 0;
}

Mat ImageRotate(Mat & src
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值