PCL 将三维点云数据转换为二维深度图像

运行代码时可能遇到的问题及解决方法:

1、问题:Error C2061 syntax error: identifier ‘_TCHAR’

解决方法: 添加头文件:#include <tchar.h> 

2、问题:Error LNK2019 unresolved external symbol __imp_ShowWindow referenced in function “protected: static int __cdecl vtkWin32OutputWindow::Initialize(void)” (?Initialize@vtkWin32OutputWindow@@KAHXZ) 

3、问题:Error LNK2019 unresolved external symbol __imp_SendMessageA referenced in function “protected: static void __cdecl vtkWin32OutputWindow::AddText(char const *)” (?AddText@vtkWin32OutputWindow@@KAXPEBD@Z)

4、问题:Error LNK2019 unresolved external symbol __imp_RegisterClassA referenced in function “protected: static int __cdecl vtkWin32OutputWindow::Initialize(void)” (?Initialize@vtkWin32OutputWindow@@KAHXZ)

5、问题:Error LNK2001 unresolved external symbol __imp_MessageBoxA

2-5解决方法:本来程序的编译选项选择的是:使用标准windows库,当改为在静态库中使用MFC后就出现了上面的错误。

代码中添加依赖库
#pragma comment(lib,”User32.lib”)

并将项目属性->General->Use of MFC改为Use Standard Windows Libraries.

《PCL 将三维点云数据转换为二维深度图像》

 

// CloudToDepth.cpp : Defines the entry point for the console application.
//

//#include "stdafx.h"
#pragma comment(lib,"User32.lib")
#include <tchar.h> 
#include <boost/thread/thread.hpp> 
#include <pcl\visualization\pcl_plotter.h>
#include <pcl/common/common_headers.h>
#include <pcl/range_image/range_image.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/png_io.h>

#include <pcl/io/obj_io.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/common/float_image_utils.h>
#include <pcl/point_types.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/statistical_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>
#include <pcl/common/common.h>
#include <pcl/io/io.h>
#include <pcl/console/parse.h>
#include <pcl/range_image/range_image_planar.h>

typedef pcl::PointXYZ PointType;
//void displayCloudImage(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &points);
//void setViewerPose(pcl::visualization::PCLVisualizer& viewer, const Eigen::Affine3f& viewer_pose);

//定义参数
float angular_resolution_x = 0.3f;
float angular_resolution_y = angular_resolution_x;
float angularResolution = (float)(1.0f * (M_PI / 180.0f));//角分辨率是1度,也就是说由相邻像素表示的光束相差一弧度
float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));
float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));//模拟的范围传感器有一个完整的360度全景图
Eigen::Affine3f sensorPose = (Eigen::Affine3f) Eigen::Translation3f(0.0f, 0.0f, 0.0f);//传感器的位置定义了虚拟传感器的6 DOF位置,它的原点是滚动=俯仰=偏航=0。
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;//x朝向右,y向下,z轴是向前的,另一种选择是激光框架,x面向前方,y向左,z向上。
float noiseLevel = 0.00;//对于噪声,噪声是0,范围图像是使用普通的z缓冲区创建的
float minRange = 0.0f;// minRange >0 ,所有更近的点都将被忽略
int borderSize = 0;//边界大小>0,边界将会在裁剪时留下一个未被观察到的点的边界。

int _tmain(int argc, _TCHAR* argv[])
{
	pcl::PointCloud<PointType>::Ptr point_cloud_ptr(new pcl::PointCloud<PointType>);
	pcl::PointCloud<PointType>& pointcloud = *point_cloud_ptr;
	if (pcl::io::loadPCDFile("knee_piece.pcd", pointcloud) == -1)
	{
		PCL_ERROR("Couldn't read PCD file \n");
		return (-1);
	}

	void setViewerPose(pcl::visualization::PCLVisualizer& viewer, const Eigen::Affine3f& viewer_pose);


	pcl::RangeImage rangeImage;
	// 	rangeImage.createFromPointCloud(pointcloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose,
	// 		coordinate_frame, noiseLevel, minRange, borderSize);
	rangeImage.createFromPointCloud(pointcloud, angular_resolution_x, angular_resolution_y,
		pcl::deg2rad(180.0f), pcl::deg2rad(180.0f),
		sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);
	float* ranges = rangeImage.getRangesArray();
	unsigned char* rgb_image = pcl::visualization::FloatImageUtils::getVisualImage(ranges, rangeImage.width, rangeImage.height);
	//pcl::io::saveRgbPNGFile("saveRangeImageRGB.png", rgb_image, rangeImage.width, rangeImage.height);
	pcl::io::saveRgbPNGFile("saveRangeImageRGB.png", rgb_image, 656, 399);

	void displayCloudImage(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &points);
	
	system("pause");
	return 0;
}

void displayCloudImage(const pcl::PointCloud<pcl::PointXYZ>::ConstPtr &points)
{
	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
	viewer->setBackgroundColor(1, 1, 1);
	pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ>image_color_handler(points, 0, 0, 0);
	viewer->addPointCloud(points, image_color_handler, "sample cloud");
	viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");
	viewer->addCoordinateSystem(1.0);
	viewer->initCameraParameters();
	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}
}

void setViewerPose(pcl::visualization::PCLVisualizer& viewer, const Eigen::Affine3f& viewer_pose)
{
	Eigen::Vector3f pos_vector = viewer_pose * Eigen::Vector3f(0, 0, 0);
	Eigen::Vector3f look_at_vector = viewer_pose.rotation() * Eigen::Vector3f(0, 0, 1) + pos_vector;
	Eigen::Vector3f up_vector = viewer_pose.rotation() * Eigen::Vector3f(0, -1, 0);
	viewer.setCameraPosition(pos_vector[0], pos_vector[1], pos_vector[2],
		look_at_vector[0], look_at_vector[1], look_at_vector[2],
		up_vector[0], up_vector[1], up_vector[2]);
}


参考博文:

1、CloudToDepth

2、error LNK2001: 无法解析的外部符号 __imp__MessageBoxA@16

 

    原文作者:钢铁男儿
    原文地址: https://blog.csdn.net/weixin_42291376/article/details/106207242
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞