基于RealSense的点云处理软件开发(点云显示部分)

年前事情总是一件接一件,老板前天晚上吃散伙饭的时候问过我自动标定的事情之后就又要我用RealSenseD435做一下点云拼接,跟我说了一下思路就要开始赶紧做,昨天上午就在玩UE4没做,中午吃完饭看到他有点慌,怕他啥时候突击检查,所以说花了一下午时间先把软件的显示部分做好,今天早上还没起床就又听到外面有人拖着行李箱走了,心里贼不爽,上午还是写篇博客放松放松吧,顺便把点云显示部分记录分享一下,闲话不多说,那么我们就直接进入主题,先分享思路,再细说内容,代码我也没有优化,基本上很杂很乱,但是实现效果还可以吧,准备今天下午或者放假回去了优化优化代码。

首先,硬件方面我用的是Intel的RealSenseD435这款相机,软件的方面的话我用的是MFC,之后如果有时间我还想做一款QT版本的,因为感觉MFC真的是使用手感没有QT舒服,我软件目前显示部分的话就是用的OpenGL来显示,关于MFC的基于对话框的程序中,是没有直接的OpenGL的控件,我看网上大多数都是使用的基于文档形式来嵌入OpenGL的,我也按照网上前辈们的方法做了,但是感觉用起来还是没有基于对话框版本的方便(可能目前我的意识还比较菜吧,哈哈),关于使用OpenGL嵌入MFC,此处可能我理解有些错误,欢迎大佬指教,就我看来可能就是将OpenGL的绘制跟pictureBox控件连接到一起,也就是将OpenGL的句柄与pictureBox控件的句柄联系到一起,

我们可以看到,上面是作为pictureBox控件的句柄变量,下面就是OpenGL渲染时候的设备上下文句柄,然后就是要将这两个句柄之间以正确的关系联系在一起,先上图,

此处做法就是先获取pictureBox控件的句柄,前两句就是获取到了控件句柄,然后下面两个if中间的SetWindowPixelFormat(hrenderDC)函数就是设置OpenGL跟控件相连之后的格式,其中该函数的内容我贴在下面

BOOL COpenGLPictureDlg::SetWindowPixelFormat(HDC hDC)
{
	PIXELFORMATDESCRIPTOR pixelDesc;
	pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);
	pixelDesc.nVersion = 1;
	pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | 
		PFD_SUPPORT_OPENGL |
		PFD_DOUBLEBUFFER |
		PFD_TYPE_RGBA;
	pixelDesc.iPixelType = PFD_TYPE_RGBA;
	pixelDesc.cColorBits = 32;
	pixelDesc.cRedBits = 0;
	pixelDesc.cRedShift = 0;
	pixelDesc.cGreenBits = 0;
	pixelDesc.cGreenShift = 0;
	pixelDesc.cBlueBits = 0;
	pixelDesc.cBlueShift = 0;
	pixelDesc.cAlphaBits = 0;
	pixelDesc.cAlphaShift = 0;
	pixelDesc.cAccumBits = 0;
	pixelDesc.cAccumRedBits = 0;
	pixelDesc.cAccumGreenBits = 0;
	pixelDesc.cAccumBlueBits = 0;
	pixelDesc.cAccumAlphaBits = 0;
	pixelDesc.cDepthBits = 0;
	pixelDesc.cStencilBits = 1;
	pixelDesc.cAuxBuffers = 0;
	pixelDesc.iLayerType = PFD_MAIN_PLANE;
	pixelDesc.bReserved = 0;
	pixelDesc.dwLayerMask = 0;
	pixelDesc.dwVisibleMask = 0;
	pixelDesc.dwDamageMask = 0;
	PixelFormat = ChoosePixelFormat(hDC,&pixelDesc);
	if(PixelFormat==0) // Choose default
	{
		PixelFormat = 1;
		if(DescribePixelFormat(hDC,PixelFormat,
			sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)
		{
			return FALSE;
		}
	}
	if(SetPixelFormat(hDC,PixelFormat,&pixelDesc)==FALSE)
	{ 
		return FALSE;
	}
	return TRUE;
}

大家可以看到这个设置函数其实就是用的一个像素格式描述表,这个表功能作用大概就是要你先把等下要使用OpenGL的绘制模式给表述清楚,例如要使用单缓冲还是双缓冲模式,像代码片段中的第四个变量赋值就是规定的模式,就是规定了双缓冲模式,绘制类型就是典型的RGBA模式,支持OpenGL绘制,然后下面赋值部分其实大多数根据变量命名就能知道是什么意思,我这里也就不一一赘述了,这里设置完格式之后我们就要使用CreateViewGLContext(hrenderDC)来将OpenGL与pictureBox连接到一起了,

BOOL COpenGLPictureDlg::CreateViewGLContext(HDC hDC)
{
	hrenderRC = wglCreateContext(hDC);

	if(hrenderRC==NULL)
		return FALSE;

	if(wglMakeCurrent(hDC,hrenderRC)==FALSE)
		return FALSE;

	return TRUE;
}

我们可以看到这个函数内容很少,就是使用wglCreateContext函数将hrenderRC和传进来的句柄参数连接到一起,它的作用是创建一个新的OpenGL渲染描述表,并且绘制到参数句柄对应的设备上去,然后wglMakeCurrent(hDC,hrenderRC)这个函数作用就是使OpenGL渲染时候绘制到对应的设备上,所有后续的OpenGL调用线程都要在这个设备 HDC上绘制 ,当然后续如果想更改,或者使用多线程绘制时候,这个函数就要起很大作用,主线程和分线程之间可能就需要使用这个函数来进行不同的绘制功能了,这些都是题外话,我就不多说了,有兴趣的朋友大佬可以一起交流交流,我也是个小白,至此其实就已经完成了OpenGL绑定到pictureBox控件上了,根据上面我贴出来的部分,后面也就是OpenGL的基本配置了,像视角,观察位置,近远距离,方向,投影模式等等这些就也不多说什么,只是说一下glulookat和gluperspective,一个是调整观察角度,一个是调整视角和物体显示比例以及最近可观察点和最远可观察点,这两个函数初始化配置OpenGL的时候非常需要注意。

至此其实就已经做完了显示部分,但是这种初级显示如果真的用起来就太不舒服了,因为初期可能还需要微调一下位置和旋转角度,所以说我就又加进去了鼠标滚轮可以平移和缩放功能,这个其实就非常简单了,直接在类向导里面找到对应的消息WM_MOUSEWHEEL就能生成对应的滚轮函数,里面函数内容的话就是

这个红色框框部分也就是主体内容,其中m_Scale就是初始化绘制时候缩放的一个变量,也就是glScalef这个函数要用到的,然后像平移和旋转的思路就是在初始化绘制的时候将glTranslatef和glRotatef对应的参数做成一个可变变量,然后使用对应消息响应函数就能轻松实现旋转平移以及缩放功能了,大体上到这基本上就已经完成了所有显示需要做的部分,接下来就是采集点云然后绘制就完事了,先给大家贴一个带颜色的点云显示效果图,

这里主要是我进行了一个简单的点云下采样,效果好像不太好,后续还需要进行进一步的修改,关于RealSenseD435的点云采集部分的话我是使用的网上一个大佬封装过的一个类,他的类的将原来RealsenseD435对应的SDK的功能封装的相当方便了,像深度对齐颜色和颜色对齐深度这两个直接调用他的函数就行了,当然还是建议弄懂一下这些具体实现要好一点,还有就是根据采集的彩色图上的点找到对应的三维坐标这个他的类也做好了,不得不说,大佬还是大佬,我还是只是一个代码搬运工,点云采集部分的话其实很简单就是分别采集点以及对应的颜色数据,感觉也不用赘述太多,可能就是深度对齐颜色和颜色对齐深度这部分有些许门道,这个我后续会对这个部分再写一篇博客记录一下的,那么今天点云显示部分就先说到这,资源后续我会上传到我的csdn上,有兴趣评阅的朋友可以下载看看。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值