matlab版本POSIT算法来计算三维以及二维人脸模型的映射透视投影矩阵

本文主要是介绍matlab版本POSIT算法来计算三维以及二维人脸模型的映射透视投影矩阵,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在已知4组及以上的二维三维对应点以后,就可以利用POSIT算法计算出三维以及二维模型的映射透视投影矩阵系数(也就是求得二维三维的映射矩阵),不废话,直接上代码以及效果截图:


①主代码MYposUSE.m:

POSIT函数estimatePose_MMedges不贴出来了,详细代码我在百度云提供免费下载链接:https://pan.baidu.com/s/1ok144mEzfHL1x1m8xGBACw 密码:qfm7

P3dALL=importdata('D:/du/2dsegment/personBAI/personBAI.xyz');% 输入:三维模型,53490个点的XYZ坐标

P3dALL=P3dALL';
P3d= reshape(P3dALL,160470,1);% 53490*3

A2d=importdata('D:/du/2dsegment/personBAI/3d2d-pairs-2d.txt');% 输入:二维模型对应点坐标
% A3d=importdata('D:/du/3d2d-pairs-3d.txt');
B2d=A2d';

Index=importdata('D:/du/2dsegment/3dIndex.txt');% 输入:三维模型对应点索引号(规则是从1开始计数)
[R,t,s]=estimatePose_MMedges( P3d,B2d,Index );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

tem1=R*P3dALL;
% tem2=tem1(:,1:2);  %tem2: N*2维数
tem2=tem1(1:2,:);  %tem2: 2*N维数
TT=zeros(2,53490);
for iii = 1:53490
    TT(:,iii)=t;  %TT: 2*53490维数
end 
RES0=tem2+TT;    %RES0: 2*53490维数
MYres=s*RES0;
MYres=MYres';     %MYres: 53490*2维数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%下面两种保存方式都可以(注释:dlmwrite保存小数点后n位)% 输出:保存53490个三维点都投影到二维图像的二维坐标:
dlmwrite('D:/du/2dsegment/personBAI/project2d.txt',MYres,'delimiter', '\t','precision','%6.5f') 

% save d:/du/project2d-person1.txt -ascii R 


②效果扩展,求出矩阵很有用。

例如,我输入一张人脸图片,并且利用三维重建技术求得3DMM三维模型,我们可以利用POSIT算法求得矩阵。

因为3DMM三维人脸模型的区域分割索引是知道的,利用project2d.txt,就可以得到二维人脸区域分割结果,如已知

(输入:彩色图,彩色图重建的3DMM模型,3DMM的三维分割文件,二维三维对应点文件)

就可以输出:project2d.txt,并利用它分割二维模型,得到:,利用一些轮廓检测算法,可以继续得到精细化轮廓。(扩展运用代码比较杂,就不贴了。可以按照以上思路写出,这重点在于POSIT算法,其他可以用opencv来写。)

这篇关于matlab版本POSIT算法来计算三维以及二维人脸模型的映射透视投影矩阵的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/185012

相关文章

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

IDEA如何切换数据库版本mysql5或mysql8

《IDEA如何切换数据库版本mysql5或mysql8》本文介绍了如何将IntelliJIDEA从MySQL5切换到MySQL8的详细步骤,包括下载MySQL8、安装、配置、停止旧服务、启动新服务以及... 目录问题描述解决方案第一步第二步第三步第四步第五步总结问题描述最近想开发一个新应用,想使用mysq

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

如何用Java结合经纬度位置计算目标点的日出日落时间详解

《如何用Java结合经纬度位置计算目标点的日出日落时间详解》这篇文章主详细讲解了如何基于目标点的经纬度计算日出日落时间,提供了在线API和Java库两种计算方法,并通过实际案例展示了其应用,需要的朋友... 目录前言一、应用示例1、天安门升旗时间2、湖南省日出日落信息二、Java日出日落计算1、在线API2