最近做的道路识别一开始终于弄懂了点东西,一开始在网上找到了一个简单的道路识别的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.
visual studio崩溃 你是不是经常会遇到一编辑combox,visual studio就会立马崩溃。一直都无法理解是什么原因,然后后来发现居然是因为有道的截屏翻译,关掉截屏翻译就好了。
combox绑定数据源 SqliteDataReader dr; if (dr.Read()) { this.comboBox1.Items.Add(dr[0]); } 自动补全的功能 我们希望在combox中实现输入的时候,有推荐的文本自动补全功能。我们主要只需要设置AutoCompleteMode和AutoCompleteSource这两个属性就可以了。
模糊查询 上面那个自动补全的功能只能实现从左到右进行匹配,而不能进行模糊匹配。假设我们的combobox里面有“张三“,如果输入”张“可以进行匹配,但是我们如果输入”三“的话就无法实现匹配,而combobox自身并没有这个属性,所以我们需要自己写一个方法来实现。
List<string> listOnit = new List<string>(); List<string> listNew = new List<string>(); //用于模糊查询 private void BindComboBox() { string str = "select License from tb_drug"; SQLiteDataReader sdr = sh.getcom(str); while (sdr.Read()) { if (sdr[0].ToString() != " " && sdr[0].ToString() != null) listOnit.Add(sdr[0].ToString()); } sdr.Close(); this.comboBox1.Items.AddRange(listOnit.ToArray()); } private void comboBox1_TextUpdate(object sender, EventArgs e) { this.comboBox1.Items.Clear(); listNew.Clear(); foreach (var item in listOnit) { if (item.
因为想查一查opencvsharp的东西,然后发觉这个包可以再NuGet上面可以直接下载。我也经常在很多地方都可以看到NuGet,所以我想写下来,记录下来。 NuGet是一个免费的并且开源的包管理器在微软的开发平台上。NuGet发布在Visual Studio的拓展插件上。 NuGet现在已经移植到代码管理平台github了,链接地址为https://github.com/nuget/home。他们打算以后新的东西都在这个网址更新了。
资源 NuGet Gallery: http://nuget.org Documentation: http://docs.nuget.org Blog: http://blog.nuget.org Twitter: @nuget JabbR chat: https://jabbr.net/#rooms/nuget TeamCity continuous build server: http://build.nuget.org Latest successful VS Extension build: http://build.nuget.org/NuGet.Tools.vsix Latest successful NuGet.exe build: http://build.nuget.org/NuGet.exe
NuGet貌似自从vs2012版本之后就默认在系统中了,所以不需要再安装了。如果想确保你的版本有没有安装NuGet,你可以看一下工具栏。你也可以在扩展和更新中可以进行NuGet的更新和管理。 只要你安装了,就可以非常方便的引用第三方的库,直接在引用里面添加就可以了。
回调函数 在计算机程序设计中,回调函数,是指通过函数参数传递到其他代码的,某一块可执行代码的引用。这一设计允许了底层的代码调用高层的子程序。回调函数在.net平台中相当于委托。
回调函数的机制 定义一个回调函数。 提供函数实现的一方在初始化的时候,将回调函数的函数指针给调用者。 当特定的事件或条件发生的时候,调用者使用函数指针调用回调函数对事件进行处理。 为什么要使用回调函数 因为可以把调用者和被调用者分开,所以调用者不关心谁是被调用者。它只需要知道存在一个具有特定原型和限制条件的被调用函数。
代码实现 下面创建了一个sort.dll的动态链接库,它导出了一个名为CompareFunction的类型–typedef int (__stdcall CompareFunction)(const byte,const byte*),它就是回调函数的类型。另外,它也导出了两个方法:Bubblesort()和Quicksort(),这两个方法原型相同,但实现了不同的排序算法。
void DLLDIR __stdcall Bubblesort(byte* array,int size,int elem_size,CompareFunction cmpFunc); void DLLDIR __stdcall Quicksort(byte* array,int size,int elem_size,CompareFunction cmpFunc); 这两个函数接受以下参数:
·byte * array:指向元素数组的指针(任意类型)。
·int size:数组中元素的个数。
·int elem_size:数组中一个元素的大小,以字节为单位。
·CompareFunction cmpFunc:带有上述原型的指向回调函数的指针。
回调函数实例 int __stdcall CompareInts(const byte* velem1,const byte* velem2) { int elem1 = *(int*)velem1; int elem2 = *(int*)velem2; if(elem1 < elem2) return -1; if(elem1 > elem2) return 1; return 0; } int __stdcall CompareStrings(const byte* velem1,const byte* velem2) { const char* elem1 = (char*)velem1; const char* elem2 = (char*)velem2; return strcmp(elem1,elem2); } int main(int argc,char* argv[])
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.
题目 Description
歌德巴赫猜想,是指对于每一个大于4的偶数n,都能表示成两个质数之和。 现在,你需要写程序验证这一猜想。对于n,找出质数a和b, 满足a+b=n, a≤b,且a*b最大。例如n=8,满足条件的a和b分别为3和5; 又如n=10,质数3、7以及5、5满足a+b=n, a≤b,而乘积大的那组是5、5。 Input
每行一个偶数n(4 < n <= 20000)
Output
对应于每个输入的偶数,输出a、一个空格、b、一个换行符
Sample Input
8 10 1000 Sample Output
3 5 5 5 491 509
代码 #include<stdio.h> #include<math.h> bool isPrime(int x); int main() { int n,i,j; while (scanf("%d",&n) != EOF) { for (i = n/2;i > 0;i -= 2) { if(i%2 == 0) i --; j = n - i; if(isPrime(i)&&isPrime(j)) { printf("%d %d\n",i,j); break; } } } return 0; } bool isPrime(int x) { int len = sqrt((float)x); for (int i = 2;i <= len;i ++) { if(x % i == 0) return false; } return true; }
我们老板希望我能在道路识别这个方面做一些东西,这方面的东西一直在看,但是一直都是模模糊糊,我希望自己能够用一个合适的方式总结一下道路识别的问题。
道路识别问题其实也正正恰好是识别问题中的一个方面,所以道路识别问题的关键也是在于如何选取一个特征来进行识别。道路识别问题可以使用不同的方法来解决,我打算从下面这些方面来阐述一下我自己对道路识别的一个理解:
我们要解决什么情况下的道路问题 其实我觉得这点挺重要的,因为很多计算机视觉的问题在不同的要求之下有各种各样的方法。我觉得很有必要弄清楚自己需要的目标,我是要解决什么样的问题。道路识别问题可以分为结构化的道路和非结构化的道路。结构化的道路就是比较标准的道路,有着清晰地道路线,高速公路,城市公路,这些都是典型的结构化道路。而非结构化道路就是往往没有规则,没有明显的道路线或者根本没有道路线,显然,这样的道路识别比较复杂。因为我自己还是一个菜鸟,所以我一直以来看的问题都是针对结构化的道路。
我们用什么样的特征来识别道路 我们道路识别是通过道路的特征来识别道路,要么或者道路线,或者区域什么的。我们通常所使用的方法就是检测道路线,比如道路之间的道路线,或者道路边缘。特征,我觉得就可以分为多个特征,包括边缘特征,纹理特征,颜色特征等等。道路线的检测,往往相当于一个边缘检测的问题,往往是等同于直线的检测。所以霍夫变换经常是应用于道路检测中。
我们要以什么样的方法来解决道路识别问题 设想我们在汽车上设置一个摄像头,在不停的获取道路的实时数据。我们如何通过对道路视频进行实时的相应处理从而帮助我们驾驶。道路识别现如今已经慢慢应用到辅助驾驶系统中,在国外已经有一些不少的成熟应用,但只是至今还未达到高度商业化的地步。而且这个问题在未来的无人驾驶肯定也是有着一席之地。我所了解的基本都是基于对视频图像的处理从而来解决道路是别的问题。
转载: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.
本文是UCLA教授朱松纯的见解,我翻译下作为见解,尽管以后不一定做这些东西,但我觉得这些道理还是有价值的。
我们如何知道我们是不是在以错误的方式做研究? 视觉问题是一个在现代科学以及工程上一个非常具有挑战性和潜力的问题,因为它非常复杂并且包罗万象。对于如此复杂的一个问题,我们必须十分谨慎地选择一个长期有效的解决方案以免走入一个死胡同中。人们喜欢享受能够感觉到的进程,但实际地研究过程就回事十分枯燥无味的在普通人的眼中。
视觉问题是一个可以用机器学习来解决的分类问题吗? 经常有些学生说:视觉问题是不是仅仅只是机器学习地应用而已,他们经常是这么觉得。如果是这样的话,那么对于视觉问题的研究者来说,他们的任务仅仅只是设计好的特征而已就可以了。这个问题真的是对视觉问题的侮辱,这反映了对与视觉问题的误解并将其简单的划分为分类问题。这对于我来说毫不奇怪,因为现在的年轻一代不仅不知道Ulf Genander(模式理论之父)同时也不知道David Marr(计算机视觉之父)。打个比方来说,机器学习的方法就好像是三千年来中国中国中药临床经验总结出来的方法。古代的人们由于对于现代医学缺乏足够的认知,他们往往尝试不同的药材组合,就像机器学习的研究者尝试不同的特征。这些成分通过不同的权重被混合在一起,然后通过煎煮最后变成一味中药,这是一个迭代回归的过程。据信这些药可以治疗一切疾病包括癌症,禽流感等等,而不需要理解这些药的生物作用或者相应的病理机制。所有你需要做的仅仅是找到正确的成分然后以合适的比例把它们混合在一起。理论上来说,这是现实可行的,就像机器学习保证可以解决所有问题如果机器学习能够找到足够的特征和例子。但是问题是:组成成分的范围如此之广,我们如何才能有效地找到合适的组成成分呢?对于视觉问题,我们需要研究图像的复杂的结构,以及丰富的空间和他们的组成部分,还有各种各样的模型和代表。
为什么我们需要忍受不同风格的视觉问题? 视觉问题中的方法论可以概括成三个部分:Hack, Math,Stat。Hacks是一种启发式的方法,或者是某种方法在某个问题可以起到作用,但是我们无法分辨出它到底在哪其作用。Math恰恰相反,它告诉我们在某种特定的条件下,事情可以在某种性能的保证下进行分析,但是这些条件经常是有限的,所以难以应用到现实世界中的通用场景中。Stat是一个回归过程。通过很多的参数,你最终可以拟合任何的数据但是缺乏足够的物理解释。所以这三者是不同等级的解释或者模型。
如果你不能解决一个简单的问题,那么你就必须要解决一个复杂的问题! 简化论是现代科学中很多领域中一个非常受欢迎的研究策略。经常说一个问题你可以把它分成几个小的组成部分或者一个复杂的系统是由几个不同的组成部分组成而来的。这些方法轮在十九世纪八十年代被一些视觉研究者所实践,比如边缘检测,分割等等。但是人们发现仅仅是边缘检测这样最简单的问题都不能够很好的解决,因为边缘的定义取决不同等级的任务需求,即使是人类如果没有特定的任务等级也无法决定是否存在边缘。不象物理学家可以选择一个给定的规模或者现象来进行研究,计算机视觉研究者发现他们自己非常的不幸:每一个简单的图像对于不同的等级包含了很多的模式以及任务。下面的表格包含了一系列我们需要解决的问题对于理解一幅图像来说。
[转载] http://blog.csdn.net/carson2005/article/details/6979806
尽管之前写过一篇关于OpenCV的介绍(http://blog.csdn.net/carson2005/article/details/5822149),但依然有朋友对其不甚了解。所以,经常能碰到有人问我诸如以下一些问题:OpenCV能不能实现人脸识别?OpenCV有没有车辆检测的API?OpenCV有没有三维重建的函数?面对这样的问题,我也很困惑。到底该如何给他们解释,才能让它们明白,OpenCV确实很强大,但还没有他们想象中的那么强大。其实,OpenCV的全称,是Open source Computer Vision Library,开放源代码计算机视觉库。也就是说,它是一套关于计算机视觉的开放源代码的API函数库。这也就意味着,(1)不管是科学研究,还是商业应用,都可以利用它来作开发;(2)所有API函数的源代码都是公开的,你可以看到其内部实现的程序步骤;(3)你可以修改OpenCV的源代码,编译生成你需要的特定API函数。但是,作为一个库,它所提供的,仅仅是一些常用的,经典的,大众化的算法的API。一个典型的计算机视觉算法,应该包含以下一些步骤:(1)数据获取(对OpenCV来说,就是图片);(2)预处理;(3)特征提取;(4)特征选择;(5)分类器设计与训练;(6)分类判别;而OpenCV对这六个部分,分别(记住这个词)提供了API。下面我分别就这六个部分对一些常见问题进行必要的解释。 对于数据获取,计算机视觉领域的数据,无非就是图片和视频两种。图片,有bmp,jpg,png,tiff….各种压缩和非压缩格式。所以,对压缩格式的图片而言,OpenCV内部必然包含了对应的图片解压缩函数(一般都是包含了开源的图片解压函数库,例如,对于jpg压缩格式而言,就包含了libjpg开源库)。而对于视频而言,常见的有.rmvb,.avi,.asf等格式,不同的格式,代表着不同的视频压缩算法(对于AVI格式,尽管都是avi格式,但内部的压缩算法仍然不相同。具体原因请参考我的另一篇博客:http://blog.csdn.net/carson2005/article/details/6314089),也就需要对应的解压算法来解压。尽管OpenCV提供了一些读写视频文件的API,但是,它也仅仅是一个接口而已,其内部,依然需要调用相应的视频编解码器的API来进行解码。常用的视频编解码器有:xvid,ffmpeg等。也就是说,如果你想利用OpenCV来进行视频读写之类的操作,是需要安装此类视频编解码器的。安装了相应的视频解码器之后,你就可以调用OpenCV的视频相关API来进行视频文件的读取操作了,当然,视频文件被解码之后,变成了一张一张的图片,然后才能被OpenCV所处理。另外,还有一种情况,就是数据来自于相机,包括数字相机和模拟相机。不管是哪种相机,你都要想办法获取到相机发送给PC的图片数据(PC在内存里面接收到的来自相机的数据可能是jpg格式,也可能是bmp格式)。如果,你在PC内存中接收到的是相机发送过来的jpg压缩格式,还需要进行图片数据的内存解压。关于相机和OpenCV的这部分内容,请见我另一篇博客:
http://blog.csdn.net/carson2005/article/details/6243476
对于预处理,一般就是去除或者降低噪声,光照归一化,亮度归一化,模糊化,锐化,膨胀,腐蚀、开闭等这些操作(详见,冈萨雷斯,《数字图像处理》一书)。而对于这些操作,OpenCV分别(又提到这个词了)提供了相应API函数。而光照的预处理,OpenCV提供了一个直方图均衡化的API,后续可能会提供一些gammar矫正之类的函数。
对于特征提取,个人认为,可以算是整个计算机视觉系统中最为复杂也最难的部分(纯属个人意见,如有异议,请保留),到底什么是特征,该如何来理解这个看似简单却又包罗万象的名词呢?其实,要想仔细解释,还真的花费很多时间(有兴趣的可以看看,Richard O.Duda(著),李宏东(译),《模式识别》,机械工业出版社)。简单点说,特征,就是一个可以将若干个类别可以尽量分开的一种描述。举例来说,如果你要进行男人和女人的分类,显然,用“身高和体重”这一描述来衡量,是可以的,但是,这两个描述没有“胸部大小”这一描述更加准确,而“胸部大小”这一描述,又没有“喉结的有无”这一描述更准确。很显然,“身高和体重”,“胸部大小”,“喉结的有无”,这三种描述,都可以用来进行男人和女人的分类,只不过,它们对事物的描述的准确(或者说全面)程度是不同的,而诸如此类的描述,有一个更加专业的称谓,叫做“特征”。OpenCV里面,提供了一些特征描述的API,比如,对于人脸检测而言,它提供了haar特征的API,行人检测,提供了hog特征的API,甚至,它提供了LBP纹理特征的API。但是,这些还远远不够。例如,如果你要进行字符识别,OpenCV并没有提供字符识别所对应的特征。这个时候,就需要你自己来编程实现了。当然,该选择什么特征来描述字符呢?哪些特征更好呢?对于这些问题,我建议你去阅读相应的会议,期刊,杂志,硕士、博士毕业论文(毕竟硕士、博士研究生本就该从事“研究”工作),看看别人写的文章,自然就知道了。
对于特征选择,OpenCV并没有提供特定的函数来进行衡量。而特征的分类能力的高低评价,有很多种分析方法,有兴趣的朋友,可以阅读"《机器学习》Tom. Mitchell(著),曾华军(译),机械工业出版社"这本书;
对于分类器部分,OpenCV提供了SVM,CART,boost,bayes,bdt,ANN,这几种常用的算法。而这些基本已经覆盖了常用的分类器。所以,你需要做的,就是知道怎么调用其接口,各种分类器的优点和缺点(该部分,建议阅读“机器学习”这本书)。
通过以上的分析,你或许已经发现,OpenCV不过是一个工具而已。或者,你可以将它理解为幼儿园小朋友过家家玩的积木,而OpenCV中的函数,则可以理解为一个一个的积木块,利用所有或者部分积木块,你可以快速的搭建起来具体的计算机视觉方面的应用(比如,字符识别,车牌识别,遗留物检测)。想必你也已经发现,在利用OpenCV这个积木来搭建具体的计算机视觉应用的时候,真正核心的,应该是这些积木块,如果你明白了积木块的工作原理,那么,是不是就可以不用这些积木块了呢?完全正确!不过,一般部分情况下,我们不需要这么做,因为,OpenCV已经帮你做好了一些工作(已经帮你做好了一些积木块,直接拿来用就是了)。但是,诸如前面提到的特征提取模块,很多情况下,OpenCV就无能为力了。这个时候,你就需要翻阅计算机视觉、模式识别、机器学习领域顶级会议、期刊、杂志上面发表的文章了。然后,根据这些文章中阐述的原理和方法,来编程实现你要的东西。实际上,也就等于搭建一个属于你私有的积木块。其实,OpenCV中的每一个API函数,也就是这么来的。