基於點座標的圖像

基於點座標形成圖像,就是先將點進行格網化,再對格網按照要求設置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軸同時翻轉
	);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章