VTK笔记-体绘制-vtkVolume

2023-11-16

体渲染

  体渲染是一个用于描述3D数据渲染过程的术语,这里的3D数据是指其属性信息遍及3D空间,而不是一个在3D空间中的2D曲面;
  面渲染是对数据的表面或者一个抽取的轮廓进行渲染,是通过对面上的标量属性进行显示的;面渲染能显示其表面或者一个抽取的轮廓,但不能反映出3D数据信息的空间特性;
  体渲染最为常用的技术是 光线投射(ray cast)
   光线投射(ray cast)是假设有一道射线照射在体数据上,并从体数据中直穿过去。如果把这一射线与体数据表面交点的标量数据映射为颜色,并当作该位置上最终显示的颜色,这就是面渲染,该点背后大量的数据信息没有表示出来。而体渲染技术要求最终的渲染结果能在一定程度上反映出背后的信息,也就是对体数据中位于同一射线上的点的标量数据,通过共同作用产生最终该位置上的颜色;
  对这些标量数据的计算方式有两种:
    1.对射线上的一系列离散点颜色数据进行加权叠加。其中颜色数据是通过对这些离散点的标量数据映射得来的;加权系数指的是不透明度,其取值范围为0-1;不透明度也可以通过标量数据映射得到;
    2.通过梯度映射得到;
  下图是面渲染结果:
面渲染
  下图是体渲染结果:
在这里插入图片描述
  从上面两张图可以明显看到面渲染和体渲染的不同效果;体渲染有三维空间上的深度的延伸;
  总之:面绘制提取的是感兴趣物体的表面信息,所重建出的三维图像不能反映物体内部的细节,应用于切割具有局限性。体绘制的处理是直接对所有体数据进行光照、纹理、计算处理,从而合成三维图像,更加适合与三维切割,且可以清晰的表达图像的内部信息与三维图像的关系。相比面绘制,体绘制在三维图像切割及三维图像切片中具有一定的优势。体绘制由于体绘制需要对所有体数据进行处理,切割效果好,但是计算量大、耗时长。

VTK中和体渲染相关类

vtkFixedPointVolumeRayCastMapper

  在早期VTK版本中,使用vtkVolumeRayCastMapper进行体数据映射,由于在最新VTK版本中不再支持vtkVolumeRayCastMapper,则使用了vtkFixedPointVolumeRayCastMapper或者vtkGPUVolumeRayCastMapper来替代;
  vtkFixedPointVolumeRayCastMapper能够实现基于Alpha合成的体渲染方法和最大密度投影体渲染方法,能够支持任意类型的医院或者多元数据。数据中由颜色和不透明度表示;或者配合vtkPiecewiseFunction和  vtkColorTransferFunction将标量数据映射为不同的颜色和不透明度;
  默认采用的是基于Alpha合成的体渲染方法;

	volumeMapper->SetBlendModeToComposite();

  vtkColorTransferFunction可以设置使用最大密度投影体渲染:

	volumeMapper->SetBlendModeToMaximumIntensity();

在这里插入图片描述
  关于vtkFixedPointVolumeRayCastMapper的使用,以后找时间单独做些笔记;

vtkVolume

  vtkVolume与几何渲染中的vtkActor作用一致,vtkVolume适用于体渲染场景,用于渲染场景中的对象;
  需要设置如下两个输入:
  void SetMapper(vtkAbstractVolumeMapper* mapper):该函数用于设置Mapper对象。
  void SetProperty(vtkVolumeProperty* property):该函数用于设置属性vtkVolumeProperty对象。

vtkVolumeProperty

  vtkVolumeProperty表达了用于体渲染的一些公共属性,包括颜色、标量不透明度、梯度不透明度等;
  不透明度可以由标量或梯度转变来。可分别用方法SetScalarOpacity()和SetGradientOpacity()设置转移函数。如果这两个函数都设置了,那么最终的不透明度就是两者的乘积;如果这两个函数都没设置,则不透明度为常数1.0;

   void SetScalarOpacity(int index, vtkPiecewiseFunction* function);
   void SetScalarOpacity(vtkPiecewiseFunction* function) { this->SetScalarOpacity(0, function); }  
   vtkPiecewiseFunction* GetScalarOpacity(int index);
   vtkPiecewiseFunction* GetScalarOpacity() { return this->GetScalarOpacity(0); }
   void SetGradientOpacity(int index, vtkPiecewiseFunction* function);
   void SetGradientOpacity(vtkPiecewiseFunction* function) { this->SetGradientOpacity(0, function); }
   vtkPiecewiseFunction* GetGradientOpacity(int index);
   vtkPiecewiseFunction* GetGradientOpacity() { return this->GetGradientOpacity(0); }

  颜色由标量转变来。可用方法SetColor()设置转移函数。如果要将标量转变为灰度值,那么该方法也可接受vtkPiecewiseFunction实例作为参数;如果是将标量转变为彩色值,则接受vtkColorTransferFunction实例;

  void SetColor(int index, vtkPiecewiseFunction *function);
  void SetColor(vtkPiecewiseFunction *function){ this->SetColor(0, function); }
  void SetColor(int index, vtkColorTransferFunction *function);
  void SetColor(vtkColorTransferFunction *function){ this->SetColor(0, function); }

  注意:对于有多个分量的标量或梯度,在设置转移函数时,还可以指定一个索引,以表明是对哪个分量进行转变;如果省略该参数,则使用默认的索引0;
  光照属性:vtkVolumeProperty也可以对光照属性进行设置。默认这些属性是不起作用,需要显示时应调用ShadeOn()方法。另外,光照属性的应用还依赖于法线的方向计算法线属于映射器的任务;光照属性主要包括环境光系数、散射光系数、反射光系数和高光强度四个参数影响;一般情况下环境光系数、散射光系数、反射光系数之和为1.0;但是有时需要提高亮度,就会将之和设置超过1.0;高光强度用来控制外观平滑程度;

	vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
	volumeProperty->SetInterpolationTypeToLinear();
	volumeProperty->ShadeOn();  // 打开光照设置
	volumeProperty->SetAmbient(0.4);  // 环境光系数	
	volumeProperty->SetDiffuse(0.6);  // 散射光系数
	volumeProperty->SetSpecular(0.2); // 反射光系数
	volumeProperty->SetSpecularPower(1);// 高光强度

开启阴影效果,光照属性生效;下图为渲染效果图:
在这里插入图片描述
默认关闭阴影效果,光照属性不生效;下图为渲染图:
在这里插入图片描述

vtkPiecewiseFunction

  vtkPiecewiseFunction定义分段函数映射,相当是分段的线程函数,是标量数据值到不透明度的映射关系。
  其中X轴方向表示标量数据值;Y轴方向表示不透明度数值;不透明度Y=f(X)上的任一点都是对应标量X在f()上的映射;
  使用vtkPiecewiseFunction时,只要给定几个点或几条线段,它就会用直线将这些点连起来,以形成最后的映射函数f();
  vtkPiecewiseFunction的功能是,将某些值或者某些范围的值对应的透明度调高或者降低,以突出其他数值的显示;
在这里插入图片描述
  配合vtkVolumeProperty的函数SetScalarOpacity和SetGradientOpacity;可以使用不用不透明度映射关系,呈现不同的渲染效果;例如:在CT图像中,表示皮肤、肌肉、骨骼的标量值各不相同,其窗宽和窗位处于不同的范围,那么就可以使用SetScalarOpacity来设置标量对应不透明度的映射关系,用来突出骨骼或者皮肤,其他组织就可以设定透明忽略;再比如:在不同材料的临界区域,如空气到软组织,或者软组织到骨头的临界区,梯度值会比较大,而材料的内部梯度值则会相对比较小;就可以使用SetGradientOpacity来设定梯度值与不透明度的映射关系,来突出高梯度的变化情况;

接口

增加点/片段/移除点

   int AddPoint(double x, double y);
   int AddPoint(double x, double y, double midpoint, double sharpness);  
   bool RemovePointByIndex(size_t id);  
   int RemovePoint(double x);  
   int RemovePoint(double x, double y);  
   void RemoveAllPoints();  
   void AddSegment(double x1, double y1, double x2, double y2);

获取X/Y/中点/锐度值

   int GetNodeValue(int index, double val[4]);
   int SetNodeValue(int index, double val[4]);

示例

		vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
		volumeProperty->SetInterpolationTypeToLinear();
		volumeProperty->ShadeOn();  //打开或者关闭阴影测试
		volumeProperty->SetAmbient(0.4);
		volumeProperty->SetDiffuse(0.6);  //漫反射
		volumeProperty->SetSpecular(0.2); //镜面反射
		//设置不透明度
		vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
		compositeOpacity->AddPoint(70, 0.00);
		compositeOpacity->AddPoint(90, 0.40);
		compositeOpacity->AddPoint(180, 0.60);
		volumeProperty->SetScalarOpacity(compositeOpacity); 

		//设置梯度不透明属性
		vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
		volumeGradientOpacity->AddPoint(10, 0.0);
		volumeGradientOpacity->AddPoint(90, 0.5);
		volumeGradientOpacity->AddPoint(100, 1.0);
		volumeProperty->SetGradientOpacity(volumeGradientOpacity);

vtkColorTransferFunction

  vtkColorTransferFunction是将标量数值映射到RGB或HSV空间中的颜色,它使用分段hermite函数来允许插值,插值可以是分段常数、分段线性或介于两者之间的某个位置(一种修改的分段hermite函数,它根据锐度参数压扁函数)。该函数还允许将中点(函数达到两个边界节点平均值的位置)指定为节点之间的规格化距离。
  通俗来讲就是,vtkColorTransferFunction和vtkPiecewiseFunction类似,也是将标量范围分成几段,每段标量波形对其中一个颜色分量进行映射;

接口

设置点/线段/移除

  设置点的颜色,两点之间的颜色根据设置进行插值;

   int AddRGBPoint(double x, double r, double g, double b);
   int AddRGBPoint(double x, double r, double g, double b, double midpoint, double sharpness);
   int AddHSVPoint(double x, double h, double s, double v);
   int AddHSVPoint(double x, double h, double s, double v, double midpoint, double sharpness);
   int RemovePoint(double x);  
   void AddRGBSegment(double x1, double r1, double g1, double b1, double x2, double r2, double g2, double b2);
   void AddHSVSegment(double x1, double h1, double s1, double v1, double x2, double h2, double s2, double v2);  
   void RemoveAllPoints();

获取指定标量对应颜色

   double* GetColor(double x) VTK_SIZEHINT(3) { return vtkScalarsToColors::GetColor(x); }
   void GetColor(double x, double rgb[3]) override;  
   double GetRedValue(double x);
   double GetGreenValue(double x);
   double GetBlueValue(double x);

设置颜色空间

   vtkSetClampMacro(ColorSpace, int, VTK_CTF_RGB, VTK_CTF_STEP);
   void SetColorSpaceToRGB() { this->SetColorSpace(VTK_CTF_RGB); }
   void SetColorSpaceToHSV() { this->SetColorSpace(VTK_CTF_HSV); }
   void SetColorSpaceToLab() { this->SetColorSpace(VTK_CTF_LAB); }
   void SetColorSpaceToLabCIEDE2000() { this->SetColorSpace(VTK_CTF_LAB_CIEDE2000); }
   void SetColorSpaceToDiverging() { this->SetColorSpace(VTK_CTF_DIVERGING); }
   void SetColorSpaceToStep() { this->SetColorSpace(VTK_CTF_STEP); }
   vtkGetMacro(ColorSpace, int);
   vtkSetMacro(HSVWrap, vtkTypeBool);
   vtkGetMacro(HSVWrap, vtkTypeBool);
   vtkBooleanMacro(HSVWrap, vtkTypeBool);

示例

	vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New();
	color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);

简单示例

  只是简单举一个例子,例子中使用到的具体类说明和介绍,在之后笔记中记录;
  张晓东, 罗火灵的《VTK图形图像开发进阶》中关于体绘制的代码如下:

/**********************************************************************
  文件名: 7.1_VolumeRenderingApp.cpp
  Copyright (c) 张晓东, 罗火灵. All rights reserved.
  更多信息请访问: 
    http://www.vtkchina.org (VTK中国)
	http://blog.csdn.net/www_doling_net (东灵工作室) 
**********************************************************************/
#include <vtkSmartPointer.h>
#include <vtkImageData.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
#include <vtkVolumeRayCastCompositeFunction.h>
#include <vtkGPUVolumeRayCastMapper.h>
#include <vtkVolumeRayCastMapper.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkAxesActor.h>
#include <vtkImageShiftScale.h>
#include <vtkImageCast.h>
#include <vtkFixedPointVolumeRayCastMapper.h>

//测试:../data/mummy.128.vtk
int main(int argc, char *argv[])
{
	if (argc < 2)
	{
		std::cout<<argv[0]<<" "<<"StructuredPointsFile(*.vtk)"<<std::endl;
		return EXIT_FAILURE;
	}

	vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName(argv[1]);
	reader->Update();

	vtkSmartPointer<vtkVolumeRayCastCompositeFunction> rayCastFun = vtkSmartPointer<vtkVolumeRayCastCompositeFunction>::New();

	vtkSmartPointer<vtkVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkVolumeRayCastMapper>::New();
	volumeMapper->SetInput(reader->GetOutput());
	volumeMapper->SetVolumeRayCastFunction(rayCastFun);

	vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
	volumeProperty->SetInterpolationTypeToLinear();
	//volumeProperty->ShadeOn();  //打开或者关闭阴影测试
	volumeProperty->SetAmbient(0.4);
	volumeProperty->SetDiffuse(0.6);
	volumeProperty->SetSpecular(0.2);

	vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
	compositeOpacity->AddPoint(70,   0.00);
	compositeOpacity->AddPoint(90,   0.40);
	compositeOpacity->AddPoint(180,  0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数

	vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
	volumeGradientOpacity->AddPoint(10,  0.0);
	volumeGradientOpacity->AddPoint(90,  0.5);
	volumeGradientOpacity->AddPoint(100, 1.0);
	
	vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New();
	color->AddRGBPoint(0.000,  0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00,  1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0,  1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0,  0.20, 0.20, 0.20);
	volumeProperty->SetColor(color);

	vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
	volume->SetMapper(volumeMapper);
	volume->SetProperty(volumeProperty);

	vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
	ren->SetBackground(1.0, 1.0, 1.0);
	ren->AddVolume( volume ); 

	vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
	renWin->AddRenderer(ren);
	renWin->SetSize(640, 480);
	renWin->Render();
	renWin->SetWindowName("VolumeRenderingApp");

	vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	iren->SetRenderWindow(renWin);
	ren->ResetCamera();

	renWin->Render();
	iren->Start();

	return EXIT_SUCCESS;
}

遇到问题1

编译时提示:
#include <vtkVolumeRayCastCompositeFunction.h>
#include <vtkVolumeRayCastMapper.h>
找不到头文件;由于我使用的是VTK8.2版本,VTK8.2版本不再支持光线投射算法的库vtkVolumeRayCastCompositeFunctionvtkVolumeRayCastMapper;可以使用vtkFixedPointVolumeRayCastMapper或者vtkGPUVolumeRayCastMapper代替;

#include "pch.h"
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);

#include <vtkSmartPointer.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
#include <vtkFixedPointVolumeRayCastMapper.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkAxesActor.h>
#include <vtkOrientationMarkerWidget.h>

int main(int argc, char* argv[])
{
	vtkSmartPointer<vtkStructuredPointsReader> reader = vtkSmartPointer<vtkStructuredPointsReader>::New();
	reader->SetFileName("G:\\Data\\VTK\\mummy.128.vtk");
	reader->Update();

	vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper = vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();
	volumeMapper->SetInputData(reader->GetOutput());

	vtkSmartPointer<vtkVolumeProperty> volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
	volumeProperty->SetInterpolationTypeToLinear();
	volumeProperty->ShadeOn();  //打开或者关闭阴影测试
	volumeProperty->SetAmbient(0.4);
	volumeProperty->SetDiffuse(0.6);  //漫反射
	volumeProperty->SetSpecular(0.2); //镜面反射
	//设置不透明度
	vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
	compositeOpacity->AddPoint(70, 0.00);
	compositeOpacity->AddPoint(90, 0.40);
	compositeOpacity->AddPoint(180, 0.60);
	volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数

	//设置梯度不透明属性
	vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity = vtkSmartPointer<vtkPiecewiseFunction>::New();
	volumeGradientOpacity->AddPoint(10, 0.0);
	volumeGradientOpacity->AddPoint(90, 0.5);
	volumeGradientOpacity->AddPoint(100, 1.0);
	volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比
	//设置颜色属性
	vtkSmartPointer<vtkColorTransferFunction> color = vtkSmartPointer<vtkColorTransferFunction>::New();
	color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);
	color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);
	color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);
	color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);
	volumeProperty->SetColor(color);
	/********************************************************************************/
	vtkSmartPointer<vtkVolume> volume = vtkSmartPointer<vtkVolume>::New();
	volume->SetMapper(volumeMapper);
	volume->SetProperty(volumeProperty);

	vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
	ren->SetBackground(0, 1, 0);
	ren->AddVolume(volume);
	vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();
	rw->AddRenderer(ren);
	rw->SetSize(640, 480);
	rw->Render();
	rw->SetWindowName("VolumeRendering PipeLine");

	vtkSmartPointer<vtkRenderWindowInteractor> rwi = vtkSmartPointer<vtkRenderWindowInteractor>::New();
	rwi->SetRenderWindow(rw);
	ren->ResetCamera();
	rw->Render();
	rwi->Start();

	return 0;
}

遇到问题2

之前代码使用的下面的配置;

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

在例子代码运行时报:
在这里插入图片描述
使用以下配置,问题解决;

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);

运行结果如下图:
在这里插入图片描述
本文中使用的vtk文件:链接:https://pan.baidu.com/s/1OPIw3jkqEnPbxe2YiihUYQ 提取码:uk37

参考资料

1.《VTK图形图像开发进阶》;
2.初次学习VTK遇到的一些坑(适用于初学者)
3.VTK系列64_VTK体绘制管线(光线投影法体绘制)
4.《医学图像编程技术》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VTK笔记-体绘制-vtkVolume 的相关文章

  • 直连模式、PAC模式和全局模式

    直连模式 就是直接连接 没有经过任何协议节点 和没开网络代理模式一样 相当于关闭网络代理 全局模式 意思是访问所有网站都走代理节点 这种模式访问国内网站速度略慢 并且耗费流量 PAC模式 根据pac文件来判断访问时需不需要经过代理 较为智能
  • 无线网改密码后显示服务器没反应,宽带密码改了后wifi上不去了怎么办?

    答 你问的这个问题其实很简单 之所以修改宽带密码后wifi和电脑都不能上网 是因为无线路由器中 仍然在用之前的宽带密码进行上网连接 运营商的服务器 在进行验证的时候 发现宽带密码不正确 就会拒绝路由 问 宽带密码改了后wifi上不去了怎么办
  • C++ ffmpeg+SDL音视频播放封装类

    1 包含必须的头文件 define SDL MAIN HANDLED 避免出现main重定义文件 extern C include ffmpeg include libavformat avformat h include ffmpeg i
  • DCDC Buck电源芯片选型

    只列举常用的 芯片均出自TI MPS SY 国产小厂只考虑XL 但并不首推 个人整理 tb均能买到 如有纰漏欢迎纠错
  • Mysql实现不关联表横向拼接(无相同字段)

    目录 1 笛卡尔积 不是本例 2 两表不关联连接 工作中前台的一些报表展示 有时需要两张不相关表的横向关联 表TAB A 表TAB B 最终需要的结果如下 1 笛卡尔积 不是本例 select from TAB A join TAB B 2
  • 苹果为什么玩游戏会找不到服务器,Game Center无法连接服务器怎么办 五种方法任你选择...

    苹果用户在玩单机游戏的时候 GameCenter会进行登录然后查看游戏排名 但是有部分用户反映无法连接服务器 这个要怎么解决呢 下面小编就告诉你处理方法 类别 摄影图像 大小 120 43M 语言 简体中文 评分 10 方法一 首先我们来查
  • 如何在VMware Workstation虚拟机上快速部署AntDB社区版

    AntDB社区版采用了一键部署架构 步骤简单 耗时短 部署快 为大家的快速体验提供了极大便利 这里将通过环境准备 下载AntDB社区版 部署AntDB社区版三个部分跟大家一起体验如何快速完成AntDB社区版在VMware Workstati
  • EXCEL词典(xllex.dll)文件丢失或损坏的解决方法

    今天打开Excel 2016 突然一个不想看到的报错弹窗出现在了屏幕上 带着郁闷和好奇的眼光瞧了一眼 好家伙 这玩意儿还是第一次遇到 这可咋办 管它三七二十几 先 确定 了再说 下面这个就是那个 好家伙 于是我做了系统修复 并没有找到什么实
  • 云计算1+X之openstack篇

    openstack之Keystone 服务运维 概述 OpenStack 框架中 Keystone OpenStack Identity Service 的功能是负责验证身份 校验服务规则和发布服务令牌的 它实现了 OpenStack 的
  • 深度学习(入门)——逻辑回归模型(Logistics Regression)

    从逻辑回归开始 是因为这是一个简单的 可以理解成为一个简单的一层的神经网络 后续将逐步深入 了解更复杂的神经网络 一 假设函数 逻辑回归算法适用于二分类问题 例如在输入一个猫的图片到模型中 模型会输出1 这是一只猫 或者0 不是一只猫 对于
  • 在RHEL6配置IPv6 DNS Server

    Youtube上有一个视频是关于IPv4 DNS Server配置的 链接为https www youtube com watch v ZQkMYWTx28o 我在这里照猫画虎 配置一下IPv6的 以本人的机器为例 网卡为eth3 IPv6
  • sql重难点

    SQL总结 语法部分 1 exists和in的区别 where exists select x from employees e where e department id d department id where department
  • 小议CSDN周赛57期 - 凑数

    本期周赛几乎忘记参加 在最后几分钟的时候上来看了看 那些选择判断一通乱选 填空题也已经被吐槽得差不多了 这里不多说 只说我对第一道编程题的看法 吐槽 因为 C 站的机制是 即使它错了 它也不会承认 印象里只承认且改过一次 再争辩只会把你拉黑
  • HTML样式

    目录 HTML 的 style 属性 不赞成使用的标签和属性 应该避免使用下面这些标签和属性 HTML 样式实例 背景颜色 HTML 样式实例 字体 颜色和尺寸 HTML 样式实例 文本对齐 一个完整的实例 style 属性用于改变 HTM
  • 安卓手机玩游戏卡顿怎么解决_手机玩游戏的时候卡顿,怎么处理?

    手机内存不足或者是后台开了太多的应用程序 请关闭不需要的应用程序 并且定时清理手机缓存垃圾 释放内存 一 iPhone6玩游戏卡顿怎么办 1 关闭Assistive Touch 对于很多果粉来说 为了避免对Home键造成伤害 Assisti
  • 心电图心跳分类

    目录 背景介绍 数据探索性分析 特征工程 时间序列特征 背景介绍 赛题以医疗数据挖掘为背景 要求选手使用提供的心跳信号传感器数据训练模型并完成不同心跳信号的分类的任务 开源内容 https github com datawhalechina
  • HDU--1247:Hat’s Words (字典树)

    1 题目源地址 http acm hdu edu cn showproblem php pid 1247 2 解题思路 第一次接触字典树 代码也是参考别人的 代码参考博客 http blog csdn net red flame artic
  • [DevEco]解决“XXX“is not translated into en(English) ans zh(Chinese)

    问题描述 其实这个问题如字面意思 你在设置element string json的时候没有进行双语翻译 由于项目是国际版项目有中英双语string json配置文件 问题解决 分别在en element和zh element的string
  • QT---信号与槽机制

    QT 信号与槽机制 信号 signal 槽 slot 槽函数的命名格式 信号与槽的关联 实例1 自动关联 实例2 手动关联 信号 signal 信号是由对象改变状态后发射 emit 出去的事件 例如 一个pushButton 对象 最常见的

随机推荐

  • 一个android项目开发遇到的各种小问题(一)

    1 map格式字符串如何解析 借助json 先将字符串转化为json格式 再取值 JSONObject object new JSONObject posMap clientIden object getString iden 1 andr
  • windows下apache开启FastCGI

    1 在此链接下载一个合适的mod fcgid 文件 64位下载第一个 32位第二个 http www apachelounge com download 2 将解压后将文件中的 mod fcgid so 复制到apache的modules目
  • 用ProGuardGui混淆多个有依赖关系的项目,亲测有效

    前提 公司要混淆代码 A项目依赖B项目 要整体混淆AB这两个项目 步骤1 把AB两个项目通过maven命令打成同一个jar包 在pom文件里添加如下 执行maven命令语句 assembly assembly
  • SqueezeNet算法解析—鸟类识别—Paddle实战

    文章目录 一 理论基础 1 前言 2 设计理念 2 1 CNN微架构 CNN MicroArchitecture 2 2 CNN宏架构 CNN MacroArchitecture 2 3 模型网络设计探索过程 2 4 结构设计策略 2 5
  • Qt下载(多种下载通道+所有版本)

    Qt 体积很大 有 1GB 3GB 官方下载通道非常慢 相信很多读者会崩溃 所以建议大家使用国内的镜像网站 较快 或者使用迅雷下载 很快 作为 Qt 下载教程 本文会同时讲解以上三种下载方式 Qt 官方下载 非常慢 Qt 官网有一个专门的资
  • Qt CSV文件的创建,读写操作

    文章目录 一 CSV文件介绍 二 创建CSV文件 三 写入CSV文件 四 读取CSV文件 一 CSV文件介绍 逗号分隔值 Comma Separated Values CSV 有时也称为字符分隔值 因为分隔字符也可以不是逗号 其文件以纯文本
  • scala和spark的下载与安装

    简易安装scala和spark 一 安装scala 1 安装scala scala下载注意和jdk的版本号 下载地址 https www scala lang org download 2 上传到linux虚拟机里 可通过rz方式上传 上传
  • 量化交易是如何实现的?

    前面我们讲到 其实最简单的量化交易 就是定投 设置好标的 时间 金额 那么不需自己动手 就可以按照设置的策略进行定投 这就是量化交易的最初形态 那么 为了实现更加复杂一些的交易 比如说 选股 买卖点位的确定 追踪实时行情等 应该怎么去实现呢
  • Python_数据读取_读取单个csv文件和批量读取csv文件

    读取单个csv pd read csv 直接读取单个csv文件通过pd read csv 函数直接在指定路径进行文件读取 需要利用Pandas包 其中 1 路径前的r表示路径符号不转义 window操作系统下不再用调整 为 或 进行文件读取
  • spark dataframe 数据类型转换

    文章目录 1 spark sql数据类型 数字类型 日期类型 复杂类型 2 spark sql和scala数据类型对比 3 spark sql数据类型转换示例 代码 输出 1 spark sql数据类型 数字类型 ByteType 代表一个
  • 解决连接腾讯云Ubuntu服务器,使用Xshell和WinSCP无法直接用root用户登陆

    发现腾讯云服务器登入只能用ubuntu用户名登入 但是无法使用root登录 下面是解决方法 1 首先使用Xshell用ubuntu用户进入系统 输入命令 sudo passwd Enter new UNIX password 然后输入密码
  • 没有权限删除文件

    通过远程发版时 有可能会没有权限删除文件 如下解决方法 1 将user 用户切换root 用户 sudo su root 该方法不一定成功 因为有可能设置权限你不能切换 但成功以后一劳永逸 当方法1没有成功时 采用如下方法 2 将你所操作的
  • 网络请求-登录

    post请求的header中发送本地存储的token 校验服务器中是否存在
  • jsbridge原理_Hybrid App技术解析 -- 原理篇

    引言 随着 Web 技术和移动设备的快速发展 Hybrid 技术已经成为一种最主流最常见的方案 一套好的 Hybrid架构方案 能让 App 既能拥有极致的体验和性能 同时也能拥有 Web技术 灵活的开发模式 跨平台能力以及热更新机制 想想
  • FLatten Transformer 简化版Transformer

    今天在找论文时 看到一篇比较新奇的论文 在这里跟大家分享一下 希望可以给一些人提供一些思路 虽然现在Transformer 比较火 在分割上面也应用的比较多 但是我一直不喜欢用 其中一个原因是结构太复杂了 平时我主要用一个sel atten
  • Java正则工具类:字母数字下划线、数据库url校验等

    文章目录 前言 一 正则基础语法 二 正则工具类 总结 前言 本文内容观摩的是其他作者的代码 在基础上增加修改了一些 参考原文地址 java用正则表达式 提示 以下是本篇文章正文内容 下面案例可供参考 一 正则基础语法 字符 描述 匹配输入
  • RabbitMQ --- 惰性队列、MQ集群

    一 惰性队列 1 1 消息堆积问题 当生产者发送消息的速度超过了消费者处理消息的速度 就会导致队列中的消息堆积 直到队列存储消息达到上限 之后发送的消息就会成为死信 可能会被丢弃 这就是消息堆积问题 解决消息堆积有三种思路 增加更多消费者
  • Numpy中的转换成数组的array函数(更新中)

    今天给大家讲解一下图像处理和深度学习里面一个常用的函数array array的功能是接收一个多位置数 例如列表list 元 组tuple等 列表 list1 1 2 3 list2 1 2 3 list3 1 2 3 元组 tuple 1
  • 单片机串口时序与TTL电平

    串口是一个广义的概念 这是单讲单片机的串口UART 以及单片机的TTL电平 主要是记录一下自己忘了还能再看一下 1 TTL电平标准 输出 L lt 0 8V H gt 2 4V 输入 L lt 1 2V H gt 2 0V TTL器件输出低
  • VTK笔记-体绘制-vtkVolume

    体渲染 体渲染是一个用于描述3D数据渲染过程的术语 这里的3D数据是指其属性信息遍及3D空间 而不是一个在3D空间中的2D曲面 面渲染是对数据的表面或者一个抽取的轮廓进行渲染 是通过对面上的标量属性进行显示的 面渲染能显示其表面或者一个抽取