绕X 轴 Y轴 Z轴旋转的结果
void warp_perspect_3_angle(cv::Mat face, float roll, float yaw, float pitch) {
cv::Mat face_img = face.clone();
	int imgHeight = face_img.rows;
	int imgWidth = face_img.cols;
float alpha, beta, gamma;
	alpha = pitch * 3.1415926 / 180;
	beta = yaw* 3.1415926 / 180;
	gamma = roll * 3.1415926 / 180;
	Mat Rot = Mat::eye(3, 3, CV_32FC1);
Rot.at<float>(0, 0) = cos(beta) * cos(gamma);
	Rot.at<float>(0, 1) = cos(beta) * sin(gamma);
	Rot.at<float>(0, 2) = -sin(beta);
	Rot.at<float>(1, 0) = sin(alpha) * sin(beta) * cos(gamma) - cos(alpha) * sin(gamma);
	Rot.at<float>(1, 1) = sin(alpha) * sin(beta) * sin(gamma) + cos(alpha) * cos(gamma);
	Rot.at<float>(1, 2) = sin(alpha) * cos(beta);
	Rot.at<float>(2, 0) = cos(alpha) * sin(beta) * cos(gamma) + sin(alpha) * sin(gamma);
	Rot.at<float>(2, 1) = cos(alpha) * sin(beta) * sin(gamma) - sin(alpha) * cos(gamma);
	Rot.at<float>(2, 2) = cos(alpha) * cos(beta);
Mat invRot;
	invert(Rot, invRot, DECOMP_SVD);
float fx = imgWidth/2;
	float fy = imgHeight/2;
	float cx = imgWidth / 2;
	float cy = imgHeight / 2;
Mat point3D = Mat::zeros(3, 1, CV_32FC1);
	Mat oldPoint3D = Mat::zeros(3, 1, CV_32FC1);
Mat dstImg = face_img.clone();
	dstImg.setTo(0);
uchar* pImgData = (uchar*)face_img.data;
	uchar* pDstData = (uchar*)dstImg.data;
	for (int j = 0; j < imgHeight; j++)
	{
		for (int i = 0; i < imgWidth; i++)
		{
			float X = (i - cx) / fx;
			float Y = (j - cy) / fy;
			float Z = 1;
point3D.at<float>(0, 0) = X;
			point3D.at<float>(1, 0) = Y;
			point3D.at<float>(2, 0) = Z;
			//求旋转前坐标点
			oldPoint3D = invRot*point3D;
			float oldX = oldPoint3D.at<float>(0, 0);
			float oldY = oldPoint3D.at<float>(1, 0);
			float oldZ = oldPoint3D.at<float>(2, 0);
			//重投影到二维平面
			if (oldZ > 1e-3)
			{
				float u = ((fx*oldX + cx*oldZ) / oldZ);
				float v = ((fy*oldY + cy*oldZ) / oldZ);
int u0 = floor(u);
				int v0 = floor(v);
				int u1 = u0 + 1;
				int v1 = v0 + 1;
if (u0 >= 0 && v0 >= 0 && u1 < imgWidth && v1 < imgHeight)
				{
					float dx = u - u0;
					float dy = v - v0;
					float weight1 = (1 - dx)*(1 - dy);
					float weight2 = dx*(1 - dy);
					float weight3 = (1 - dx)*dy;
					float weight4 = dx*dy;
pDstData[j*imgWidth * 3 + i * 3 + 0] = weight1*pImgData[v0*imgWidth * 3 + u0 * 3 + 0] +
						weight2*pImgData[v0*imgWidth * 3 + u1 * 3 + 0] +
						weight3*pImgData[v1*imgWidth * 3 + u0 * 3 + 0] +
						weight4*pImgData[v1*imgWidth * 3 + u1 * 3 + 0];
pDstData[j*imgWidth * 3 + i * 3 + 1] = weight1*pImgData[v0*imgWidth * 3 + u0 * 3 + 1] +
						weight2*pImgData[v0*imgWidth * 3 + u1 * 3 + 1] +
						weight3*pImgData[v1*imgWidth * 3 + u0 * 3 + 1] +
						weight4*pImgData[v1*imgWidth * 3 + u1 * 3 + 1];
pDstData[j*imgWidth * 3 + i * 3 + 2] = weight1*pImgData[v0*imgWidth * 3 + u0 * 3 + 2] +
						weight2*pImgData[v0*imgWidth * 3 + u1 * 3 + 2] +
						weight3*pImgData[v1*imgWidth * 3 + u0 * 3 + 2] +
						weight4*pImgData[v1*imgWidth * 3 + u1 * 3 + 2];
				}
			}
		}
	}
	imshow("show", dstImg);
---------------------
绕X 轴 Y轴 Z轴旋转的结果的更多相关文章
- Android立体旋转动画实现与封装(支持以X、Y、Z三个轴为轴心旋转)
		
本文主要介绍Android立体旋转动画,或者3D旋转,下图是我自己实现的一个界面 立体旋转分为以下三种: 1. 以X轴为轴心旋转 2. 以Y轴为轴心旋转 3. 以Z轴为轴心旋转--这种等价于andro ...
 - PhoneGap 加速计 api 获取加速计 x 轴 y 轴 z 轴信息
		
一.PhoneGap 加速计 Accelerometer 对象介绍 1.主要方法 accelerometer.getCurrentAcceleration 获取当前设备在 x,y,z 轴上的加速度信息 ...
 - 传感器(3)传感器的X,Y,Z轴
		
设备正面水平向上. X轴 : 左右方向,向右是正值. Y轴 : 远近方向,远离你是负. Z轴 : 上下方向,向上是正值.
 - [osg][原]osg的坐标系:使用右手法则Y轴向前、X向、右Z向上。camare的默认姿态:向下看(Z轴负向),头向前(Y轴正向)
		
参考:http://blog.csdn.net/tmljs1988/article/details/7561887 图中上半边为opengl坐标系,下半边的osg坐标系: osg::Camare的默认 ...
 - OpenGL编程(七)3D模型的深度(z轴)检测
		
下图是我们要修改后的效果图: 一.深度检测 1.模型Z轴显示有问题: 上一次试验中,如果认真留意,会发现一个问题.当控制锥体在左右或上下旋转时,你会发现锥体看起来是在+-180度之间来回摆动,而不是3 ...
 - atlas z 轴
		
问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖在下面链接中 http://game.ceeger.com/forum/read.php?tid=8911#info NGU ...
 - (转)NGUI中深度depth和z轴关系
		
先列出转载链接: http://game.ceeger.com/forum/read.php?tid=8917 转载原文: 问题源自一个帖子,因为上传的图比较多,就另开了这个贴写下自己的试验结果,原帖 ...
 - 用MATLAB绘制折线图,x轴为字符串,并旋转一定的角度!!!
		
先上代码,然后再一行一行解释: x=1:37; %这一行其实一开始,写的时候是没有的,后来需要给X轴上规定几个刻度才加上的 plot(x,Y,'linewidth',2); %以x为自变量,y为因变量 ...
 - transform:translateZ()  字体模糊问题 父类重返Z轴平面
		
translateZ()变糊 第一种情况: 当translateZ(m)中的 m设置为 非整数,1.5px 之类的,字体会模糊,但是不明显;和浏览器渲染,字体格式,或者操作系统有关, 这个 css中 ...
 
随机推荐
- JSP_01
			
1.定义局部变量.输出语句 <!doctype html> <html> <head> <title>定义局部变量.输出语句</title> ...
 - 单击EasyUI的datagrid行时不选中
			
单击EasyUI的datagrid行时不选中,行背景色不变,点击选择框checkbox时选中该行 核心代码: $("#msgList").datagrid({ url ...
 - Jenkins搭建,节点配置
			
一.服务器安装jdk和Jenkins 二.安装完成后打开jenkins页面:http://localhost:8080,设置管理员密码后登陆进去. 三.系统管理->全局变量,勾选允许用户注册 ...
 - Java稀疏数组
			
一.概述 1.概念 2.处理方法 3.示例 原数组如下: 转换为稀疏数组如下: 二.代码 1.主方法 @Testpublic void SparseTest() { // 创建一个原始的二维数组 11 ...
 - Codeforces Round #529 (Div. 3)   E. Almost Regular Bracket Sequence (思维)
			
Codeforces Round #529 (Div. 3) 题目传送门 题意: 给你由左右括号组成的字符串,问你有多少处括号翻转过来是合法的序列 思路: 这么考虑: 如果是左括号 1)整个序列左括号 ...
 - 如何做PPT
			
如何做出更漂亮的PPT? 1.文字对齐,PPT字体最好使用微软雅黑,文档最好使用宋体 2.总分总的叙述形式 3.颜色最好使用冷色系,蓝色.灰色.灰蓝色等等 4.每段话中的重点内容标出特殊颜色 5.可使 ...
 - 使用定时器实现在console中打印内容
			
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
 - JSON对象与JavaScript对象的区别
			
//js对象的字面量表示法: var people1={ name:'hehe', age:18 }; //json的格式是: var people1={ "name":'hehe ...
 - XML处理指令
			
“处理指令(PIs)允许文档包含用于应用程序的指令.指令并不是文档字符数据的一部分,但是必须通过应用程序传递”. 处理指令可以用于将信息传递给应用程序.处理指令可以出现在文档任意位置的标记外部.可以出 ...
 - JavaScript 中JSON
			
JSON是JavaScript Object Notation的缩写,它是一种数据交换格式. 在JSON出现之前,大家一直用XML来传递数据.因为XML是一种纯文本格式,所以它适合在网络上交换数据.X ...