open3d实现交互式泊松重建

1、c++如何实现与键盘通信

参考https://www.runoob.com/w3cnote/c-get-keycode.html

1.1、Windows 系统下的 vs 中可以使用 _kbhit() 函数来获取键盘事件,使用时需要加入 conio.h 头文件,例:

#include <conio.h>
#include <iostream>
 
using namespace std;
 
int main()
{
    int ch;
    while (1){
        if (_kbhit()){//如果有按键按下,则_kbhit()函数返回真
            ch = _getch();//使用_getch()函数获取按下的键值
            cout << ch;
            if (ch == 27){ break; }//当按下ESC时循环,ESC键的键值时27.
        }
    }
    system("pause");
}

1.2、键盘 Key Code 对照表

字母和数字键的键码值(keyCode)
按键键码按键键码按键键码按键键码
A65J74S83149
B66K75T84250
C67L76U85351
D68M77V86452
E69N78W87553
F70O79X88654
G71P80Y89755
H72Q81Z90856
I73R82048957
数字键盘上的键的键码值(keyCode)功能键键码值(keyCode)
按键键码按键键码按键键码按键键码
0968104F1112F7118
1979105F2113F8119
298*106F3114F9120
399+107F4115F10121
4100Enter108F5116F11122
5101-109F6117F12123
6102.110
7103/111
控制键键码值(keyCode)
按键键码按键键码按键键码按键键码
BackSpace8Esc27Right Arrow39-_189
Tab9Spacebar32Dw Arrow40.>190
Clear12Page Up33Insert45/?191
Enter13Page Down34Delete46`~192
Shift16End35Num Lock144[{219
Control17Home36;:186/|220
Alt18Left Arrow37=+187]}221
Cape Lock20Up Arrow38,<188'"222
多媒体键码值(keyCode)
按键键码按键键码按键键码按键键码
音量加175
音量减174
停止179
静音173
浏览器172
邮件180
搜索170
收藏171

2、open3d的泊送重建

open3d的播送重建参考的官方实现,可以获取density属性,提供了裁剪的可能。
在这里插入图片描述

函数open3d:geometry::TriangleMesh::CreateFromPointCloudPoisson
接收带法向量的点云、八叉树深度等参数,返回mesh和densities数组。
参考使用方法:

auto mesh_with_density = open3d::geometry::TriangleMesh::CreateFromPointCloudPoisson(*cloudptr, 12, 0, 1, false, 16);
auto mesh = std::get<0>(mesh_with_density);
auto densities = std::get<1>(mesh_with_density);//density数组的下标就是对应顶点vertex的下标

如果要裁剪掉某一density范围的顶点及其对应的三角网格

mesh->RemoveVerticesByIndex(verticesToRemove);//verticesToRemove是要删除的顶点下标

3、open3d提供的键盘事件接口

参考http://www.open3d.org/docs/release/cpp_api/classopen3d_1_1visualization_1_1_visualizer_with_key_callback.html
在这里插入图片描述

如图所示,该类提供了接收键盘事的回调函数作为参数的成员函数。
这里实现两个成员函数用于接收键盘事件并裁剪mesh。

bool key_up_callback(open3d::visualization::Visualizer* visualizer)
{
	std::cout << "key_up_callback\n";
	open3d::geometry::TriangleMesh m;
	m += *mesh;
	auto mptr = std::make_shared<open3d::geometry::TriangleMesh>(m);
	remove_percent -= 0.05;
	getVerticesToRemove(min_density + remove_percent * delt, densities, verticesToRemove);
	mptr->RemoveVerticesByIndex(verticesToRemove);
	showmesh(*visualizer, mptr);
	return true;
}

bool key_down_callback(open3d::visualization::Visualizer* visualizer)
{
	std::cout << "key_down_callback\n";
	open3d::geometry::TriangleMesh m;
	m += *mesh;
	auto mptr = std::make_shared<open3d::geometry::TriangleMesh>(m);
	remove_percent += 0.05;
	getVerticesToRemove(min_density + remove_percent * delt, densities, verticesToRemove);
	mptr->RemoveVerticesByIndex(verticesToRemove);
	showmesh(*visualizer, mptr);
	return true;
}

注册

open3d::visualization::VisualizerWithKeyCallback visualizer;;
visualizer.CreateVisualizerWindow("使用A或D键,对mesh进行裁剪", 1500, 1000);
visualizer.RegisterKeyCallback(65, key_up_callback);
visualizer.RegisterKeyCallback(97, key_up_callback);
visualizer.RegisterKeyCallback(68, key_down_callback);
visualizer.RegisterKeyCallback(100, key_down_callback);

最终效果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值