用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十九课

osg学习(三十一)osg、Qt的image 1、格式转换 osg::Image* CommonTools::covertImage(QImage image) { QImage glImage = QGLWidget::convertToGLFormat(image); unsigned char* data = new unsigned char[glImage.byteCount()]; for (int i = 0; i < glImage.byteCount(); i++) { data[i] = glImage.b 阅读详情
  • 简介

这节课NeHe课程教我们如何读取一张raw格式的图片,并且对两张raw格式图片进行处理生成了一张纹理图片。整个过程并不是十分复杂,文中大部分内容涉及到图片数据的操作。

  • 实现

首先我们创建需要显示的立方体:

osg::Geode*	createCubeGeode(osg::Image *image)
{
	osg::Geometry *quadGeometry = new osg::Geometry;
	osg::Vec3Array *quadVertexArray = new osg::Vec3Array;
	for (unsigned i = 0; i < sizeof(QuadVertices); ++i)
	{
		quadVertexArray->push_back(osg::Vec3(QuadVertices[i][0], QuadVertices[i][1], QuadVertices[i][2]));
	}
	quadGeometry->setVertexArray(quadVertexArray);
 ......
}
接着我们需要创建纹理所需要的image,这里的raw格式图片实际上并不是一种通用的格式,在osg中也并不支持。我们需要将raw格式中的字节数据读取出来并赋值给osg::Image用来作为我们的纹理图片。

首先我们使用NeHe中用到的函数读取图片:(函数代码并不完整,完整代码查看后面的附录中源码)

osg::Image*  ReadTextureData ( char *filename, unsigned int width, unsigned int height, unsigned int pixelPerBytes)
{
	//NeHe中使用256x256大小的图片,并且每个像素的字节数是4
	//因此这里在分配内存是使用RGBA都是8位的方式(1个字节)
	//正好是4个字节
	osg::Image *buffer = new osg::Image;
	buffer->allocateImage(width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE);
	int bytesPerPixel = buffer->getPixelSizeInBits() / 8;

	FILE *f;
	int i,j,k,done=0;
	int stride = buffer->s() * buffer->getPixelSizeInBits() / 8;				// Size Of A Row (Width * Bytes Per Pixel)
	unsigned char *p = NULL;
......
}
图片加载之后,我们使用Blit函数来对两张图片中的数据进行一些处理,具体代码参考Blit函数

最后生成我们的256x256的大小的纹理,图片的每个像素占用4个字节:

osg::Image*	createTextureImage()
{
	osg::Image *src = ReadTextureData("Data/GL.raw",  256, 256, 32);
	osg::Image *dst = ReadTextureData("Data/Monitor.raw", 256, 256, 32);
	
	Blit(src,dst,127,127,128,128,64,64,1,127);
	return dst;
}

将图片设置给立方体纹理,场景中为了简便用AnimationPathCallback来进行旋转:

	osg::AnimationPathCallback *quadAnimationCallbackX = 
		new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Vec3(1, 0, 0), 2.5);

	osg::AnimationPathCallback *quadAnimationCallbackY = 
		new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Vec3(0, 1, 0), 1.5);

	osg::AnimationPathCallback *quadAnimationCallbackZ = 
		new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Vec3(0, 0, 1), 0.5);

	osg::MatrixTransform *quadXRotMT = new osg::MatrixTransform;
	quadXRotMT->setUpdateCallback(quadAnimationCallbackX);

	osg::MatrixTransform *quadYRotMT = new osg::MatrixTransform;
	quadYRotMT->setUpdateCallback(quadAnimationCallbackY);

	osg::MatrixTransform *quadZRotMT = new osg::MatrixTransform;
	quadZRotMT->setUpdateCallback(quadAnimationCallbackZ);

	quadMT->addChild(quadXRotMT);
	quadXRotMT->addChild(quadYRotMT);
	quadYRotMT->addChild(quadZRotMT);

	osg::Image *image = createTextureImage();
	quadZRotMT->addChild(createCubeGeode(image));
一般来说,纹理操作很少使用这种方式进行,大部分都是通过加载多重纹理的方式来实现贴多张纹理,并设置其中纹理的作用方式。这种方式相当于先将多张纹理处理成一张再贴到物体上。编译运行程序:


附:本课源码(源码中可能存在错误和不足,仅供参考)

#include "../osgNeHe.h"

#include <QtCore/QTimer>
#include <QtGui/QApplication>
#include <QtGui/QVBoxLayout>

#include <osgViewer/Viewer>
#include <osgDB/ReadFile>
#include <osgQt/GraphicsWindowQt>

#include <osg/MatrixTransform>
#include <osg/Texture2D>

#include <osg/AnimationPath>



float textureVertices[][2] = {
	//Front Face
	{0.0f, 0.0f},
	{1.0f, 0.0f},
	{1.0f, 1.0f},
	{0.0f, 1.0f},
	// Back Face
	{1.0f, 0.0f},
	{1.0f, 1.0f},
	{0.0f, 1.0f},
	{0.0f, 0.0f},
	// Top Face
	{0.0f, 1.0f},
	{0.0f, 0.0f},
	{1.0f, 0.0f},
	{1.0f, 1.0f},
	// Bottom Face
	{1.0f, 1.0f},
	{0.0f, 1.0f},
	{0.0f, 0.0f},
	{1.0f, 0.0f},
	// Right face
	{1.0f, 0.0f},
	{1.0f, 1.0f},
	{0.0f, 1.0f},
	{0.0f, 0.0f},
	// Left Face
	{0.0f, 0.0f},
	{1.0f, 0.0f},
	{1.0f, 1.0f},
	{0.0f, 1.0f}
};

float QuadVertices[][3] = {

	{-1.0f, -1.0f,  1.0f},
	{ 1.0f, -1.0f,  1.0f},
	{ 1.0f,  1.0f,  1.0f},
	{-1.0f,  1.0f,  1.0f},

	{-1.0f, -1.0f, -1.0f},
	{-1.0f,  1.0f, -1.0f},
	{ 1.0f,  1.0f, -1.0f},
	{ 1.0f, -1.0f, -1.0f},

	{-1.0f,  1.0f, -1.0f},
	{-1.0f,  1.0f,  1.0f},
	{ 1.0f,  1.0f,  1.0f},
	{ 1.0f,  1.0f, -1.0f},

	{-1.0f, -1.0f, -1.0f},
	{ 1.0f, -1.0f, -1.0f},
	{ 1.0f, -1.0f,  1.0f},
	{-1.0f, -1.0f,  1.0f},

	{ 1.0f, -1.0f, -1.0f},
	{ 1.0f,  1.0f, -1.0f},
	{ 1.0f,  1.0f,  1.0f},
	{ 1.0f, -1.0f,  1.0f},

	{-1.0f, -1.0f, -1.0f},
	{-1.0f, -1.0f,  1.0f},
	{-1.0f,  1.0f,  1.0f},
	{-1.0f,  1.0f, -1.0f}

};


float normalsArray[][3] = {
	{0.0f, 0.0f, 1.0f},
	{0.0f, 0.0f,-1.0f},
	{0.0f, 1.0f, 0.0f},
	{0.0f,-1.0f, 0.0f},
	{1.0f, 0.0f, 0.0f},
	{-1.0f, 0.0f, 0.0f}
};


//////////////////////////////////////////////////////////////////////////
osg::Geode*	createCubeGeode(osg::Image *image)
{
	osg::Geometry *quadGeometry = new osg::Geometry;
	osg::Vec3Array *quadVertexArray = new osg::Vec3Array;
	for (unsigned i = 0; i < sizeof(QuadVertices); ++i)
	{
		quadVertexArray->push_back(osg::Vec3(QuadVertices[i][0], QuadVertices[i][1], QuadVertices[i][2]));
	}
	quadGeometry->setVertexArray(quadVertexArray);

	osg::Vec2Array* texcoords = new osg::Vec2Array;
	for (unsigned i = 0; i < sizeof(textureVertices); ++i)
	{
		texcoords->push_back(osg::Vec2(textureVertices[i][0], textureVertices[i][1]));
	}
	quadGeometry->setTexCoordArray(0,texcoords);

	osg::Vec3Array *normals = new osg::Vec3Array;
	for (unsigned i = 0; i < sizeof(normals); ++i)
	{
		for (int j = 0; j < 4; ++j)
		{
			normals->push_back(osg::Vec3(normalsArray[i][0], normalsArray[i][1], normalsArray[i][2]));
		}
	}
	quadGeometry->setNormalArray(normals, osg::Array::BIND_PER_VERTEX);
	int first = 0;
	for (unsigned i = 0; i < 6; ++i)
	{
		osg::DrawArrays *vertexIndices = new osg::DrawArrays(osg::PrimitiveSet::QUADS, first, 4);
		first += 4;
		quadGeometry->addPrimitiveSet(vertexIndices);
	}

	osg::Texture2D *texture2D = new osg::Texture2D;
	texture2D->setImage(image);
	texture2D->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
	texture2D->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);

	quadGeometry->getOrCreateStateSet()->setTextureAttributeAndModes(0, texture2D);
	quadGeometry->getOrCreateStateSet()->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

	osg::Geode *quadGeode = new osg::Geode;
	quadGeode->addDrawable(quadGeometry);

	return quadGeode;
}

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
//操作Raw纹理

osg::Image*  ReadTextureData ( char *filename, unsigned int width, unsigned int height, unsigned int pixelPerBytes)
{
	//NeHe中使用256x256大小的图片,并且每个像素的字节数是4
	//因此这里在分配内存是使用RGBA都是8位的方式(1个字节)
	//正好是4个字节
	osg::Image *buffer = new osg::Image;
	buffer->allocateImage(width, height, 1, GL_RGBA, GL_UNSIGNED_BYTE);
	int bytesPerPixel = buffer->getPixelSizeInBits() / 8;

	FILE *f;
	int i,j,k,done=0;
	int stride = buffer->s() * buffer->getPixelSizeInBits() / 8;				// Size Of A Row (Width * Bytes Per Pixel)
	unsigned char *p = NULL;

	f = fopen(filename, "rb");									// Open "filename" For Reading Bytes
	if( f != NULL )												// If File Exists
	{
		for( i = buffer->t()-1; i >= 0 ; i-- )				// Loop Through Height (Bottoms Up - Flip Image)
		{
			p = buffer->data() + (i * stride );					// 
			for ( j = 0; j < buffer->s() ; j++ )				// Loop Through Width
			{
				for ( k = 0 ; k < buffer->getPixelSizeInBits() / 8-1 ; k++, p++, done++ )
				{
					*p = fgetc(f);								// Read Value From File And Store In Memory
				}
				*p = 255; p++;									// Store 255 In Alpha Channel And Increase Pointer
			}
		}
		fclose(f);												// Close The File
	}
	return buffer;												// Returns Number Of Bytes Read In
}


void Blit( osg::Image *src, osg::Image *dst, 
		  int src_xstart, int src_ystart, int src_width, int src_height,
		  int dst_xstart, int dst_ystart, int blend, int alpha)
{
	int i,j,k;
	unsigned char *s, *d;

	// Clamp Alpha If Value Is Out Of Range
	if( alpha > 255 ) alpha = 255;
	if( alpha < 0 ) alpha = 0;

	// Check For Incorrect Blend Flag Values
	if( blend < 0 ) blend = 0;
	if( blend > 1 ) blend = 1;

	d = dst->data() + (dst_ystart * dst->s() * dst->getPixelSizeInBits() / 8);    // Start Row - dst (Row * Width In Pixels * Bytes Per Pixel)
	s = src->data() + (src_ystart * src->s() * src->getPixelSizeInBits() / 8);    // Start Row - src (Row * Width In Pixels * Bytes Per Pixel)

	for (i = 0 ; i < src_height ; i++ )							// Height Loop
	{
		s = s + (src_xstart * src->getPixelSizeInBits() / 8);						// Move Through Src Data By Bytes Per Pixel
		d = d + (dst_xstart * dst->getPixelSizeInBits() / 8);						// Move Through Dst Data By Bytes Per Pixel
		for (j = 0 ; j < src_width ; j++ )						// Width Loop
		{
			for( k = 0 ; k < src->getPixelSizeInBits()/8 ; k++, d++, s++)		// "n" Bytes At A Time
			{
				if (blend)										// If Blending Is On
					*d = ( (*s * alpha) + (*d * (255-alpha)) ) >> 8; // Multiply Src Data*alpha Add Dst Data*(255-alpha)
				else											// Keep in 0-255 Range With >> 8
					*d = *s;									// No Blending Just Do A Straight Copy
			}
		}
		d = d + (dst->s() - (src_width + dst_xstart))*dst->getPixelSizeInBits()/8;	// Add End Of Row */
		s = s + (src->s() - (src_width + src_xstart))*src->getPixelSizeInBits()/8;	// Add End Of Row */
	}
}


osg::Image*	createTextureImage()
{
	osg::Image *src = ReadTextureData("Data/GL.raw",  256, 256, 32);
	osg::Image *dst = ReadTextureData("Data/Monitor.raw", 256, 256, 32);
	
	Blit(src,dst,127,127,128,128,64,64,1,127);
	return dst;
}


//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////



class ViewerWidget : public QWidget, public osgViewer::Viewer
{
public:
	ViewerWidget(osg::Node *scene = NULL)
	{
		QWidget* renderWidget = getRenderWidget( createGraphicsWindow(0,0,100,100), scene);

		QVBoxLayout* layout = new QVBoxLayout;
		layout->addWidget(renderWidget);
		layout->setContentsMargins(0, 0, 0, 1);
		setLayout( layout );

		connect( &_timer, SIGNAL(timeout()), this, SLOT(update()) );
		_timer.start( 10 );
	}

	QWidget* getRenderWidget( osgQt::GraphicsWindowQt* gw, osg::Node* scene )
	{
		osg::Camera* camera = this->getCamera();
		camera->setGraphicsContext( gw );

		const osg::GraphicsContext::Traits* traits = gw->getTraits();

		camera->setClearColor( osg::Vec4(0.0, 0.0, 0.0, 1.0) );
		camera->setViewport( new osg::Viewport(0, 0, traits->width, traits->height) );
		camera->setProjectionMatrixAsPerspective(45.0f, static_cast<double>(traits->width)/static_cast<double>(traits->height), 0.1f, 100.0f );
		camera->setViewMatrixAsLookAt(osg::Vec3d(0, 0, 1), osg::Vec3d(0, 0, 0), osg::Vec3d(0, 1, 0));

		this->setSceneData( scene );

		return gw->getGLWidget();
	}

	osgQt::GraphicsWindowQt* createGraphicsWindow( int x, int y, int w, int h, const std::string& name="", bool windowDecoration=false )
	{
		osg::DisplaySettings* ds = osg::DisplaySettings::instance().get();
		osg::ref_ptr<osg::GraphicsContext::Traits> traits = new osg::GraphicsContext::Traits;
		traits->windowName = name;
		traits->windowDecoration = windowDecoration;
		traits->x = x;
		traits->y = y;
		traits->width = w;
		traits->height = h;
		traits->doubleBuffer = true;
		traits->alpha = ds->getMinimumNumAlphaBits();
		traits->stencil = ds->getMinimumNumStencilBits();
		traits->sampleBuffers = ds->getMultiSamples();
		traits->samples = ds->getNumMultiSamples();

		return new osgQt::GraphicsWindowQt(traits.get());
	}

	virtual void paintEvent( QPaintEvent* event )
	{ 
		frame(); 
	}

protected:

	QTimer _timer;
};



osg::Node*	buildScene()
{
	osg::Group *root = new osg::Group;

	osg::MatrixTransform *quadMT = new osg::MatrixTransform;
	quadMT->setMatrix(osg::Matrix::translate(0.0, 0.0, -5.0));

	osg::AnimationPathCallback *quadAnimationCallbackX = 
		new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Vec3(1, 0, 0), 2.5);

	osg::AnimationPathCallback *quadAnimationCallbackY = 
		new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Vec3(0, 1, 0), 1.5);

	osg::AnimationPathCallback *quadAnimationCallbackZ = 
		new osg::AnimationPathCallback(osg::Vec3d(0, 0, 0), osg::Vec3(0, 0, 1), 0.5);

	osg::MatrixTransform *quadXRotMT = new osg::MatrixTransform;
	quadXRotMT->setUpdateCallback(quadAnimationCallbackX);

	osg::MatrixTransform *quadYRotMT = new osg::MatrixTransform;
	quadYRotMT->setUpdateCallback(quadAnimationCallbackY);

	osg::MatrixTransform *quadZRotMT = new osg::MatrixTransform;
	quadZRotMT->setUpdateCallback(quadAnimationCallbackZ);

	quadMT->addChild(quadXRotMT);
	quadXRotMT->addChild(quadYRotMT);
	quadYRotMT->addChild(quadZRotMT);

	osg::Image *image = createTextureImage();
	quadZRotMT->addChild(createCubeGeode(image));

	root->addChild(quadMT);
	return root;
}


int main( int argc, char** argv )
{
	QApplication app(argc, argv);
	ViewerWidget* viewWidget = new ViewerWidget(buildScene());
	viewWidget->setGeometry( 100, 100, 640, 480 );
	viewWidget->show();
	return app.exec();
}

C++/MFC中实现OSG以及OSG文件的读取 本程序实现了在MFC中显示我们的OSG模型以及读取我们的OSG模型,并显示在视图类中。 立即下载

相关推荐

dotnet语言调用openscenegraph

dotnet openscenegraph,附带vs2010工程文件

osg::Image和QImage互相转换

osg::Image 转QImage const uchar *qImageBuffer = (const uchar*)myOsgImage->data(); QImage img(qImageBuffer, myOsgImage->s(), myOsgImage->t(), myOsgImage->getRowSizeInBytes(), QImage::Format_RGB888); QImage 转 osg::Image // To Do ...

【星天阁】 2304

OSG中jpg格式图片的加载测试

若运行程序后能成功显示一个方盒子,并且上面有像生锈一样的贴图则表示测试成功。

OSG-渲染状态、纹理映射(一)

osg(OpenSceneGraph) 渲染状态、纹理映射 osg::StateSet 类 osg::StateAttribute 渲染状态(ClipeNode) 纹理映射(Texture2D、Texture3D) 多重纹理映射

liangfei868的博客 2938

从Si3N4到SiNx:一文搞懂芯片制造中氮化硅的化学式玄机(附工艺参数影响)

本文深入探讨了芯片制造中氮化硅(SiNx)化学式的调控艺术,揭示了从Si3N4到SiNx的转变如何影响材料性能。通过分析PECVD和PVD工艺参数对x值的精确调控,以及x值对电学和机械性能的影响,为半导体制造提供了实用的工艺优化策略。

weixin_30776273的博客 194

Zabbix 简介、优缺点、基础原理

(8条消息) Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型 --------------------------------------------------------------------------------------------------------------------------- 一、Zabbix 简介 Zabbix是由A...

weixin_50196615的博客 2037

osg Image 保存图片测试

// test for read image osg::ref_ptr&lt;osg::Texture2D&gt; texture2d = new osg::Texture2D; osg::ref_ptr&lt;osg::Image&gt; img = new osg::Image; img=osgDB::readImageFile("C:\\Users\\Public\\Pictures\\Sa...

kasteluo的专栏 4121

从仿真到实体:基于Isaac Gym的X20机械狗与Kinova Gen3 Lite机械臂全身协同控制实战

本文详细介绍了基于Isaac Gym仿真平台,实现云深处X20机械狗与Kinova Gen3 Lite机械臂全身协同控制的完整实战流程。内容涵盖环境搭建、模型适配、分阶段训练策略、域随机化技巧,以及最终将训练好的策略安全部署到实体机器人的关键步骤,为复杂机器人系统的仿真到实体迁移提供了宝贵经验。

yhn45678901的博客 489

创建带Mipmap的osg::Image

我们常用osgDB::readImage或者osg::Image::allocateImage()方式创建Image对象, 跟深一步的带Mipmap的Image怎样创建呢? 偶然在分析osgParticle::PrecipitationEffect.cpp中的代码时有所收获 不废话,直接贴代码 以下这段代码是申请一个带mipmap的宽高相同(size)的Image的方法,image的总大小t...

weixin_33895604的博客 1829

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 529

【读代码】TradingAgents:基于多智能体LLM的金融交易框架深度解析

TradingAgents是由Tauric Research团队开源的创新型金融交易框架,其核心思想是通过多智能体协作系统模拟专业交易机构的决策流程。项目采用模块化设计,整合了LLM、实时数据分析、风险控制等组件,实现了从市场分析到交易执行的完整闭环。

kakaZhui的博客 2004

OpenSceneGraph实现的NeHe OpenGL教程 - 第二十九课

简介 这节课NeHe课程教我们如何读取一张raw格式的图片,并且对两张raw格式图片进行处理生成了一张纹理图片。整个过程并不是十分复杂,文中大部分内容涉及到图片数据的操作。 实现 首先我们创建需要显示的立方体: [cpp] view plain copy osg::Geode* createCubeGeode(osg

ALLENJIAO的专栏 686

别再用图片水印了!5种你可能不知道的文本隐写术实战

本文介绍了5种高效的文本隐写术,帮助创作者在不影响内容可读性的情况下嵌入版权信息。从零宽度字符到同形字替换,再到标点符号变形和行尾空格编码,这些技术为数字内容提供了轻量级版权保护方案,特别适用于社交媒体和电子合同等场景。

k8l9m0n的博客 225

用OpenSceneGraph实现的NeHe OpenGL教程 - 第一课

简介 OpenSceneGraph是一个开放源码,跨平台的图形开发包,它为诸如飞行器仿真,游戏,虚拟现实,科学计算可视化这样的高性能图形应用程序开发而设计。它基于场景图的概念,它提供一个在OpenGL之上的面向对象的框架,从而能把开发者从实现和优化底层图形的调用中解脱出来,并且它为图形应用程序的快速开发提供很多附加的实用工具。 NeHe教程是目前针对初学者来说最

Frank的专栏 1万+

1个PID回路如何连接2个执行器(算法和代码)

我们先看下位置型PID的控制框图:2、PID是基于error的控制 所以反馈信号跳动、干扰非常大的话,对PID的闭环控制影响是非常大的,所以对于反馈信号、一定要抗干扰和滤波处理。3、下图是增量型PID的控制框图:4、一个PID输出回路如何连接2个执行器?(有些系统会设置热阀和冷阀才能满足控制要求)。

RXXW_Dor的博客 1811

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十四课

简介 NeHe教程在这节课中向我们介绍了如何读取显卡支持的OpenGL的扩展,如何使用Targa(TGA)图像文件作为纹理,以及如何利用OpenGL的剪裁区域来滚动屏幕文字。 在OpenInventor中没有相关的函数来获取OpenGL的扩展信息,我们只能通过直接调用OpenGL来获得这些信息。OpenInventor的纹理节点自动支持使用Targa(TGA)图像文件作为纹理,所以我们

Frank的专栏 2317

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

用OpenSceneGraph实现的NeHe OpenGL教程 - 第十一课

简介 这节课我们将创建一个以正弦波方式飘动的旗帜。本课所用到的知识在前面的课程中都有讲解,并没有什么新的内容 实现 首先创建我们的场景,关于旗帜的顶点坐标在NeHe教程中已经有非常详细的介绍,本文就不在赘述了。 float points[45][45][3]; for(int x=0; x<45; x++) { for(int y=0; y<45; y++

Frank的专栏 1579

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

OpenSceneGraph实现的NeHe OpenGL教程 - 第二十四课

简介 NeHe教程在这节课中向我们介绍了如何读取显卡支持的OpenGL的扩展,如何使用Targa(TGA)图像文件作为纹理,以及如何利用OpenGL的剪裁区域来滚动屏幕文字。osg支持tga格式的文件读取,因此不需要像NeHe课程那样解析TGA格式,有兴趣的读者可以查看osgPlugins库中的ReaderWriterTGA.cpp文件了解osg是如何读取TGA图片格式的。

ALLENJIAO的专栏 1110

用OpenSceneGraph实现的NeHe OpenGL教程 - 第三十八课

简介 这节课NeHe教我们怎样把图片

Frank的专栏 2303

用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十五课

简介 NeHe教程在这节课中向我们介绍了如何从文件加载3D模型,并且平滑的从一个模型变换为另一个模型。两个模型之间平滑过渡的算法其实是很简单的,首先我们要保证两个模型要有相同数目的顶点,然后我们分别计算每个点从一个模型移动到另外一个模型时,中间的位置数据。我们将这个过程显示出来就会产生模型平滑过渡的效果。

Frank的专栏 1747

OpenSceneGraph实现的NeHe OpenGL教程 - 第十一课

简介 这节课我们将创建一个以正弦波方式飘动的旗帜。本课所用到的知识在前面的课程中都有讲解,并没有什么新的内容 实现 首先创建我们的场景,关于旗帜的顶点坐标在NeHe教程中已经有非常详细的介绍,本文就不在赘述了。 [cpp] view plain copy   float points[45][45][3];

ALLENJIAO的专栏 717

用OpenSceneGraph实现的NeHe OpenGL教程 - 第十二课

简介 本课NeHe教程主要是使用了OpenGL中的显示列表。OpenGL的显示列表是加速OpenGL性能的一种重要的手段。OpenGl的几何体绘制方法主要包括立即模式、顶点数组、显示列表和VBO。在OSG中显示列表是大部分OSG程序所使用的默认绘制优化行为,因此不需要我们去像OpenGL那样进行设置。 实现 首先创建整个场景,本课中我使用了OSG中预定义的几种基本形体,(os

Frank的专栏 7883

OpenSceneGraph实现的NeHe OpenGL教程 - 第一课

目录(?)[-] 简介创建一个osg窗口 简介 OpenSceneGraph是一个开放源码,跨平台的图形开发包,它为诸如飞行器仿真,游戏,虚拟现实,科学计算可视化这样的高性能图形应用程序开发而设计。它基于场景图的概念,它提供一个在OpenGL之上的面向对象的框架,从而能把开发者从实现和优化底层图形的调用中解脱出来,并且它为图形应用程序的快速

ALLENJIAO的专栏 1201

OpenSceneGraph实现的NeHe OpenGL教程 - 第三十二课

简介 本节课NeHe课程主要想我们介绍了OpenGL中的拾取(Selection)的方式来和场景中的物体进行交换,在OSG中并没有封装OpenGL中的拾取方式,而是用了更高效的一种方式来实现与场景中的模型进行求交的操作,对于OSG这样处理的原因可以参考OSG中的这个MailList: New to OSG, some questions (selection buffer, para

ALLENJIAO的专栏 541

OpenSceneGraph实现的NeHe OpenGL教程 - 第三十课

简介 这节课NeHe课程实现了在场景中进行碰撞检测以及简单的物理作用(碰撞之后的反弹),碰撞检测三维图形学中一个比较高级的主题,本课只涉及了简单的规则几何体之间的碰撞检测,更复杂的实例需要读者去更深入的学习。 实现 本课中碰撞检测的算法包括线与平面的求交检测、线与圆柱体的求交、以及球体之间的碰撞检测,这些碰撞检测的原理可以参考NeHe中的介绍。 具体实现在如下几

ALLENJIAO的专栏 722
上一篇: 用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十八课
下一篇: 用OpenSceneGraph实现的NeHe OpenGL教程 - 第二十七课
csxiaoshui
博客等级 码龄16年 873粉丝 158原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值