赞
踩
常常需要最图像进行仿射变换,仿射变换后,我们可能需要将原来图像中的特征点坐标进行重新计算,获得原来图像中例如眼睛瞳孔坐标的新的位置,用于在新得到图像中继续利用瞳孔位置坐标。
仿射变换在:http://blog.csdn.net/xiaowei_cqu/article/details/7616044 这位大牛的博客中已经介绍的非常清楚。
关于仿射变换的详细介绍,请见上面链接的博客。
我这里主要介绍如何在已经知道原图像中若干特征点的坐标之后,计算这些特征点进行放射变换之后的坐标,然后做一些补充。
** 在原文中,很多功能函数都是使用的cvXXX,例如cv2DRotationMatrix( center, degree,1, &M); 这些都是老版本的函数,在opencv2以后,应该尽量的使用全新的函数,所以在我的代码中,都是使用的最新的函数,不再使用 cvMat, 而是全部使用 Mat 类型。 **
假设已经有一个原图像中的特征点的坐标 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。