上一篇的三维转换成二维图像应该说是三维点云投影到二维平面上,点云投影并不能达到项目要求,我们需要转换完成的二维图像可以看到每个点的深度,即用灰度图颜色的深浅来表是原点云数据的深度程度。
利用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;
}
转换完成的图像:
由图可以清楚的看清车头、车尾以及线缆的大体位置,与三维点云图可以对比一下:
得到二维图像,相比较处理三维点云,更加容易获取每个线缆的位置和尺寸。
虽然这些都是比较简单的处理操作,但是完成任务还是非常自豪的,学习带给我的满足感油然而生,继续加油!