第一天5.15 星期一 csv转pcd mat转tif Chrome私密链接
今天主要阅读了篇论文,并深入了解了多源数据融合的概念,学习了几个相关问题的解答,以及mat格式和tif格式的互相转化:
一、csv转pcd
注意:csv文件必须有三列,且分别表示x,y,z的坐标,且不能有表头,代码如下:
#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;
}
二、问题解答
1.CNN在HSI和lidar数据融合中的作用
CNN提取图像的深度特征,然后再用多层感知机( multilayer percseptron) ,即全连接网络和 softmax 函数作为分类器,对提取出的深度特征进行分类.
2.典型的特征工程包括:计算各种植被指数和纹理特征
3.chrome浏览器如果对一个网页提示不是私密链接
解决方法:聚焦到 chrome 浏览器 不是私密连接 的页面,然后键盘输入 “thisisunsafe” 12个字母,此时浏览器就会加载出网站页面了
三、mat格式与tif格式的互相转化
1.mat转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
注:刚转化处理用ENVI打开会只有一个波段的选择,用ENVI重新打开即可解决
2.tif转mat(待补充)
5.16-6.4 jupyter使用 几点开发的注意事项 遥感知识梳理 QString和QDateTime的转化
一、使用jupyter使用创建的虚拟环境步骤
1.conda install ipykernel
2. activate data
3.python -m ipykernel install --name data
二、开发过程中的注意事项
1.活用全局变量,比如让一个变量自增时,但它又与多个函数有关,这时就用用到全局变量
2.关于获取当前时间的使用,年月日、度分秒
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"); 可获取当前日期
4.killTimer(timer_XX); 可以将定时器关闭
5.循环一定不要出界
6.QStringLIst的对象添加数据时,一定要用temp.append(a);
不能用temp[i]=fileInfo->at(i).fileName()
7.0是假,其他的数字是真
8.有关QDateTime的几个使用与QString和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.复制代码时一定不要丢括号
三、遥感知识梳理
1.计算植被覆盖率通常用NDVI反算,(二分法)