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

相关文章

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

resultMap如何处理复杂映射问题

《resultMap如何处理复杂映射问题》:本文主要介绍resultMap如何处理复杂映射问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录resultMap复杂映射问题Ⅰ 多对一查询:学生——老师Ⅱ 一对多查询:老师——学生总结resultMap复杂映射问题

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI