Segunda semana de estudio (5.15-6.4)

 El primer día, lunes a las 5:15, csv a pcd mat a tif Enlace privado de Chrome

Hoy principalmente leí un artículo y entendí profundamente el concepto de fusión de datos de múltiples fuentes, aprendí las respuestas a varias preguntas relacionadas y la conversión mutua entre el formato mat y el formato tif:

1. Convertir csv a pcd

Nota: El archivo csv debe tener tres columnas, que representan las coordenadas de x, y y z respectivamente, y no puede tener encabezado, el código es el siguiente:

#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <boost/thread/thread.hpp>

using namespace std;

#pragma region //csv转为pcd
// 删除字符串中空格,制表符tab等无效字符
string Trim(string& str)
{
	//str.find_first_not_of(" \t\r\n"),在字符串str中从索引0开始,返回首次不匹配"\t\r\n"的位置
	str.erase(0, str.find_first_not_of(" \t\r\n"));
	str.erase(str.find_last_not_of(" \t\r\n") + 1);
	return str;
}

void csv2pcd(std::string filename, pcl::PointCloud<pcl::PointXYZ>::Ptr& cloud)
{
	ifstream fin(filename);      //打开文件流操作
	string line;
	while (getline(fin, line))   //整行读取,换行符“\n”区分,遇到文件尾标志eof终止读取
	{
		istringstream iss(line); // 创建输入string流对象,保存line的一个副本
		vector<string> fields;   // 声明一个字符串向量
		string field;
		while (getline(iss, field, ',')) //将字符串流iss中的字符读入到field字符串中,以逗号为分隔符
		{
			fields.push_back(field);     //将刚刚读取的字符串添加到向量fields中
		}
		pcl::PointXYZ point;
		point.x = float(atof(Trim(fields[0]).c_str())); //Trim用于清除掉向量fields中的无效字符
		point.y = float(atof(Trim(fields[1]).c_str()));
		point.z = float(atof(Trim(fields[2]).c_str()));
		cloud->push_back(point);
	}
}
#pragma endregion 

int main()
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

	csv2pcd("ptcloud_OSBS_002.csv", cloud);
	cout << "读取点云点的个数为:" << cloud->points.size() << endl;
	//-----------------------保存pcd文件-------------------------
	pcl::io::savePCDFileASCII("ptcloud_OSBS_002.pcd", *cloud);
	pcl::visualization::PCLVisualizer::Ptr viewer(new pcl::visualization::PCLVisualizer("Viewer"));
	viewer->setBackgroundColor(0, 0, 0);
	// 按照z字段进行渲染,将z改为x或y即为按照x或y字段渲染
	pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZ> fildColor(cloud, "z");
	viewer->addPointCloud<pcl::PointXYZ>(cloud, fildColor, "sample cloud");

	while (!viewer->wasStopped())
	{
		viewer->spinOnce(100);
		boost::this_thread::sleep(boost::posix_time::microseconds(100000));
	}

	system("pause");
	return 0;
}

2. Respuestas a preguntas

1. El papel de CNN en la fusión de HSI y datos lidar

CNN extrae las características de profundidad de la imagen y luego utiliza un perceptrón multicapa (percseptron multicapa), es decir, una red totalmente conectada y una función softmax como clasificador para clasificar las características de profundidad extraídas.

2. La ingeniería característica típica incluye: calcular varios índices de vegetación y características de textura

3. Si el navegador Chrome muestra una página web que no es un enlace privado

Solución: concéntrese en la página donde el navegador Chrome no es una conexión privada y luego ingrese 12 letras de "thisisunsafe", y el navegador cargará la página del sitio web

3. Conversión mutua entre formato mat y formato tif

1. mate a tif:

import scipy.io as sio
import numpy as np
from osgeo import gdal

# 加载.mat文件
data = sio.loadmat('data.mat')

# 提取高光谱图像数据
hsi_data = data['hsi']

# 将数据归一化到[0, 1]范围
hsi_data = (hsi_data - np.min(hsi_data)) / (np.max(hsi_data) - np.min(hsi_data))

# 将高光谱图像数据转换为.tif格式
driver = gdal.GetDriverByName('GTiff')
output_file = 'output.tif'
rows, cols, bands = hsi_data.shape
output = driver.Create(output_file, cols, rows, bands, gdal.GDT_Float32)
for i in range(bands):
    output.GetRasterBand(i + 1).WriteArray(hsi_data[:, :, i])
output = None

Nota: Abrir con ENVI justo después del proceso de conversión solo tendrá una selección de banda, y se puede resolver volviendo a abrir con ENVI

2. tif to mat (para añadir)

5.16-6.4 Uso de jupyter Algunos puntos de atención en el desarrollo Combinación de conocimientos de teledetección QString y QDateTime conversión

1. Use jupyter para usar los pasos del entorno virtual creado

1.conda instalar ipykernel

2. activar datos

3.python -m ipykernel install --nombre datos

2. Asuntos que requieren atención en el proceso de desarrollo

1. Haga un uso completo de las variables globales, como cuando una variable se incrementa automáticamente, pero está relacionada con varias funciones, luego se usan las variables globales

2. En cuanto al uso de la obtención de la hora actual, año, mes, día, grados, minutos y segundos

    qDebug() << now.toString("yyyy-MM-dd");
    qDebug() << now.toString("yyyy-MM-dd HH:mm:ss");
    qDebug() << now.toString("HH:mm:ss");

3.QString now_date = now.toString("yyyy-MM-dd"); puede obtener la fecha actual

4.killTimer(timer_XX); puede apagar el temporizador

5. La bicicleta no debe salirse de los límites

6. Al agregar datos al objeto de QStringLIst, asegúrese de usar temp.append(a);            

No se puede usar temp[i]=fileInfo->at(i).fileName()

7.0 es falso, otros números son verdaderos

8. Varios usos de QDateTime y la conversión de QString y QDateTime

    // 待转换的QString
    QString str = "2022-02-22 22:22:58"; 
    // 通过fromString()将QString转为QDateTime
    QDateTime dateTime = QDateTime::fromString(str, "yyyy-MM-dd hh:mm:ss"); 
    // 可以通过toString()方法将QDateTime转为QString进行输出
    qDebug() << dateTime.toString("yyyy-MM-dd hh:mm:ss");
    //toMSecsSinceEpoch()方法会将日期时间对象转换为从1970年1月1日0时分0秒UTC(即时间)开始的毫秒数
    qDebug() << dateTime.toMSecsSinceEpoch();  

9. Asegúrese de no perder los paréntesis al copiar el código

3. Combinación de conocimientos de teledetección

1. El cálculo de la cobertura vegetal generalmente se retrocalcula con NDVI, (dicotomía)

Supongo que te gusta

Origin blog.csdn.net/z377989129/article/details/130598214
Recomendado
Clasificación