OpenCV中二维点求取进行仿射和透视变换之后的坐标点方法
2015-09-14 18:23
519 查看
我使用的是OpenCV 2.2版本。得到了一个透视矩阵,想把屏幕上的一个二维点经过这个透视矩阵进行变换,本身很简单的一个事情,却颇费了一番周折。原因是刚接触OpenCV,而且使用了OpenCV新添加的C++部分的矩阵类Mat,使用起来还真有点不顺手,因为OpenCV中没有向量的说法。一个矩阵变换一个向量就让我找了半天。
最终得以解决,还是使用了CvMat类而不是Mat类。代码如下:
///透视变换
1 CvPoint transformPoint(const CvPoint pointToTransform, const CvMat* matrix)
2 {
3 double coordinates[3] = {pointToTransform.x, pointToTransform.y, 1};
4 CvMat originVector = cvMat(3, 1, CV_64F, coordinates);
5 CvMat transformedVector = cvMat(3, 1, CV_64F, coordinates);
6 cvMatMul(matrix, &originVector, &transformedVector);
7 CvPoint outputPoint = cvPoint((int)(cvmGet(&transformedVector, 0, 0) / cvmGet(&transformedVector, 2, 0)), (int)(cvmGet(&transformedVector, 1, 0) / cvmGet(&transformedVector, 2, 0)));
8 return outputPoint;
9 }
///仿射变换
//objectXY原坐标; temp转换后坐标; angle角度大小.
cv::Point2f calDeta(float angle, cv::Point2f pointXY, cv::Point2f objectXY)
{
cv::Point2f resultPoint, temp;
double radian = 3.1415926*(angle/180.0);
temp.x = objectXY.x*cos(radian) + objectXY.y*sin(radian) + (1-cos(radian))*pointXY.x - sin(radian)*pointXY.y;
temp.y = -objectXY.x*sin(radian) + objectXY.y*cos(radian) + sin(radian)*pointXY.x + (1-cos(radian))*pointXY.y;
return temp;
}
这个函数一个很有用的地方就在于,原本二维图上的一个像素点位于(x,y)处,经过一个变换(仿射变换、透视变换)之后,求取它的新的坐标点(x', y')。
最终得以解决,还是使用了CvMat类而不是Mat类。代码如下:
///透视变换
1 CvPoint transformPoint(const CvPoint pointToTransform, const CvMat* matrix)
2 {
3 double coordinates[3] = {pointToTransform.x, pointToTransform.y, 1};
4 CvMat originVector = cvMat(3, 1, CV_64F, coordinates);
5 CvMat transformedVector = cvMat(3, 1, CV_64F, coordinates);
6 cvMatMul(matrix, &originVector, &transformedVector);
7 CvPoint outputPoint = cvPoint((int)(cvmGet(&transformedVector, 0, 0) / cvmGet(&transformedVector, 2, 0)), (int)(cvmGet(&transformedVector, 1, 0) / cvmGet(&transformedVector, 2, 0)));
8 return outputPoint;
9 }
///仿射变换
//objectXY原坐标; temp转换后坐标; angle角度大小.
cv::Point2f calDeta(float angle, cv::Point2f pointXY, cv::Point2f objectXY)
{
cv::Point2f resultPoint, temp;
double radian = 3.1415926*(angle/180.0);
temp.x = objectXY.x*cos(radian) + objectXY.y*sin(radian) + (1-cos(radian))*pointXY.x - sin(radian)*pointXY.y;
temp.y = -objectXY.x*sin(radian) + objectXY.y*cos(radian) + sin(radian)*pointXY.x + (1-cos(radian))*pointXY.y;
return temp;
}
这个函数一个很有用的地方就在于,原本二维图上的一个像素点位于(x,y)处,经过一个变换(仿射变换、透视变换)之后,求取它的新的坐标点(x', y')。
相关文章推荐
- Linux下实用的JAVA内存泄露监控命令
- 应用 Valgrind 发现 Linux 程序的内存问题
- 如何在linux下检测内存泄漏
- Linux多线程编程
- Linux下的Socket编程
- 为bash添加内置命令(built-in)的方法
- linux常用的makefile模版编写
- linux下C程序printf没有立即输出的问题及我的Makefile文件
- Nginx服务安装配置
- 智能终端双处理器架构
- linux常用命令(27):tar命令
- Fast-cgi cgi nginx php-fpm 的关系
- Android开发时你遇到过什么相见恨晚的工具或网站?
- war包部署到Tomcat服务器
- Ubuntu使用SHA256检验iso镜像完整性的实例
- Citrix NetScaler铂金版外网使用Receiver登陆XenDesktop失败
- MTK android代码架构
- nutch2.3 hadoop2.6.0 hbase0.98.8 分布式爬虫NoClassDefFoundError: org/apache/hadoop/hbase/HBaseConfigurati
- 如何检测Linux系统已下载文件的完整性
- CentOS 6.3安装NodeJS环境