OpenCV学习笔记(五十一)——imge stitching图像拼接stitching OpenCV学习笔记(五十二)——号外:OpenCV 2.4.1 又出来了。。。。。 OpenCV学习笔记(五

OpenCV学习笔记(五十一)——imge stitching图像拼接stitching

stitching是OpenCV2.4.0一个新模块,功能是实现图像拼接,所有的相关函数都被封装在Stitcher类当中。这个类当中我们可能用到的成员函数有createDefault、estimateTransform、composePanorama、stitch。其内部实现的过程是非常繁琐的,需要很多算法的支持,包括图像特征的寻找和匹配,摄像机的校准,图像的变形,曝光补偿和图像融合。但这些模块的接口、调用,强大的OpenCV都为我们搞定了,我们使用OpenCV做图像拼接,只需要调用createDefault函数生成默认的参数,再使用stitch函数进行拼接就ok了。就这么简单!estimateTransform和composePanorama函数都是比较高级的应用,如果各位对stitching的流程不是很清楚的话,还是慎用。

实例也非常简单,下载链接哦:http://download.csdn.net/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又放出来了。与之同时放出的还有两个网站http://opencv.org/http://answers.opencv.org,前者作为一个正式的全新的官方用户网站,简单浏览了一下,应该是一个对应之前维基百科上的那个网站,是一个介绍性的新闻网站,对开发者的意义可能不是太大;后面这个网站就厉害了,是一个类似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要好很多。下面让我来对比一下算法的运行时间:

 ORBFREAK detectionFREAK extraction
debug0.317s0.301s0.167s
release0.094s0.162s0.085s

虽然两种算法不能直接比较,因为FREAK没有提供特征点位置检测的算法,个人感觉如果FREAK采用FAST来做detection,确实速度应该要逼ORB要快一些

最后分享给大家我的工程链接:http://download.csdn.net/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作为示例说明一下如何训练和预测:

  1. vector<Mat> images;  
  2. vector<int> labels;  
  3. // images for first person  
  4. images.push_back(imread("person0/0.jpg", CV_LOAD_IMAGE_GRAYSCALE));  
  5. labels.push_back(0);  
  6. images.push_back(imread("person0/1.jpg", CV_LOAD_IMAGE_GRAYSCALE));  
  7. labels.push_back(0);  
  8. // images for second person  
  9. images.push_back(imread("person1/0.jpg", CV_LOAD_IMAGE_GRAYSCALE));  
  10. labels.push_back(1);  
  11. images.push_back(imread("person1/1.jpg", CV_LOAD_IMAGE_GRAYSCALE));  
  12. labels.push_back(1);  
  13.   
  14. Ptr<FaceRecognizer> model = createFisherFaceRecognizer();  
  15. model->train(images, labels);  
  16.   
  17. Mat img = imread("person1/2.jpg", CV_LOAD_IMAGE_GRAYSCALE);  
  18. int predicted = 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_componentsthreshold两个参数和其他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-rec.org/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: http://blog.csdn.net/yang_xian521/article/category/910716

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值