Kinect for Windows SDK开发入门(十五):进阶指引 下

Kinect for Windows SDK开发入门(十五):进阶指引 下
Kinect for Windows SDK开发入门(十五):进阶指引 下

[译]Kinect for Windows SDK开发入门(十五):进阶指引下

上一篇文章介绍了Kinect for Windows SDK进阶开发需要了解的一些内容,包括影像处理Coding4Fun Kinect工具类库以及如何建立自己的扩展方法类库来方便开发,接下来介绍了利用Kinect进行近距离探测的一些方法,限于篇幅原因,仅仅介绍了近距离探测的三种方式。

本文接上文将继续介绍近距离探测中如何探测运动,如何获取并保存产生的影像数据;然后将会介绍如何进行脸部识别,以及介绍全息图(Holograme)的一些知识,最后介绍了一些值得关注的类库和项目。

2.4 运动识别

目前,利用运动识别(motion detection)来进行近景识别是最有意思的一种方式。实现运动识别的基本原理是设置一个起始的基准RGB图像,然后将从摄像头获取的每一帧影像和这个基准图像进行比较。如果发现了差异,我们可以认为有东西进入到了摄像头的视野范围。

不难看出这种策略是有缺陷的。在现实生活中,物体是运动的。在一个房间里,某个人可能会轻微移动家具。在户外,一辆汽车可能会启动,风可能会将一些小树吹的摇摇晃晃。在这些场景中,尽然没有连续的移动动作,但是物体的状态还是发生了变化,依据之前的策略,系统会判断错误。因此,在这些情况下,我们需要间歇性的更改基准图像才能解决这一问题。

与我们之前遇到的问题相比,完成这些任务看起来需要更强大的图像分析处理工具。幸好,之前介绍的开源OpenCV库提供了某种复杂的实时图像处理操作的能力。OpenCV是Intel公司在1999年发起的一个项目,它将一些高级的视觉研究成果加入到OpenCV库中并开源贡献给了全世界。2008年,一个名为Willow Garage的科技孵化公司负责对该项目的更新和维护。几乎同时EmguCV项目开始发起,他提供了对OpenCV的.Net包装,使得我们在.Net环境下能够使用OpenCV库中的函数。下面我们将使用EmguCV来完成运动检测以及后面的几个演示项目。

EmguCV项目的官方网站为https://www.360docs.net/doc/4715622754.html,/wiki/index.php/Main_Page实际的源代码和安装包放在

SourceForge(https://www.360docs.net/doc/4715622754.html,/projects/emgucv/files/ )上。本文使用的Emgu版本为2.3.0。Emgu的安装过程很简单直观,只需要点击下载好的可执行文件即可。不过有一点需要注意的是EmguCV似乎在x86架构的计算机上运行的最好。如果在64

位的机器上开发,最好为Emgu库的目标平台指定为x86,如下图所示(你也可以在官网上下载源码然后自己在x64平台上编译)。要使用Emgu库,需要添加对下面三个dll的引用:Emgu.CV、Emgu.CV.UI以及Emgu.Util。这些dll可以在Emgu的安装目录下面找到,在我的机器上该路径是:C:\Emgu\emgucv-windows-x86 2.3.0.1416\bin\。

因为Emgu是对C++类库的一个.Net包装,所以需要在dll所在的目录放一些额外的非托管的dll,使得Emgu能够找到这些dll 进行处理。Emgu在应用程序的执行目录查找这些dll。如果在debug模式下面,则在bin/Debug目录下面查找。在release模式下,则在bin/Release目录下面。共有11个非托管的C++ dll需要放置在相应目录下面,他们是opencv_calib3d231.dll,

opencv_conrib231.dll, opencv_core231.dll,opencv_features2d231.dll, opencv_ffmpeg.dll, opencv_highgui231.dll,

opencv_imgproc231.dll,opencv_legacy231.dll, opencv_ml231.dll, opencv_objectdetect231.dll, and

opencv_video231.dll。这些dll可以在Emgu的安装目录下面找到。为了方便,可以拷贝所有以opencv_开头的dll。

就像之前文章中所讨论的,通过其他的工具来进行Kinect开发可能会使得代码变得有些混乱。但是有时候,通过添加OpenCV和Emgu的图像处理功能,能够开发出一些比较有意思的应用程序。例如,我们能够实现一个真正的运动识别解决方案。

在我们的扩展方法库中,我们需要一些额外的扩展帮助方法。上一篇文章讨论过,每一种类库都有其自己能够理解的核心图像类型。在Emgu中,这个核心的图像类型是泛型的Image类型,它实现了Emgu.CV.IImage接口。下面的代码展现了一些我们熟悉的影像数据格式和Emgu特定的影像格式之间转换的扩展方法。新建一个名为EmguExtensions.cs的静态类,并将其命名空间改为ImageManipulationMethods,和我们之前ImageExtensions类的命名空间相同。我们可以将所有的的扩展方法放到同一个命名空间中。这个类负责三种不同影像数据类型之间的转换:从Microsoft.Kinect.ColorFrameImage到

Emgu.CV.Image,从System.Drawing.Bitmap到Emgu.CV.Image以及

Emgu.CV.Image到System.Windows.Media.Imaging.BitmapSource之间的转换。

namespace ImageManipulationExtensionMethods

{

public static class EmguImageExtensions

{

public static Image ToOpenCVImage(this ColorImageFrame image) where TColor : struct, IColor

where TDepth : new()

{

var bitmap = image.ToBitmap();

return new Image(bitmap);

}

public static Image ToOpenCVImage(this Bitmap bitmap)

where TColor : struct, IColor

where TDepth : new()

{

return new Image(bitmap);

}

public static System.Windows.Media.Imaging.BitmapSource ToBitmapSource(this IImage image)

{

var source = image.Bitmap.ToBitmapSource();

return source;

}

}

}

使用Emgu类库来实现运动识别,我们将用到在之前文章中讲到的“拉数据”(polling)模型而不是基于事件的机制来获取数据。这是因为图像处理非常消耗系统计算和内存资源,我们希望能够调节处理的频率,而这只能通过“拉数据”这种模式来实现。需要指出的是本例子只是演示如何进行运动识别,所以注重的是代码的可读性,而不是性能,大家看了理解了之后可以对其进行改进。

因为彩色影像数据流用来更新Image控件数据源,我们使用深度影像数据流来进行运动识别。需要指出的是,我们所有用于运动追踪的数据都是通过深度影像数据流提供的。如前面文章讨论,CompositionTarget.Rendering事件通常是用来进行从彩色影像数据流中“拉”数据。但是对于深度影像数据流,我们将会创建一个BackgroundWorker对象来对深度影像数据流进行处理。如下代码所示,

BackgroundWorker对象将会调用Pulse方法来“拉”取深度影像数据,并执行一些消耗计算资源的处理。当BackgroundWorker完成了一个循环,接着从深度影像数据流中“拉”取下一幅影像继续处理。代码中声明了两个名为MotionHistory和IBGFGDetector的Emgu成员变量。这两个变量一起使用,通过相互比较来不断更新基准影像来探测运动。

KinectSensor _kinectSensor;

private MotionHistory _motionHistory;

private IBGFGDetector _forgroundDetector;

bool _isTracking = false;

public MainWindow()

{

InitializeComponent();

this.Unloaded += delegate

{

_kinectSensor.ColorStream.Disable();

};

this.Loaded += delegate

{

_motionHistory = new MotionHistory(

1.0, //in seconds, the duration of motion history you wants to keep

0.05, //in seconds, parameter for cvCalcMotionGradient

0.5); //in seconds, parameter for cvCalcMotionGradient

_kinectSensor = KinectSensor.KinectSensors[0];

_kinectSensor.ColorStream.Enable();

_kinectSensor.Start();

BackgroundWorker bw = new BackgroundWorker();

bw.DoWork += (a, b) => Pulse();

bw.RunWorkerCompleted += (c, d) => bw.RunWorkerAsync();

bw.RunWorkerAsync();

};

}

下面的代码是执行图象处理来进行运动识别的关键部分。代码在Emgu的示例代码的基础上进行了一些修改。Pluse方法中的第一个任务是将彩色影像数据流产生的ColorImageFrame对象转换到Emgu中能处理的图象数据类型。_forgroundDetector对象被用来更新_motionHistory对象,他是持续更新的基准影像的容器。_forgroundDetector还被用来与基准影像进行比较,以判断是否发生变化。当从当前彩色影像数据流中获取到的影像和基准影像有不同时,创建一个影像来反映这两张图片之间的差异。然后将这张影像转换为一系列更小的图片,然后对运动识别进行分解。我们遍历这一些列运动的图像来看他们是否超过我们设定的运动识别的阈值。如果这些运动很明显,我们就在界面上显示视频影像,否则什么都不显示。

private void Pulse()

{

using (ColorImageFrame imageFrame = _kinectSensor.ColorStream.OpenNextFrame(200))

{

if (imageFrame == null)

return;

using (Image image = imageFrame.ToOpenCVImage())

using (MemStorage storage = new MemStorage()) //create storage for motion components

{

if (_forgroundDetector == null)

{

_forgroundDetector = new BGStatModel(image

, Emgu.CV.CvEnum.BG_STAT_TYPE.GAUSSIAN_BG_MODEL);

}

_forgroundDetector.Update(image);

//update the motion history

_motionHistory.Update(_forgroundDetector.ForgroundMask);

//get a copy of the motion mask and enhance its color

double[] minValues, maxValues;

System.Drawing.Point[] minLoc, maxLoc;

_motionHistory.Mask.MinMax(out minValues, out maxValues

, out minLoc, out maxLoc);

Image motionMask = _motionHistory.Mask

.Mul(255.0 / maxValues[0]);

//create the motion image

Image motionImage = new Image(motionMask.Size);

motionImage[0] = motionMask;

//Threshold to define a motion area

//reduce the value to detect smaller motion

double minArea = 100;

storage.Clear(); //clear the storage

Seq motionComponents = _motionHistory.GetMotionComponents(storage);

bool isMotionDetected = false;

//iterate through each of the motion component

for (int c = 0; c < motionComponents.Count(); c++)

{

MCvConnectedComp comp = motionComponents[c];

//reject the components that have small area;

if (comp.area < minArea) continue;

OnDetection();

isMotionDetected = true;

break;

}

if (isMotionDetected == false)

{

OnDetectionStopped();

this.Dispatcher.Invoke(new Action(() => rgbImage.Source = null));

return;

}

this.Dispatcher.Invoke(

new Action(() => rgbImage.Source = imageFrame.ToBitmapSource())

);

}

}

}

private void OnDetection()

{

if (!_isTracking)

_isTracking = true;

}

private void OnDetectionStopped()

{

_isTracking = false;

}

2.5 保存视频影像

相比直接将影像显示出来,如果能将录制到的影像保存到硬盘上就好了。但是,影像录制,是需要一定的技巧,在网上可以看到很多例子演示如何将Kinect获取到的影像以图片的形式保存到本地,前面的博文也介绍了这一点,但是你很少看到如何演示将一个完整的视频影像保存到本地硬盘上。幸运的是Emgu类库提供了一个VideoWriter类型来帮助我们实现这一功能。

下面的方法展示了Record和StopRecording方法如何将Kinect彩色影像摄像头产生的数据流保存到avi文件中。我们在D盘创建了一个vids文件夹,要写入avi文件之前需要保证该文件夹存在。当录制开始时,我们使用当前时间作为文件名创建一个文件,同时我们创建一个list对象来保存从彩色影像数据流中获取到的一帧帧影像。当停止录制时,将list对象中的一些列Emgu影像最为参数传入到VideoWriter对象来将这些影像转为为avi格式并保存到硬盘上。这部分代码没有对avi编码,所以产生的avi文件非常大。我们可以对avi文件进行编码压缩然后保存到硬盘上,但是这样会加大计算机的运算开销。

string _baseDirectory = @"d:\vids\";

string _fileName;

List> _videoArray = new List>();

void Record(ColorImageFrame image)

{

if (!_isRecording)

{

_fileName = string.Format("{0}{1}{2}", _baseDirectory, DateTime.Now.ToString("MMddyyyyHmmss"), ".avi");

_isRecording = true;

}

_videoArray.Add(image.ToOpenCVImage());

}

void StopRecording()

{

if (!_isRecording)

return;

CvInvoke.CV_FOURCC('P', 'I', 'M', '1'); //= MPEG-1 codec

CvInvoke.CV_FOURCC('M', 'J', 'P', 'G'); //= motion-jpeg codec (does not work well)

CvInvoke.CV_FOURCC('M', 'P', '4', '2');//= MPEG-4.2 codec

CvInvoke.CV_FOURCC('D', 'I', 'V', '3'); //= MPEG-4.3 codec

CvInvoke.CV_FOURCC('D', 'I', 'V', 'X'); //= MPEG-4 codec

CvInvoke.CV_FOURCC('U', '2', '6', '3'); //= H263 codec

CvInvoke.CV_FOURCC('I', '2', '6', '3'); //= H263I codec

CvInvoke.CV_FOURCC('F', 'L', 'V', '1'); //= FLV1 codec

using (VideoWriter vw = new VideoWriter(_fileName, 0, 30, 640, 480, true))

{

for (int i = 0; i < _videoArray.Count(); i++)

vw.WriteFrame(_videoArray[i]);

}

_fileName = string.Empty;

_videoArray.Clear();

_isRecording = false;

}

本例中,运动识别最后一点代码是简单的修改从彩色影像数据流“拉”取数据部分的逻辑。使得不仅将在探测到运动时将影像显示到UI 界面上,同时也调用Record方法。当没有探测到运动时,UI界面上什么也不显示,并调用StopRecording方法。这部分代码也通过演示如何分析原始数据流,并探测Kinect视野中常用的变化给出了一个原型,这些变化信息可能会提供很有用的信息。

3.面部识别

EmguCV库也能用来进行面部识别(face identify)。实际的面部识别,就是将一张图像上的人物的脸部识别出来,这是个很复杂的过程,具体过程我们这里不讨论。对一幅影像进行处理来找到包含脸部的那一部分是我们进行面部识别的第一个步骤。

大多数面部识别软件或多或少都是基于类哈尔特征(Haar-like feature)来进行识别的,他是哈尔小波(Haar wavelets)的一个应用,通过一些列的数学方法来定义一个矩形形状。2001年,Paul Viola和Michael Jones发表了Viola-Jones物体识别方法的框架,该框架基于识别Haar-like特征进行的。该方法和其他面部识别算法相比,所需要的运算量较小。所以这部分方法整合进了OpenCV库。

OpenCV和EmguCV中的面部识别是建立在一系列定义好了的识别规则基础之上的,规则以XML文件的形式存储,最初格式是由Rainer Lienhart定义的。在Emgu示例代码中该文件名为haarcascade_frontalface_default.xml。当然还有一系列的可以识别人物眼睛的规则在这些示例文件中,本例子中没有用到。

要使用Kinect SDK来构造一个简单的面部识别程序,首先创建一个名为KinectFaceFinder的WPF应用程序,然后引用Microsoft.Kinect, System.Drawing, Emgu.CV, Emgu.CV.UI, 和Emgu.Util. 并将所有以opencv_*开头的dll拷贝到程序编译的目录下面。最后将之前写好的两个扩展方法类库ImageExtension.cs和EmguImageExtensions.cs拷贝到项目中。项目的前端代码和之前的一样。只是在root根节点下面添加了一个名为rgbImage的Image控件。

后台代码中,首先在MainWindow的构造函数中实例化KinectSensor对象然后配置彩色影像数据。因为我们使用EmguCV库来进行影像处理,所以我们可以直接使用RGB影像而不是深度影像。如下代码所示,代码中使用了BackgroundWork对象来从彩色影像数据流中拉取数据。每一次处理完了之后,拉取下一幅,然后继续处理。

上面代码中,Pluse方法处理BackgroundWork的DoWork事件,这个方法是这个例子的主要方法。下面的代码简单的对Emgu 提供的示例代码进行了一点修改。我们基于提供的脸部识别规则文件实例化了一个新的HaarCascade类。然后我们从彩色影像数据流获取了一幅影像,然后将他转换为了Emgu能够处理的格式。然后对图像进行灰度拉伸然后提高对比度来使得脸部识别更加容易。Haar 识别准则应用到图像上去来产生一些列的结构来指示哪个地方是识别出来的脸部。处理完的影像然后转换为BitmapSource类型,最后后复制给Image控件。因为WPF线程的工作方式,我们使用Dispatcher对象来在正确的线程中给Image控件赋值。

运行程序可以看到,蓝色方框内就是识别出来的人的脸部,这种识别精度比简单的使用骨骼追踪来识别出人的头部,然后识别出脸部要精确的多。

既然facesDetected包含了识别出来的脸部的位置信息,我们能够使用脸部识别算法来建立一个现实增强应用。我们可以将一个图片放到脸部位置,而不是用矩形框来显示。下面的代码显示了我们如何使用一个图片替代蓝色的矩形框。

运行程序,代码效果如下。这个形象来自动漫《攻克机动队》(Ghost in the Shell: Stand Alone Complex),讲述的是在一个在未来全面监控下的社会,一个黑客,每当他的脸被监控的摄像头捕获到的时候,就在上面叠加一个笑脸。因为脸部识别的算法很好,所以这张笑脸图像,和动漫中的形象很像,他会随着脸部的大小和运动而变化。

4.全息图

Kinect的另一个有趣的应用是伪全息图(pseudo-hologram)。3D图像可以根据人物在Kinect前面的各种位置进行倾斜和移动。如果方法够好,可以营造出3D控件中3D图像的效果,这样可以用来进行三维展示。因为WPF具有3D矢量绘图的功能。所以这一点使用WPF和Kinect比较容易实现。下图显示了一个可以根据观察者位置进行旋转和缩放的3D立方体。但是,只有一个观察者时才能运行。

这个效果可以追溯到Johnny Chung Lee在2008 年TED演讲中对Wii Remote的破解演示。后来Johnny Lee在Kinect项目组工作了一段时间,并发起了AdaFruit竞赛,来为破解Kinect编写驱动。在Lee的实现中,Wii Remote的红外传感器放置在一对眼镜上。能够追踪戴上该眼镜的人的运动。界面上会显示一个复杂的3D图像,该图像可以根据这副眼镜的运动创建全息图的效果。

使用Kinect SDK实现这一效果非常简单。Kinect已经在骨骼数据中提供了坐标点的以米为单位的X,Y和Z的值。比较困难的部分是,如何使用XAML创建一个3D矢量模型。在本例子中,我使用Blender这个工具,他是一个开源的3D模型建造工具,可以在https://www.360docs.net/doc/4715622754.html,网站上下载到。但是,要将3D网格曲面导出为XAML,需要为Blender安装一个插件。我使用的Blender版本是2.6,本身有这么一个功能,虽然有些限制。Dan Lehenbauer在CodePlex上也有针对Blender开发的导出Xmal的插件,但是只能在老版本的Blender上使用。

WPF中3D矢量图像的核心概念是Viewport3D对象。Viewport3D对象可以被认为是一个3D空间,在这个空间内,我们可以放置对象,光源和照相机。为了演示一个3D效果,我们创建一个新的名为KinectHologram项目,并添加对Microsoft.Kinect.dll的引用。在MainWindow的UI界面中,在root Grid对象下面创建一个新的ViewPort3D元素。下面的代码显示了一个立方体的代码。代码中唯一和Kinect进行交互的是Viewport3D照相机对象。因此很有必要对照相机对象进行命名。

Positions="1.000000,1.000000,-1.000000 1.000000,-1.000000,-1.000000

-1.000000,-1.000000,-1.000000 -1.000000,1.000000,-1.000000 1.000000,0.999999,1.000000

-1.000000,1.000000,1.000000 -1.000000,-1.000000,1.000000 0.999999,-1.000001,1.000000

1.000000,1.000000,-1.000000 1.000000,0.999999,1.000000 0.999999,-1.000001,1.000000

1.000000,-1.000000,-1.000000 1.000000,-1.000000,-1.000000 0.999999,-1.000001,1.000000

-1.000000,-1.000000,1.000000 -1.000000,-1.000000,-1.000000 -1.000000,-1.000000,-1.000000

-1.000000,-1.000000,1.000000 -1.000000,1.000000,1.000000 -1.000000,1.000000,-1.000000

1.000000,0.999999,1.000000 1.000000,1.000000,-1.000000 -1.000000,1.000000,-1.000000

-1.000000,1.000000,1.000000"

TriangleIndices="0,1,3 1,2,3 4,5,7 5,6,7 8,9,11 9,10,11 12,13,15 13,14,15 16,17,19 17,18,19 20,21,23 21,22,23"

Normals="0.000000,0.000000,-1.000000 0.000000,0.000000,-1.000000

0.000000,0.000000,-1.000000 0.000000,0.000000,-1.000000 0.000000,-0.000000,1.000000

0.000000,-0.000000,1.000000 0.000000,-0.000000,1.000000 0.000000,-0.000000,1.000000

1.000000,-0.000000,0.000000 1.000000,-0.000000,0.000000 1.000000,-0.000000,0.000000

1.000000,-0.000000,0.000000 -0.000000,-1.000000,-0.000000 -0.000000,-1.000000,-0.000000

-0.000000,-1.000000,-0.000000 -0.000000,-1.000000,-0.000000 -1.000000,0.000000,-0.000000

-1.000000,0.000000,-0.000000 -1.000000,0.000000,-0.000000 -1.000000,0.000000,-0.000000

0.000000,1.000000,0.000000 0.000000,1.000000,0.000000 0.000000,1.000000,0.000000

0.000000,1.000000,0.000000"/>

上面的代码中,照相机对象(camera)有一个以X,Y,Z表示的位置属性。X从左至右增加。Y从下往上增加。Z随着屏幕所在平面,向靠近用户的方向增加。该对象还有一个观看方向,该方向和位置相反。在这里我们告诉照相机往后面的0,0,0坐标点看。最后,UpDirection表示照相机的朝向,在本例中,照相机向上朝向Y轴方向。

立方体使用一系列8个位置的值来绘制,每一个点都是三维坐标点。然后通过这些点绘制三角形切片来形成立方体的表面。在这之上我们添加一个Material对象然后将其颜色改为蓝色。然后给一个缩放变形使这个立方体看起来大一点。最后我们给这个立方体一些定向光源来产生一些3D的效果。

在后台代码中,我们只需要配置KienctSensor对象来支持骨骼追踪,如下代码所示。彩色影像和深度值影像在该项目中不需要用到。

为了能够产生全息图的效果,我们将会围绕立方体来移动照相机的位置,而不是对立方体本身进行旋转。首先我们需要确定Kinect 中是否有用户正在处于追踪状态。如果有一个,我们就忽略其他的。我们获取追踪到的骨骼数据并提取X,Y,Z坐标信息。因为Kinect

提供的位置信息的单位是米,而我们的3D立方体不是的,所以需要将这些位置点信息进行一定的转换才能够产生3D效果。基于这些位置坐标,我们大概以正在追中的骨骼为中心来移动照相机。我们也用这些坐标,并将这些坐标翻转,使得照相机能够连续的指向0,0,0这个原点。

有意思的是,这样产生全息图影像的效果比许多复杂的3D对象产生的全息图要好。3D立方体可以很容易的转换为矩形,如下图所示,只需要简单的将立方体在Z方向上进行拉伸即可。这个矩形朝向游戏者拉伸。我们可以简单的将立方体的UI这部分代码复制,然后创建一个新的modelVisual3D对象来产生新的矩形。使用变换来将这些矩形放X,Y轴上的不同位置,并给予不同的颜色。因为照相机是后台代码唯一需要关注的对象,在前台添加一个矩形对象及变换并不会影响代码的运行。

5.其他值得关注的类库和项目

与Kinect相关的一些类库和工具在以后的几年,估计会更加多和Kienct SDK一起工作。当然,最重要的使人着迷的类库及工具有FAAST,Utility3D以及Microsoft Robotics Developer Studio。

FAAST(Flexible Action and Articulated Skeleton Toolkit)是一个中间件类库用来连接Kinect的手势交互界面和传统的人际交互界面。这个类库由南加利福利亚大学的创新技术研究院编写和维护。最初FAAST是使用OpenNI结合Kinect来编写的一个手势识别类库。这个类库真正优秀的地方在于它能够将大多数内建手势映射到其他API中,甚至能够将手势映射到键盘点击中来。这使得一些Kinect技术爱好者(hacker)能够使用这一工具来使用Kinect玩一些视频游戏,包括一些例如《使命召唤》(Call of Duty)的第一人称射击游戏,以及一些像《第二人生》(Second Life)和《魔兽世界》(World of Warcraft)这样的网络游戏。目前FAAST只有针对OpenNI 版本,但是据最新的消息,FAAST现在正在针对KienctSDK进行开发,可以在其官网https://www.360docs.net/doc/4715622754.html,/mxr/faast了解更多的相关信息。

Utility3D是一个工具,能够使得传统开发3D游戏的复杂工作变得相对简单,他有免费版和专业版之分。使用Uitltiy3D编写的游戏能够轻松的跨多种平台,包括web,windows,ios, iPhone,ipad,Android,Xbox,Playstation以及Wii。它也支持第三方插件,包括一些为Kinect开发的插件,使得开发者能够使用Kinect作为传感器来作为Windows游戏的输入设备。可以在Unity3D的官网查看更多信息https://www.360docs.net/doc/4715622754.html,。

Microsoft Robotics Developer Studio是微软针对机器人的开发平台,其最新发布的RDS4.0版本也集成了Kinect传感器。除了能够访问Kinect提供的功能,Kinect也支持一系列特定的基于Kinect的机器人平台,他们可以利用Kinect传感器进行障碍物避让。更多的有关Microsoft Robotics Developer Studio的信息可以访问https://www.360docs.net/doc/4715622754.html,/robotics。

6.结语

本文接上文,介绍了Kinect进阶开发中需要了解一些类库和项目。在上文的基础上,本文接着介绍了近距离探测中如何探测运动,如何获取并保存产生的影像数据;然后将会介绍如何进行脸部识别,以及介绍全息图(Holograme)的一些知识,最后介绍了一些值得关注的类库和项目。本文中的几个例子可能对计算机性能有点要求,因为从Kinect获取数据以及实时图像处理是一个比较耗费资源的工作,我是09年的买的笔记本,运行上面的例子基本比较卡,大家可以试着在好一点的机器上运行,就像之前所讲的,本文例子着重的是功能和方法的展示,所以注重代码的可读性,最求性能的同学可以试着优化一下。

本文所有示例代码点击此处下载,希望以上内容对于您扩宽Kinect开发视野有所帮助!

windows驱动开发和调试环境搭建

Windows驱动开发和环境搭建 【文章标题】: Windows驱动开发和调试的环境设置 【文章作者】: haikerenwu 【使用工具】: VC6.0,VMware6.0.3,Windbg 【电脑配置】: 惠普笔记本xp sp3 (一)VMWare安装篇 VMWare的安装一路Next即可,关于其序列号,百度一下就能找到,虚拟机安装完成之后,需要安装操作系统,我在虚拟机中安装的是windows xp sp2系统。 点击“文件”----“新建”----“虚拟机” 进入新建虚拟机的向导,配置虚拟系统参数

选择虚拟系统文件的兼容格式(新手推荐选择默认选项) 按照默认设置继续点击下一步,选择好您需要的操作系统,此处我选择的是Windows XP Prefessional。 设置虚拟机名称和虚拟操作系统安装路径,我单独空出来一个F 盘,将虚拟机和虚拟操作系统全部装在该盘。

配置网络模式(推荐选择NA T,一般主机不用做任何的设置虚拟机就可以利用主机上网)。 配置虚拟磁盘的容量。在这里可以直接单击完成,来完成基本操作设置,磁盘默认空间是8GB,用户可以根据自己的实际使用情况来调整大小,也可以自定义分区。

操作完成之后,在“VM”菜单下有个“setting。。。”菜单,点击此菜单,在CD-ROM中选择合适的选项,我使用的是Use ISO image 选项,将我的xp sp2操作系统的ISO映像路径设置好,安装操作系统。点击ok之后,启动虚拟机,即开始安装操作系统,安装过程跟普通装机过程相同。安装完成之后,启动操作系统,然后在VM菜单下点击“Install VMWare Tools”,把虚拟操作系统的驱动装好。 (二)VMWare设置篇

Windows驱动开发培训

Windows驱动开发培训 培训流程: 一、基础知识 在开始驱动开发之前,您应该知道操作系统原理以及驱动程序是如何在操作系统中进行工作的,了解这些基本原理将有助于您做出正确的设计决策并简化您的开发过程。 1、了解Windows操作系统构造\\ 可以链接进去 2、安装WDK,参考相关文档,熟悉WDK的内容\\ 可以链接进去 二、Windows驱动开发\\ 可以链接进去 一、基础知识 在开始驱动开发之前,您应该知道操作系统原理以及驱动程序是如何在操作系统中进行工作的,了解这些基本原理将有助于您做出正确的设计决策并简化您的开发过程。 1、了解Windows操作系统构造 (1)培训目标 深入了解Windows操作系统的系统结构以及工作原理 (2)培训内容 阅读书籍《深入解析Windows操作系统》的第3、4、6、7、9章,重点关注第九章“I/O系统” (3)培训任务 ①掌握Windows操作系统的系统结构 ②理解ISR、IRP、IRQL、DCP等概念的含义 ③了解注册表的用法,掌握注册表数据的查看和修改方法 ④了解进程和线程的内部机理以及线程的调度策略 ⑤了解I/O系统的内容,理解I/O请求以及I/O处理过程 注:以上相关内容,请在一周内完成。

2、安装WDK,参考相关文档,熟悉WDK的内容 (1)培训目标 了解WDK的安装过程,熟悉WDK的编译环境,掌握如何使用WDK的相关帮助文档;了解WDM驱动程序的基本结构 (2)培训内容 ①.阅读文档\\10.151.131.12\book\windows\MSWDM.chm,掌握WDM驱动程序的基本结构以及基本的编程技术。 ②.参考WDK的帮助文档:WDK documentation ,了解WDK的基本内容 (3)培训任务 ①理解分层驱动结构的含义,掌握设备和驱动程序的层次结构 ②理解“驱动对象”和“设备对象”的概念 ③理解2个基本例程:DriverEntry 和addDevice ④了解IRP的结构以及IRP处理的流程 ⑤初步了解I/O的控制操作 注:以上相关内容,请在一周内完成。 二、Windows驱动开发 学习如何基于WDK进行驱动程序的开发 1、培训目标 (1)学会根据WDK开发一个基本的Windows驱动程序和测试程序 (2)学会利用不同的IOCTL方式在内核模式和用户模式之间进行通讯 (3)学会如何在内核模式下和用户模式下访问注册表 (4)利用WinDbg跟踪程序,学会使用WinDbg进行调试 2、培训内容 (1)阅读\src\general\ioctl中的示例代码 (2)build并运行应用程序和驱动程序

WIN7主题制作基础教程

用VSB制作Windows 7主题基础教程 ——编写by荻野千寻子@樱茶幻萌组 ——修正by榕骑士@樱茶幻萌组【前言】 暑假到了,Mina也有空了,看着别人做的漂亮的win7主题,你是否也想“大显身手”呢?为了让大家更容易制作出自己喜欢的主题,本小组特意编写了这个教程。此教程针对的是win7主题制作的新手,以系统自带的aero主题为副本,只讲解主题制作的基础,如theme的编写、开始菜单、细节窗格等,至于樱茶不规则菜单等请参考樱茶高级教程!不过对新手来说本教程已经能让你做出个基本的主题了,如果有兴趣的话不妨跟着本教程开始你的DIY之旅吧。 OK,Let's go! 【注意】 想要DIY主题,你的系统必须为家庭高级版或以上版本,切记!【制作工具】 Photoshop、Vista/Win7 style builder (樱茶初级汉化版:https://www.360docs.net/doc/4715622754.html,/thread-119173-1-1.html) 【制作详解】 一、破解系统主题 推荐使用win7优化大师或魔方优化大师等软件,以我使用的魔方为例,对照图片

二、获取主题文件 以aero为例,从系统盘:\windows\resources\themes目录下找到aero文件夹及aero.theme文件,一起复制到某个目录下,如D:\主题制作;然后将aero文件夹与aero.theme文件一起重命名为你想要的名字,比如xx及xx.theme,再进入xx文件夹把.msstyles文件一并重命名为xx.msstyles。 三、关于.theme文件的编写(以下xx均表示你的主题名称) 用记事本方式打开xx.theme文件,对照着修改: 注:粉红字为可修改部分,蓝字为注释 ; Copyright ?Microsoft Corp.

Windows驱动开发入门

接触windows驱动开发有一个月了,感觉Windows驱动编程并不像传说中的那么神秘。为了更好地为以后的学习打下基础,记录下来这些学习心得,也为像跟我一样致力于驱动开发却苦于没有门路的菜鸟朋友们抛个砖,引个玉。 我的开发环境:Windows xp 主机+ VMW ARE虚拟机(windows 2003 server系统)。编译环境:WinDDK6001.18002。代码编辑工具:SourceInsight。IDE:VS2005/VC6.0。调试工具:WinDBG,DbgView.exe, SRVINSTW.EXE 上面所有工具均来自互联网。 对于初学者,DbgView.exe和SRVINSTW.EXE是非常简单有用的两个工具,一定要装上。前者用于查看日志信息,后者用于加载驱动。 下面从最简单的helloworld说起吧。Follow me。 驱动程序的入口函数叫做DriverEntry(PDRIVER_OBJECT pDriverObj,PUNICODE_STRING pRegisgryString)。两个参数,一个是驱动对象,代表该驱动程序;另一个跟注册表相关,是驱动程序在注册表中的服务名,暂时不用管它。DriverEntry 类似于C语言中的main函数。它跟main的差别就是,main完全按照顺序调用的方法执行,所有东西都按照程序员预先设定的顺序依次发生;而DriverEntry则有它自己的规则,程序员只需要填写各个子例程,至于何时调用,谁先调,由操作系统决定。我想这主要是因为驱动偏底层,而底层与硬件打交道,硬件很多都是通过中断来与操作系统通信,中断的话就比较随机了。但到了上层应用程序,我们是看不到中断的影子的。说到中断,驱动程序中可以人为添加软中断,__asm int 3或者Int_3();前者是32位操作系统用的,后者是64位用的。64位驱动不允许内嵌汇编。下面是我的一个helloworld的源码:

操作系统与驱动开发试题

河北科技大学硕士学位研究生 2014——2015学年第1学期 《操作系统与驱动开发》课程期末考试试卷 学院信息学院专业电路与系统姓名程莉学号 2201414007 题号一二三四五六总分 得分 一.单项选择题(每小题1分,共10分) 1.操作系统的 D 管理部分负责对进程进行调度。 A.主存储器 B.控制器 C.运算器 D.处理机 2.分时操作系统通常采用 B 策略为用户服务。 A.可靠性和灵活性 B.时间片轮转 C.时间片加权分配 D.短作业优先 3.很好地解决了“零头”问题的存储管理方法是 A 。 A 页式存储管理 B 段式存储管理 C 多重分区管理 D 可变式分区管理 4.用WAIT、SIGNAL操作管理临界区时,信号量的初值应定义为 B 。 A.-1 B.0 C.1 D.任意值 5.在进程管理中,当 C 时,进程从阻塞状态变为就绪状态。 A.进程被进程调度程序选中 B.等待某一事件 C.等待的事件发生 D.时间片用完 6.某系统中有3个并发进程,都需要同类资源4个,试问该系统不会发生死锁的最少资源数 B 。 A.9 B.10 C.11 D.12 7.虚拟存储器管理系统的基础是程序的 B 理论。 A.全局性 B.局部性 C. 动态性 D.虚拟性 8.从用户的角度看,引入文件系统的主要目的是 D A.实现虚拟存储 B.保存系统文档

C.保存用户和系统文档 D.实现对文件的按名存取 9.操作系统中采用多道程序设计技术提高CPU和外部设备的 A A.利用率 B.可靠性 C.稳定性 D.兼容性 10.缓冲技术中缓冲池在 C 中。 A.主存 B. 外存 C. ROM D. 时间片轮转 二.填空(每空0.5分,共15分)。 11.进程存在的唯一标志是PCB 。 12.通常进程实体是由程序块、进程控制块和数据块三部分组成。 13.磁盘访问时间由寻道时间、旋转延迟时间和传输时间组成。 14.作业调度是从后备作业队列中选一些作业,为它们分配资源,并为它们创建进程。 15.文件的物理组织有顺序、链接和索引。 16.若一个进程已经进入临界区,则其它欲要进入临界区的进程必须___等待____。 17.信号量的物理意义是,当信号量值大于零时其值表示可分配资源的个数;当信号 量值小于零时,其绝对值表示等待使用该资源的进程的个数。 18.静态重定位在程序装入时进行; 而动态重定位在程序运行时进行。 19.分区管理中采用“最佳适应”分配算法时,宜把空闲区按长度递增次序登记在空闲 区表中。 20.所谓系统调用,就是用户在程序中调用操作系统所提供的一些子功能。 21.把逻辑地址映射为物理地址的工作称为地址映射。 22.设备管理中采用的数据结构有设备控制表、控制器控制表、通道控制表、 系统设备表等四种。 23.从资源管理(分配)的角度,I/O设备可分为独占设备、共享设备和虚 拟设备三种。 24.设备与控制器之间的接口信号主要包括数据、状态和控制。 25.DMA控制器由三部分组成,分别为主机与DMA控制器的接口、 DMA控制器与块设备的接 口和 I/O控制逻辑。 三.名词解释(每小题2.5分,共10分)。 26.虚拟存储器 答:虚拟存储器是指在具有层次结构存储器的计算机系统中,自动实现部分装入和部分替换功能,能从逻辑上为用户提供一个比物理贮存容量大得多,可寻址的“主存储器”。

Windows驱动程序开发环境配置

Windows驱动程序开发笔记 一、WDK与DDK环境 最新版的WDK 微软已经不提供下载了这里:https://https://www.360docs.net/doc/4715622754.html,/ 可以下并且这里有好多好东东! 不要走进一个误区:下最新版的就好,虽然最新版是Windows Driver Kit (WDK) 7_0_0,支持windows7,vista 2003 xp等但是它的意思是指在windows7操作系统下安装能编写针对windows xp vista的驱动程序, 但是不能在xp 2003环境下安装Windows Driver Kit (WDK) 7_0_0这个高版本,否则你在build的时候会有好多好多的问题. 上文build指:首先安装好WDK/DDK,然后进入"开始"->"所有程序"->"Windows Driver Kits"->"WDK XXXX.XXXX.X" ->"Windows XP"->"x86 Checked Build Environment"在弹出来的命令行窗口中输入"Build",让它自动生成所需要的库 如果你是要给xp下的开发环境还是老老实实的找针对xp的老版DDK吧,并且xp无WDK 版只有DDK版build自己的demo 有个常见问题: 'jvc' 不是内部或外部命令,也不是可运行的程序。 解决办法:去掉build路径中的空格。 二、下载 WDK 开发包的步骤 1、访问Microsoft Connect Web site站点 2、使用微软 Passport 账户登录站点 3、登录进入之后,点击站点目录链接 4、在左侧的类别列表中选择开发人员工具,在右侧打开的类别:开发人员工具目录中找到Windows Driver Kit (WDK) and Windows Driver Framework (WDF)并添加到您的控制面板中 5、添加该项完毕后,选择您的控制面板,就可以看到新添加进来的项了。 6、点击Windows Driver Kit (WDK) and Windows Driver Framework (WDF),看到下面有下载链接,OK,下载开始。下载后的文件名为: 6.1.6001.18002.081017-1400_wdksp-WDK18002SP_EN_DVD.iso将近600M大小。

最新服务器基础知识(初学者必看)

服务器基础知识【初学者必看】 1. 什么是服务器 就像他的名字一样,服务器在网络上为不同用户提供不同内容的信息、资料和文件。可以说服务器就是Internet网络上的资源仓库,正是因为有着种类繁多数量庞大内容丰富的服务器的存在,才使得Internet如此的绚丽多彩。 2. 服务器的种类和功能 (1) WWW服务器(WWW Server) WWW服务器也称为Web服务器(Web Server)或HTTP服务器(HTTP Server),它是Internet上最常见也是使用最频繁的服务器之一,WWW服务器能够为用户提供网页浏览、论坛访问等等服务。比如:我们在使用浏览器访问https://www.360docs.net/doc/4715622754.html,的时候,实际上就是在访问Discuz!的WWW服务器,从该WWW服务器获取需要的论坛资料和网页。 (2) FTP服务器(FTP Server) FTP服务器是专门为用户提供各种文件(File)的服务器,FTP服务器上往往存储大量的文件,例如:软件、MP3、电影、程序等等。用户只要使用FTP客户端软件登录到FTP服务器上就可以从FTP服务器下载所需文件和资源到自己的电脑上,同时,

你也可以把自己电话上的文件上传到FTP上供其他用户下载,以实现文件资源的共享。 (3) 邮件服务器(Mail Server) e-mail是Internet上应用最频繁的服务之一,而Internet上每天数亿百亿计的电子邮件的收发都是通过邮件服务器实现的。邮件服务器就像邮局一样,可以为用户提供电子邮件的接收存储和发送服务。 除了以上介绍的3种主要服务器之外,还有很多其他类型的网络服务器,例如:数据库服务器(DatabaseServer)、代理服务器(Proxy Server)、域名服务器(Domain Name Server)等等…… 3. 服务器的操作系统 目前服务器中使用的操作系统主要有两类:Windows和Unix。 (1) Windows Windows是美国微软公司(Microsoft)开发的操作系统,在服务器领域,主要有Windows2000Server/Advanced Server/Data Center与Windows2003 Standard Edition/EnterpriseEdition操作系统,Windows的优点是操作简 单,由于Windows使用图形界面进行操作,因而对各种服务器软件功能配置简

WINDOWS驱动编程

WDM驱动程序开发之读写设备寄存器:KIoRange类 2009-11-09 14:05 WDM驱动程序开发之读写设备寄存器:KIoRange类收藏 KIoRange类: 一、Overview KIoRange类将一系列特殊的外围总线的地址映射到CPU总线的地址空间。CPU总线上的地址即可能在CPU的I/O空间,也可能在CPU的内存空间,这取决于平台和外围总线的控制方式。考虑到可移植性,所有对I/O周期(I/O cycle)进行译码的设备驱动程序必须用这个类对I/O的位置(location)进行正确的访问(access)。KIoRange是KPeripheralAddress类的派生类。 一旦映射关系建立起来,驱动程序就用KIoRange类的成员函数去控制设备的I/O寄存器。这个类提供了8位、16位和32位I/O访问控制的函数。这些函数是以内联(in-line)函数方式来使用的,它们调用系统内相应的宏来产生依赖于平台的代码。 对I/O位置(location)进行访问的另一种备选方案是创建一个KIoRegister 的实例。这要通过取得一个KIoRange对象的数组元素来实现。 为了访问一系列外围总线内存空间的地址,需要用KMemoryRange类。 二、Member Functions 1、KIoRange - Constructor (4 forms) 构造函数 【函数原型】 FORM 1: KIoRange( void ); FORM 2: (NTDDK Only) KIoRange( INTERFACE_TYPE IntfType, ULONG BusNumber , ULONGLONG BaseBusAddress, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE ); FORM 3 (WDM): KIoRange( ULONGLONG CpuPhysicalAddress, BOOLEAN InCpuIoSpace, ULONG Count, BOOLEAN MapToSystemVirtual =TRUE

Windows 内核技术与驱动开发笔记(完整版)

Windows 内核技术与驱动开发笔记 1.简述Driver Entry例程 动程序的某些全局初始化操作只能在第一次被装入时执行一次,而Driver Entry例程就是这个目的。 * Driver Entry是内核模式驱动程序主入口点常用的名字。 * Driver Entry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。WDM驱动程序的Driver Entry例程应完成对这个对象的初始化并返回。非WDM驱动程序需要做大量额外的工作,它们必须探测自己的硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作。 * Driver Entry的第二个参数是设备服务键的键名。这个串不是长期存在的(函数返回后可能消失)。如果以后想使用该串就必须先把它复制到安全的地方。 * 对于WDM驱动程序的Driver Entry例程,其主要工作是把各种函数指针填入驱动程序对象,这些指针为操作系统指明了驱动程序容器中各种例程的位置。 2.简述使用VC进行内核程序编译的步骤 编译方式是使用VC++进行编译 1.用VC新建工程。 2.将两个源文件Driver.h和Driver.cpp拷贝到工程目录中,并添加到工程中。 3.增加新的编译版本。 4.修改工程属性,选择“project | setting”将IterMediate file和Output file 都改为MyDriver_Check。 5.选择C/C++选项卡,将原有的Project Options内容全部删除替换成相关参数。 6.选择Link选项卡,将原有的Project Options内容删除替换成相关Link。 7.修改VC的lib目录和include的目录。 8.在VC中选择tools | options,在弹出的对话框中选择“Directories”选项卡,在“Show directories for”下拉菜单中选择“Include file”菜单。添加DDK的相关路径。 3.简述单机内核调试技术 答:1.下载和安装WinDbg能够调试windows内核模块的调试工具不多,其中一个选择是微软提供的WinDbg 下载WinDbg后直接双击安装包执行安装。 2.安装好虚拟机以后必须把这个虚拟机上的windows设置为调试执行。在被调试系统2000、2003或是xp的情况下打开虚拟机中的windows系统盘。 3.将boot.ini文件最后一行复制一下,并加上新的参数使之以调试的方法启动。重启系统,在启动时就可以看到菜单,可以进入正常windows xp,也可以进入Debug模式的windows xp。 4.设置VMware管道虚拟串口。调试机与被调试机用串口相连,但是有被调试机是虚拟机的情况下,就不可能用真正的串口连接了,但是可以在虚拟机上生成一个用管道虚拟机的串口,从而可以继续内核调试。 4.请画出Windows架构简图

(仅供参考)服务器硬件入门基础知识

服务器硬件入门基础知识 开篇一:服务器主板 服务器主板概述 对于服务器而言,稳定性才是首要,服务器必须承担长年累月高负荷的工作要求,而且不能像台式机一样随意的重起,为了提高起可靠性普遍的做法都是部件的冗余技术,而这一切的支持都落在主板的肩上。下面我就来看看有关服务器主板的一些特性: 1、首先,服务器的可扩展性决定着它们的专用板型为较大的ATX,EATX或WATX。 2、中高端服务器主板一般都支持多个处理器,所采用的CPU也是专用的CPU。 3、主板的芯片组也是采用专用的服务器/工作站芯片组,比方Intel E7520、ServerWorks GC-HE等等,不过像入门级的服务器主板,一般都采用高端的台式机芯片组(比如Intel875P芯片组) 4、服务器通常要扩展板卡(比如如网卡,SCSI卡等),因此我们通常都会发现服务器主板上会有较多的PCI、PCI-X、PCI—E插槽。 5、服务器主板同时承载了管理功能。一般都会在服务器主板上集成了各种传感器,用于检测服务器上的各种硬件设备,同时配合相应管理软件,可以远程检测服务器,从而使网络管理员对服务器系统进行及时有效的管理。

6、在内存支持方面。由于服务器要适应长时间,大流量的高速数据处理任务,因此其能支持高达十几GB甚至几十GB的内存容量,而且大多支持ECC内存以提高可靠性(ECC内存是一种具有自动纠错功能的内存,由于其优越的性能使造价也相当高)。 7、存储设备接口方面。中高端服务器主板多采用SCSI接口、SATA接口而非IDE接口,并且支持RAID方式以提高数据处理能力和数据安全性。 8、在显示设备方面。服务器与工作站有很大不同,服务器对显示设备要求不高,一般多采用整合显卡的芯片组,例如在许多服务器芯片组中都整合有ATI的RAGE XL显示芯片,要求稍高点的就采用普通的AGP显卡。而如果是图形工作站,那一般都是选用高端的3DLabs、ATI等显卡公司的专业显卡。 9、在网络接口方面。服务器/工作站主板也与台式机主板不同,服务器主板大多配备双网卡,甚至是双千兆网卡以满足局域网与Internet的不同需求。 10、最后是服务器的价格方面。一般台式机主板顶天也不过1、2千,而服务器主板的价格则从1千多元的入门级产品到几万元甚至十几万元的高档产品都有! 推荐品牌:泰安、超微、Intel 开篇二:服务器CPU 服务器CPU概述 服务器是网络中的重要设备,要接受少至几十人、多至成千上万人的访问,因此对服务器具有大数据量的快速吞吐、超强的稳定性、长时间运行等严格要求。所以说CPU是计算机的“大脑”,是衡量服务器

win7旗舰版完全操作教程

一、Windows键+ 空格键“Space” [作用]:透明化所有窗口,快速查看桌面(并不切换) [快捷键]:win+空格 [小结]:当你打开了很多程序窗口的时候,这招非常有用,而且桌面还会有华丽的光影效果哦。没用过的赶紧试试先查看图片 二、Windows键+ D [作用]:最小化所有窗口,并切换到桌面,再次按又重新打开刚才的所有窗口 [快捷键]:win+d [小结]:这个功能在以前的系统里是都有的,只不过win7的显示桌面放到了任务栏的右下角了(就是最右边的那个长方形小条) 三、Windows键+ tab键 [作用]:传说中的3D桌面展示效果 [快捷键]:win+tab [小结]:记得本区应该有一个帖就是关于这个效果的,不过感觉这招最简单了 四、Windows键+ ctrl键+tab键 [作用]:3D桌面浏览并锁定(可截屏) [快捷键]:win+ctrl+tab [小结]:见识了它的效果想留个图,win+tab是办不到di,win7说了-- I can! 五、Windows键+ 数字键 [作用]:针对固定在快速启动栏中的程序,按照数字排序打开相应程序

[快捷键]:win+数字(1-9) [小结]:吼吼,这个功能爽吧 六、Windows键+ P [作用]:打开“外接显示”的设置窗口 [快捷键]:win+p [小结]:办公室一族,对这个功能肯定不会陌生吧。对了,接投影仪快速切换,嘿嘿。七、Windows键+ X [作用]:打开“移动中心”设置窗口 [快捷键]:win+x [小结]:设置窗口里包括显示器亮度控制、音量控制、笔记本电池监控、Mobile手机同步设置、外接显示器管理...等多种功能 八、修复系统默认文件关联 [作用]:修复系统默认文件关联 [快捷键]:无 [小结]:当我们无意中破坏了系统默认的文件关联,这招就派上用场了。win7下可不像winxp 那样容易修改文件关联的,不信?试试*_* [操作方法]:开始->cmd,按如下格式输入assoc.XXX=XXXfile XXX代表文件类型,比如修复TXT和BAT的文件关联,命令就是assoc.TXT=TXTfile 和assoc.BAT=BATfile 九、关闭系统休眠功能 [作用]:关闭系统休眠功能 [快捷键]:无

windows驱动开发 driverstudio 教程

前言 鉴于国内开发人员迫切需要学习驱动开发技术,而国内有关驱动开发工具DriverStudio的资料很少,大家在开发过程中遇到很多问题却没处问,没法问.而这些问题却是常见的,甚至是很基础的问题。 有感于此,本站联合北京朗维计算机应用公司编写了本教程。本教程的目的是让一个有一些核心态程序编写经验或对系统有所了解的人学习编写驱动程序。当然,本教程不是DDK中有关驱动方面内容的替换,而只是一个开发环境的介绍和指导。 学习本教程,你应该能熟练地使用本套工具编写基本的驱动程序。当然如果你想能顺利地编写各种各样的驱动的话,你应该有相关的硬件知道和系统核心知识并且要经过必要的训练才能胜任。 如果真心说一句话,DriverStudio并没有对驱动程序开发有什么实质的改变,它和DDk的关系不过是sdk和mfc的关系,但很多人选择了MFC,原因不言自明,方便二字何以说得完呀?你再也不用去关注繁琐的框架实现代码,也不用去考虑让人可怕的实现细节。封装完整的C++函数库让你专注于你要实现的程序逻辑。它包含一套完整调试和性能测试、增强工具,使你的代码更稳定。 说些题外话,作驱动开发很苦,不是一般的人能忍受的,那怕开发一个小小的驱动也要忍受无数次的宕机,有时甚至有些灾难性的事故等着你,所以要有充分的思想准备。当然,在开发的过程中你会有一种彻底控制计算机的满足感,调试开发完毕后的成就感是其它开发工作所不能体会到的。当然,就个人前途来说,作驱动开发能拿到别的开发所不能得到的薪水。而且开发的生命期也会长一些,你不用不断的学习新的开发工具,只需要不断的加深对系统的理解就行了。当然,还有一点是必需的,那就是英文要好,否则永远比国外同行慢半拍。 本人水平不高,所做的工作只要能提起大家学习驱动开发的兴趣,能带领大家入门便心满意足了。在此感谢北京朗维公司(DriverStduio 国内总代理)的大力赞助,特别是感谢技术部的王江涛,市场部的李强两位先生的大力支持。同时要感谢我的女友,可爱的小猫(我对她的呢称)的贴心照顾和支持(一些很好看的图片就出自她手:))。在此我也要感谢论坛各大版主的鼎力支持和广大网友的关怀。 DriverStudio工具包介绍: DriverStudio 是一套用来简化微软Windows 平台下设备驱动程序的开发,调试和测试的工具包。DriverStudio 当前的版本包括下列工具模块: DriverAgent DriverAgent 为Win32 应用程序提供直接访问硬件的功能。即使你没有任何设备驱动程序开发的经验或经历,你也能编写出DriverAgent应用程序来直接访问硬件设备。DriverAgent 应用程序可以运行在 Windows 98, Windows 95, Windows NT 和 Windows 2000平台上。(当前版本不支持Windows XP平台。) VToolsD VToolsD 是一个用来开发针对Win9X (Windows 95 和 Windows 98)操作系统下设备驱动程序(VxD)

win7操作系统教程详解使用__绝对有用

能够使用windows7操作系统成为了许多电脑用户的一大喜悦之事,相比之前的Vista系统,windows7系统真的是好看了,快了,好用了,但你是否担心自己的windows7系统就像新安装其他Windows系统一样仅仅是刚开始运行飞快,随着使用时间的增加就会导致效率越来越低呢?想要保持自己的windows7系统一直运行如飞并非是难事,下面将介绍十个有效的小方法帮助你保持windows7的高速度,放心非常简单,老少皆宜! 1. 加快windows7系统启动速度 正在使用windows7操作系统的用户也许已经有明显感受,windows7的启动速度的确比Vista快了很多,但你想不想让它更快一些呢?来吧按照我说的做。微软windows7仅仅默认是使用一个处理器来启动系统的,但现在不少网友早就用上多核处理器的电脑了,那就不要浪费,增加用于启动的内核数量立即可以减少开机所用时间。非常简单,只需修改一点点系统设置。 首先,打开windows7开始菜单在搜索程序框中输入“msconfig”命令,打开系统配置窗口后找到“引导”选项(英文系统是Boot)。

windows7拥有强大便捷的搜索栏,记住一些常用命令,可以让你操作起来更快捷。 点击“高级选项”此时就可以看到我们将要修改的设置项了。 勾选“处理器数”和“最大内存”,看到你的电脑可选项中有多大你就可以选多大,这里所用电脑最大就支持将处理器调整到2,可能你的机器会更高

(处理器数目通常是2,4,8), 同时调大内存,确定后重启电脑生效,此时再看看系统启动时间是不是加快了。如果你想要确切知道节省的时间,可以先记录下之前开机时所用时间做详细比较。 2. 加快windows7系统关机速度 上面教大家加速windows7系统的开机,那自然关机也是可以加快速度的。虽然windows7的关机速度已经比之前的Windows XP和Vista系统快了不少,但稍微修改一下注册表你会发现关机会更迅速。 还是在windows7系统的开始菜单处的搜索框中输入“regedit”打开注册表编辑器,

Windows驱动程序框架理解_经典入门

标题: 【原创】Windows驱动程序框架 windows驱动程序入门比较坑爹一点,本文旨在降低入门的门槛。注:下面的主要以NT式驱动为例,部分涉及到WDM驱动的差别会有特别说明。 首先,肯定是配置好对应的开发环境啦,不懂的就百度下吧,这里不再次描述了。 在Console控制台下,我们的有一个入口函数main;在Windows图形界面平台下,有另外一个入口函数Winmain。我们只要在这入口函数里面调用其他相关的函数,程序就会按照我们的意愿跑起来了。在我们用IDE开发的时候,也许你不会发现这些细微之处是如何配置出来的,一般来说我们也不用理会,因为在新建工程的时候,IDE已经帮我们把编译器(Compiler)以及连接器(Linker)的相关参数设置好,在正式编程的时候,我们只要按照规定的框架编程就行了。 同样,在驱动程序也有一个入口函数DriverEntry,这并不是一定的,但这是微软默认的、推荐使用的。在我们配置开发环境的时候我们有机会指定入口函数,这是链接器的参数/entry:"DriverEntry"。 入口函数的声明 代码: DriverEntry主要是对驱动程序进行初始化工作,它由系统进程(System)创建,系统启动的时候System系统进程就被创建了。 驱动加载的时候,系统进程将会创建新的线程,然后调用执行体组件中的对象管理器,创建一个驱动对象(DRIVER_OBJECT)。另外,系统进程还得调用执行体组件中的配置管理程序,查询此驱动程序在注册表中对应项。系统进程在调用驱动程序的Driv erEntry的时候就会将这两个值传到pDriverObject和pRegistryPath。 接下来,我们介绍下上面出现的几个数据结构: typedef LONG NTSTATUS 在驱动开发中,我们应习惯于用NTSTATUS返回信息,NTSTATUS各个位有不同的含义,我们可以也应该用宏NT_SUCCESS来判断是否返回成功。 代码: NTSTAUS的编码意义: 其中 Ser是Serviity的缩写,代表严重程度。 00:成功01:信息10:警告11:错误 C是Customer的缩写,代表自定义的位。

计算机教程(win7-2016)资料

计算机应用基础 1.讲课进度安排:(共18次) 2.学习方法: i. 勤记忆 ii. 勤操作 iii.勤体会 3.教材及光盘的使用方法: 第一章计算机基础知识 一.概述: 1.定义:p2 2.特征: 1)外部特征:高速高集成、数字化信息、逻辑判断、存储程序 2)内部特征:快速、准确、通用、逻辑 3.发展阶段: 从计算机的器件来划分: 第一台计算机诞生于1946年,名为ENIAC。P6 第一代:电子管 1946--1957 第二代:晶体管 1958--1964 第三代:集成电路1965--1969

第四代:大规模集成电路1970-1980 第五代:智能计算机 4.应用领域:共11方面。 p9 文档和网页制作、图形/图象处理、产品和科技演示、数值和图表分析、数据管理、网络通讯教育、娱乐、帐目和财务、商业、科学计算。 二.计算机系统的组成: (一)计算机硬件系统 P4-7 硬件的定义:是指构成计算机系统的物理实体和物理装置。 1.硬件系统组成: (1)运算器 (2)控制器(运算器及控制器合称CPU) (3)内存储器(MAIN MEMORY): A.只读存储器(ROM):READ ONLY MEMORY B.随机存储器(RAM):RANDOM ACCESS MEMORY ROM、RAM之间的比较: (4)输入设备:键盘、鼠标、扫描仪、手写输入器、数码照相机、磁卡和条码读入器等。 (5)输出设备:显示器、打印机、绘图仪。 (6)外存储器:软盘、硬盘、光盘(cdrom) 2.硬件系统的常见术语解释 (1)总线系统A.数据总线DB B.地址总线AB C.控制总线CB (2)中央(微)处理器CPU :包括运算器、控制器、寄存器 intel公司奔腾 II 400 赛扬 400 AMD公司 K6-2-400 奔腾 II 450 赛扬 433 K6-2-450 奔腾 III 500 赛扬 466 K7-500(600 650)(3)微机(CPU中寄存器)的字长:寄存器所占二进制位数。 (4)微机硬件性能的主要技术指标 p18-19 A.字长(CPU中寄存器字长): 16位机:INTEL80286 32位机:INTEL80386、INTEL80486 64位机:INTEL80586 B.CPU时钟主频:单位时间内CPU所能接受的时钟脉冲数,单位是兆赫兹MHZ C.内存容量(RAM): 单位是兆字节(MB),目前常规配置有16M、32M、64M、128M 字节(BYTE):8位(BIT)二进制数构成一个存储单元叫做字节 1 KB=1024 B 1 MB=1024 KB 1 GB=1024 MB 一个汉字占用两个字节,一个3.5英寸的1.2MB磁盘可存储大约60万个汉字

win7系统安装详细图文教程

系统安装方式目前有三种,分别是硬盘装系统、U盘装系统、光盘装系统。它们各有优 缺点小编就不在此累述。小编编写此篇教程的目的是为了教大家在系统没崩溃的情况下,通过硬盘安装GHOST系统的方式,实现快速装机目的。具体步骤如下: 硬盘装系统 一、系统下载完成之后,右键单击ISO镜像,弹出菜单选择解压文件; 二、解压完成,文件夹内容如下,双击打开autorun.exe文件:

三、弹出的“AUTORUN.EXE”运行界面中选择“安装GHOST系统到C盘”; 四、进入系统安装界面,如下图点选相应选项,点确认即可

五、点击取消“支持赞助商999.coom”全面复选框的勾选,然后选“是”即可; 选择“是“之后,再点选自动重启,装机过程的时间约持续5~10分钟; 选择完成,点击确定,然后选择自动重启,即可进入自动装机状态,时间约持续5~10分钟; 注意事项:1、如果自动装机完成后没有直接进入桌面,而出现了黑屏状态,毋须担心,不是系统问题,直接手动重启电脑,重启完成即可正常使用。 2、解压时请直接进行解压,不可系统存放路径不可存有中文字符,否则将无法正常安装。 3、请将解压出的gho文件放到除C盘外的分区,否则将无法正常安装;点击确定后会重新启动自动化安装,一般安装时间在5-10分钟! U盘装系统

U盘装系统是目前最常用的系统安装方式。特别适合于未安装光驱的台式机或超薄笔记本电脑上。小编为了给这类无光驱用户提供最大的便利,将在本文中为大家讲解最详细的U盘装系统教程。 您需要准备一个空的U盘(注意U盘中的重要数据请及时的备份出来,最好提前格式化U盘,U盘容量不小于4G) 第一步:1、下载大白菜U盘制作软件到你的电脑中; 2、下载GHOST系统到你的电脑中; 第二步:首先插入U盘,右键点击U盘,弹出菜单选择快速格式化(切记U盘中重要文件事先要备份出来,以防丢失),然后启动大白菜软件,界面如下图,点击界面最下方的“一键制作U盘启动”按钮,进入自动制作U盘启动盘;

Windows驱动开发技术详解 第六章的(Windows内核函数)自我理解

Windows驱动开发技术详解第六章的(Windows内核函数)自我理解 学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。 其实这章主要就是讲函数DDK有自己的函数跟SDK一样编写DDK使用DDK提供的函数就OK了 /////////////////////////////////////////////////////////////////////////////// ASCII字符串和宽字符串 ASCII字符构造 char*str1="abc"; 打印ASCII字符串 char*string="hello"; KdPrint("%s\n",string);\\注意是小写%s ///// UNICODE字符构造 wchar_t*str2=L"abc"; 打印宽字符串 WCHAR*string=L"hello"; KdPrint("%S\n",string);\\注意是大写%S /////////////////////////////////////////////////////////////////////////////// ANSI_STRING字符串和UNICODE_STRING字符串 ASCII字符串进行了封装 typedef struct_STRING{ USHORT Length;//字符的长度。 USHORT MaximumLength;//整个字符串缓冲区的最大长度。 PCHAR Buffer;//缓冲区的指针。 }STRING; 输出字符串 ANSI_STRING ansiString; KdPrint("%Z\n",&ansiString);//注意是%Z UNICODE_STRING宽字符串封装 typedef struct_UNICODE_STRING{ USHORT Length;//字符的长度,单位是字节。如果是N个字符,那么Length等于N的2倍。USHORT MaximumLength;//整个字符串缓冲区的最大长度,单位也是字节。 PWSTR Buffer;//缓冲区的指针。 }UNICODE_STRING*PUNICODE_STRING; 输出字符串 UNICODE_STRING ansiString; KdPrint("%wZ\n",&ansiString);//注意是%wZ ///////////////////////////////////////////////////////////////////////////////

U盘安装win7系统原版安装版图文教程

安装原版Win7的方法 注意备份驱动程序 设置U盘启动教程参考地址: wenku.baidu./view/6c5d476327d3240c8447ef2a.html U盘制作教程参考地址: wenku.baidu./view/6ac2d192dd88d0d233d46a35.html?st=1 Win旗舰版下载地址: ed2k://|file|cn_windows_7_ultimate_with_sp1_x86_dvd_u_67748 6.iso|2653276160|7503E4B9B8738DFCB95872445C72AEFB|/ 电脑店U盘工具地址:u.diannaodian./ 进PE利用虚拟光驱工具进行安装 以下安装过程是在虚拟机上完全安装的,和实际安装过程完全一样。 具体步骤: 1、先使用电脑店U盘启动盘制作工具制作完U盘启动。 注意:进入启动菜单,然后选择第十一个菜单,进入第一个PE。

2、插入U盘进入PE,先把要装系统的盘格式化一下。

3、进入第一个PE后找到我们事先准备好的win7光盘iso镜像,找到虚拟光驱工具VDM进行加载。

4、打开光盘镜像后如图所示,之后把这个程序最小化就不用管他了,现在打开“我的电脑”,是不是多了一个盘符,这就说明光盘镜像已经顺利得加载到虚拟光驱中了。下面执行光盘根目录下的 SETUP.EXE 开始安装(这个步骤,每个安装盘可能有所不同,有的就是SETUP.EXE ,也有叫做 WINNT32.BAT,也可能叫做 XP安装器之类的,本文章的例子就是SETUP.EXE)(打开SETUP.EXE安装之前注意拔掉U盘,不然文件会自动写进U盘里,无法进行下一步重启安装)。 5、双击SETUP.EXE打开,会出现安windows7安装欢迎安装窗口,点击“现在安装”。

相关文档
最新文档