pangolin-task3

本文详细解析了Pangolin库提供的SimpleMultiDisplay例子,涉及生成随机图像、颜色混合以及多窗口设置。文章还讨论了如何在计算机视觉中设置和使用多个观察相机,创建3D视窗和图像窗口,并阐述了相机激活与场景重建的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Task3

pangolin 提供的例子 SimpleMultiDisplay

#include <iostream>
#include <pangolin/pangolin.h>

void setImageData(unsigned char * imageArray, int size){
	for(int i = 0 ; i < size;i++) {
		imageArray[i] = (unsigned char)(rand()/(RAND_MAX/255.0));
	}
}

int main(/*int argc, char* argv[]*/)
{
	// Create OpenGL window in single line
	pangolin::CreateWindowAndBind("Main",640,480);

	// 3D Mouse handler requires depth testing to be enabled
	glEnable(GL_DEPTH_TEST); 

	// Issue specific OpenGl we might need
	glEnable (GL_BLEND);
	glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

	// Define Camera Render Object (for view / scene browsing)
	pangolin::OpenGlMatrix proj = pangolin::ProjectionMatrix(640,480,420,420,320,240,0.1,1000);

	pangolin::OpenGlRenderState s_cam(proj, pangolin::ModelViewLookAt(1,0.5,-2,0,0,0, pangolin::AxisY) );

	pangolin::OpenGlRenderState s_cam2(proj, pangolin::ModelViewLookAt(0,0,-2,0,0,0, pangolin::AxisY) );

	// Add named OpenGL viewport to window and provide 3D Handler
	pangolin::View& d_cam1 = pangolin::Display("cam1")
		.SetAspect(640.0f/480.0f)
		.SetHandler(new pangolin::Handler3D(s_cam));

	pangolin::View& d_cam2 = pangolin::Display("cam2")
		.SetAspect(640.0f/480.0f)
		.SetHandler(new pangolin::Handler3D(s_cam2));

	pangolin::View& d_cam3 = pangolin::Display("cam3")
		.SetAspect(640.0f/480.0f)
		.SetHandler(new pangolin::Handler3D(s_cam));

	pangolin::View& d_cam4 = pangolin::Display("cam4")
		.SetAspect(640.0f/480.0f)
		.SetHandler(new pangolin::Handler3D(s_cam2));

	pangolin::View& d_img1 = pangolin::Display("img1")
		.SetAspect(640.0f/480.0f);

	pangolin::View& d_img2 = pangolin::Display("img2")
		.SetAspect(640.0f/480.0f);

	// LayoutEqual is an EXPERIMENTAL feature - it requires that all sub-displays
	// share the same aspect ratio, placing them in a raster fasion in the
	// viewport so as to maximise display size.
	pangolin::Display("multi")
		.SetBounds(0.0, 1.0, 0.0, 1.0)
		.SetLayout(pangolin::LayoutEqual)
		.AddDisplay(d_cam1)
		.AddDisplay(d_img1)
		.AddDisplay(d_cam2)
		.AddDisplay(d_img2)
		.AddDisplay(d_cam3)
		.AddDisplay(d_cam4);

	const int width = 64;
	const int height = 48;
	unsigned char* imageArray = new unsigned char[3*width*height];

	pangolin::GlTexture imageTexture(width,height,GL_RGB,false,0,GL_RGB,GL_UNSIGNED_BYTE);

	// Default hooks for exiting (Esc) and fullscreen (tab).
	while( !pangolin::ShouldQuit() )
	{
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

		// Generate random image and place in texture memory for display
		setImageData(imageArray,3*width*height);
		imageTexture.Upload(imageArray,GL_RGB,GL_UNSIGNED_BYTE);

		glColor3f(1.0,1.0,1.0);

		d_cam1.Activate(s_cam);
		pangolin::glDrawColouredCube();

		d_cam2.Activate(s_cam2);
		pangolin::glDrawColouredCube();

		d_cam3.Activate(s_cam);
		pangolin::glDrawColouredCube();

		d_cam4.Activate(s_cam2);
		pangolin::glDrawColouredCube();

		d_img1.Activate();
		glColor4f(1.0f,1.0f,1.0f,1.0f);
		imageTexture.RenderToViewport();

		d_img2.Activate();
		glColor4f(1.0f,1.0f,1.0f,1.0f);
		imageTexture.RenderToViewport();

		// Swap frames and Process Events
		pangolin::FinishFrame();
	}

	delete[] imageArray;
	return 0;
}

代码解析

void setImageData(unsigned char * imageArray, int size){
	for(int i = 0 ; i < size;i++) {
		imageArray[i] = (unsigned char)(rand()/(RAND_MAX/255.0));
	}
}

//...

unsigned char* imageArray = new unsigned char[3*width*height];

//...

setImageData(imageArray,3*width*height);

//...

delete[] imageArray;

setImageData生成一个随机图像。new了一个字符数组,不使用后,必须记得清空内存。

glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

将传入的 RGBA 颜色值与颜色缓冲区中的值混合。混合常用来绘制透明或半透明的物体。见 https://blog.csdn.net/hudfang/article/details/46726465

glBlendFunc 回答如何混合的问题。

pangolin::OpenGlRenderState s_cam(proj, pangolin::ModelViewLookAt(1,0.5,-2,0,0,0, pangolin::AxisY) );

pangolin::OpenGlRenderState s_cam2(proj, pangolin::ModelViewLookAt(0,0,-2,0,0,0, pangolin::AxisY) );

定义了两个观察相机。

pangolin::View& d_cam1 = pangolin::Display("cam1")
	.SetAspect(640.0f/480.0f)
	.SetHandler(new pangolin::Handler3D(s_cam));

pangolin::View& d_cam2 = pangolin::Display("cam2")
	.SetAspect(640.0f/480.0f)
	.SetHandler(new pangolin::Handler3D(s_cam2));

pangolin::View& d_cam3 = pangolin::Display("cam3")
	.SetAspect(640.0f/480.0f)
	.SetHandler(new pangolin::Handler3D(s_cam));

pangolin::View& d_cam4 = pangolin::Display("cam4")
	.SetAspect(640.0f/480.0f)
	.SetHandler(new pangolin::Handler3D(s_cam2));

pangolin::View& d_img1 = pangolin::Display("img1")
	.SetAspect(640.0f/480.0f);

pangolin::View& d_img2 = pangolin::Display("img2")
	.SetAspect(640.0f/480.0f);
	
//...

d_cam1.Activate(s_cam);
d_cam2.Activate(s_cam2);
d_cam3.Activate(s_cam);
d_cam4.Activate(s_cam2);
d_img1.Activate();
d_img2.Activate();

创建多个视窗。d_cam1-4 是3D视窗,定义了独立的相机句柄。使用相机为窗口提供图像。图像窗口d_img1-2。

pangolin::Display("multi")
	.SetBounds(0.0, 1.0, 0.0, 1.0)
	.SetLayout(pangolin::LayoutEqual)
	.AddDisplay(d_cam1)
	.AddDisplay(d_img1)
	.AddDisplay(d_cam2)
	.AddDisplay(d_img2)
	.AddDisplay(d_cam3)
	.AddDisplay(d_cam4);

多窗口的参数设置顺序

  1. 在窗体中的位置大小(SetBounds)
  2. 如何布局(SetLayout)
  3. 有哪些窗口要添加进来(AddDisplay)
pangolin::GlTexture imageTexture(width,height,GL_RGB,false,0,GL_RGB,GL_UNSIGNED_BYTE);

//...

imageTexture.Upload(imageArray,GL_RGB,GL_UNSIGNED_BYTE);

opengl的图像类,加载方式。

glColor3f(1.0,1.0,1.0);

设置主窗体的背景。

d_cam1.Activate(s_cam);
pangolin::glDrawColouredCube();

d_cam2.Activate(s_cam2);
pangolin::glDrawColouredCube();

d_cam3.Activate(s_cam);
pangolin::glDrawColouredCube();

d_cam4.Activate(s_cam2);
pangolin::glDrawColouredCube();

d_img1.Activate();
glColor4f(1.0f,1.0f,1.0f,1.0f);
imageTexture.RenderToViewport();

d_img2.Activate();
glColor4f(1.0f,1.0f,1.0f,1.0f);
imageTexture.RenderToViewport();

图像窗口的背景设置,没什么意义,除非图像有透明效果。通过RenderToViewport渲染到当前窗口上去。

相机不能同时激活,当前相机激活时,前一个相机关闭,场景也没了。所以每次激活相机,都要重新布置一下场景。

要复现ORB-SLAM3的配置,你可以按照以下步骤进行操作: 1. 首先,你需要下载ORB-SLAM3的源代码。你可以从官方的GitHub仓库获取代码。 2. 在开始配置之前,你需要确保你的系统已经安装了所需的依赖项。这些依赖项包括C++11编译器、Pangolin、OpenCV和Eigen。你可以根据官方文档的指引安装这些依赖项。 3. 下载并编译源代码。在下载源代码后,执行build.sh脚本来进行编译。这个脚本将会处理编译过程中的依赖项和配置。你可以按照脚本的指引来完成编译过程。 4. 完成编译后,你可以通过运行测试脚本来验证你的配置是否成功。ORB-SLAM3提供了一些测试数据集,你可以使用这些数据集来测试你的系统。 通过按照这些步骤进行操作,你应该能够成功复现并配置ORB-SLAM3。请记得根据你的实际情况进行适当的调整和修改。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [ORB-SLAM3配置及安装教程(2023.3)](https://blog.csdn.net/shadowmimii/article/details/129472719)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [ORB_SLAM3复现——上篇](https://blog.csdn.net/CharmsLUO/article/details/125949694)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值