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,就可以得到二维人脸区域分割结果,如已知

扫描二维码关注公众号,回复: 1588411 查看本文章

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

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

猜你喜欢

转载自blog.csdn.net/baidu_26408419/article/details/80678211