点云数据转换成图像数据

基于点坐标形成图像,就是先将点进行格网化,再对格网按照要求设置RGB,再进行可视化。

下面是对一点云进行可视化的案例:

#include <iostream> 
#include <opencv2/core/core.hpp> 
#include<opencv2/highgui/highgui.hpp> 
using namespace std;
#include<fstream>
#include"DataStruct.h"
#include<vector>
#include<sstream>
#include"arrayoperation.h"
int main()
{
	arrayoperation ArrExample;
	ifstream infile("XX.txt", ios::in);
	pcl::PointXYZ point;
	vector<pcl::PointXYZ> AllPoints, BuildingPoints;
	vector<double> XArr, YArr;
	int label;
	char line[128];
	while (infile.getline(line,sizeof(line)))
	{
		stringstream word(line);
		word >> point.x;
		word >> point.y;
		word >> point.z;
		word >> label;
		AllPoints.push_back(point);
		if (label == 6)
		{
			BuildingPoints.push_back(point);
		}
		XArr.push_back(point.x);
		YArr.push_back(point.y);
	}
	//进行格网化
	double Xmax, Xmin, Ymax, Ymin;
	double len = 1.0;
	Ymax = ArrExample.getMax_vector(YArr) + 2 * len;
	Ymin = ArrExample.getMin_vector(YArr) - 2 * len;
	Xmax = ArrExample.getMax_vector(XArr) + 2 * len;
	Xmin = ArrExample.getMin_vector(XArr) - 2 * len;
	int rows = ceil((Ymax - Ymin) / len);//行数
	int columns = ceil((Xmax - Xmin) / len);//列数
	//包含点的格网
	vector<pcl::PointXYZ> **GridAllpoints = new vector<pcl::PointXYZ>*[rows];
	for (int i = 0; i < rows; i++)
	{
		GridAllpoints[i] = new vector<pcl::PointXYZ>[columns];
	}
	//对于所有点
	for (int i = 0; i < AllPoints.size(); i++)
	{
		int rowID = ceil((AllPoints[i].y - Ymin) / len);
		int columnID = ceil((AllPoints[i].x - Xmin) / len);
		GridAllpoints[rowID][columnID].push_back(AllPoints[i]);
	}

	//对于建筑物
	//包含点的格网
	vector<pcl::PointXYZ> **GridBuildpoints = new vector<pcl::PointXYZ>*[rows];
	for (int i = 0; i < rows; i++)
	{
		GridBuildpoints[i] = new vector<pcl::PointXYZ>[columns];
	}
	//对于所有点
	for (int i = 0; i < BuildingPoints.size(); i++)
	{
		int rowID = ceil((BuildingPoints[i].y - Ymin) / len);
		int columnID = ceil((BuildingPoints[i].x - Xmin) / len);
		GridBuildpoints[rowID][columnID].push_back(BuildingPoints[i]);
	}

	cv::Mat img(rows, columns, CV_8UC3, cv::Scalar(255, 255, 255));
	cv::namedWindow("Test",1);     //创建一个名为Test窗口
	for (int i = 0; i < rows; i++)
	{
		for (int j = 0; j < columns; j++)
		{
			if (GridAllpoints[i][j].size()>0 && GridBuildpoints[i][j].size()>0)//有建筑物点的使用红色表示
			{
				img.ptr<uchar>(i)[j * 3] = 0;
				img.ptr<uchar>(i)[j * 3 + 1] = 0;
				img.ptr<uchar>(i)[j * 3 + 2] = 255;
			}
			else //用白色显示
			{
				img.ptr<uchar>(i)[j * 3] = 255;
				img.ptr<uchar>(i)[j * 3 + 1] = 255;
				img.ptr<uchar>(i)[j * 3 + 2] = 255;
			}	
		}
	}

	cv::Mat img_fliped;
	cv::flip(img, img_fliped, 0);//按照y轴堆成(图像和点云坐标的原点不一致导致)

	cv::imshow("Test", img_fliped);   //窗口中显示图像
	cv::waitKey(5000); //等待5000ms后窗口自动关闭
	getchar();



}

       

影像                                    点云

其中涉及到翻转和调整图片大小:

namedWindow("窗口名",1);//创建窗口,这句也可以不写,直接imshow是自动调整显示窗口大小,人工不能调;值为2时,可以鼠标调整

	void cv::flip(
		cv::InputArray src, // 输入图像
		cv::OutputArray dst, // 输出
		int flipCode = 0 // >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转
	);

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

点云实验室lab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值