前段时间,答题 APP 如火如荼的发展,各大互联网公司都加入了撒币大战,包括像冲顶大会,百万英雄,芝士英雄等等。随之而来的也是各个答题应用辅助的兴起。
网上已经有不少答题应用的辅助,一般来说包括两个步骤,即获取题目选项以及搜索答案。对于题目以及选项的获取包括利用 adb 抓取手机屏幕截图,然后使用 ocr(optical character recognization) 的方式去识别题目和选项。大多数使用的 ocr 工具有谷歌开源的 tesseract-ocr以及百度的 ocr API。谷歌的 tesseract-ocr 可以在本地进行安装,软件下载地址是 https://digi.bib.uni-mannheim.de/tesseract/tesseract-ocr-setup-3.05.01.exe , 安装的时候注意选择增加中文简体语言包,否则无法识别中文。另外一种方法就是利用百度的 ocr API,可以免费申请,使用起来比较方便,识别率相对来说也更加准确。百度 API 还有一个优点是图片无需处理就可以进行识别,而 tesseract-ocr 一般还需要对图片进行简单的处理。获取题目以及选项的另外一种方式就是使用抓包工具去抓取 APP 请求从而获取题目以及选项信息。
另一方面,对于题目答案的搜索。常见的几种做法是直接用题目作为搜索关键字打开浏览器,或者是问题加选项搜索,获取搜索引擎搜索的结果数量。通过结果数量来判断问题和选项的相关性从而判断问题的答案,一般来说这种方式获取的答案都是不太准确的,一是因为现在题目的出题方式越来越诡异,二是相关性越大并不一定就意味着是正确答案。本来对于题目和选项的判断就是很难的一件事情,除非你能做出很完美的语意理解,否则很难判断出正确的选项。还有一种比较直白的方式就是建立题库。在本文中,我们讨论一种建立题库的方式,这里只是做一个简单的探索,未必在实际中就能够使用,因为题库必须足够全才能够发挥威力。
使用 elasticsearch 建立题库 本文主要讲解关于题库的建立方面的很小的一方面进行探索,对于答题辅助的使用可以阅读原文查看完整介绍,代码主要是基于TopSup 做了一些调整。Elasticsearch 将被用于题库的建立,对于 es 的安装可以查看第一篇文章。有人可能会觉得用 es 来做题库,简直就是高射炮打蚊子——小题大做。但我觉得 es 安装和使用都很方便,得益于其强大的 RESTFUL接口,几乎可以用任何工具操控 es。Talk is cheap, show me the code.
from elasticsearch import Elasticsearch def write_quetion(): question = { 'question': '谁是世界上最帅的人', 'answer': 'Neal' } es = Elasticsearch({'localhost'}) es.index(index='question-index', doc_type='question', id=1, body=question) 上面是一个简单的像索引中写入一条记录的代码片段,其实 es 可以算是一种非关系型数据库,在 DB-Engines 的最新排名中,es 已经蹿到了第 9 名。Elasticsearch 中的某些概念可以和关系型数据库进行类比:
因为爬虫项目需要模拟登陆,可是有一个网站的登录需要输入验证码。其实这种登录有2种解决方案,一种是利用cookie,一种是识别图片。前者需要人工登录一次,而且有时效限制,故不太现实。后者可以,但是难点是如何识别出验证码。 这里面就要介绍一个神器了,tesseract-ocr这个项目是一个开源项目,可以用于图像识别。不过这个项目现在托管于google,所以不好下载,你可以搜一下,选择在国内下载。http://download.csdn.net/detail/neal1991/9502931 一开始我觉得我的验证码还挺好识别的,因为都是数字,如下图: 但是我发觉直接来识别还是来识别不了的,最好还是先要对图片进行一些预处理。说到图片的预处理就要说到另外一个软件了,就是imagemagick,这个是一个开源的图片处理项目,你可以去http://www.imagemagick.org/script/binary-releases.php根据你自己的系统进行相应得下载。这个软件还有相应的开发api,你可以自行的根据需要去下载。记住,这个软件安装后,配置环境变量后,需要重新启动的,一开始我还以为是什么问题呢。后来发现重新启动之后,就生效了,可以直接在cmd中使用。在这我就不说什么别的了。 首先是对图片进行预处理:
convert 1.jpg -colorspace gray -normalize -threshold 50% 1.tif 这里主要是先做一个灰度图转化,然后进行归一化处理,最后设立一个阈值,进行二值化,这样最后的结果还是比较清晰的,如下图: 然后再用tesseract进行识别:
tesseract 1.tif result 是不是很简单? 在github上面写了一个nodejs的程序可以直接执行,不过需要安装nodejs,链接如下: https://github.com/neal1991/code-recognition
读过很多道路追踪的论文,经常都需要道路模型的建模。我不知道是不是因为自己太笨还是怎样,好多人建的模型我实在无法理解他的用意何在,而且我真的深刻怀疑他们那些模型的参数是不是真的可以求出来。就比如这篇文章“lane detection and tracking using a new lane model and distance transform",我实在无法理解他的建模,还有他的建模参数到底如何求解: 我无法理解他为什么要设置那个角度,我也不知道那个顶点的位置如何获取,如果有大神知道的,还望告知一下。 好,说完不好的,我就要说个我觉得很通俗易懂的模型,这是我第一个遇到一个我能看的懂,而且我又觉得具有实用意义的道路模型,首先如图所示: 这个图片被xm分成为了两个部分,一个部分我们称为far feild,一个部分我们称为near feild,对于这两个部分采用了不同的建模方法。道路模型f(x)由这两个部分组成,near feild线性的,而far feild是抛物线的,定义如下: 这里的xm就是代表了原图中的边界线,同时我们根据道路模型的连续性,可以得出 因为在xm两边的函数值是相等的,并且导数也是相等的。 从而我们就能得到下面的公式: 这样我们可以把c和e用别的变量来表达 因此我们可以把最终的道路模型参数用下面的函数来表达 这就是这个论文提出的道路模型,这样是不是很好理解,而且很有根据。 Reference Jung C R, Kelber C R. A robust linear-parabolic model for lane following[C]//Computer Graphics and Image Processing, 2004. Proceedings. 17th Brazilian Symposium on. IEEE, 2004: 72-79.
RGB色彩模式是工业界的一种颜色标准,它通过对红(RED)、绿(GREEN)、蓝(BLUE)三种基本颜色的相互组合从而叠加出各种颜色。RGB色彩模式为每一个红、绿、蓝分类了0-255范围内的亮度值。 RGB色彩模式通常RGB(0,0,0)的格式来表示颜色,括号中的3个数字分别表示红、绿、蓝的亮度值,常用的颜色的RGB颜色分布有以下这些:
品红色 (255,0,255) 蓝色 (0,0,255) 青色 (0,255,255) 绿色 (0,255,0) 黄色 (255,255,0) 红色 (255,0,0) 紫色 (128,0,128) 深蓝色 (0,128,128) 鸭绿色 (0,128,128) 深绿色 (0,128,0) 橄榄绿 (128,128,0) 栗色 (128,0,0) 黑色 (0,0,0) 灰色 (128,128,128) 银色 (192,192,192) 白色 (255,255,255)
这个算法是汪悦在 Lane detection and tracking using B-spline中提出来的。他在这篇论文中主要用的是B-spline模型,这个模型的主要优点是鲁棒性好,可以针对不同的情景进行处理,而且他将检测道路两边的边缘的问题转化成求解道路中间线的问题。 下面主要描述一下CHEVP算法:
边缘像素提取 我们使用Canny边缘检测来获得边缘映射和边缘定位映射。选择方差σ = 1 并且模板的尺寸是9*1在X方向和Y方向上进行高斯卷积。边缘映射是通过一个合适的阈值处理得到的结果。在图表1中,图b是通过Canny边缘检测得到的边缘映射,图c则是边缘定位映射。 通过霍夫变化检测直线 检测到的边缘点将被用于对直线参数空间中可能的存在的线进行投票。图像被水平地分为几个部分,如图2a所示,为了适应因为道路弯曲从而导致道路消失点的变化。图像部分自下而上高度越来越小。每个图像分割部分都有它们自己的直线参数空间,每个图像分割部分中边缘点分别为可能的直线进行投票。通过对于规范化后的累加空间的阈值处理,直线分割最终能够在每一个图像分割部分中检测出来。 地平线和消失点检测 每一个图像分割部分中检测到的直线都是成对出现的,任意一队直线的相交部分会为另外一个霍夫空间中的消失点进行投票。投票的权重是根据最后一步产生的成对直线的规范化累加值决定的。这个过程在每个图像分割部分中分别重复,但是会在相同的霍夫空间中投票。 霍夫空间中对于每一列的投票会归总起来从来检测可能的消失点。获得投票最多的一行将会被选择座位地平线在图像平面中,如下图所示: 对于每个图像分割部分来说,它的消失点由地平线附近投票最多的点所决定。所有检测到的消失点可以再图4b中看到。注意一点,对于图像部分5,没有消失点存在,因为在这个图像分割部分并没有检测到直线。 根据检测的道路线估计道路中间线的参数k 对于消失点进行投票的直线被认为是每个图像分割部分中道路线。从图像最下面的图像分割部分往上,挑选出在各个图像分割部分中的左右两边挑选出最接近去中间一列的检测到的道路线。如果这两条道路线在这个图像分割部分中并不存在,这个过程就会在更高的图像分割部分中进行,知道获得需要的道路线。图6表示两条直线L1和L2在图像分割部分4中,因为没有直线存在图像分割部分5中。 然后连接图像分割部分4中的消失点和P-l4和P-r4的中点P-m4(直线L1和直线L2的相交的部分) 参数k可以通过以下公式进行估计: 对于图7中中间线的估计的例子如下所示: 从图像分割部分4开始,因为图像分割部分5中不存在消失点,我们假设这个部分的消失点跟在分割部分4中的消失点。延伸通过vp4和P-m4交于图像分割部分5的P-m5点。同样的,我们在图像分割部分3中我们也能够检测到消失点。直线(vp3-P-m3)交于图像分割部分2的底部的P-m2处。同样的道理,适用于以上的部分 通过构建道路中间线,通过参数k和道路中间线我们可以估计处道路的两条边缘线,图8给出了例子 计算道路模型的控制点来接近检测的道路中间线 可以利用很多方法来计算B-spline中的控制点通过中间线。因为B-spline后面的部分会准确地逼近道路边缘,这里我们只是粗略地使用B-spline来接近检测到的道路中间线。 我们是通过使用3个不同的控制点来构成两个部分的B-spline。为了让B-spline通过第一个和最后一个控制点,我们使用三倍的第一个和最后一个控制点。因此事实上一共有7个控制点,3个第一个控制点和3个最后一个控制点都是相同的。 我们首先选择P-m0和P-m5分别代表道路模型中的第一个控制点Q0和最后一个控制点Q2.节点P1的选择取决于图9中β1和β2的值。如果β1和β2的值不等于0,我们则选择P-m作为Q1。即P1=P-m,P-m是P-m1和P-m2的中点。如果β1为0,而β2不等于0.我们则选择P-m1作为P1(Q1).其他的情况,我们则选择P-m2作为P1(Q1).因此控制点Q1可以通过下面的公式计算: ![控制点初始化] (http://img.blog.csdn.net/20150418193033394) 实验结果## 引用: Wang, Yue, Eam Khwang Teoh, and Dinggang Shen. “Lane detection and tracking using B-Snake.” Image and Vision computing 22.4 (2004): 269-280.
我们可能经常面临这样的困惑,Iplimage和Mat这两种数据结构,我们应该用哪一种数据结构。 Iplimage一开始就存在opencv库之中,他来源于Intel的另外一个函数库Intel Image Processing Library(IPL),这是一种非常重要的数据结构。在经典书籍里面的sample用的基本都是Iplimage这个数据结构。但是这是一种C风格的数据结构,你必须为他分配以及释放内存。 Mat则是一种新的数据结构,越来越多的人也在使用这种数据结构了,因为它是面向对象的。所以我们不需要自己来为它管理内存。它是通过计数的方式来进行引用,如果它的引用计数为0的话,那么它就会自动释放内存。 老实说,用什么数据结构,我也不知道。因为我觉得有些方法,Mat数据结构还不具备,有的方法只有运用Iplimage才可以。
将Iplimage转化为Mat IplImage* ipl; Mat m = cvarrToMat(ipl);
最近做的道路识别一开始终于弄懂了点东西,一开始在网上找到了一个简单的道路识别的opencvsharp的版本。我觉得opencvsharp真的是一个很好的东西,它封装了比opencv更多的数据结构和库,而且得益于.net平台的强大,使用起来也非常的便捷。唯一的缺点就是目前关于这方面的资料还是少之又少,后来我还是想一想把这个demo转换成cpp版本,也是一个非常简单的demo。
opencvsharp版本 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using OpenCvSharp; namespace LaneDetection { class Program { [STAThread] static void Main() { CvCapture cap = CvCapture.FromFile("test1.mp4"); CvWindow w = new CvWindow("Lane Detection"); CvWindow canny = new CvWindow("Canny"); IplImage src, gray, dstCanny, halfFrame, smallImg; CvMemStorage storage = new CvMemStorage(); CvSeq lines; while (CvWindow.WaitKey(10) < 0) { src = cap.QueryFrame(); halfFrame = new IplImage(new CvSize(src.Size.Width / 2, src.Size.Height / 2), BitDepth.U8, 3); Cv.PyrDown(src, halfFrame, CvFilter.Gaussian5x5); gray = new IplImage(src.Size, BitDepth.U8, 1); dstCanny = new IplImage(src.Size, BitDepth.U8, 1); storage.Clear(); // Crop off top half of image since we're only interested in the lower portion of the video int halfWidth = src.Width / 2; int halfHeight = src.Height / 2; int startX = halfWidth - (halfWidth / 2); src.SetROI(new CvRect(0, halfHeight - 0, src.Width - 1, src.Height - 1)); gray.SetROI(src.GetROI()); dstCanny.SetROI(src.GetROI()); src.CvtColor(gray, ColorConversion.BgrToGray); Cv.Smooth(gray, gray, SmoothType.Gaussian, 5, 5); Cv.Canny(gray, dstCanny, 50, 200, ApertureSize.Size3); canny.Image = dstCanny; storage.Clear(); lines = dstCanny.HoughLines2(storage, HoughLinesMethod.Probabilistic, 1, Math.PI / 180, 50, 50, 100); for (int i = 0; i < lines.Total; i++) { CvLineSegmentPoint elem = lines.GetSeqElem<CvLineSegmentPoint>(i).Value; int dx = elem.P2.X - elem.P1.X; int dy = elem.P2.Y - elem.P1.Y; double angle = Math.Atan2(dy, dx) * 180 / Math.PI; if (Math.Abs(angle) <= 10) continue; if (elem.P1.Y > elem.P2.Y + 50 || elem.P1.Y < elem.P2.Y -50 ) { src.Line(elem.P1, elem.P2, CvColor.Red, 2, LineType.AntiAlias, 0); } } src.ResetROI(); storage.Clear(); w.Image = src; } } } } opencv版本 #include "stdafx.h" #include <highgui.h> #include <cv.h> #include <math.h> using namespace cv; using namespace std; #define INF 99999999 CvCapture* g_capture = NULL; int g_slider_pos = 0 ; int frame_count = 0; CvSeq* lines; int main(int argc,char* argv[]) { cvNamedWindow( "show"); g_capture=cvCreateFileCapture( "D:\\road.avi"); IplImage* frame; while(1) { CvMemStorage* storage = cvCreateMemStorage(); frame=cvQueryFrame(g_capture); //set the ROI of the original image int x = 0,y = frame->height/2; int width = frame->width,height = frame->height/2; if(!frame) break; cvSetImageROI(frame,cvRect(x,y,width,height)); IplImage* gray = cvCreateImage(cvGetSize(frame),8,1); cvCvtColor(frame,gray,CV_BGR2GRAY); cvCanny(gray,gray,50,100); cvShowImage("canny",gray); cvSmooth(gray,gray,CV_GAUSSIAN,3,1,0); //Hough lines = cvHoughLines2(gray,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,50,90,50); //select approprivate lines acoording to the slope for (int i = 0;i < lines->total;i ++) { double k =INF; CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i); int dx = line[1].x - line[0].x; int dy = line[1].x - line[0].y; double angle = atan2(dy,dx) * 180 /CV_PI; if (abs(angle) <= 10) continue; if (line[0].y > line[1].y + 50 || line[0].y < line[1].y - 50) { cvLine(frame,line[0],line[1],CV_RGB(255,0,0),2,CV_AA); } } cvResetImageROI(frame); cvShowImage( "show",frame); char c = cvWaitKey(33); if(c==27) break; } cvReleaseCapture(&g_capture); cvDestroyWindow( "show"); return 0; } 非常希望有弄这方面的人能和我讨论一下,若转载请注明出处,谢谢。
Opencv提供一个简单易用的框架以提取视频文件和USB摄像头中的图像帧,如果只是想读取某个视频,你只需要创建一个VideoCapture实例,然后在循环中提取每一帧。下面是一个简单的代码 #include<opencv2\core\core.hpp> #include<opencv2\imgproc\imgproc.hpp> #include<opencv2\highgui\highgui.hpp> #include<iostream> using namespace cv; using namespace std; int main() { VideoCapture capture("d:\\road.avi"); //检测视频是否读取成功 if (!capture.isOpened()) { cout << "No input image"; return 1; } //获取图像帧率 double rate = capture.get(CV_CAP_PROP_FPS); bool stop = false; Mat frame; namedWindow("Example"); int delay = 1000/rate; while (!stop) { if (!capture.read(frame)) break; imshow("Example",frame); if (waitKey(delay) >= 0) stop = true; } return 0; } 要正确地打开视频文件必须确保电脑具有相应的解码器。同时也应该注意文件路径的未知是否正确,路径为止错误经常也会提示错误warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:545)。这个错误一般都是文件路径错误而导致的。
处理视频帧 为了对视频中的每一帧进行处理,我们可以创建自己的类VideoProcessor,其中封装OopenCV的视频获取框架,该类允许我们制定每帧调用的处理函数。 首先,我们希望制定一个回调处理函数,(关于回调函数,另外一个帖子http://blog.csdn.net/neal1991/article/details/45009377有介绍)。这个喊出可以接受一个Mat对象然后输出处理之后的Mat对象。 void processFrame(Mat& img, Mat& out); // 对视频的每帧做Canny算子边缘检测 void canny(Mat& img, Mat& out) { // 先要把每帧图像转化为灰度图 cvtColor(img,out,CV_BGR2GRAY); // 调用Canny函数 Canny(out,out,100,200); // 对像素进行翻转 threshold(out,out,128,255,THRESH_BINARY_INV); } 定义好一个视频处理类,它将与一个回调函数相关联。使用该类,可以创建一个实例,制定输入的视频文件,绑定回调函数,然后开始对每一帧进行处理,要调用这个视频处理类,只需要在main函数添加就可以了:
我们老板希望我能在道路识别这个方面做一些东西,这方面的东西一直在看,但是一直都是模模糊糊,我希望自己能够用一个合适的方式总结一下道路识别的问题。
道路识别问题其实也正正恰好是识别问题中的一个方面,所以道路识别问题的关键也是在于如何选取一个特征来进行识别。道路识别问题可以使用不同的方法来解决,我打算从下面这些方面来阐述一下我自己对道路识别的一个理解:
我们要解决什么情况下的道路问题 其实我觉得这点挺重要的,因为很多计算机视觉的问题在不同的要求之下有各种各样的方法。我觉得很有必要弄清楚自己需要的目标,我是要解决什么样的问题。道路识别问题可以分为结构化的道路和非结构化的道路。结构化的道路就是比较标准的道路,有着清晰地道路线,高速公路,城市公路,这些都是典型的结构化道路。而非结构化道路就是往往没有规则,没有明显的道路线或者根本没有道路线,显然,这样的道路识别比较复杂。因为我自己还是一个菜鸟,所以我一直以来看的问题都是针对结构化的道路。
我们用什么样的特征来识别道路 我们道路识别是通过道路的特征来识别道路,要么或者道路线,或者区域什么的。我们通常所使用的方法就是检测道路线,比如道路之间的道路线,或者道路边缘。特征,我觉得就可以分为多个特征,包括边缘特征,纹理特征,颜色特征等等。道路线的检测,往往相当于一个边缘检测的问题,往往是等同于直线的检测。所以霍夫变换经常是应用于道路检测中。
我们要以什么样的方法来解决道路识别问题 设想我们在汽车上设置一个摄像头,在不停的获取道路的实时数据。我们如何通过对道路视频进行实时的相应处理从而帮助我们驾驶。道路识别现如今已经慢慢应用到辅助驾驶系统中,在国外已经有一些不少的成熟应用,但只是至今还未达到高度商业化的地步。而且这个问题在未来的无人驾驶肯定也是有着一席之地。我所了解的基本都是基于对视频图像的处理从而来解决道路是别的问题。
转载:http://blog.csdn.net/carson2005/article/details/6601109
提示:本文为笔者原创,转载请注明出处:blog.csdn.net/carson2005
以下链接是本人整理的关于计算机视觉(ComputerVision, CV)相关领域的网站链接,其中有CV牛人的主页,CV研究小组的主页,CV领域的paper,代码,CV领域的最新动态,国内的应用情况等等。打算从事这个行业或者刚入门的朋友可以多关注这些网站,多了解一些CV的具体应用。搞研究的朋友也可以从中了解到很多牛人的研究动态、招生情况等。总之,我认为,知识只有分享才能产生更大的价值,真诚希望下面的链接能对朋友们有所帮助。 (1)googleResearch; http://research.google.com/index.html (2)MIT博士,汤晓欧学生林达华; http://people.csail.mit.edu/dhlin/index.html (3)MIT博士后Douglas Lanman; http://web.media.mit.edu/~dlanman/ (4)opencv中文网站; http://www.opencv.org.cn/index.php/%E9%A6%96%E9%A1%B5 (5)Stanford大学vision实验室; http://vision.stanford.edu/research.html (6)Stanford大学博士崔靖宇; http://www.stanford.edu/~jycui/ (7)UCLA教授朱松纯; http://www.stat.ucla.edu/~sczhu/ (8)中国人工智能网; http://www.chinaai.org/ (9)中国视觉网; http://www.china-vision.net/ (10)中科院自动化所; http://www.ia.cas.cn/ (11)中科院自动化所李子青研究员; http://www.cbsr.ia.ac.cn/users/szli/ (12)中科院计算所山世光研究员; http://www.jdl.ac.cn/user/sgshan/ (13)人脸识别主页; http://www.face-rec.org/ (14)加州大学伯克利分校CV小组; http://www.eecs.berkeley.edu/Research/Projects/CS/vision/
(15)南加州大学CV实验室; http://iris.usc.edu/USC-Computer-Vision.html (16)卡内基梅隆大学CV主页;
http://www.cs.cmu.edu/afs/cs/project/cil/ftp/html/vision.html
(17)微软CV研究员Richard Szeliski;http://research.microsoft.com/en-us/um/people/szeliski/ (18)微软亚洲研究院计算机视觉研究组; http://research.microsoft.com/en-us/groups/vc/ (19)微软剑桥研究院ML与CV研究组; http://research.microsoft.com/en-us/groups/mlp/default.aspx
(20)研学论坛; http://bbs.matwav.com/ (21)美国Rutgers大学助理教授刘青山; http://www.research.rutgers.edu/~qsliu/ (22)计算机视觉最新资讯网; http://www.cvchina.info/ (23)运动检测、阴影、跟踪的测试视频下载; http://apps.hi.baidu.com/share/detail/18903287 (24)香港中文大学助理教授王晓刚; http://www.ee.cuhk.edu.hk/~xgwang/ (25)香港中文大学多媒体实验室(汤晓鸥); http://mmlab.ie.cuhk.edu.hk/ (26)U.C. San Diego. computer vision;http://vision.ucsd.edu/content/home (27)CVonline; http://homepages.inf.ed.ac.uk/rbf/CVonline/ (28)computer vision software; http://peipa.essex.ac.uk/info/software.html (29)Computer Vision Resource; http://www.cvpapers.com/ (30)computer vision research groups;http://peipa.essex.ac.uk/info/groups.html (31)computer vision center; http://computervisioncentral.com/cvcnews
(32)浙江大学图像技术研究与应用(ITRA)团队:http://www.dvzju.com/
(33)自动识别网:http://www.autoid-china.com.cn/
(34)清华大学章毓晋教授:http://www.tsinghua.edu.cn/publish/ee/4157/2010/20101217173552339241557/20101217173552339241557_.html
(35)顶级民用机器人研究小组Porf.Gary领导的Willow Garage:http://www.willowgarage.com/
(36)上海交通大学图像处理与模式识别研究所:http://www.pami.sjtu.edu.cn/
(37)上海交通大学计算机视觉实验室刘允才教授:http://www.visionlab.sjtu.edu.cn/
(38)德克萨斯州大学奥斯汀分校助理教授Kristen Grauman :http://www.cs.utexas.edu/~grauman/ 图像分解,检索
(39)清华大学电子工程系智能图文信息处理实验室(丁晓青教授):http://ocrserv.ee.tsinghua.edu.cn/auto/index.asp
(40)北京大学高文教授:http://www.jdl.ac.cn/htm-gaowen/
(41)清华大学艾海舟教授:http://media.cs.tsinghua.edu.cn/cn/aihz
(42)中科院生物识别与安全技术研究中心:http://www.cbsr.ia.ac.cn/china/index%20CH.asp
(43)瑞士巴塞尔大学 Thomas Vetter教授:http://informatik.unibas.ch/personen/vetter_t.html