NFT链游系统开发模式丨NFT链游项目系统开发流程

简介: NFT链游系统开发模式丨NFT链游项目系统开发流程

  最后,利用之前写好的工具函数,实现一个VO:

  src/visualOdometry.cpp

复制代码
1 /*
2 > File Name: rgbd-slam-tutorial-gx/part V/src/visualOdometry.cpp
3 > Author: xiang gao
4 > Mail: gaoxiang12@mails.tsinghua.edu.cn
5 > Created Time: 2015年08月01日 星期六 15时35分42秒
6 **/
7
8 #include
9 #include
10 #include
11 using namespace std;
12
13 #include "slamBase.h"
14
15 // 给定index,读取一帧数据
16 FRAME readFrame( int index, ParameterReader& pd );
17 // 度量运动的大小
18 double normofTransform( cv::Mat rvec, cv::Mat tvec );
19
20 int main( int argc, char** argv )
21 {
22 ParameterReader pd;
23 int startIndex = atoi( pd.getData( "start_index" ).c_str() );
24 int endIndex = atoi( pd.getData( "end_index" ).c_str() );
25
26 // initialize
27 cout<<"Initializing ..."<<endl;
28 int currIndex = startIndex; // 当前索引为currIndex
29 FRAME lastFrame = readFrame( currIndex, pd ); // 上一帧数据
30 // 我们总是在比较currFrame和lastFrame
31 string detector = pd.getData( "detector" );
32 string descriptor = pd.getData( "descriptor" );
33 CAMERA_INTRINSIC_PARAMETERS camera = getDefaultCamera();
34 computeKeyPointsAndDesp( lastFrame, detector, descriptor );
35 PointCloud::Ptr cloud = image2PointCloud( lastFrame.rgb, lastFrame.depth, camera );
36
37 pcl::visualization::CloudViewer viewer("viewer");
38
39 // 是否显示点云
40 bool visualize = pd.getData("visualize_pointcloud")==string("yes");
41
42 int min_inliers = atoi( pd.getData("min_inliers").c_str() );
43 double max_norm = atof( pd.getData("max_norm").c_str() );
44
45 for ( currIndex=startIndex+1; currIndex<endIndex; currIndex++ )
46 {
47 cout<<"Reading files "<<currIndex<<endl;
48 FRAME currFrame = readFrame( currIndex,pd ); // 读取currFrame
49 computeKeyPointsAndDesp( currFrame, detector, descriptor );
50 // 比较currFrame 和 lastFrame
51 RESULT_OF_PNP result = estimateMotion( lastFrame, currFrame, camera );
52 if ( result.inliers < min_inliers ) //inliers不够,放弃该帧
53 continue;
54 // 计算运动范围是否太大
55 double norm = normofTransform(result.rvec, result.tvec);
56 cout<<"norm = "<<norm<<endl;
57 if ( norm >= max_norm )
58 continue;
59 Eigen::Isometry3d T = cvMat2Eigen( result.rvec, result.tvec );
60 cout<<"T="<<T.matrix()<<endl;
61
62 //cloud = joinPointCloud( cloud, currFrame, T.inverse(), camera );
63 cloud = joinPointCloud( cloud, currFrame, T, camera );
64
65 if ( visualize == true )
66 viewer.showCloud( cloud );
67
68 lastFrame = currFrame;
69 }
70
71 pcl::io::savePCDFile( "data/result.pcd", *cloud );
72 return 0;
73 }
74
75 FRAME readFrame( int index, ParameterReader& pd )
76 {
77 FRAME f;
78 string rgbDir = pd.getData("rgb_dir");
79 string depthDir = pd.getData("depth_dir");
80
81 string rgbExt = pd.getData("rgb_extension");
82 string depthExt = pd.getData("depth_extension");
83
84 stringstream ss;
85 ss<<rgbDir<<index<<rgbExt;
86 string filename;
87 ss>>filename;
88 f.rgb = cv::imread( filename );
89
90 ss.clear();
91 filename.clear();
92 ss<<depthDir<<index<<depthExt;
93 ss>>filename;
94
95 f.depth = cv::imread( filename, -1 );
96 return f;
97 }
98
99 double normofTransform( cv::Mat rvec, cv::Mat tvec )
100 {
101 return fabs(min(cv::norm(rvec), 2*M_PI-cv::norm(rvec)))+ fabs(cv::norm(tvec));
102 }
复制代码
  其实一个VO也就一百行的代码,相信大家很快就能读懂的。我们稍加解释。

FRAME readFrame( int index, ParameterReader& pd ) 是读取帧数据的函数。告诉它我要读第几帧的数据,它就会乖乖的把数据给找出来,返回一个FRAME结构体。
在得到匹配之后,我们判断了匹配是否成功,并把失败的数据丢弃。为什么这样做呢?因为之前的算法,对于任意两张图像都能做出一个结果。对于无关的图像,就明显是不对的。所以要去除匹配失败的情形。
如何检测匹配失败呢?我们采用了三个方法:
去掉goodmatch太少的帧,最少的goodmatch定义为:
min_good_match=10
去掉solvePnPRASNAC里,inlier较少的帧,同理定义为:
min_inliers=5
去掉求出来的变换矩阵太大的情况。因为假设运动是连贯的,两帧之间不会隔的太远:
max_norm=0.3

相关文章
|
8月前
|
存储 算法 安全
GameFi游戏NFT链游系统开发模式详情
区块链1.0和区块链2.0之间的主要区别是,如今区块链是可编程的
|
存储 人工智能 物联网
NFT链游系统开发(案例详解)丨元宇宙链游开发方案
NFT链游系统开发(案例详解)丨元宇宙链游开发方案
|
算法 区块链 数据库
链游开发NFT游戏开发方案指南
链游开发NFT游戏开发方案指南
|
安全 Go
链游系统开发案例详情/NFT元宇宙链游系统开发方案项目/成熟技术/源码逻辑
Step 1: Requirements analysis and planning. At this stage, the development team needs to have in-depth communication with clients, understand their needs and expectations, and then develop development plans and project plans.
|
Shell
OpenSea项目系统开发技术NFT元宇宙平台系统开发流程
OpenSea项目系统开发技术NFT元宇宙平台系统开发流程
153 0
|
区块链
链游开发丨3D链游系统开发(开发规则)丨DAPP链游系统开发(成熟及技术)丨源码
  区块链技术由此可以从多方面为企业赋能:提供可靠的共享数据,在各方之间建立信任;消除数据孤岛,即通过去中心化的,在一个网络中共享并支持获许可方访问的账本将数据集成到一个系统中;为数据赋予高度安全性
|
存储 JSON JavaScript
链游项目系统开发技术功能丨链游DAPP合约系统模式开发方案
链游项目系统开发技术功能丨链游DAPP合约系统模式开发方案
161 0
|
区块链 Windows
区块链链游项目系统开发技术功能丨链游NFT元宇宙系统开发技术方案
区块链链游项目系统开发技术功能丨链游NFT元宇宙系统开发技术方案
157 0
|
存储 区块链 vr&ar
NFT元宇宙链游开发设计逻辑丨NFT元宇宙链游开发源码示例
使用NFT元宇宙链游开发系统,开发者可以创建一个独特的数字世界,并添加功能丰富的故事情节、游戏规则、卡片、角色、本地角色和游戏工作室等内容。所有功能都是通过NFT代币来衡量的,例如卡中有效性的透明度;决赛前的分数将被隐藏并存储在NFT代币上。
|
存储 安全 调度
NFT链游项目系统开发技术方案丨NFT链游铸造定制开发技术
NFT链游项目系统开发技术方案丨NFT链游铸造定制开发技术
135 0

热门文章

最新文章