OpenCV学习笔记(五十一)——imge stitching图像拼接stitching
stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitcher类当中。这个类当中我们可能用到的成员函数有createDefault、estimateTransform、composePanorama、stitch。其内部实现的过程是非常繁琐的,需要很多算法的支持,包括图像特征的寻找和匹配,摄像机的校准,图像的变形,曝光补偿和图像融合。但这些模块的接口、调用,强大的OpenCV都为我们搞定了,我们使用OpenCV做图像拼接,只需要调用createDefault函数生成默认的参数,再使用stitch函数进行拼接就ok了。就这么简单!estimateTransform和composePanorama函数都是比较高级的应用,如果各位对stitching的流程不是很清楚的话,还是慎用。
实例也非常简单,下载链接哦:/detail/yang_xian521/4321158。
输入原图(为了显示,我都压缩过):
OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。
距离2.4.0放出来才一个月。儿童节当天2.4.1就出炉了。。。。真心跟不上节奏啊,路漫漫其修远兮。。。。
这次主要的改变还是bug的修订,之前有朋友告诉我,说他的2.3.1版本说什么都不能成功配置CUDA,后来他用2.2版本就成功了,看来新出的版本bug还是很多的,也不能盲目求新。这次的2.4.1版本更新如下:
GPU模块支持了CUDA4.1、CUDA4.2版本,添加了一个文件字符串存储回读的API接口
完善了光流法的clacOpticalFlowPyrLK,支持了金字塔图像作为输入
完善了文档,使文档和版本更加对应
修正了SURF、MSER的python包装
修正了其他45处bug
最近更新比较慢,感觉没有学习OpenCV过程有新的太大收获,还请见谅
OpenCV学习笔记(五十三)——新版本2.4.2简介&FREAK和ORB特征描述子效果对比features2d
OpenCV 2.4.2简介
OpenCV从未放慢自己前进的步法,就在7月4日,最新版的2.4.2又放出来了。与之同时放出的还有两个网站/和,前者作为一个正式的全新的官方用户网站,简单浏览了一下,应该是一个对应之前维基百科上的那个网站,是一个介绍性的新闻网站,对开发者的意义可能不是太大;后面这个网站就厉害了,是一个类似google讨论组一样的交流区,大家可以在上面提问,留言,解答,我也刚刚注册了个用户,刚成立没几天已经有60多个问题了,应该还是很活跃的一个讨论区。
还是老样子,介绍一下新版本的更新以及改动:
现在支持IOS操作系统了!开发iphone的朋友们,你们也可以用OpenCV了,是不是内牛满面。
添加了一个新的特征点描述算法FREAK,这也是今年的CVPR的一个新算法,也是一个2值的特征,文章里说是根据人视网膜的原理,挺玄乎的,据说是效果比ORB和SURF都好,我要试试看。
对GPU的模块进一步优化,对个别算法的性能有较大提升。
还修正了2.4.1的50多个bug。
介绍就这么多,感觉亮点就是网站的建设和这个FREAK特征,其他的还得慢慢摸索啊
FREAK和ORB特征描述子效果对比
ORB就是BRIEF的改进,BRIEF太简单了,就不介绍了,有兴趣的朋友自己看paper吧。ORB的paper我读下来,感觉改进主要有以下几点:用FAST作为特征点提取的算法,更快了,添加了特征点的主方向,这样就具有了旋转不变性。最后一点其实我也想到了,当时看BRIEF的时候就想应该可以优化,就是ORB采用贪婪穷举的方法得到了相关性较低的随机点对,还有一个改进就是对于随机点对,受噪声的影响很大BRIEF的办法就是对原图像滤波,降低噪声的影响,ORB不在使用像素点的直接比较,而是选择该像素为中心的一个小patch作为比较对象,提高了抗噪能力。
FREAK我只是大致看了下,理解可能不到位,我的理解是这个算法是基于人眼视网膜细胞的分布,中间密集,四周稀疏,从而在图像中构建很多的区域,当然越靠近中心的区域采样更密集,四周区域采样稀疏,随机对比各区域的像素得到一组2值特征,这个算法也关注了尺度和方向的问题,都有对应的解决办法,还根据了人眼看事物时眼睛不停的转动,设计了一种级联的搜索器,总而言之,我感觉这个算法也是受ORB和BRISK这种2值特征的启发下的一种改进吧。
下面就利用OpenCV对其进行一下对比,值得说明的是,在2.4.2中,FREAK给出了pattern的训练代码。
对比实验效果如下:(上图为ORB,下图为FREAK)
经过筛选之后的特征点如下图:(上图为ORB,下图为FREAK)
当然,我这里只是个简单的测试,其实并不能完全反应实际的性能,因为我这里FREAK的特征点位置的检测用的是SURF,而ORB用的是FAST。但从我这里的比较效果来看,ORB要好很多。下面让我来对比一下算法的运行时间:
虽然两种算法不能直接比较,因为FREAK没有提供特征点位置检测的算法,个人感觉如果FREAK采用FAST来做detection,确实速度应该要逼ORB要快一些。
最后分享给大家我的工程链接:/detail/yang_xian521/4421537
OpenCV学习笔记(五十四)——概述FaceRecognizer人脸识别类contrib
在最新版的2.4.2中,文档的更新也是一大亮点,refrence manual扩充了200多页的内容,添加了contrib部分的文档。contrib就是指OpenCV中新添加的模块,但又不是很稳定,可以认为是一个雏形的部分。这次结合refman的阅读,介绍一下FaceRecognizer这个人脸识别类,这个类也是2.4.2更新日志里着重强调过的更新,配套的文档也是相当充实。这个类的基类也是Algorithm类,对于Algorithm类的简单介绍,请参看我之前的blogOpenCV学习笔记(五十)——Algorithm类介绍(core),这个类内的接口函数也是异常简单,人脸识别的任务也就是两大部分,训练和预测,分别对应着train函数和predict函数,还有对应的数据加载保存函数save和load。不过它当然还可以调用其基类Algorithm的函数。特别说明的是,人脸识别中预测的参数也是可以调节的,但这里只给出了train和predict函数,为啥没有setparameter的函数呢,那是因为各中人脸识别方法的参数并不相同,要通过Algorithm的get和set函数实时的调整~~v5啊!
先来说说训练的过程,train函数的两个参数也很简单,训练的图像组vector<Mat>和对应的标签组vector<int>,这个label标签只需保证同一个人的标签相同即可,不需要保证图像的按标签顺序输入,方便极了。对于预测,有两种调用,其中的参数有测试图像、返回的标签值和测试样本和标签样本的相似性。返回的标签值为-1,说明测试样本在训练集中无对应或距离较远。这里用个FisherFace作为示例说明一下如何训练和预测:
[cpp]view plain copy vector<Mat>images;vector<int>labels;//imagesforfirstpersonimages.push_back(imread("person0/0.jpg",CV_LOAD_IMAGE_GRAYSCALE));labels.push_back(0);images.push_back(imread("person0/1.jpg",CV_LOAD_IMAGE_GRAYSCALE));labels.push_back(0);//imagesforsecondpersonimages.push_back(imread("person1/0.jpg",CV_LOAD_IMAGE_GRAYSCALE));labels.push_back(1);images.push_back(imread("person1/1.jpg",CV_LOAD_IMAGE_GRAYSCALE));labels.push_back(1);Ptr<FaceRecognizer>model=createFisherFaceRecognizer();model->train(images,labels);Matimg=imread("person1/2.jpg",CV_LOAD_IMAGE_GRAYSCALE);intpredicted=model->predict(img);
当然我们也不需要每次使用都进行一次训练,可以把训练好的模型通过save函数保存成一个文件,下次使用的时候只需load即可。
目前支持的3种人脸识别的方案:特征脸EigenFace、Fisher脸FisherFace、LBP直方图LBPHFace。分别调用函数createEigenFaceRecognizer、createFisherFaceRecognizer、createLBPHFaceRecognizer建立模型。
对于EigenFace两个输入参数,分别为PCA主成分的维数num_components和预测时的阈值threshold,主成分这里没有一个选取的准则,要根据输入数据的大小而决定,通常认为80维主成分是足够的。除了这两个输入参数外,还有eigenvalues和eigenvectors分别代表特征值和特征向量,mean参数为训练样本的平均值,projections为训练数据的预测值,labels为预测时的阈值。
对于FisherFace,和EigenFace非常相似,也有num_components和threshold两个参数和其他5个参数,FisherFace的降维是LDA得到的。默认值为c-1,如果设置的初始值不在(0,c-1]的范围内,会自动设定为c-1。
特别需要强调的是,EigenFace和FisherFace的训练图像和测试图像都必须是灰度图,而且是经过归一化裁剪过的。
对于LBPHFace,我想不用过多介绍,LBP简单和效果是大家都很喜欢的,参数包括半径radius,邻域大小即采样点个数neighbors,x和y方向的单元格数目grid_x,grid_y,还有两个参数histograms为训练数据得到的直方图,labels为直方图对应的标签。这个方法也要求训练和测试的图像是灰度图
接下来应该结合文档进一步研究一下这个人脸识别类。我之前大量的人脸实验都是在matlab下进行的,有了这个利器,我感觉会有越来越多的学生做老师和老板布置的project会选择用OpenCV,而不是Matlab。希望我们都爱的OpenCV越来越好,越来越强大。欢迎交流
OpenCV学习笔记(五十五)——用OpenCV做人脸识别和性别识别contrib
人脸识别的故事说也说不完,调研的事还是交给大家吧。这里说的是用OpenCV做人脸识别。
因为是真正的人脸识别,不是搞笑娱乐的东西,所以数据库一定要强大的,推荐个网站http://www.face-/databases/。这里有最全的人脸库的概述,希望大家能找到自己需要的人脸库(PS:我现在特别需要一个3d的人脸库,不知道哪位大侠知道如何free获取,或者愿意共享给我那更是极好的了,先谢过咯)。这里简单介绍两个库,ORL和Yale,ORL是一个轻量级的库,Yale更为复杂,但并不是免费的。
数据的准备:在我们程序里需要读取图像和对应的标签,这里采用CSV文件,是一种简单的数据交互格式,在我们最常用的Excel里就支持这种格式。这种格式每条信息占一行。信息格式为:文件名;标签,例如C:/ORL/image.jpg;0。只要创建了一个CSV文件和对应的图像,你就可以对任何一个数据库进行训练了。当然,这个CSV文件并不一定要自己手动的创建,也可以Python脚本自己生成自己需要的CSV文件,对应的脚本为\modules\contrib\doc\facerec\src\create_csv.py,唉,谁让咱对这个脚本不熟悉,只能偷懒了,直接调\modules\contrib\doc\facerec\etc\at.txt或者\samples\cpp\facerec_at_t.txt。这个txt对应的是ORL的数据库,其中的路径就按照其改一下就好了。
至于人脸识别的具体实现,我已经在blogOpenCV学习笔记(五十四)——概述FaceRecognizer人脸识别类contrib提到了如何实现。\modules\contrib\doc\facerec\src很多很好的示例,我这里就不上传代码了。
最后再说一下人脸的标定。因为对Python也不是太熟悉,只给大家一个脚本文件吧,是\modules\contrib\doc\facerec\src\crop_face.py,通过这个脚本可以制作自己需要的人脸图片大小。
性别识别和视频中的识别在对应的demo里都有介绍,我这里就不详细说了,因为性别识别无非就是把训练样本的标签只有两类:男性和女性。需要说明的是,EigenFace是基于PCA的,是一种非监督的模型,不太适合性别识别的任务,这里的demo用的是FisherFace。对于视频的人脸识别,无非就是添加了个VideoCapture和一个人脸检测的CascadeClassifier。
关于训练的模型的保存和调用,就是用save和load函数,好简单的,就不介绍了吧。
最后说一下伪彩色图的这个函数applyColorMap,其中colorMap参数是用来选择伪彩色图的样式。因为人眼对颜色的敏感的程度要比对亮度的敏感程度要高,所以用伪彩色图 的对比效果要更好。这才医学图像处理中用的比较多,以前的B超现在都用彩超了,价格竟然要贵好多,其实就是一个伪彩色处理罢了,医院真黑啊!!
from: /yang_xian521/article/category/910716
OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五
如果觉得《OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五》对你有帮助,请点赞、收藏,并留下你的观点哦!