实习任务一(4):将三维点云转换成二维图像(修正后)

上一篇的三维转换成二维图像应该说是三维点云投影到二维平面上,点云投影并不能达到项目要求,我们需要转换完成的二维图像可以看到每个点的深度,即用灰度图颜色的深浅来表是原点云数据的深度程度。

利用pcl库读取pcd点云文件,并结合opencv,将在三维中表示深度的z经过一定的变换得到图像中每个像素点的灰度值。

代码如下:

#include<iostream>
#include<pcl/point_types.h>
#include<pcl/point_cloud.h>
#include<pcl/io/pcd_io.h>
#include<vector>
#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main()
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PCDReader r;
	r.read("C:\\Users\\asus\\Desktop\\激光扫描\\line.pcd", *cloud);
	int row = 1492; //行
	int col = 217; //列
	//创建行数为1492,列数为217,类型为CV_8UC3 的图像
	Mat Image = Mat(row, col, CV_8UC3);
	int k = 0;
	for (int i = 0; i < row; i++)
	{
		for (int j = 0; j < col; j++)
		{
			Image.at<cv::Vec3b>(i, j)[0] = (cloud->points[k].z / 12.13) * 255;
			Image.at<cv::Vec3b>(i, j)[1] = (cloud->points[k].z / 12.13) * 255;
			Image.at<cv::Vec3b>(i, j)[2] = (cloud->points[k].z / 12.13) * 255;
			k++;		
			cout << k << endl;
		}		
	}
	cout << cloud->points.size() << endl;
	namedWindow("Picture");
	imshow("Picture", Image);
	imwrite("C:\\Users\\asus\\Desktop\\激光扫描\\line.jpg", Image);
	cvWaitKey(0);
	return 0;
}

转换完成的图像:

 由图可以清楚的看清车头、车尾以及线缆的大体位置,与三维点云图可以对比一下:

得到二维图像,相比较处理三维点云,更加容易获取每个线缆的位置和尺寸。

虽然这些都是比较简单的处理操作,但是完成任务还是非常自豪的,学习带给我的满足感油然而生,继续加油!

猜你喜欢

转载自blog.csdn.net/qinlele1994/article/details/88952163