pcl+opencv,将pcd点云投影为图片

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <opencv2/opencv.hpp>


int
main(int argc, char** argv)
{


	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

	if (pcl::io::loadPCDFile<pcl::PointXYZ>("test.pcd", *cloud) == -1)//*打开点云文件
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd\n");
		return(-1);
	}


	int num = cloud->points.size();

	cv::Mat img(1000, 1000, CV_8UC1, cv::Scalar(0, 0, 0));
	

	std::cout << "Loaded "
		<< cloud->width * cloud->height
		<< " data points from test_pcd.pcd with the following fields: "
		<< std::endl;
	//for (size_t i = 0; i < 5; ++i)
	//	std::cout << "    " << cloud->points[i].x
	//	<< " " << cloud->points[i].y
	//	<< " " << cloud->points[i].z << std::endl;

    for (int i = 0; i < num; i++)
    {

		if (cloud->points[i].x < -9 || cloud->points[i].x >= 9) //不在图片范围内的点去掉
		{
			continue;
		}
		if (cloud->points[i].y < -2 || cloud->points[i].y >= 2) //不在图片范围内的点去掉
		{
			continue;
		}
		if (cloud->points[i].z < -1 || cloud->points[i].z >= 5) //不在图片范围内的点去掉
		{
			continue;
		}

        int x = std::round((cloud->points[i].x - (-10)) * 50);

		// int y = std::round((cloud->points[i].y - (-3)) * 50);

		int z = std::round((cloud->points[i].z - (-2)) * 50);	
		img.at<uchar>(z,x) = 255;
		//(row, col)


    }
	while (1) {
		cv::imshow("pcd", img);
		cv::waitKey(10);
	}

	return(0);
}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
下面是一个简单的示例,演示如何使用PCL库将两个pcd点云文件合并成一个: ```c++ #include <iostream> #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/voxel_grid.h> #include <pcl/filters/passthrough.h> #include <pcl/visualization/pcl_visualizer.h> int main(int argc, char** argv) { // 读取第一个点云文件 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud1(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("cloud1.pcd", *cloud1) == -1) { PCL_ERROR("Couldn't read file cloud1.pcd\n"); return (-1); } // 读取第二个点云文件 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("cloud2.pcd", *cloud2) == -1) { PCL_ERROR("Couldn't read file cloud2.pcd\n"); return (-1); } // 创建一个新点云,将两个点云合并到一起 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_combined(new pcl::PointCloud<pcl::PointXYZ>); *cloud_combined = *cloud1 + *cloud2; // 可视化结果 pcl::visualization::PCLVisualizer viewer("Point Cloud Viewer"); viewer.setBackgroundColor(0, 0, 0); viewer.addPointCloud<pcl::PointXYZ>(cloud_combined, "cloud"); viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "cloud"); viewer.addCoordinateSystem(1.0); viewer.initCameraParameters(); while (!viewer.wasStopped()) { viewer.spinOnce(); } return 0; } ``` 以上代码会将两个pcd点云文件`cloud1.pcd`和`cloud2.pcd`合并成一个新的点云,并可视化结果。注意,这只是一个简单的示例,实际使用中可能需要根据具体需求进行修改。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值