这周学习目录
1、可视化
2、深度图像

一、可视化Visualization

1.1 可视化的基本概念
可视化(Visualization)是利用计算机图形学和图像处理技术,将数据转换成图形或图像在屏幕上显示出来,并进行交互处理的理论、方法和技术。
1.2 PCLVisualizer介绍

class pcl: : visualization: : PCL Visualizer
类PCLVisuafizer为PCL可视化3D点云的主要类。其内部实现了添加各种3D对象以及交互实现等,比其他类实现的功能更齐全。

类PCLVisualizer的关键函数说明:

  • PCL Visualizer (int &.argc, char **argv, canst std: : string &.name="",PCLVisualizerlnteractorStyle *style= PCLVisualizerlnteractorStyle:: New (),const bool create_mteractor true):重构函数,其中name为创建窗口名,style为交互类实现,默认为PCLVisualizerlnteractorStyle对象,create_interactor设置是否重建 交互对象,默认是创建的。
  • void spin () 调用内部渲染函数,重新渲染输出。
  • void spinOnce (int time 1, bool force_redraw false):调用内部渲染函数一次,重新渲染输出时间最大不超过time,单位ms,force_ re­draw设置是否强制 重新绘制。
  • void addCoordinateSystem (double scale =1.0 , int viewport 0):在坐标原点(0,0,0)添加指示坐标轴,viewport为需要添加的视口,默认在所有视口中都添加,scale设置指示坐标轴的放大系数。
  • void setBackgroundColor (const double &.r, const double &.g, canst double &.b, int viewport = O) 设置指定viewport 视口的背景色。
    等等还有很多函数。
1.3 CloudViewer介绍

class pcl: : visualization: : CloudViewer
类CloudViewer实现创建点云可视化的窗口,以及相关的可视化功能。

CloudViewer的关键成员函数

  • CloudViewer (const std: :string &.window_name) :构建可视化点云窗口,窗口名为window_name。
  • void showCloud (const ColorCloud: : ConstPtr &.cloud, const std: : string&. cloudname = “cloud”): 在可视化点云窗口中显示 cloud对应的点云,考虑到多个点云用键值cloudname 来限定具体是哪个点云。
  • bool wasStopped (int millis_to_ wait= 1) :判断用户是否已关闭窗口,如果是则需要注销窗口,millis_to_wait为在注销窗口之前的等待。
  • void runOnVisualizationThread (VizCallable x, const std: : string & key = " callable") :在窗口运行期间处理x 回调函数,key为键值标识此回调函数,直到窗口关闭,可以多次使用回调函数。**重点:**此X为回调函数(返回值为空,参数是pcl::visualization::PCLVisualizer &viewer)
  • void run On VisualizationThreadOnce (VizCallable x) 同上,但只调用回询函数一次。
a、CloudViewer实现:
// 使用CloudViewer,CloudViewer是PCLVisualizer的子类,所以可以传参,进行设置背景颜色,
// CloudViewer是没有setBackground属性
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);#include<thread>
#include<pcl/visualization/cloud_viewer.h>
#include<pcl/point_cloud.h>
#include<pcl/io/pcd_io.h>
#include<pcl/point_types.h>using namespace std;
static int num = 0;
//int user_data;
// 设置背景
void viewerOneOff(pcl::visualization::PCLVisualizer &viewer) {viewer.setBackgroundColor(1, 0.5, 1);  // 设置背景颜色// 设置点云尺寸大小viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3);
}//设置文字
void viewerText(pcl::visualization::PCLVisualizer &viewer) {stringstream s;  // 定义字符串s << " viewer loop " << num++ ; // 输出文字viewer.removeShape("Text", 0);  // 删除“Text”形状//viewer.addText(s.str(), 100, 200, "Text", 0);  // 定义文字框viewer.setPosition(100, 200);pcl::PointXYZ position;position.x = 1.0;position.y = 1.0;position.z = 1.0;viewer.addText3D(s.str(), position, 0.3, 0.3, 0.3,0.4,"Text",0);  // 将Text3D添加到“Text”形状里// user_data++;
}void getCube(pcl::visualization::PCLVisualizer& viewer) {num++;//cout << "num : "<< num << endl;string cube = "cube" + num;float r = rand() + 0.1;float b = rand() + 0.2;float g = rand() + 0.3;viewer.addCube(0, 1, 0, 1, 0, 1, r, g, b, "cube" + num , 0);//std::cout <<cube<<"  run !!!" << std::endl;
}int main() {pcl::visualization::CloudViewer viewer("可视化");//pcl::PointCloud<pcl::PointXYZ> cloud;  // 在viewer.showCloud()作为参数是会报错的,因为其接受Ptr参数// 当参数为PointXYZRGB就会加载点云颜色数据,如果为PointXYZ,则会输出白色数据。pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>());pcl::io::loadPCDFile("maize.pcd", *cloud);//if (pcl::io::loadPCDFile("maize.pcd", *cloud)) {//	cout << "w文件不存在" << endl;//	return -1;//}// 加载点云数据viewer.showCloud(cloud);// 一次性线程,加载一次viewerOneOffviewer.runOnVisualizationThreadOnce(viewerOneOff);// 多次加载viewer.runOnVisualizationThread(viewerText);while (!viewer.wasStopped()) {//user_data++;// 可以加一些其他的活动std::this_thread::sleep_for(100ms);viewer.runOnVisualizationThreadOnce(getCube);}return 0;
}

运行结果:
在这里插入图片描述

1.3 Range_image_visualizer的介绍
可视化深度图像的两种方法,在3D视窗中以点云形式进行可视化(深度图像来源于点云),另一种是将深度值映射为颜色,从而以彩色图像方式可视化深度图像。
#include <iostream>
#include <boost/thread/thread.hpp>  // boost中的线程
#include <pcl/common/common_headers.h>
#include <pcl/pcl_macros.h>
#include <pcl/range_image/range_image.h>  // 深度图像
#include <pcl/io/pcd_io.h>  // 读取pcd数据
#include <pcl/visualization/range_image_visualizer.h>  // 深度图像可视化要通过这个头文件
#include <pcl/visualization/pcl_visualizer.h>  // 可视化
#include <pcl/console/parse.h>typedef pcl::PointXYZ PointType;  // 重定义
// 全局参数
float angular_resolution = 0.5f;  // 分辨率
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;  // 定义深度图像坐标系为照相机坐标系
pcl::RangeImage::CoordinateFrame coordinate_frame1 = pcl::RangeImage::LASER_FRAME;  // 定义深度图像坐标系为照相机坐标系
bool live_update = false;  // 设置更新为false// -----打印帮助-----
void
printUsage(const char* progName)
{std::cout << "\n\nUsage: " << progName << " [options] <scene.pcd>\n\n"<< "Options:\n"<< "-------------------------------------------\n"<< "-r <float>   angular resolution in degrees (default " << angular_resolution << ")\n"<< "-c <int>     coordinate frame (default " << (int)coordinate_frame << ")\n"<< "-l           live update - update the range image according to the selected view in the 3D viewer.\n"<< "-h           this help\n"<< "\n\n";
}// 深度图像位置,Eigen::Affine3f&可以保存摄像头位置
void
setViewerPose(pcl::visualization::PCLVisualizer& viewer, const Eigen::Affine3f& viewer_pose)
{Eigen::Vector3f pos_vector = viewer_pose * Eigen::Vector3f(0, 0, 0);Eigen::Vector3f look_at_vector = viewer_pose.rotation() * Eigen::Vector3f(0, 0, 1) + pos_vector;Eigen::Vector3f up_vector = viewer_pose.rotation() * Eigen::Vector3f(0, -1, 0);// 设置摄像头位置,前三个参数是摄像头的位置,中间三个参数是视向,最后三个参数是向上方向viewer.setCameraPosition(pos_vector[0], pos_vector[1], pos_vector[2], look_at_vector[0], look_at_vector[1],look_at_vector[2], up_vector[0], up_vector[1], up_vector[2]);//viewer.camera_.pos[0] = pos_vector[0];//viewer.camera_.pos[1] = pos_vector[1];//viewer.camera_.pos[2] = pos_vector[2];//viewer.camera_.focal[0] = look_at_vector[0];//viewer.camera_.focal[1] = look_at_vector[1];//viewer.camera_.focal[2] = look_at_vector[2];//viewer.camera_.view[0] = up_vector[0];//viewer.camera_.view[1] = up_vector[1];//viewer.camera_.view[2] = up_vector[2];viewer.updateCamera();
}// -----Main-----
int
main03(int argc, char** argv)
{//解析命令行参数if (pcl::console::find_argument(argc, argv, "-h") >= 0){printUsage(argv[0]);return 0;}if (pcl::console::find_argument(argc, argv, "-l") >= 0){live_update = true;std::cout << "Live update is on.\n";}if (pcl::console::parse(argc, argv, "-r", angular_resolution) >= 0)std::cout << "Setting angular resolution to " << angular_resolution << "deg.\n";int tmp_coordinate_frame;  // 坐标系// 命令行解析if (pcl::console::parse(argc, argv, "-c", tmp_coordinate_frame) >= 0){coordinate_frame = pcl::RangeImage::CoordinateFrame(tmp_coordinate_frame);std::cout << "Using coordinate frame " << (int)coordinate_frame << ".\n";}angular_resolution = pcl::deg2rad(angular_resolution);// 读取给定的pcd点云文件或者自行创建随机点云pcl::PointCloud<PointType>::Ptr point_cloud_ptr(new pcl::PointCloud<PointType>);pcl::PointCloud<PointType>& point_cloud = *point_cloud_ptr;Eigen::Affine3f scene_sensor_pose(Eigen::Affine3f::Identity());std::vector<int> pcd_filename_indices = pcl::console::parse_file_extension_argument(argc, argv, "pcd");if (!pcd_filename_indices.empty()){std::string filename = argv[pcd_filename_indices[0]];if (pcl::io::loadPCDFile(filename, point_cloud) == -1){std::cout << "Was not able to open file \"" << filename << "\".\n";printUsage(argv[0]);return 0;}scene_sensor_pose = Eigen::Affine3f(Eigen::Translation3f(point_cloud.sensor_origin_[0],point_cloud.sensor_origin_[1],point_cloud.sensor_origin_[2])) *Eigen::Affine3f(point_cloud.sensor_orientation_);}else{std::cout << "\nNo *.pcd file given => Genarating example point cloud.\n\n";for (float x = -0.5f; x <= 0.5f; x += 0.01f){for (float y = -0.5f; y <= 0.5f; y += 0.01f){PointType point;  point.x = x;  point.y = y;  point.z = 2.0f - y;point_cloud.points.push_back(point);}}point_cloud.width = (int)point_cloud.points.size();point_cloud.height = 1;}//从点云创建深度图像对象float noise_level = 0.0;float min_range = 0.0f;int border_size = 1;// boost::shared_ptr共享指针,代表该指针在整个程序全局中都可以使用,不用担心内存错误boost::shared_ptr<pcl::RangeImage> range_image_ptr(new pcl::RangeImage);pcl::RangeImage& range_image = *range_image_ptr;range_image.createFromPointCloud(point_cloud, angular_resolution, pcl::deg2rad(360.0f), pcl::deg2rad(180.0f), scene_sensor_pose, coordinate_frame, noise_level, min_range, border_size);//创建3D视图并且添加点云进行显示pcl::visualization::PCLVisualizer viewer("3D Viewer");viewer.setBackgroundColor(1, 1, 1);// 自定义点云颜色(白色)pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> range_image_color_handler(range_image_ptr, 0, 0, 0);// 添加点云数据到viewer中,第一个参数是图像指针,第二个参数是颜色属性,第三个参数是ID号viewer.addPointCloud(range_image_ptr, range_image_color_handler, "range image");// 设置点云尺寸viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "range image");viewer.addCoordinateSystem (1.0f);  // 添加坐标系pcl::visualization::PointCloudColorHandlerCustom<PointType> point_cloud_color_handler (point_cloud_ptr, 150, 150, 150);viewer.addPointCloud (point_cloud_ptr, point_cloud_color_handler, "original point cloud");viewer.initCameraParameters();  // 初始化摄像机参数(按照默认方向)setViewerPose(viewer, range_image.getTransformationToWorldSystem());  // 设置深度图像的位置//显示深度图像pcl::visualization::RangeImageVisualizer range_image_widget("Range image");range_image_widget.showRangeImage(range_image);//主循环while (!viewer.wasStopped()){// 深度图像渲染一次range_image_widget.spinOnce();// 3D viewer渲染一次viewer.spinOnce();// 更新间隔10mspcl_sleep(0.01);if (live_update){scene_sensor_pose = viewer.getViewerPose();range_image.createFromPointCloud(point_cloud, angular_resolution, pcl::deg2rad(360.0f), pcl::deg2rad(180.0f), scene_sensor_pose, pcl::RangeImage::LASER_FRAME, noise_level, min_range, border_size);range_image_widget.showRangeImage(range_image);}}
}
程序运行:首先通过cmake把cpp文件和CmakeLists文件进行编译生成Debug文件,然后再命令行中输入命令运行程序。
./range_image_visualization.exe -h :是帮助的意思,可以看一下命令的含义所在。
./range_image_visualization.exe rabbit.pcd -r:是当分辨率为0.5时的深度图像。但是不是动态的。
./range_image_visualization.exe rabbit.pcd -l:是动态深度图像,当移动3D Viewer中的模型位置时,深度图像也会发生变化。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

深度的描述:图中不可区视域(代表无限远)用浅绿光表示,远距离区域(范围无限远激光,扫描时可获取信息)用淡蓝色表示,注意两者虽然都是无穷远,但前者是在激光扫描不可见区域,后者是在可见区域的无穷远。
1.4 实例三
ModelCoefficients 介绍:可以定义ModelCoefficients 得到各种各样的图形。前提是知道图形的函数方程,如下ax+by+cz+d = 0是一个平面方程,所以pcl::ModelCoefficients coeffs;coeffs.values.push_back(0.0);  // 是a的值coeffs.values.push_back(0.0);  // b的值coeffs.values.push_back(1.0);  // c的值coeffs.values.push_back(0.0);  // d的值
分屏的介绍:意思就是在把一个Viewer分成n块。这个就要利用到viewportint v1(0);  // 定义一个viewport为0viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);   // 创建一个视口,索引为v1,(0.0,0.0)可以看成一个窗口左上角的位置,(0.5,1.0)代表窗口x轴的一半(宽度),1.0代表窗口的高度viewer->setBackgroundColor(0, 0, 0, v1);  / /定义背景颜色int v2(0);  // 定义另一个viewport为1viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);  // 定义背景颜色
上面几行代码创建新的视口,所需的4个参数是视口在X轴的最小值、最大值、 Y轴的最小值、最大值,取值在0~1。我们创建的视口分布于窗口的左半部分,最后 一个字符串参数,用来唯一标志该视口,在其他改变该视口内容的调用中需要以该唯 一标志为参数
/* \author Geoffrey Biggs */#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/common/common_headers.h>
#include <pcl/common/common_headers.h>
#include <pcl/features/normal_3d.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/console/parse.h>
// 帮助
void
printUsage1(const char* progName)
{std::cout << "\n\nUsage: " << progName << " [options]\n\n"<< "Options:\n"<< "-------------------------------------------\n"<< "-h           this help\n"<< "-s           Simple visualisation example\n"<< "-r           RGB colour visualisation example\n"<< "-c           Custom colour visualisation example\n"<< "-n           Normals visualisation example\n"<< "-a           Shapes visualisation example\n"<< "-v           Viewports example\n"<< "-i           Interaction Customization example\n"<< "\n\n";
}boost::shared_ptr<pcl::visualization::PCLVisualizer> simpleVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{//创建3D窗口并添加点云boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 1, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();  // 初始化所有参数return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> rgbVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{//创建3D窗口并添加点云	boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> customColourVis(pcl::PointCloud<pcl::PointXYZ>::ConstPtr cloud)
{//创建3D窗口并添加点云boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> normalsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals)
{//创建3D窗口并添加点云其包括法线  boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals, 10, 0.05, "normals");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> shapesVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud)
{//创建3D窗口并添加点云    boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud");viewer->addCoordinateSystem(1.0);viewer->initCameraParameters();//在点云上添加直线和球体模型viewer->addLine<pcl::PointXYZRGB>(cloud->points[0],cloud->points[cloud->size() - 1], "line");viewer->addSphere(cloud->points[0], 0.2, 0.5, 0.5, 0.0, "sphere");//在其他位置添加基于模型参数的平面及圆锥体pcl::ModelCoefficients coeffs;coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);viewer->addPlane(coeffs, "plane");coeffs.values.clear();coeffs.values.push_back(0.3);coeffs.values.push_back(0.3);coeffs.values.push_back(0.0);coeffs.values.push_back(0.0);coeffs.values.push_back(1.0);coeffs.values.push_back(0.0);coeffs.values.push_back(5.0);viewer->addCone(coeffs, "cone");return (viewer);
}boost::shared_ptr<pcl::visualization::PCLVisualizer> viewportsVis(pcl::PointCloud<pcl::PointXYZRGB>::ConstPtr cloud, pcl::PointCloud<pcl::Normal>::ConstPtr normals1, pcl::PointCloud<pcl::Normal>::ConstPtr normals2)
{// 创建3D窗口并添加显示点云其包括法线boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->initCameraParameters();int v1(0);viewer->createViewPort(0.0, 0.0, 0.5, 1.0, v1);viewer->setBackgroundColor(0, 0, 0, v1);viewer->addText("Radius: 0.01", 10, 10, "v1 text", v1);pcl::visualization::PointCloudColorHandlerRGBField<pcl::PointXYZRGB> rgb(cloud);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, rgb, "sample cloud1", v1);int v2(0);viewer->createViewPort(0.5, 0.0, 1.0, 1.0, v2);viewer->setBackgroundColor(0.3, 0.3, 0.3, v2);viewer->addText("Radius: 0.1", 10, 10, "v2 text", v2);pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZRGB> single_color(cloud, 0, 255, 0);viewer->addPointCloud<pcl::PointXYZRGB>(cloud, single_color, "sample cloud2", v2);viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud1");viewer->setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 3, "sample cloud2");viewer->addCoordinateSystem(1.0);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals1, 10, 0.05, "normals1", v1);viewer->addPointCloudNormals<pcl::PointXYZRGB, pcl::Normal>(cloud, normals2, 10, 0.05, "normals2", v2);return (viewer);
}unsigned int text_id = 0;
void keyboardEventOccurred(const pcl::visualization::KeyboardEvent &event,void* viewer_void)
{boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);if (event.getKeySym() == "r" && event.keyDown()){std::cout << "r was pressed => removing all text" << std::endl;char str[512];for (unsigned int i = 0; i < text_id; ++i){sprintf(str, "text#%03d", i);viewer->removeShape(str);}text_id = 0;}
}void mouseEventOccurred(const pcl::visualization::MouseEvent &event,void* viewer_void)
{boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer = *static_cast<boost::shared_ptr<pcl::visualization::PCLVisualizer> *> (viewer_void);if (event.getButton() == pcl::visualization::MouseEvent::LeftButton &&event.getType() == pcl::visualization::MouseEvent::MouseButtonRelease){std::cout << "Left mouse button released at position (" << event.getX() << ", " << event.getY() << ")" << std::endl;char str[512];sprintf(str, "text#%03d", text_id++);viewer->addText("clicked here", event.getX(), event.getY(), str);}
}boost::shared_ptr<pcl::visualization::PCLVisualizer> interactionCustomizationVis()
{cout << "Interaction...."<<endl;boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));viewer->setBackgroundColor(0, 0, 0);viewer->addCoordinateSystem(1.0);viewer->registerKeyboardCallback(keyboardEventOccurred, (void*)&viewer);viewer->registerMouseCallback (mouseEventOccurred, (void*)&viewer);return (viewer);
}
// -----Main-----
int
main04(int argc, char** argv)
{// 解析命令行参数if (pcl::console::find_argument(argc, argv, "-h") >= 0){printUsage1(argv[0]);return 0;}bool simple(false), rgb(false), custom_c(false), normals(false),shapes(false), viewports(false), interaction_customization(false);if (pcl::console::find_argument(argc, argv, "-s") >= 0){simple = true;std::cout << "Simple visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-c") >= 0){custom_c = true;std::cout << "Custom colour visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-r") >= 0){rgb = true;std::cout << "RGB colour visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-n") >= 0){normals = true;std::cout << "Normals visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-a") >= 0){shapes = true;std::cout << "Shapes visualisation example\n";}else if (pcl::console::find_argument(argc, argv, "-v") >= 0){viewports = true;std::cout << "Viewports example\n";}else if (pcl::console::find_argument(argc, argv, "-i") >= 0){interaction_customization = true;std::cout << "Interaction Customization example\n";}else{printUsage1(argv[0]);return 0;}// 自行创建一随机点云pcl::PointCloud<pcl::PointXYZ>::Ptr basic_cloud_ptr(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);std::cout << "Genarating example point clouds.\n\n";// 以椭圆为边线沿z轴拉伸获取其点云,并赋予红绿蓝渐变色。uint8_t r(255), g(15), b(15);for (float z(-1.0); z <= 1.0; z += 0.05){for (float angle(0.0); angle <= 360.0; angle += 5.0){pcl::PointXYZ basic_point;basic_point.x = 0.5 * cosf(pcl::deg2rad(angle));basic_point.y = sinf(pcl::deg2rad(angle));basic_point.z = z;basic_cloud_ptr->points.push_back(basic_point);pcl::PointXYZRGB point;point.x = basic_point.x;point.y = basic_point.y;point.z = basic_point.z;uint32_t rgb = (static_cast<uint32_t>(r) << 16 |static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));point.rgb = *reinterpret_cast<float*>(&rgb);point_cloud_ptr->points.push_back(point);}if (z < 0.0){r -= 12;g += 12;}else{g -= 12;b += 12;}}basic_cloud_ptr->width = (int)basic_cloud_ptr->points.size();basic_cloud_ptr->height = 1;point_cloud_ptr->width = (int)point_cloud_ptr->points.size();point_cloud_ptr->height = 1;// 0.05为搜索半径获取点云法线pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> ne;ne.setInputCloud(point_cloud_ptr);pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>());ne.setSearchMethod(tree);pcl::PointCloud<pcl::Normal>::Ptr cloud_normals1(new pcl::PointCloud<pcl::Normal>);ne.setRadiusSearch(0.05);ne.compute(*cloud_normals1);//  0.1为搜索半径获取点云法线pcl::PointCloud<pcl::Normal>::Ptr cloud_normals2(new pcl::PointCloud<pcl::Normal>);ne.setRadiusSearch(0.1);ne.compute(*cloud_normals2);boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer;if (simple){viewer = simpleVis(basic_cloud_ptr);}else if (rgb){viewer = rgbVis(point_cloud_ptr);}else if (custom_c){viewer = customColourVis(basic_cloud_ptr);}else if (normals){viewer = normalsVis(point_cloud_ptr, cloud_normals2);}else if (shapes){viewer = shapesVis(point_cloud_ptr);}else if (viewports){viewer = viewportsVis(point_cloud_ptr, cloud_normals1, cloud_normals2);}else if (interaction_customization){viewer = interactionCustomizationVis();}// 主循环while (!viewer->wasStopped()){viewer->spinOnce(100);boost::this_thread::sleep(boost::posix_time::microseconds(100000));}
}

运行结果:一个是分窗口的结果,一个是添加图形的结果
在这里插入图片描述在这里插入图片描述

二、深度图像

2.1 深度图像的概念
深度图像(Depth Images)也被称为距离影像(Range Images), 是指将从图像采集器到场景中各点的距离(深度)值作为像素值的图像,
它直接反映了景物可见表面的几何形状,利用它可以很方便的解决3D目标描述中的许多问题。 深度图像经过坐标转换可以计算为
点云数据,有规则及必要信息的点云数据也可以反算为深度图像数据。
2.2 深度图像的创建
#include <pcl/range_image/range_image.h>
#include<pcl/visualization/range_image_visualizer.h>int main(int argc, char** argv) {pcl::PointCloud<pcl::PointXYZ> pointCloud;  // 定义点云//生成数据for (float y = -0.5f; y <= 0.5f; y += 0.01f) {for (float z = -0.5f; z <= 0.5f; z += 0.01f) {pcl::PointXYZ point;point.x = 2.0f - y;point.y = y;point.z = z;pointCloud.points.push_back(point);  // 将point添加到点云数据中}}pointCloud.width = (uint32_t)pointCloud.points.size();pointCloud.height = 1;//以1度为角分辨率,从上面创建的点云创建深度图像。float angularResolution = (float)(1.0f * (M_PI / 180.0f));// 1度转弧度float maxAngleWidth = (float)(360.0f * (M_PI / 180.0f));// 360.0度转弧度float maxAngleHeight = (float)(180.0f * (M_PI / 180.0f));// 180.0度转弧度Eigen::Affine3f sensorPose = (Eigen::Affine3f)Eigen::Translation3f(0.0f, 0.0f, 0.0f);  // 观测角度pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;// 深度图像遵循的坐标系统float noiseLevel = 0.00;  // 归一化的的Z缓冲区来创建深度图像float minRange = 0.0f;  // 所有在这个半径范围内的数据被忽略int borderSize = 1;  // 将在图像周围留下当前视点不可见点的边界pcl::RangeImage rangeImage;  // 定义深度图像// 从点云数据来创建深度图像rangeImage.createFromPointCloud(pointCloud, angularResolution, maxAngleWidth, maxAngleHeight, sensorPose, coordinate_frame, noiseLevel, minRange, borderSize);std::cout << rangeImage << "\n";//显示深度图像pcl::visualization::RangeImageVisualizer range_image_widget("Range image");range_image_widget.showRangeImage(rangeImage);//主循环while (!range_image_widget.wasStopped()){// 深度图像渲染一次range_image_widget.spinOnce();// 更新间隔10mspcl_sleep(0.01);}
}
这部分定义了创建深度图像时需要的设置参数,将角度分辨率定义为1°意味着由邻近的像素点所对应的每个光束之间相差1°,
maxAngleWidth=360和maxAn­gleHeight= 180意味着,进行模拟的距离传感器对周围的环境拥有一个完整的360° 视角,
用户在任何数据集下都可以使用此设置,因为最终获取的深度图像将被裁剪到有空间物体存在的区域范围。但是,用户可以
通过减小数值来节省一些计算资源,例如:对于传感器后面没有可以观测的点时,一个水平视角为18矿的激光扫描仪,即
maxAngleWidth= 180 就足够了这样只需要观察距离传感器前面就可以了,因为后面没有需要观察的场景。sensorPose定义
了模拟深度图像获取传感器的6自由度位置,其原始值为横滚角roll,俯仰角pitch、偏航角yaw都为0,coordinate_ frame= CAMERA_FRAME
说明系统的X轴是向右的,Y轴是向下的,Z轴是向前的,另外一个选择是LASER_FRAME,其X轴向前,Y轴向左,Z轴向上。noiseLevel= 0是指使用
一个归一化的Z缓冲器来创建深度图像,但是如果想让邻近点集都落在同一 个像素单元,用户可以设置一个较高的值,例如noiseLevel= 0. 05
可以理解为,深度距离值是通过查询点半径为5cm的圆内包含的点用来平均计算而得到的。如果minRange>O, 则所有模拟器所在位置半径minRange
内的邻近点都将被忽略,即为盲区。在栽剪图像时,如果borderSize>O,将在图像周围留下当前视点不可见点的边界。

在这里插入图片描述在这里插入图片描述

2.3 深度图像边界的提取

#include <iostream>
#include <boost/thread/thread.hpp>
#include <pcl/range_image/range_image.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/range_image_visualizer.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/features/range_image_border_extractor.h>
#include <pcl/console/parse.h>
typedef pcl::PointXYZ PointType;
// --------------------
// -----参数-----
// --------------------
float angular_resolution = 0.5f;  // 设置角度分辨率
pcl::RangeImage::CoordinateFrame coordinate_frame = pcl::RangeImage::CAMERA_FRAME;  // 设置坐标系
bool setUnseenToMaxRange = false;  // 设置所有不能观察的点都是远距离的
// --------------
// -----帮助-----
// --------------
void
printUsage(const char* progName)
{std::cout << "\n\nUsage: " << progName << " [options] <scene.pcd>\n\n"<< "Options:\n"<< "-------------------------------------------\n"<< "-r <float>   angular resolution in degrees (default " << angular_resolution << ")\n"<< "-c <int>     coordinate frame (default " << (int)coordinate_frame << ")\n"<< "-m           Treat all unseen points to max range\n"<< "-h           this help\n"<< "\n\n";
}
// --------------
// -----主函数-----
// --------------
int
main02(int argc, char** argv)
{// --------------------------------------// -----解析命令行参数-----// --------------------------------------if (pcl::console::find_argument(argc, argv, "-h") >= 0){printUsage(argv[0]);return 0;}if (pcl::console::find_argument(argc, argv, "-m") >= 0){setUnseenToMaxRange = true;cout << "Setting unseen values in range image to maximum range readings.\n";}int tmp_coordinate_frame;if (pcl::console::parse(argc, argv, "-c", tmp_coordinate_frame) >= 0){coordinate_frame = pcl::RangeImage::CoordinateFrame(tmp_coordinate_frame);cout << "Using coordinate frame " << (int)coordinate_frame << ".\n";}if (pcl::console::parse(argc, argv, "-r", angular_resolution) >= 0)cout << "Setting angular resolution to " << angular_resolution << "deg.\n";angular_resolution = pcl::deg2rad(angular_resolution);// ------------------------------------------------------------------// -----读取pcd文件,如果没有给出pcd文件则创建一个示例点云-----// ------------------------------------------------------------------pcl::PointCloud<PointType>::Ptr point_cloud_ptr(new pcl::PointCloud<PointType>);pcl::PointCloud<PointType>& point_cloud = *point_cloud_ptr;pcl::PointCloud<pcl::PointWithViewpoint> far_ranges;Eigen::Affine3f scene_sensor_pose(Eigen::Affine3f::Identity());std::vector<int> pcd_filename_indices = pcl::console::parse_file_extension_argument(argc, argv, "pcd");if (!pcd_filename_indices.empty()){std::string filename = argv[pcd_filename_indices[0]];if (pcl::io::loadPCDFile(filename, point_cloud) == -1){cout << "Was not able to open file \"" << filename << "\".\n";printUsage(argv[0]);return 0;}scene_sensor_pose = Eigen::Affine3f(Eigen::Translation3f(point_cloud.sensor_origin_[0], point_cloud.sensor_origin_[1], point_cloud.sensor_origin_[2])) *Eigen::Affine3f(point_cloud.sensor_orientation_);std::string far_ranges_filename = pcl::getFilenameWithoutExtension(filename) + "_far_ranges.pcd";if (pcl::io::loadPCDFile(far_ranges_filename.c_str(), far_ranges) == -1)std::cout << "Far ranges file \"" << far_ranges_filename << "\" does not exists.\n";}else{cout << "\nNo *.pcd file given => Genarating example point cloud.\n\n";for (float x = -0.5f; x <= 0.5f; x += 0.01f){for (float y = -0.5f; y <= 0.5f; y += 0.01f){PointType point;  point.x = x;  point.y = y;  point.z = 2.0f - y;point_cloud.points.push_back(point);}}point_cloud.width = (int)point_cloud.points.size();  point_cloud.height = 1;}// -----------------------------------------------// -----从点云创建深度图像-----// -----------------------------------------------float noise_level = 0.0;float min_range = 0.0f;int border_size = 1;boost::shared_ptr<pcl::RangeImage> range_image_ptr(new pcl::RangeImage);pcl::RangeImage& range_image = *range_image_ptr;range_image.createFromPointCloud(point_cloud, angular_resolution, pcl::deg2rad(360.0f), pcl::deg2rad(180.0f), scene_sensor_pose, coordinate_frame, noise_level, min_range, border_size);range_image.integrateFarRanges(far_ranges);if (setUnseenToMaxRange)range_image.setUnseenToMaxRange();// --------------------------------------------// -----打开三维浏览器并添加点云-----// --------------------------------------------pcl::visualization::PCLVisualizer viewer("3D Viewer");viewer.setBackgroundColor(1, 1, 1);viewer.addCoordinateSystem(1.0f);pcl::visualization::PointCloudColorHandlerCustom<PointType> point_cloud_color_handler(point_cloud_ptr, 0, 0, 0);viewer.addPointCloud(point_cloud_ptr, point_cloud_color_handler, "original point cloud");//PointCloudColorHandlerCustom<pcl::PointWithRange>   range_image_color_handler (range_image_ptr, 150, 150, 150);//viewer.addPointCloud (range_image_ptr, range_image_color_handler, "range image");//viewer.setPointCloudRenderingProperties (PCL_VISUALIZER_POINT_SIZE, 2, "range image");// -------------------------// -----提取边界-----// -------------------------pcl::RangeImageBorderExtractor border_extractor(&range_image);pcl::PointCloud<pcl::BorderDescription> border_descriptions;border_extractor.compute(border_descriptions);// ----------------------------------// -----在三维浏览器中显示点集-----// ----------------------------------pcl::PointCloud<pcl::PointWithRange>::Ptr border_points_ptr(new pcl::PointCloud<pcl::PointWithRange>), veil_points_ptr(new pcl::PointCloud<pcl::PointWithRange>), shadow_points_ptr(new pcl::PointCloud<pcl::PointWithRange>);pcl::PointCloud<pcl::PointWithRange>& border_points = *border_points_ptr, &veil_points = *veil_points_ptr, &shadow_points = *shadow_points_ptr;for (int y = 0; y < (int)range_image.height; ++y){for (int x = 0; x < (int)range_image.width; ++x){if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__OBSTACLE_BORDER])border_points.points.push_back(range_image.points[y*range_image.width + x]);if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__VEIL_POINT])veil_points.points.push_back(range_image.points[y*range_image.width + x]);if (border_descriptions.points[y*range_image.width + x].traits[pcl::BORDER_TRAIT__SHADOW_BORDER])shadow_points.points.push_back(range_image.points[y*range_image.width + x]);}}pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> border_points_color_handler(border_points_ptr, 0, 255, 0);viewer.addPointCloud<pcl::PointWithRange>(border_points_ptr, border_points_color_handler, "border points");viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "border points");pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> veil_points_color_handler(veil_points_ptr, 255, 0, 0);viewer.addPointCloud<pcl::PointWithRange>(veil_points_ptr, veil_points_color_handler, "veil points");viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "veil points");pcl::visualization::PointCloudColorHandlerCustom<pcl::PointWithRange> shadow_points_color_handler(shadow_points_ptr, 0, 255, 255);viewer.addPointCloud<pcl::PointWithRange>(shadow_points_ptr, shadow_points_color_handler, "shadow points");viewer.setPointCloudRenderingProperties(pcl::visualization::PCL_VISUALIZER_POINT_SIZE, 7, "shadow points");//-------------------------------------// -----在深度图像中显示点集-----// ------------------------------------pcl::visualization::RangeImageVisualizer* range_image_borders_widget = NULL;range_image_borders_widget =pcl::visualization::RangeImageVisualizer::getRangeImageBordersWidget(range_image, -std::numeric_limits<float>::infinity(), std::numeric_limits<float>::infinity(), false, border_descriptions, "Range image with borders");// -------------------------------------//--------------------// -----主循环-----//--------------------while (!viewer.wasStopped()){range_image_borders_widget->spinOnce();viewer.spinOnce();pcl_sleep(0.01);}
}
	pcl::RangeImageBorderExtractor border_extractor(&range_image);pcl::PointCloud<pcl::BorderDescription> border_descriptions;border_extractor.compute(border_descriptions);此部分创建了 RangelmageBorderExtractor 这个对象,给了它深度图像,并且计算后存储边界信息在 border_descriptions 中。
运行结果。
./range_image_border_extraction.exe rabbit.pcd -r :设置角度分辨率为0.5时的结果
./range_image_border_extraction.exe rabbit.pcd -c:设置不同的坐标系
./range_image_border_extraction.exe rabbit.pcd -m:如果用户没有这些远距离的点云,则可采用命令行参数-m,这样设置所有不能观察到的点都为远距离的

在这里插入图片描述

./range_image_border_extraction.exe rabbit.pcd -r :设置角度分辨率为0.5时的运行结果

在这里插入图片描述在这里插入图片描述

./range_image_border_extraction.exe rabbit.pcd -m的运行结果如下

在这里插入图片描述在这里插入图片描述

三、总结

	本周学习了可视化和深度图像的表示方法,明白了使用这些代码的意义所在,这些代码都来源于点云库PCL学习教程和PCL官方文档。
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 01-HTML控件

    1.HTML (常用标签 网页的基本结构)2.CSS (常用样式 网页的显示效果)3.JavaScript (用户交互效果 动态效果)4.jQuery (JavaScript库 简化原生js操作)5.Ajax (异步数据交互 在页面不刷新的情况下进行数据交互)6.BootStrap (前段UI框架 快速搭建静态页面并支持不同设备)## HTML概述…...

    2024/4/29 22:29:10
  2. ROS入门(十)——两只小乌龟(乌龟跟随C++实现)

    所用的学习链接&#xff1a; 【奥特学园】ROS机器人入门课程《ROS理论与实践》零基础教程P204- 【以上视频笔记见http://www.autolabor.com.cn/book/ROSTutorials/】 一、目标 产生两只乌龟 A 和 B &#xff0c;B 会自动运行至A的位置。 键盘只控制 A 的运动&#xff0c;而…...

    2024/5/1 7:00:19
  3. html传值方式有哪几种,关于html页面间传值的几种方法

    问题因最近尝试实现客户端与服务端分离&#xff0c;服务端只提供接口&#xff0c;客户端用htmljs实现&#xff0c;分成两个独立的项目部署&#xff0c;因项目是个人项目&#xff0c;客户端展示不考虑使用像Angular、Vue、Native这种前端框架实现&#xff0c;于是全部使用静态页…...

    2024/4/21 15:32:07
  4. 九院孙英做双眼皮9mm恢复后的样子

    ...

    2024/4/21 15:32:05
  5. 双眼皮 孙英 内双

    ...

    2024/4/21 15:32:05
  6. 华美蒋琳牡丹江北方医院朱克文李圣利双眼皮图片

    ...

    2024/5/1 21:31:26
  7. Angularjs的前端拦截器

    最近项目中&#xff0c;要使用过滤器去做登陆拦截&#xff0c;接到要求的第一反应肯定是java的filter。简单方便&#xff0c;后来发现项目中很多请求用到的是ajax异步请求&#xff0c;在使用sendRedirect跳转的时候&#xff0c;根本跳出过去。因为服务器要控制页面跳转必须客户…...

    2024/4/21 15:32:02
  8. 合肥割双眼皮于-艺星

    ...

    2024/4/30 13:26:14
  9. 新书《Java EE实用教程——基于WebLogic和Eclipse(第2版)》目录

    经过了一年多的修改,新书《Java EE实用教程——基于WebLogic和Eclipse(第2版)》终于出版了。相对于本书的第一版,这个版本的改动如下: 1)增加了部分内容,包括RMI、Web Service,增加了实验指导书和习题手册; 2)去掉了部分内容,包括EJB中关于EJB 2的内容和JavaMail …...

    2024/5/1 9:36:04
  10. git 工作流和git commit规范

    目的 统一团队的Git工作流&#xff0c;包括分支使用、tag规范、issue等 统团队的Git Commit日志标准&#xff0c;便于后续代码review,版本发布以及日志自动化生成 git工作流 git flow工作流&#xff1a; master为主分支&#xff0c;属保护分支&#xff0c;不能直接在此进行代…...

    2024/4/21 15:32:00
  11. 双眼皮肉条四年疤克有用

    ...

    2024/4/27 21:52:07
  12. 平凉做做双眼皮需要什么工具

    ...

    2024/4/27 20:22:57
  13. 全切双眼皮过窄

    ...

    2024/4/28 16:57:18
  14. 从头再学Vue之slot插槽

    介绍在Vue中提供了一个内置组件&#xff1a;「slot」&#xff0c;官方称之为「插槽」。其作用主要是为了做内容分发。内容分发这个词理解起来可能不太直观&#xff0c;如果学习过Angular&#xff0c;就可以将它理解为Angular中的ng-content&#xff0c;ng-content的解释是「内容…...

    2024/4/29 1:59:13
  15. 新 旧 slot 作用域插槽 属性验证

    slot 作用域插槽 旧&#xff1a; slot-scope 使用流程 在组件的模板中书写slot插槽&#xff0c;并将当前组件的数据通过 v-bind 绑定在 slot标签上在组件使用时&#xff0c;通过slot-scope “slotProp” 来接收slot标签身上绑定的数据通过 slotProp.xxx 就可以进行使用了 …...

    2024/4/27 23:39:33
  16. vue2.0 slot用法

    学习vue.js也有一段时间了&#xff0c;关于slot这一块&#xff0c;也看了不少次了&#xff0c;总感觉有点迷迷糊糊&#xff0c;不知其然也不知其所以然&#xff0c;抽出一段完整的时间&#xff0c;再一次仔细学习。稍微有点理解了&#xff0c;在此稍作记录&#xff0c;好记性不…...

    2024/4/28 12:01:03
  17. slot 作用域插槽

    1. 旧&#xff1a; slot-scope 使用流程在组件的模板中书写slot插槽&#xff0c;并将当前组件的数据通过 v-bind 绑定在 slot标签上在组件使用时&#xff0c;通过slot-scope “slotProp” 来接收slot标签身上绑定的数据通过 slotProp.xxx 就可以进行使用了 <!DOCTYPE htm…...

    2024/4/28 1:31:43
  18. Adaptive Feature Mapping for Customizing Deep Learning Based Facial Expression Recognition

    Adaptive Feature Mapping for Customizing Deep Learning Based Facial Expression Recognition Model基于自适应特征映射的自定义深度学习面部表情识别模型摘要:自动面部表情识别可以大大改善人机界面。当机器知道人类的情感时,它可以提供更好更个性化的服务。这种改进是人…...

    2024/4/28 1:55:19
  19. 双眼皮手术后会不会变内双

    ...

    2024/4/29 22:53:48
  20. 本身就是双眼皮想加宽

    ...

    2024/4/28 15:34:26

最新文章

  1. Pandas DataFrame基础知识

    1.1 简介 Pandas 是 Python 编程语言的一个软件库&#xff0c;用于数据操作和分析。它提供了强大的数据结构&#xff0c;特别是 DataFrame&#xff0c;用于处理结构化数据。DataFrame 类似于电子表格&#xff0c;可以存储多种类型的数据&#xff0c;并支持各种数据操作&#x…...

    2024/5/1 22:23:18
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 关于hive启动的相关问题记录

    问题&#xff1a;初始化hive元数据报错 [atguiguhadoop102 software]$ schematool -initSchema -dbType mysql -verboseError: Table CTLGS already exists (state42S01,code1050) Closing: 0: jdbc:mysql://hadoop102:3306/metastore?useSSLfalse org.apache.hadoop.hive.me…...

    2024/5/1 1:28:01
  4. [C++][算法基础]模拟队列(数组)

    实现一个队列&#xff0c;队列初始为空&#xff0c;支持四种操作&#xff1a; push x – 向队尾插入一个数 x&#xff1b;pop – 从队头弹出一个数&#xff1b;empty – 判断队列是否为空&#xff1b;query – 查询队头元素。 现在要对队列进行 M 个操作&#xff0c;其中的每…...

    2024/5/1 13:02:53
  5. 分享一个Python爬虫入门实例(有源码,学习使用)

    一、爬虫基础知识 Python爬虫是一种使用Python编程语言实现的自动化获取网页数据的技术。它广泛应用于数据采集、数据分析、网络监测等领域。以下是对Python爬虫的详细介绍: 架构和组成:下载器:负责根据指定的URL下载网页内容,常用的库有Requests和urllib。解析器:用于解…...

    2024/4/30 2:54:18
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57