基于点坐标形成图像,就是先将点进行格网化,再对格网按照要求设置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轴同时翻转
);