vtk初始化代码学习1

本文详细介绍了如何在MFC应用中集成OpenCV和PCL库,实现3D扫描数据的可视化。通过设置窗口大小、句柄交互以及初始化PCLVisualizer,成功地将3D点云在MFC静态控件中展示。同时,涉及到窗口句柄的转换、VTK渲染窗口的大小调整以及交互器的配置,使得点云窗口能够适应MFC对话框的尺寸。
摘要由CSDN通过智能技术生成

//对话框的初始化函数OnInitDialog()

//http://www.manongjc.com/detail/25-owjledgivqlvees.html
CListBox* plistb; //标定的对话框的参数,指针
BOOL Cmy3DScanMFCDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码
	cv::namedWindow("1", cv::WINDOW_AUTOSIZE);//利用opencv创建一个窗口
	GetDlgItem(IDC_STATIC)->GetWindowRect(&rec1);//得到窗口的矩形大小
	cv::resizeWindow("1", rec1.Width(), rec1.Height());//将opencv的窗口设置和MFC创建的矩形同样的大小
	HWND hWnd = (HWND)cvGetWindowHandle("1");//将cv获取窗口的句柄,强制转换成MFC的句柄
	HWND hParent = ::GetParent(hWnd);//将子窗口的父窗口句柄捕获,赋值给hParent
	::SetParent(hWnd, GetDlgItem(IDC_STATIC)->m_hWnd);
	::ShowWindow(hParent, SW_HIDE);//隐藏父窗口


	//MyPointCloud mpc
	//创建一个PCL实例,并将点云的观察视觉复位
	mpc.viewer.reset(new pcl::visualization::PCLVisualizer("3D viewer", false));
	//点云复位
	mpc.cloud.reset(new pcl::PointCloud<pcl::PointXYZ>);
	设置背景颜色为黑色
	mpc.viewer->setBackgroundColor(0, 0, 0);
	//mpc.viewer->addCoordinateSystem(0.05f);
	//创建一个windows的窗口静态控件
	CStatic *pclStatic = new CStatic();
	LPRECT rect = new CRect;

	//PCL静态窗口
	pclStatic = (CStatic*)GetDlgItem(IDC_STATIC2);

	//点云的窗口vtkRenderWindow
	//renwin指针,指向viewer这个窗口
	mpc.renwin = mpc.viewer->getRenderWindow();
	//将renwin的父窗口ID,设置为MFC的pclStatic的ID。
	mpc.renwin->SetParentId(pclStatic->m_hWnd);
	//将VTK显示的一些信息,关闭
	刚开用Qt编写VTK程序里,总是弹出vtkOutputWindow窗口,
	//虽然对程序结果没有影响,但很让人不爽,尝
	//	试像VC中一样运用GlobalWarningDisplayOff()函数来关闭,
	//	仅能关闭一些信息,但不能关闭因Qt和VTK版本更新再来的一些用法警告。
	//	经过各种验证,需要关闭所有的警告,需要在用CMake配置VTK的安装sln时选择
	//	VTK_LEGACY_SILENT为on。如果你已经安装好,
	//	需要重新用CMake配置,并再安装一次。
	mpc.iren->GlobalWarningDisplayOff();
	//具体的使用流程:创建一个交互器iren
	//1.创建一个交互器vtkRenderWindowInteractor对象iren;
	//	2.给对象iren设定SetRenderWindow()需要交互的窗口;
	//	3.给对象iren指定SetInteractorStyle()特定的交互方式,如果没有指定,交互器会使用默认交互方式;
	//	4.对对象iren初始化Initialize,调用Start开始进行交互;
	//	————————————————
	//	版权声明:本文为CSDN博主「黑山老妖的博客」的原创文章,遵循CC 4.0 BY - SA版权协议,转载请附上原文出处链接及本声明。
	//	原文链接:https ://blog.csdn.net/liushao1031177/article/details/117585653
	mpc.iren = vtkRenderWindowInteractor::New();

	//该函数返回指定pclStatic窗口的边框矩形的大小,赋值给rect
	pclStatic->GetWindowRect(rect);
	//将控件pclStatic的矩形大小计算出来,设置点云的窗口大小等于pclstatic的大小
	mpc.renwin->SetSize(rect->right - rect->left, rect->bottom - rect->top);
	//将renwein窗口的位置,设置为00
	mpc.renwin->SetPosition(0, 0);

	//将交互器iren设定为点云的renwin
	mpc.iren->SetRenderWindow(mpc.renwin);


	mpc.viewer->createInteractor();
	mpc.iren->Render();
	mpc.renwin->Render();
	
	//dlp初始化,如何调用?????
	//将标定参数控件,指针到plistb
	plistb = ((CListBox*)GetDlgItem(IDC_LIST1));
	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值