g-var.com | G-VAR's Blog

Recent Posts

Full Category Index

Posts in “Blog”

VS2013编译Qt 4.8.6 x64

Thu, Apr 13, 2017
转载请注明出处! 原文链接:VS2013编译Qt 4.8.6 x64 下载Qt 4.8.6源码 下载地址 源码配置 将下载的qt-everywhere-opensource-src-4.8.6.zip解压,如:E:/qt-everywhere-opensource-src-4.8.6 对源文件进行修改,修改内容如下: 找到./mkspecs/win32-msvc2013/qmake.conf文件,将 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF QMAKE_LFLAGS_DEBUG = /DEBUG 修改为 QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NO QMAKE_LFLAGS_DEBUG = /DEBUG /INCREMENTAL:NO 找到./src/3rdparty/webkit/Source/JavaScriptCore/wtf/HashSet.h文件,将 return m_impl.add(value); 修改为 typedef typename HashSet<T, U, V>::iterator iter_type; auto& p = m_impl.add(value); return make_pair((iter_type)p.first, p.second); 再将 return m_impl.template addPassingHashCode<T, T, Adapter>(value, value); 修改为: typedef typename HashSet<Value, HashFunctions, Traits>::iterator iter_type; auto& p = m_impl.

Golang获取网卡信息

Wed, Dec 23, 2015
转载请注明出处! 原文链接:Golang获取网卡信息 最近项目需要,想用Go语言获取网卡信息,并能用Go语言对网卡进行配置。 Go的net包可以获取网卡的IP,但不能获取网卡的子网掩码以及网关等信息,需要借助syscall包来获取子网掩码等信息,实现代码如下: // getAdapterList()是interface_windows.go下的源码,getAdapterList()这个函数只在go 1.5之前有,1.5之后就没有该函数了,不过这不影响程序的运行。 func getAdapterList() (*syscall.IpAdapterInfo, error) { b := make([]byte, 1000) l := uint32(len(b)) a := (*syscall.IpAdapterInfo)(unsafe.Pointer(&b[0])) err := syscall.GetAdaptersInfo(a, &l) if err == syscall.ERROR_BUFFER_OVERFLOW { b = make([]byte, l) a = (*syscall.IpAdapterInfo)(unsafe.Pointer(&b[0])) err = syscall.GetAdaptersInfo(a, &l) } if err != nil { return nil, os.NewSyscallError("GetAdaptersInfo", err) } return a, nil } func localAddresses() error { ifaces, err := net.Interfaces() if err != nil { return err } aList, err := getAdapterList() if err !

wxWidgets 1 | VS2013下搭建wxWidgets 3.0.2开发环境

Tue, Sep 15, 2015
转载请注明出处! 原文链接:VS2013下搭建wxWidgets 3.0.2开发环境 准备条件 OS:Win 7 VS:VS2013 wx:wxWidgets 3.0.2 安装 wxWidgets的安装分为两种:一种是直接下载安装包进行安装,另外一种就是下载源码进行编译。 本文将采用源码编译的方式进行安装。 首先下载wxWidgets 3.0.2的源码包,然后解压在任意位置。如:X:\wxWidgets-3.0.2。 然后进入X:\wxWidgets-3.0.2\build\msw路径下找到wx_vc12.sln文件,双击打开。 最后在vs2013的菜单栏里找到生成->批生成选项,点击打开批生成窗口,在窗口里选择要编译生成的工程,并点击窗口右侧的生成按钮进行编译。 如果顺利,在经过几分钟的编译之后,会在X:\wxWidgets-3.0.2\lib\vc_lib文件夹下生成所需的库文件,其中u表示Release版本,ud表示Debug版本。 使用 至此,wxWidgets的开发环境基本上就算搭建完成了,接下来就可以编译源码中的例子来进行深入的学习了。 以X:\wxWidgets-3.0.2\samples\mfc下的工程为例,双击打开目录下的mfc_vc9.vcxproj文件进行工程的迁移工作,完成之后直接进行编译,成功之后就会在X:\wxWidgets-3.0.2\samples\mfc\vc_mswud目录下生成名为mfctest.exe的可执行文件,双击运行就可以看到简单的界面程序了。 注意:这里编译的自带例子可以直接生成,如果要编译其它基于wxWidgets的工程(如OpenPhone)可能会就需要进行一些配置了,具体的配置就自行Google吧。 [ 转载必须在正文中标注并保留原文链接等信息。]

(转)50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs

Tue, Jun 16, 2015
原文地址:50 Shades of Go: Traps, Gotchas, and Common Mistakes for New Golang Devs 最近看到一篇不错的文章,没时间翻译,先分享过来,以后有时间再加以翻译。 Go is a simple and fun language, but, like any other language, it has a few gotchas… Many of those gotchas are not entirely Go’s fault. Some of these mistakes are natural traps if you are coming from another language. Others are due to faulty assumptions and missing details. A lot of these gotchas may seem obvious if you took the time to learn the language reading the official spec, wiki, mailing list discussions, many great posts and presentations by Rob Pike, and the source code.

搭建OpenCV 2.4.10和VS2010开发环境 | OpenCV 1

Mon, Mar 2, 2015
转载请注明出处! 原文链接:搭建OpenCV 2.4.10和VS2010开发环境 本篇主要介绍如何在VS2010下安装配置OpenCV。 OpenCV的下载 首先在http://opencv.org/downloads.html官网上下载OpenCV的最新版本2.4.10(截止2015年3月2日的版本),然后解压安装。我的安装目录是:E:,得到一个称为opencv的文件夹,其中包括build和sources两个文件夹; 配置环境变量 修改系统变量,在Path的最后添加上 E:\opencv\build\x86\vc10\bin。 配置VS2010 为了让每次新建的程序都可以直接用上配置,我们在属性管理器中进行修改。但是首先必须新建一个空的Win32控制台项目,然后才能进行下面的操作: 打开 视图->属性管理器 ,如下图所示; 双击Microsoft.Cpp.Win32.user,在弹出的窗口进行操作: 选择VC++目录,修改: 包含目录中添加: E:\opencv\build\include\opencv2 E:\opencv\build\include\opencv E:\opencv\build\include 库目录中添加: E:\opencv\build\x86\vc10\lib 选择 链接器->输入 ,添加附加依赖项: opencv_calib3d2410d.lib opencv_contrib2410d.lib opencv_core2410d.lib opencv_features2d2410d.lib opencv_flann2410d.lib opencv_gpu2410d.lib opencv_highgui2410d.lib opencv_imgproc2410d.lib opencv_legacy2410d.lib opencv_ml2410d.lib opencv_nonfree2410d.lib opencv_objdetect2410d.lib opencv_ocl2410d.lib opencv_photo2410d.lib opencv_stitching2410d.lib opencv_superres2410d.lib opencv_ts2410d.lib opencv_video2410d.lib opencv_videostab2410d.lib 到此OpenCV的开发环境就搭建好了。 注意:上边的附加依赖项是针对Debug版本的,Release版本就换成相应的库文件。 例子 #include <iostream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> using namespace cv; int main() { // 读取图片 Mat img=imread("222.jpg"); // 创建一个名为"222"窗口 namedWindow("222"); // 在窗口中显示 imshow("222",img); // 等待5s后窗口自动关闭 waitKey(5000); } 编译,成功。程序运行结果如下图所示:

Windows下搭建PCL开发环境 | PCL 1

Tue, Feb 10, 2015
转载请注明出处! 原文链接:Windows下搭建PCL开发环境 准备条件 Windows 7 64位操作系统 Visual Studio 2010 PCL-1.6.0-AllInOne-msvc2010-win64.exe cmake-3.1.2-win32-x86.exe qt-opensource-windows-x86-msvc2010_opengl-5.4.0.exe 安装 安装Visual Studio 2010 Visual Studio的安装请按照默认的安装配置进行安装就可以,如果有不清楚的地方请参考百度。 安装QT QT的安装请按照默认的安装配置进行安装就可以,如果有不清楚的地方请参考百度。 安装PCL 双击PCL-1.6.0-AllInOne-msvc2010-win64.exe程序,按照提示默认安装即可。运行如下面图示所示: 成功安装之后,安装目录下有6个文件夹:3rdParty、bin、cmake、include、lib、share,其中3rdParty内部有6个第三方开源包的预编译库(Boost、Eigen、Flann、OpenNI、Qhull、VTK),预编译库文件夹中包含了安装包对应链接库以及include头文件等;bin目录下包含编译好的PCL相关DLL文件与EXE文件,此处编译好的EXE文件有很多是示例程序,可以自行运行测试;cmake目录下包含开发包相关的CMake配置文件,在建立工程时,利用此文件中包含的宏寻找第三方包和PCL相对应的include与lib目录;include目录包含了PCL的头文件;lib目录下包含了PCL相关的LIB文件;share目录包含了帮助文件等。 另外,在安装PCL的过程中,会弹出提示安装OpenNI与PrimeSense,按照默认进行安装就可以了。 安装CMake 双击cmake-3.1.2-win32-x86.exe程序,按照提示默认安装就可以了。 至此,基本的PCL开发环境就已经安装完成了,接下来的会一步一步的进行开发工作。 [ 转载必须在正文中标注并保留原文链接、译文链接等信息。]

(转)16 Best Online Resources to Learn Programming Easily

Sun, Feb 8, 2015
原文地址:http://devzum.com/2015/02/04/16-best-online-resources-to-learn-programming-easily/ Development is a very complex and fun task. You need to be extremely quick and efficient, to match the deadlines and the requirements, that your client or your project presents to you. This is something, that you don’t get eventually. You need to spend time practicing the same, but before practicing, the more important thing is to learn it from the right place. Half knowledge is more dangerous. So, learning from a source not reliable enough is very useless, and as well as wasting your time and efforts.

(转)Go语言并发之美

Tue, Jan 20, 2015
原文地址:http://golang.in/post/47948631906/go 简介 多核处理器越来越普及,那有没有一种简单的办法,能够让我们写的软件释放多核的威力?答案是:Yes。随着Golang, Erlang, Scale等为并发设计的程序语言的兴起,新的并发模式逐渐清晰。正如过程式编程和面向对象一样,一个好的编程模式需要有一个极其简洁的内核,还有在此之上丰富的外延,可以解决现实世界中各种各样的问题。本文以GO语言为例,解释其中内核、外延。 并发模式之内核 这种并发模式的内核只需要协程和通道就够了。其中协程负责执行代码,通道负责在协程之间传递事件。 并发编程一直以来都是个非常困难的工作。要想编写一个良好的并发程序,我们不得不了解线程,锁,semaphore,barrier甚至CPU更新高速缓存的方式,而且他们个个都有怪脾气,处处是陷阱。笔者除非万不得以,决不会自己操作这些底层并发元素。一个简洁的并发模式不需要这些复杂的底层元素,只需协程和通道就够了。 协程是轻量级的线程。在过程式编程中,当调用一个过程的时候,需要等待其执行完才返回。而调用一个协程的时候,不需要等待其执行完,会立即返回。协程十分轻量,Go语言可以在一个进程中执行有数以十万计的协程,依旧保持高性能。而对于普通的平台,一个进程有数千个线程,其CPU会忙于上下文切换,性能急剧下降。随意创建线程可不是一个好主意,但是我们可以大量使用的协程。 通道是协程之间的数据传输通道。通道可以在众多的协程之间传递数据,具体可以值也可以是个引用。通道有两种使用方式。 协程可以试图向通道放入数据,如果通道满了,会挂起协程,直到通道可以为他放入数据为止。 协程可以试图向通道索取数据,如果通道没有数据,会挂起协程,直到通道返回数据为止。 如此,通道就可以在传递数据的同时,控制协程的运行。有点像事件驱动,也有点像阻塞队列。这两个概念非常的简单,各个语言平台都会有相应的实现。在Java和C上也各有库可以实现两者。 只要有协程和通道,就可以优雅的解决并发的问题。不必使用其他和并发有关的概念。那如何用这两把利刃解决各式各样的实际问题呢? 并发模式之外延 协程相较于线程,可以大量创建。打开这扇门,我们拓展出新的用法,可以做生成器,可以让函数返回“服务”,可以让循环并发执行,还能共享变量。但是出现新的用法的同时,也带来了新的棘手问题,协程也会泄漏,不恰当的使用会影响性能。下面会逐一介绍各种用法和问题。演示的代码用GO语言写成,因为其简洁明了,而且支持全部功能。 生成器 有的时候,我们需要有一个函数能不断生成数据。比方说这个函数可以读文件,读网络,生成自增长序列,生成随机数。这些行为的特点就是,函数的已知一些变量,如文件路径。然后不断调用,返回新的数据。 下面生成随机数为例,以让我们做一个会并发执行的随机数生成器。 非并发的做法是这样的: // 函数rand_generator_1 ,返回 int func rand_generator_1() int { return rand.Int() } 上面是一个函数,返回一个int。假如rand.Int()这个函数调用需要很长时间等待,那该函数的调用者也会因此而挂起。所以我们可以创建一个协程,专门执行rand.Int()。 // 函数rand_generator_2,返回通道(Channel) func rand_generator_2() chan int { // 创建通道 out := make(chan int) // 创建协程 go func() { for { //向通道内写入数据,如果无人读取会等待 out <- rand.Int() } }() return out } func main() { // 生成随机数作为一个服务 rand_service_handler :=rand_generator_2() // 从服务中读取随机数并打印 fmt.

(转)给golang程序进行一次廋身

Sun, Jan 18, 2015
原文地址:http://91xcode.com/2014/10/22/go-build/ golang语言是使用静态编译,但是由golang编译出来的程序仔细一点的话会发现有点大,我们需要对它进行一次廋身。 举个例子这个文件hello.go 正常编译后的大小: go build hello.go 添加点参数就不一样了: go build -ldflags "-s -w" hello.go 命令解析 -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果。 -w去掉DWARF调试信息,得到的程序就不能用gdb调试了。 -s和-w也可以分开使用,一般来说如果不打算用gdb调试。 -w基本没啥损失。-s的损失就有点大了。

(转)Beego+uploadify实现图片批量上传

Sun, Jan 18, 2015
原文地址:http://www.momaek.me/article?tid=12 使用uploadify来实现无刷新批量上传图片,后台使用Beego 来处理上传的图片。需要在 form 表单需要添加这个属性: enctype="multipart/form-data" 不然浏览器是不会上传你的文件的。 下载uploadify,就不多说了。免费的版本就可以了,你也可以下载收费的。免费的是flash版本,收费的是html5版本。具体区别我没有研究过。感兴趣的童鞋可以去研究下。 引入uploadify: <script src="/static/js/jquery-1.6.js" type="text/javascript" charset="utf-8"></script> //uploadify是基于jQuery的所以需要jQuery <script src="/static/js/uploadify/jquery.uploadify.min.js" type="text/javascript"></script> <link rel="stylesheet" href="/static/js/uploadify/uploadify.css" type="text/css"> 然后就是HTML代码: <form method="POST" action="/addphoto" enctype="multipart/form-data"> <input type="file" name="image" id="file_upload"> </form> 将uploadify绑定在input元素上面: <script type="text/javascript"> $(function(){ $("#file_upload").uploadify({ //绑定元素 'fileObjName':'image',//html input标签的name属性的值吧。 'debug':false, 'auto':true, //自动上传 'buttonText':'Choose A File', 'removeCompleted':false, //上传完成以后是否保存进度条 'cancelImg':'/static/js/uploadify/uploadify-cancel.png', 'swf':'/static/js/uploadify/uploadify.swf', //必须设置 swf文件路径 'uploader':'/addphoto', //必须设置,上传文件触发的url 'fileTypeDesc':'FileType', 'fileTypeExts':'*.jpg;*.jpge;*.gif;*.png', 'overrideEvents':['onDialogClose'], 'multi':true, 'formData':{'url':window.location.search} //这里我需要得到当前页面url的问号后面的值,所以就用 fromData 这个参数。 }); }); </script> 最后是beego的处理,如同处理单个文件上传: func (this *AddPhoto) AP() { f, h, _ := this.

(转)使用Golang实现简单Ping过程

Sat, Jan 17, 2015
转自:http://my.oschina.net/ybusad/blog/300155 引言 关于各种语言实现Ping已经是大家喜闻乐见的事情了,网络上利用Golang实现Ping已经有比较详细的代码示例,但大多是仅仅是实现了Request过程,而对Response的回显内容并没有做接收。而Ping程序不仅仅是发送一个ICMP,更重要的是如何接收并进行统计。 下面是网络上几篇关于Ping的实现代码: https://github.com/paulstuart/ping/blob/master/ping.go http://blog.csdn.net/gophers/article/details/21481447 http://blog.csdn.net/laputa73/article/details/17226337 本文借鉴了第二个链接里面的部分代码。 准备 安装最新的Go 由于Google被墙的原因,如果没有VPN的话,就到这里下载: http://www.golangtc.com/download 使用任意文本编辑器,或者LiteIDE会比较方便编译和调试,下面是LiteIDE的下载地址 https://github.com/visualfc/liteide 编码 要用到的package: import ( "bytes" "container/list" "encoding/binary" "fmt" "net" "os" "time" ) 使用Golang提供的net包中的相关函数可以快速构造一个IP包并自定义其中一些关键参数,而不需要再自己手动填充IP报文。 使用encoding/binary包可以轻松获取结构体struct的内存数据并且可以规定字节序(这里要用网络字节序BigEndian),而不需要自己去转换字节序。之前的一片文中使用boost,还要自己去实现转换过程,详见:关于蹭网检查的原理及实现 使用container/list包,方便进行结果统计 使用time包实现耗时和超时处理 ICMP报文struct: type ICMP struct { Type uint8 Code uint8 Checksum uint16 Identifier uint16 SequenceNum uint16 } Usage提示: arg_num := len(os.Args) if arg_num < 2 { fmt.Print( "Please runAs [super user] in [terminal].

(转)Golang 实现文件解压缩与拷贝

Sat, Jan 17, 2015
Golang 实现文件解压缩与拷贝 package main import ( "archive/tar" "compress/gzip" "fmt" "io" "os" "path" ) // main functions shows how to TarGz a directory/file and // UnTarGz a file // Gzip and tar from source directory or file to destination file // you need check file exist before you call this function func main() { os.Mkdir("/home/ty4z2008/tar", 0777) w, err := CopyFile("/home/ty4z2008/tar/1.pdf", "/home/ty4z2008/src/1.pdf") //targetfile,sourcefile if err != nil { fmt.Println(err.Error()) } fmt.Println(w) TarGz("/home/ty4z2008/tar/1.pdf", "/home/ty4z2008/test.

(转)如何Golang开发Android应用(for golang1.4)

Sat, Jan 17, 2015
文章出处 http://shengxiang.me/article/38/write-android-program-with-golang.html Golang是一门强类型编程语言,2009年推出,在今年2014年,开始支持android的开发了。 环境配置好复杂,我不得不唠叨几句。 需要下载golang1.4rc版,下载ndk,然后编译。 然后用go get 下载gobind这个工具, 然后,将写好的代码用gobind转化下,然后使用特殊的编译命令,将代码编译成.so文件,将生成的相关文件,放到android studio的项目中。然后java代码中,利用jni调用引用的代码。 … 好,接着往下看吧。 环境准备 一台Linux 64的机器 一个带有AndroidStudioIDE的开发机器 因为环境配置实在复杂,所以我们引入的docker。 docker pull codeskyblue/docker-goandroid docker run --rm -ti codeskyblue/docker-goandroid bash cd example; echo "view example projects docker起来之后,什么就都配置好了,NDK啦,java啦,GO的环境变量了,等等,并且还预装了vim,gradle,tmux,git,syncthing,svn。 开始写代码 写代码之前,先约定下目录结构 go的代码都放在src/golib下,编译使用make.bash编译脚本,看下这个文件树 . |-- app.iml |-- build.gradle |-- libs/armeabi-v7a # go编译生成的so文件 | `-- libgojni.so |-- main.go_tmpl # 一个模板文件,先不用管它 |-- make.bash # 编译脚本,用来生成.so和Java代码 `-- src |-- golib | |-- hi | | |-- go_hi֞֞֞ # 自动生成的代码 | | | `-- go_hi.

(转)Kinect开发学习笔记之(八)彩色、深度、骨骼和用户抠图结合 | Kinect 8

Tue, Jan 28, 2014
我的Kinect开发平台是: Win7 x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0 开发环境的搭建见上一文: http://blog.csdn.net/zouxy09/article/details/8146055 本学习笔记以下面的方式组织:编程前期分析、代码与注释和重要代码解析三部分。 要实现目标:整合前面所说的彩色图像、深度图像和骨骼图像,就是实现和SDK自带的那个SkeletonView例程差不多的功能。另外,再增加用户抠图功能,这个功能和SDK自带的那个Green Screen功能差不多。我们通过OpenCV来显示。 编程前期分析 这里因为是整合前面几个学习笔记提到的功能,所以要了解的东西前面都已经了解了,这里就不赘述了。这里唯一有一个新的点就是用户抠图,我们再学习学习。 那么叫抠图啊?用过Photoshop或者AE等一般的图像或者视频处理软件的人应该不会陌生。所谓抠图,就是把图片或影像的某一部分从原始图片或影像中分离出来成为单独的图层。主要功能是为了后期的合成做准备。如果还不了解的话,我们看过科幻电影或者一个特效视频吧?某个人在恐龙旁边、某个人在悬崖边打架、某个人在天上飞等等,这些场景大家有没有想过它是怎样实现的啊?难道真的是实景拍的?你都会说了“怎么可能!”。实际上很大一部分就是采用抠图这个技术的,如果搞视频特效处理的话,这个技术行业内好像叫“键控”。它在电视制作和电影制作中很常见,这种技术叫做绿屏抠像,就是演员或者播音员站在绿色底板前,然后录完节目后,绿色背景抠出,换成其他场景,在一些科幻电影中演员不可能在实景中表演时常采用的造景手法。 在Kinect中我们也可以达到类似的效果。Kinect SDK使得这个很容易实现。这实际上就是现实增强的一个基本例子,现实增强应用非常有趣而且能够获得非常好的用户体验。许多艺术家使用Kinect来进行现实增强交互展览。另外,这种技术也通常作为广告和营销的工具。 代码与注释 #include <windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; bool tracked[NUI_SKELETON_COUNT]={FALSE}; CvPoint skeletonPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT]={cvPoint(0,0)}; CvPoint colorPoint[NUI_SKELETON_COUNT][NUI_SKELETON_POSITION_COUNT]={cvPoint(0,0)}; void getColorImage(HANDLE &colorEvent, HANDLE &colorStreamHandle, Mat &colorImage); void getDepthImage(HANDLE &depthEvent, HANDLE &depthStreamHandle, Mat &depthImage); void getSkeletonImage(HANDLE &skeletonEvent, Mat &skeletonImage, Mat &colorImage, Mat &depthImage); void drawSkeleton(Mat &image, CvPoint pointSet[], int witchone); void getTheContour(Mat &image, int whichone, Mat &mask); int main(int argc, char *argv[]) { Mat colorImage; colorImage.

(转)Kinect开发学习笔记之(七)骨骼数据的提取 | Kinect 7

Tue, Jan 28, 2014
我的Kinect开发平台是: Win7x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0 开发环境的搭建见上一文: http://blog.csdn.net/zouxy09/article/details/8146055 本学习笔记以下面的方式组织:编程前期分析、代码与注释和重要代码解析三部分。 要实现目标:通过微软的SDK提取骨骼数据并用OpenCV显示 编程前期分析 Kinect产生的深度数据作用有限,要利用Kinect创建真正意义上交互,还需要除了深度数据之外的其他数据。这就是骨骼追踪技术的初衷,也是Kinect最神奇,最有作为的地方。骨骼追踪技术通过处理深度数据来建立人体各个关节的坐标,骨骼追踪能够确定人体的各个部分,如那部分是手,头部,以及身体,还能确定他们所在的位置。 骨架空间 先看看啥叫骨架?应该地球人都知道吧。呵呵。在Kinect里面,是通过20个关节点来表示一个骨架的,具体由下图可以看到。当你走进Kinect的视野范围的时候,Kinect就可以把你的20个关节点的位置找到(当然你得站着),位置通过(x, y, z)坐标来表示。这样,你在Kinect前面做很多复杂的动作的时候,因为人的动作和这些关节点的位置的变化关系还是很大的,那么电脑拿到这些数据后,对于理解你做什么动作就很有帮助了。 玩家的各关节点位置用(x, y, z)坐标表示。与深度图像空间坐标不同的是,这些坐标单位是米。坐标轴x,y, z是深度感应器实体的空间x, y, z坐标轴。这个坐标系是右手螺旋的,Kinect感应器处于原点上,z坐标轴则与Kinect感应的朝向一致。y轴正半轴向上延伸,x轴正半轴(从Kinect感应器的视角来看)向左延伸,如下图所示。为了方便讨论,我们称这些坐标的表述为骨架空间(坐标)。 Kinect放置的位置会影响生成的图像。例如,Kinect可能被放置在非水平的表面上或者有可能在垂直方向上进行了旋转调整来优化视野范围。在这种情况下,y轴就往往不是相对地面垂直的,或者不与重力方向平行。最终得到的图像中,尽管人笔直地站立,在图像中也会显示出事倾斜的。 骨骼跟踪 Kinect最多可以跟踪两个骨骼,可以最多检测六个人。站立模式可以跟踪20个关节点,坐着的模式的话,可以跟踪10个关节点。 NUI骨骼跟踪分主动和被动两种模式,提供最多两副完整的骨骼跟踪数据。主动模式下需要调用相关帧读取函数获得用户骨骼数据,而被动模式下还支持额外最多四人的骨骼跟踪,但是在该模式下仅包含了用户的位置信息,不包括详细的骨骼数据。也就是说,假如Kinect面前站着六个人,Kinect能告诉你这六个人具体站在什么位置,但只能提供其中两个人的关节点的数据(这两个人属于主动模式),也就是他们的手啊,头啊等等的位置都能告诉你,而其他的人,Kinect只能提供位置信息,也就是你站在哪,Kinect告诉你,但是你的手啊,头啊等具体在什么位置,它就没法告诉你了(这四个人属于被动模式)。 对于所有获取的骨骼数据,其至少包含以下信息: 相关骨骼的跟踪状态,被动模式时仅包括位置数据(用户所在位置),主动模式包括完整的骨骼数据(用户20个关节点的空间位置信息)。 唯一的骨骼跟踪ID,用于分配给视野中的每个用户(和之前说的深度数据中的ID是一个东西,用以区分现在这个骨骼数据是哪个用户的)。 用户质心位置,该值仅在被动模式下可用(就是标示用户所在位置的)。 关于编程处理过程 在上篇文章中,我们讨论了如何获取像素点的深度值以及如何根据深度值产生影像。 彩色图像数据,深度数据分别来自ColorImageSteam和DepthImageStream,同样地,骨骼数据来自SkeletonStream。要使用骨架数据,应用程序必须在初始化NUI的时候声明,并且要启用骨架追踪。访问骨骼数据和访问彩色图像数据、深度数据一样,也有事件模式和查询模式两种方式。在本例中我们采用基于事件的方式,因为这种方式简单,代码量少,并且是一种很普通基本的方法。当SkeletonStream中有新的骨骼数据产生时就会触发该事件。 我们初始化并打开骨骼跟踪后,就可以从SkeletonStream中拿骨骼数据了。SkeletonStream产生的每一帧数据skeletonFrame都是一个骨骼对象集合。包含了一个骨架数据结构的数组,其中每一个元素代表着一个被骨架追踪系统所识别的一个骨架信息。每一个骨架信息包含有描述骨骼位置以及骨骼关节的数据。每一个关节有一个唯一标示符如头(head)、肩(shoulder)、肘(dlbow)等信息和对应的三维坐标数据。 Kinect能够追踪到的骨骼数量是一个常量。这使得我们在整个应用程序中能够一次性的为数组分配内存。循环遍历skeletonFrame,每一次处理一个骨骼。那么跟踪的骨骼也有跟得好与不好之分吧,你的姿势、是否有阻挡等等情况,都会使得跟踪不那边好。所以在处理之前需要判断一下是否是一个追踪好的骨骼,可以使用Skeleton对象的TrackingState属性来判断,只有骨骼追踪引擎追踪到的骨骼我们才进行处理,忽略哪些不是游戏者的骨骼信息即过滤掉那些TrackingState不等于SkeletonTrackingState.Tracked的骨骼数据。 Kinect能够探测到6个游戏者,但是同时只能够追踪到2个游戏者的骨骼关节位置信息。处理骨骼数据相对简单,首先,我们根据Kinect追踪到的游戏者的编号,用不同的颜色把游戏者的骨架画出来。 涉及的东西还是比较多的,但是代码思路还是比较清晰的,我们可以看代码,再看看第三部分的解析就会比较好理解了。 代码与注释 #include <windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; //通过传入关节点的位置,把骨骼画出来 void drawSkeleton(Mat &image, CvPoint pointSet[], int whichone); int main(int argc, char *argv[]) { Mat skeletonImage; skeletonImage.

(转)Kinect开发学习笔记之(六)带游戏者ID的深度数据的提取 | Kinect 6

Tue, Jan 28, 2014
我的Kinect开发平台是: Win7x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0 开发环境的搭建见上一文: http://blog.csdn.net/zouxy09/article/details/8146055 本学习笔记以下面的方式组织:编程前期分析、代码与注释和重要代码解析三部分。 要实现目标:通过微软的SDK提取带游戏者ID的深度数据并用OpenCV显示,不同用户,显示的颜色不同 编程前期分析 我们在上一文中提到的是不带游戏者ID的深度数据的提取,具体见下面: Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取 http://blog.csdn.net/zouxy09/article/details/8146719 首先,Kinect传感器核心是发射红外结构光,并探测红外光反射,从而可以计算出视场范围内每一个像素的深度值。从深度数据中最先提取出来的是物体主体和形状,以及每一个像素点的游戏者索引信息。然后用这些形状信息来匹配人体的各个部分,最后计算匹配出来的各个关节在人体中的位置。而Kinect具有一次识别多达6个游戏者的能力,并能跟踪最多两个人的骨骼(对于XBOX360来说,就是可以同时两个人玩游戏了)。 可能有点奇怪哦,这一个带游戏者ID,一个不带,还得那么严肃地给它单独开一文来学习。究竟啥来头啊。呵呵,实际上,既然微软提供了这种差别,那么它的存在肯定是有意义的,所谓存在即合理嘛。多个选择嘛。需要用到游戏者ID的时候就用,不需要的时候就不用费那么大劲。也不能说费劲,就是使用游戏者ID的时候,我们需要再做一些工作,去把不同游戏者的轮廓找出来,然后为了区别,标上不同的颜色,这就是本文想实现的。有点啰嗦了。 上一文中,我们讲到,Kinect的深度图像数据有两种格式,一种是带游戏者ID的,一种是不带的。两种格式都是用两个字节来保存一个像素的深度值,而两方式的差别在于: 唯一表示深度值:那么像素的低12位表示一个深度值,高4位未使用; 既表示深度值又含有游戏者ID:Kinect为每一个追踪到的游戏者编号作为索引。而这个方式中,像素值的高13位保存了深度值,低三位保存用户序号,7 (0000 0111)这个位掩码能够帮助我们从深度数据中获取到游戏者索引值。 要注意的是,不要对特定的游戏者索引位进行编码,因为他们是会变化的。实际的游戏者索引位并不总是和Kinect前面的游戏者编号一致。啥意思呢?例如,Kinect视野中只有一个游戏者,但是返回的游戏者索引位值可能是3或者4。也就是说有时候第一个游戏者的游戏者索引位可能不是1。还有,如果走进Kinect视野再走出去,然后再走进来,虽然你还是你,但是Kinect给你的索引ID可能就和原来的不一样了,例如之前返回的索引位是1,走出去后再次走进,可能索引位变为其他值了。所以开发Kinect应用程序的时候应该注意到这一点。 说得有点乱哦,咱们还是看代码吧。 代码与注释 #include <windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; //处理深度数据的每一个像素,如果属于同一个用户的ID,那么像素就标为同种颜色,不同的用户, //其ID不一样,颜色的标示也不一样,如果不属于某个用户的像素,那么就采用原来的深度值 RGBQUAD shortDepth2RGBquad( USHORT depthID ) { //每像素共16bit的信息,其中最低3位是ID(所捕捉到的人的ID),剩下的13位才是信息 USHORT realDepth = (depthID & 0xfff8) >> 3; //提取距离信息,高13位 USHORT player = depthID & 0x07 ; //提取ID信息 ,低3位 //因为提取的信息是距离信息,为了便于显示,这里归一化为0-255 BYTE depth = 255 - (BYTE)(256*realDepth/0x0fff); RGBQUAD q; q.

(转)Kinect开发学习笔记之(五)不带游戏者ID的深度数据的提取 | Kinect 5

Tue, Jan 28, 2014
我的Kinect开发平台是: Win7 x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0 开发环境的搭建见上一文: http://blog.csdn.net/zouxy09/article/details/8146055 本学习笔记以下面的方式组织:编程前期分析、代码与注释和重要代码解析三部分。 要实现目标:通过微软的SDK提取不带游戏者ID的深度数据并用OpenCV显示 编程前期分析 深度数据的获取和彩色图像数据的获取基本上是一样的,所以关于采集过程就不赘述了,具体见: Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示 http://blog.csdn.net/zouxy09/article/details/8146266 这里需要了解下深度数据: 深度数据流所提供的图像帧中,每一个像素点代表的是在深度感应器的视野中,该特定的(x, y)坐标处物体到离摄像头平面最近的物体到该平面的距离(以毫米为单位)。 Kinect中深度值最大为4096mm,0值通常表示深度值不能确定,一般应该将0值过滤掉。微软建议在开发中使用1220mm~3810mm范围内的值。在进行其他深度图像处理之前,应该使用阈值方法过滤深度数据至1220mm-3810mm这一范围内。 下图显示了Kinect Sensor的感知范围,其中的default range对Xbox 360和Kinect for Windows都适用,而near range仅对后者适用: 深度数据的存储: Kinect的深度图像数据含有两种格式,两种格式都是用两个字节来保存一个像素的深度值,而两方式的差别在于: 唯一表示深度值:那么像素的低12位表示一个深度值,高4位未使用; 既表示深度值又含有游戏者ID:Kinect SDK具有分析深度数据和探测人体或者游戏者轮廓的功能,它一次能够识别多达6个游戏者。SDK为每一个追踪到的游戏者编号作为索引。而这个方式中,像素值的高13位保存了深度值,低三位保存用户序号,7 (0000 0111)这个位掩码能够帮助我们从深度数据中获取到游戏者索引值(这个编程将在下一节)。 应用程序可以使用深度数据流中的深度数据来支持各种各样的用户特性,如追踪用户的运动并在程序中识别和忽略背景物体的信息等。 代码与注释 #include <windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char *argv[]) { Mat image; //这里我们用灰度图来表述深度数据,越远的数据越暗。 image.create(240, 320, CV_8UC1); //1、初始化NUI,注意:这里传入的参数就不一样了,是DEPTH HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_DEPTH); if (FAILED(hr)) { cout<<"NuiInitialize failed"<<endl; return hr; } //2、定义事件句柄 //创建读取下一帧的信号事件句柄,控制KINECT是否可以开始读取下一帧数据 HANDLE nextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); HANDLE depthStreamHandle = NULL; //保存图像数据流的句柄,用以提取数据 //3、打开KINECT设备的深度图信息通道,并用depthStreamHandle保存该流的句柄,以便于以后读取 hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_DEPTH, NUI_IMAGE_RESOLUTION_320x240, 0, 2, nextColorFrameEvent, &depthStreamHandle); if( FAILED( hr ) )//判断是否提取正确 { cout<<"Could not open color image stream video"<<endl; NuiShutdown(); return hr; } namedWindow("depthImage", CV_WINDOW_AUTOSIZE); //4、开始读取深度数据 while(1) { const NUI_IMAGE_FRAME * pImageFrame = NULL; //4.

(转)Kinect开发学习笔记之(四)提取颜色数据并用OpenCV显示 | Kinect 4

Tue, Jan 28, 2014
我的Kinect开发平台是: Win7 x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0 开发环境的搭建见上一文: http://blog.csdn.net/zouxy09/article/details/8146055 下面这几个大部分是参考“timebomb”的Kinect学习笔记系列: http://blog.csdn.net/timebomb/article/details/7169372 非常感谢“timebomb”的工作,让我能尽快的进入Kinect的开发。 本学习笔记以下面的方式组织:编程前期分析、代码与注释和重要代码解析三部分。 要实现目标:通过微软的SDK提取颜色数据(彩色图像)并用OpenCV显示 编程前期分析 我们在http://blog.csdn.net/zouxy09/article/details/8145592中提到: Kinect有三个镜头,中间的镜头是 RGB 彩色摄影机,用来采集彩色图像。左右两边镜头则分别为红外线发射器和红外线CMOS 摄影机所构成的3D结构光深度感应器,用来采集深度数据(场景中物体到摄像头的距离)。彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。那下面我们就是要通过微软提供的SDK的API去读取驱动上面的彩色摄像头来读取彩色图像。 一个应用程序从Kinect传感器阵列中访问下列图像数据: 色彩数据:就是彩色摄像头采集到的数据,我们可以设置采集的分辨率; 深度数据:就是红外摄像头采集到的数据,同样可以设置采集的分辨率; 带游戏者ID的深度数据:Kinect可以检测6个人,所以深度数据中有携带标示这是哪个游戏者的深度数据的。 骨骼点数据:实际上不能算是图像数据,感觉应该是Kinect上层算法分析彩色和深度图像得到的骨骼点数据,包含了跟踪到的人的关节点的位置等信息。 而对于彩色和深度这些图像数据,SDK是以数据流的方式来组织的,也就是图像数据按顺序的一帧一帧的流过来,你需要的时候就拿。当然,如果你拿的速度比摄像头提供图像的速度要快,那么你就需要等待,等待摄像头产生新的数据给你。那么这个“等”就有了两种方式了: 查询方式:反正我也没事干,所以我不停的问摄像头拿数据,通过一个while循环不断地催它,然后一旦有新的图像数据了,我拿到就跑; 事件方式:要我不停地催你,我也烦,你没有数据给我,那我先打个瞌睡(休眠了,不用占CPU资源),然后你有新的数据来后,再叫醒我(给个有数据的信号),然后我再拿走数据。那我这个等新数据的过程就叫一个事件,系统通过一个事件的句柄来标示,这样系统才知道下面摄像头有数据来了,系统才知道唤醒谁啊,是吧。而这个事件我们待会编程就遇到了。而目前,大部分是通过这种方式来得到图像数据的。(呵呵,不知道理解得对不对) 还是通过代码来分析清晰点。 代码与注释 #include <windows.h> #include <iostream> #include <NuiApi.h> #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc, char *argv[]) { Mat image; image.create(480, 640, CV_8UC3); //1、初始化NUI HRESULT hr = NuiInitialize(NUI_INITIALIZE_FLAG_USES_COLOR); if (FAILED(hr)) { cout<<"NuiInitialize failed"<<endl; return hr; } //2、定义事件句柄 //创建读取下一帧的信号事件句柄,控制KINECT是否可以开始读取下一帧数据 HANDLE nextColorFrameEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); HANDLE colorStreamHandle = NULL; //保存图像数据流的句柄,用以提取数据 //3、打开KINECT设备的彩色图信息通道,并用colorStreamHandle保存该流的句柄,以便于以后读取 hr = NuiImageStreamOpen(NUI_IMAGE_TYPE_COLOR, NUI_IMAGE_RESOLUTION_640x480, 0, 2, nextColorFrameEvent, &colorStreamHandle); if( FAILED( hr ) )//判断是否提取正确 { cout<<"Could not open color image stream video"<<endl; NuiShutdown(); return hr; } namedWindow("colorImage", CV_WINDOW_AUTOSIZE); //4、开始读取彩色图数据 while(1) { const NUI_IMAGE_FRAME * pImageFrame = NULL; //4.

(转)Kinect开发学习笔记之(三)Kinect开发环境配置 | Kinect 3

Tue, Jan 28, 2014
我的Kinect开发平台是: Win7 x86 + VS2010 + Kinect for Windows SDK v1.6 + OpenCV2.3.0 基本要求 Microsoft Visual Studio® 2010 预览版或者其他VisualStudio 2010发行版 Microsoft.NET Framework 4.0 (安装在Visual Studio 2010) 对于C++开发者要浏览骨骼样例需要: DirectXSoftware Development Kit,June 2010或最新版 DirectXEnd-User Runtime Web Installer 对于语音识别样例 (x86only): MicrosoftSpeech Platform - Server Runtime, version 10.2 (x86 edition) MicrosoftSpeech Platform - Software Development Kit, version 10.2 (x86 edition) Kinect for Windows RuntimeLanguage Pack, version 0.9 (微软语音平台为Kinect Windows SDK Beta提供的声学模型) 安装和配置Kinect for Windows SDK v1.

(转)Kinect开发学习笔记之(二)Kinect开发学习资源整理 | Kinect 2

Tue, Jan 28, 2014
刚刚接触Kinect,在网上狂搜资料,获得了很多有利于学习Kinect开发的资源,现整理如下: 首先当然是官方的API介绍了,编程少不了的。Kinect for Windows Programming Guide: http://msdn.microsoft.com/en-us/library/hh855348.aspx KinectSDK的视频开发教程: http://channel9.msdn.com/Series/KinectSDKQuickstarts?sort=recent#tab_sortBy_recent KinectSDK的开发指南: http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/guides.aspx KinectSDK的官方论坛: http://social.msdn.microsoft.com/Forums/en-US/kinectsdk/threads “无花无酒锄作田”的博客,对《Apress Beginning Kinect Programming with the Microsoft Kinect SDK》这本书的连载翻译(目前到十五节了,好像完了),这本书的的英文pdf版可以网上下载。书的内容不仅介绍了如何通过Kinect SDK编程,还介绍了关于人机交互软件设计的很多内容,虽然书所采用的编程语言可能与你的不同,但很多设计思想很有参考价值。 http://www.cnblogs.com/yangecnu/archive/2012/03/30/KinectSDK_Geting_Started.html 马宁的Kinect for Windows SDK开发初体验系列 http://www.cnblogs.com/aawolf/archive/2011/06/17/2083249.html Kinect+OpenNI学习笔记 系列 http://www.cnblogs.com/tornadomeet/archive/2012/09/26/2704046.html timebomb的Kinect学习笔记系列(终于找到一个基于Opencv和C++的了) http://blog.csdn.net/timebomb/article/details/7169372 如何使用Kinect for windows SDK中的NUI(彩色图像获取) http://blog.csdn.net/leowangzi/article/details/6604513 OpenCV的新版支持与OpenNI的结合,故可直接对其彩色或者深度图像等获取: UsingKinect and other OpenNI compatible depth sensors http://docs.opencv.org/doc/user_guide/ug_highgui.html Kinect相关最新资讯: ENGADGET中国版 http://cn.engadget.com/tag/kinect 体感之家 http://www.kinecthome.com/portal.php 商业不靠谱Kinect http://www.bukop.com/?s=Kinect 雷锋网 Kinect http://www.leiphone.com/tag/kinect 然后,下面的内容来自:http://blog.csdn.net/chenli2010/article/details/6887646 首先是csdn上小斤童鞋的系列文章: Kinect开发教程一:OpenNI的安装与开发环境配置 Kinect开发教程二:OpenNI读取深度图像与彩色图像并显示 Kinect开发教程三:利用OpenNI进行手势识别 Kinect开发教程四:用Kinect控制鼠标玩水果忍者PC版 Kinect开发教程五:OpenNI获取人体骨架 其次是mp77技术交流频道上的系列文章,基于openNI的《user guide》来写的,简明易懂(作者自称西大学生,俺不知是哪个西大): Kinect内幕——解析SDK(OpenNIFramework 1):PrimeSense OpenNI Framework的基本架构和设计思路

(转)Kinect开发学习笔记之(一)Kinect介绍和应用 | Kinect 1

Tue, Jan 28, 2014
Kinect简介 Kinectfor Xbox 360,简称 Kinect,是由微软开发,应用于Xbox 360 主机的周边设备。它让玩家不需要手持或踩踏控制器,而是使用语音指令或手势来操作 Xbox360 的系统界面。它也能捕捉玩家全身上下的动作,用身体来进行游戏,带给玩家“免控制器的游戏与娱乐体验”。其在2010年11月4日于美国上市,建议售价149美金。Kinect在销售前60天内,卖出八百万部,目前已经申请金氏世界记录,成为全世界销售最快的消费性电子产品。 2012年2月1日,微软正式发布面向Windows系统的Kinect版本“Kinect for Windows”,建议售价249美金。而在2012年晚些时候,微软还将发布面向“教育用户”的特别版Kinect。(以上来自wiki百科) 硬件 Kinect有三个镜头,中间的镜头是 RGB 彩色摄影机,用来采集彩色图像。左右两边镜头则分别为红外线发射器和红外线CMOS 摄影机所构成的3D结构光深度感应器,用来采集深度数据(场景中物体到摄像头的距离)。彩色摄像头最大支持1280*960分辨率成像,红外摄像头最大支持640*480成像。Kinect还搭配了追焦技术,底座马达会随着对焦物体移动跟着转动。Kinect也内建阵列式麦克风,由四个麦克风同时收音,比对后消除杂音,并通过其采集声音进行语音识别和声源定位。 软件开发环境 非官方组合 一开始微软对Xbox 360推出Kinect的时候,并没有在windows的开发包。而由于Kinect强大的功能和相对低廉的价格,geeks们纷纷表示希望能在电脑上用它。于是就有多位大牛开发了驱动,目前我了解到的有三个: CL NUI Platform 由NUI的大牛AlexP开发(他开发的其他著名产品包括PS3的windows驱动),可以到这里下载,目标平台是windows7,能够获取彩色摄像头,深度传感器以及加速度传感器数据,使用简单方便。 OpenKinect/libfreenect 由号称第一个破解Kinect的Hector Martin发起,可以到这里下载,目标平台是Linux and Mac,据说有人成功移植到了windows上。因为很多geek都是Mac的拥趸,所以开发参与者众多,不仅仅是个可以获得数据的driver,geek们还写了其他高级的东西,比如我前面提到的骨骼化,将彩色摄像头作为纹理贴在深度数据上等等,很吸引人啊。 OpenNI OpenNI(opennatural interface开放自然交互)是一个多语言,跨平台的框架,它定义了编写应用程序,并利用其自然交互的API。可以到这里下载。从名字判断其终极目标大约是实现少数派报告的效果,从目前放出来的一些demo,恐怕已经超越了这个终极目标。它不是专为Kinect开发,但有Kinect的生产商PrimeSense的支持。这个感觉也是目前相对来说用的比较多的非官方组合:SensorKinect + NITE + OpenNI;其中SensorKinect是Kinect的驱动。NITE是PrimeSense提供的中间件,可以分析Kinect读取的资料,输出人体动作等等。 微软官方SDK Kinect体感游戏在Xbox 360 上获得很好的评价,但是对于 Windows 平台上的开发却一直只能使用非官方的解决方案(上面所说),例如NKinect 配合CL NUI SDK;但是微软终于在2011 年 6 月推出了 Kinect forWindows SDK Beta,特别是可以使用 C# 与.NETFramework 4.0 来进行开发。Kinect for Windows SDK主要是针对Windows7设计,内含驱动程序、丰富的原始感测数据流程式开发接口、自然用户接口、安装文件以及参考例程。Kinect for Windows SDK可让使用C++、C#或VisualBasic语言搭配MicrosoftVisualStudio2010工具的程序设计师轻易开发使用。目前最新是V1.6 。 Kinectfor Windows SDK的下载地址: http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/download.aspx Kinect SDK目前只支持Windows 7,分为x86和x64两个版本。开发工具方面还需要.

编译Direct3D例子时遇到 fatal error CVT1100错误的解决办法!

Sun, Sep 29, 2013
今天在win7上安装了DirectX SDK,安装完成后用Visual studio 2005编译Direct3D例子,碰到以下错误: 1>Linking… 1>CVTRES : fatal error CVT1100: duplicate resource. type:MANIFEST, name:1, language:0x0409 1>LINK : fatal error LNK1123: failure during conversion to COFF: file invalid or corrupt 解决方法: 在文件winmain.rc中搜索MANIFEST,然后将该行注释掉。