搜档网
当前位置:搜档网 › OpenCV中特征点提取和匹配的通用方法

OpenCV中特征点提取和匹配的通用方法

OpenCV中特征点提取和匹配的通用方法
OpenCV中特征点提取和匹配的通用方法

OpenCV中特征点提取和匹配的通用方法

OpenCV在新版本中把很多C语言的代码都重新整理成了C++代码,让我们在使用的时候更加方便灵活。其中对于特征点的提取和匹配,充分体现了C++的强大。下面直接用例子来说明。假设我们有两幅图:1.bmp和2.bmp,要从中提取体征点并匹配,代码如下:

// Load image from file

IplImage *pLeftImage = cvLoadImage("1.bmp",

CV_LOAD_IMAGE_GRAYSCALE);

IplImage *pRightImage = cvLoadImage("2.bmp",

CV_LOAD_IMAGE_GRAYSCALE);

// Convert IplImage to cv::Mat

Mat matLeftImage = Mat(pLeftImage, false); // Do not copy

Mat matRightImage = Mat(pRightImage, false);

// Key point and its descriptor

vectorLeftKey;

vectorRightKey;

Mat LeftDescriptor;

Mat RightDescriptor;

vector Matches;

// Detect key points from image

FeatureDetector *pDetector = new SurfFeatureDetector; // 这里我们用了

SURF特征点

pDetector->detect(matLeftImage, LeftKey);

pDetector->detect(matRightImage, RightKey);

delete pDetector;

// Extract descriptors

DescriptorExtractor *pExtractor = new SurfDescriptorExtractor; // 提取SURF描述向量

pExtractor->compute(matLeftImage, LeftKey, LeftDescriptor); pExtractor->compute(matRightImage, RightKey, RightDescriptor);

delete pExtractor;

// Matching features

DescriptorMatcher *pMatcher = new FlannBasedMatcher; // 使用Flann 匹配算法

pMatcher->match(LeftDescriptor, RightDescriptor, Matches);

delete pMatcher;

// Show result

Mat OutImage;

drawMatches(matLeftImage, LeftKey, matRightImage, RightKey, Matches, OutImage);

cvNamedWindow( "Match features", 1);

cvShowImage("Match features", &(IplImage(OutImage)));

cvWaitKey( 0 );

cvDestroyWindow( "Match features" );

从上面的代码可以看见,用OpenCV来做特征提取匹配相当简便,出去读图和显示结果的代码,真正核心的部分只有3段代码,分别是检测关键点,提取描述向量和特征匹配,一共只有11行代码。

在我的示例代码中,使用的是SURF特征,而在OpenCV中,实现了很多种特征,如SIFT,FAST等,这些特征的实现各不相同,但是都是从一个公共抽象基类派生出来的,因此可以用多态方便地切换特征提取算法。下面我将详细地说明。

1 FeatureDetector

FeatureDetector是关键点检测类的抽象基类,其已经实现的具体类有:class FastFeatureDetector

class GoodFeaturesToTrackDetector

class MserFeatureDetector

class StarFeatureDetector

class SiftFeatureDetector

class SurfFeatureDetector

要使用某一种检测器,可以直接调用FeatureDetector的工厂来创建,该工厂是一个静态方法,如下:

// Create feature detector by detector name.

static Ptr create( const string&detectorType );

也可以像我的示例代码中那样显式的创建,如下:

FeatureDetector *pDetector = new SurfFeatureDetector;

可以用swich实现在多种方法中切换。

2 DescriptorExtractor

DescriptorExtractor是提取关键点的描述向量类抽象基类,其具体类有:class SiftDescriptorExtractor

class SurfDescriptorExtractor

class CalonderDescriptorExtractor

class BriefDescriptorExtractor

class OpponentColorDescriptorExtractor

要使用某一种描述向量,可以调用DescriptorExtractor的工厂来创建,静态方法如下:

static Ptr create( const

string&descriptorExtractorType );

也可以像我的示例代码中那样显式的创建,如下:

DescriptorExtractor *pExtractor = new SurfDescriptorExtractor;

可以用swich实现在多种方法中切换。

3 DescriptorMatcher

DescriptorMatcher是匹配器的抽象基类,其具体类有:

class BruteForceMatcher

class FlannBasedMatcher

匹配器可以由静态工厂方法直接创建,如下:

static Ptr create( const

string&descriptorMatcherType );

也可以像我的示例代码中那样显式的创建,如下:

DescriptorMatcher *pMatcher = new FlannBasedMatcher;

可以用swich实现在多种方法中切换。

多态的使用,可以让我们对不同的特征采用相同的代码来编程,这是OpenCV设计的一种策略模式,大大地简化了代码量,并增加了灵活性,让我们可以在多种特征提取和匹配方法之间自由切换。

人脸检测算法原理及OPENCV人脸检测程序分析

人脸检测算法原理及OpenCV 人脸检测程序分析 罗海风 2011-3-30 人脸检测研究背景:人脸检测 基于肤色特征基于灰度特征 启发模型统计模型 肤色区域分割方法人脸模板方法等特征空间方法PCA 、fisherfaces 方法等ANN SVM 概率模型方法 贝叶斯概率模型HMM 集成机器学习 以上所列方法中,基于统计模型的方法是目前比较流行的方法[1],具有较大的优越性。其优点有: 1.不依赖于人脸的先验知识和参数模型,可以避免不精确或不完整的知识造成的错误; 2.采用实例学习的方法获取模型的参数,统计意义上更加可靠; 3.通过增加学习的实例可以扩种检测模式范围,提高鲁棒性。 在统计模型方法中,2001年左右由Viola 和Jones 提出的基于集成机器学习的人脸检测算法相对于其他方法具有明显优势[123]。近期文献也表明目前尚未发现优于Viola &Jones 方法的其他人脸检测方法[4]。该方法不仅检测精度高,最关键的是其运算速度大大快于其他方法。Viola &Jones 人脸检测方法原理: 该方法中几个关键性概念[5]: 1.Haar-like 特征 Haar-like 型特征是Viola 等人提出的一种简单矩形特征,因为类似Haar 小波而得名。Haar

型特征的定义是黑色矩形和白色矩形在图像子窗口中对应的区域的权重灰度级总和之差。上图显示了两种最简单的特征算子。在上述图中,可以看到,在人脸特定结构处,算子计算得到较大的值。 2.积分图 算子数量庞大时上述计算量显得太大,Viola等人发明了积分图方法,使得计算速度大大加快。积分图如上所示,点1处的值为A区域的像素积分,点2处的值为AB区域的像素积分。对整张图片进行一次积分操作,便可以方便的计算出任一区域D像素积分值为4+1-2-3。 3.Adaboost训练算法 在离散Adaboost算法中,Haar-like特征算子计算结果减去某阈值,便可视为一个人脸检测器。因为其准确率不高,称为弱分类器。Adaboost算法的循环中,首先利用各种弱分类器对训练图片库进行分类,准确度最高的弱分类器保留下来,同时提高判断错误的图片的权重,进入下一循环。最终将每次循环所保留的弱分类器组合起来,成为一个准确的人脸检测器,称为强分类器。具体计算流程见[35]。 4.瀑布型级联检测器 瀑布型级联检测器是针对人脸检测速度问题提出的一种检测结构。瀑布的每一层是一个由adaboost算法训练得到的强分类器。设置每层的阈值,是的大多数人脸能够通过,在此基础上尽量抛弃反例。位置越靠后的层越复杂,具有越强的分类能力。 这样的检测器结构就想一系列筛孔大小递减的筛子,每一步都能筛除一些前面筛子楼下的反例,最终通过所有筛子的样本被接受为人脸。瀑布型检测器训练算法见[3]。 OpenCV人脸检测程序流程[6]: OpenCV的人脸检测程序采用了Viola&Jones人脸检测方法,主要是调用训练好的瀑布级联分类器cascade来进行模式匹配。 cvHaarDetectObjects,先将图像灰度化,根据传入参数判断是否进行canny边缘处理(默认不

opencv adaboost人脸检测训练程序阅读笔记(LBP特征)

1、训练程序整体流程 (1)读输入参数并打印相关信息 (2)进入训练程序最外层入口classifier.train 1)读正负样本,将正负样本放入imgLiast中,先读正样本,后读负样本 2)load( dirName )判断之前是否有已训练好的xml文件,若有,不在重新训练该stage的xml文件,没有返回false,初始化参数 3)计算requiredLeafFARate = pow(maxFalseAlarm,numStages)/max_depth,该参数是stage停止条件(利用训练样本集来计算tempLeafFARate,若 tempLeafFARate小于这一参数,则退出stage训练循环); 4)Stage训练循环 5)更新训练样本集,计算tempLeafFARate(负样本被预测为正样本的个数除以读取负样本的次数,第一次没有训练之前,这个比值为1,因为没训练之前, 所有负样本都被预测成了正样本,当第一层训练好以后,负样本采集时会先 用第一层的分类器预测一次,若能分类,则不选用,选用负样本的数目是固 定的,但选用这么多负样本总共要选的次数会随着层数的增多而加大,因为 层数越大,分类器的分类能力也要求越大,说需要的样本就是前面分类器所 不恩呢该识别的,故在采集时也比较困难。) 6)判断stage是否退出训练,若tempLeafFARatetrain() a.建立训练数据data = new CvCascadeBoostTrainData(主要是一些参 数的设置,还有特征值的计算) b.初始化样本权重update_weights( 0 ); c.弱分类器训练循环 i)tree->train—》do_train ai) 根节点的初始root = data->subsample_data( _subsample_idx ); (主要是对根节点的一些参数进行初始化,parent 0,count 1, split 0,value 0,class_idx 0,maxlr 0,left = right = 0,等等) bi) CV_CALL( try_split_node(root)),根据根节点计算整颗数的各 节点的参数配置 aii) calc_node_value( node );计算节点的回归值,类似于分类 投票值sum(w*class_lable),正样本的class_lable取,负样 本的class_lable取-1;计算节点的风险值node_risk,node risk is the sum of squared errors: sum_i((Y_i - )^2) bii) 判断节点是否可以分裂(判断依据:样本值和设计的节点最 大深度);再利用node_risk与regression_accuracy,如 果这个节点的所有训练样本的节点估计值的绝对差小 于这个参数,节点不再进行分裂 cii) 找出最佳分裂best_split = find_best_split(node); aiii) 定义DTreeBestSplitFinder finder( this, node ); biii) parallel_reduce(cv::BlockedRange(0, data->var_count), finder); 此时调用DTreeBestSplitFinder类的操作符 DTreeBestSplitFinder::operator()(constBlockedRange

OPENCV静态编译与动态编译

一、序言 当一个opencv工程实现之后,我们会面临一个问题,怎么把opencv程序的exe在其他电脑上运行,这个问题已经有很多人遇到过,当然也有很多人给出了博客,介绍了具体的解决方法,具体自己操作时,还是遇到了这样或者那样的小毛病,不过凭借自己根据错误提示解决问题的能力,最后还是把静态编译给编译成功了。 本文介绍两种opencv程序移植到其他电脑运行的方法,一种是动态编译,需要拷贝程序运行需要的dll,也就是-个exe跟着多个dll的模式,这种简单粗暴,但是显得拖拖拉拉,一个程序还得跟着那么多其他文件,所以我们很不推荐。另外一种就是本文主要介绍的静态编译,和之前运行不一样,我们在这使用的不是opencv的lib库,而是staticlib,编译成功之后,程序只需要拷贝一个exe,就可以在其他电脑上运行。 另外介绍一下本文测试程序工作的程序配置 操作系统Win7 IDE VS2010 opencv版本opencv2.4.5 二、动态编译 为了做一个全面的总结,在这简单的介绍opencv动态编译的方法。 opencv动态编译需要两部分dll: (1)opencv库的dll,检查你所引用的h文件,把对应的dll,拷贝过来就行,注意debug和release的不同,当然一般程序发布的话都会用release版本的,因为release版本比debug版本要快10倍有余。 (2)考虑到目标终端有可能没有装vs,所以需要拷贝msvcp110.dll和msvcr110.dll(release下),dll在C:/Windows/System32下。 三、静态编译 静态编译主要的不同就是利用的是 H:/Opencv2.4.5/opencv/build/x86/vc11/staticlib文件下的lib,而非 H:/Opencv2.4.5/opencv/build/x86/vc11/lib文件夹。具体配置如下: 1.新建空项目,项目名称Static_Opencv

视觉里程计原理(一)特征提取(SURF算法)

MPIG Seminar0045 Feature Extraction 陈伟杰 Machine Perception and Interaction Group (MPIG) https://www.sodocs.net/doc/e78744519.html, cwj@https://www.sodocs.net/doc/e78744519.html,

Feature Extraction Refined based on the book: Mastering OpenCV with Practical Computer Vision Projects_full.pdf and Bay H, Tuytelaars T, Van Gool L. Surf: Speeded up robust features [M]. Computer vision–ECCV 2006. Springer. 2006: 404-417.

or F for [R|t]Drawing path The main steps of Visual Odometry images parameters Feature Extraction Feature matching Compute E

First Feature Extraction What feature is? Characteristics can be easily identified in images Edges Corners Blobs lines points

Harris SIFT SURF Commonly used algorithm: ?Corner extractor ?Fast operation ?Poor resolution ?Not applicable when scale changes ?Blobs extractor ?Slow operation ?Good resolution ?Scale invariance ?Upgrade from SIFT ?Speed up ?More robust

opencv特征提取解析

特征提取是计算机视觉和图像处理中的一个概念。它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征。特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点、连续的曲线或者连续的区域。 特征的定义 至今为止特征没有万能和精确的定义。特征的精确定义往往由问题或者应用类型决定。特征是一个数字图像中“有趣”的部分,它是许多计算机图像分析算法的起点。因此一个算法是否成功往往由它使用和定义的特征决定。因此特征提取最重要的一个特性是“可重复性”:同一场景的不同图像所提取的特征应该是相同的。 特征提取是图象处理中的一个初级运算,也就是说它是对一个图像进行的第一个运算处理。它检查每个像素来确定该像素是否代表一个特征。假如它是一个更大的算法的一部分,那么这个算法一般只检查图像的特征区域。作为特征提取的一个前提运算,输入图像一般通过高斯模糊核在尺度空间中被平滑。此后通过局部导数运算来计算图像的一个或多个特征。 有时,假如特征提取需要许多的计算时间,而可以使用的时间有限制,一个高层次算法可以用来控制特征提取阶层,这样仅图像的部分被用来寻找特征。 由于许多计算机图像算法使用特征提取作为其初级计算步骤,因此有大量特征提取算法被发展,其提取的特征各种各样,它们的计算复杂性和可重复性也非常不同。 边缘 边缘是组成两个图像区域之间边界(或边缘)的像素。一般一个边缘的形状可以是任意的,还可能包括交叉点。在实践中边缘一般被定义为图像中拥有大的梯度的点组成的子集。一些常用的算法还会把梯度高的点联系起来来构成一个更完善的边缘的描写。这些算法也可能对边缘提出一些限制。

局部地看边缘是一维结构。 角 角是图像中点似的特征,在局部它有两维结构。早期的算法首先进行边缘检测,然后分析边缘的走向来寻找边缘突然转向(角)。后来发展的算法不再需要边缘检测这个步骤,而是可以直接在图像梯度中寻找高度曲率。后来发现这样有时可以在图像中本来没有角的地方发现具有同角一样的特征的区域。 区域 与角不同的是区域描写一个图像中的一个区域性的结构,但是区域也可能仅由一个像素组成,因此许多区域检测也可以用来监测角。一个区域监测器检测图像中一个对于角监测器来说太平滑的区域。区域检测可以被想象为把一张图像缩小,然后在缩小的图像上进行角检测。 脊 长条形的物体被称为脊。在实践中脊可以被看作是代表对称轴的一维曲线,此外局部针对于每个脊像素有一个脊宽度。从灰梯度图像中提取脊要比提取边缘、角和区域困难。在空中摄影中往往使用脊检测来分辨道路,在医学图像中它被用来分辨血管。 特征抽取 特征被检测后它可以从图像中被抽取出来。这个过程可能需要许多图像处理的计算机。其结果被称为特征描述或者特征向量。 常用的图像特征有颜色特征、纹理特征、形状特征、空间关系特征。 一、颜色特征 (一)特点:颜色特征是一种全局特征,描述了图像或图像区域所对应的景物的表面性质。一般颜色特征是基于像素点的特征,此时所有属于图像或图像区

基于Opencv的人脸检测源程序(附详细使用说明)

基于Opencv的人脸检测程序 我的电脑上是用visual studio 2015,配置opencv2.4.9,visuanl studio加载opencv的方法百度上可以找到很多,按照要求配置好后以后进行一下操作: 第一步:新建win32应用程序的工程,在该工程以下程序复杂被覆盖win32的几行程序, #include"stdafx.h" #include"opencv2/objdetect.hpp" #include"opencv2/videoio.hpp" #include"opencv2/highgui.hpp" #include"opencv2/imgproc.hpp" #include #include using namespace std; using namespace cv; /** Function Headers */ void detectAndDisplay(Mat frame); /** Global variables */ String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; String window_name = "Capture - Face detection"; /** @function main */ int main(void) { VideoCapture capture; Mat frame; //-- 1. Load the cascades if (!face_cascade.load(face_cascade_name)) { printf("--(!)Error loading face cascade\n"); return -1; }; if (!eyes_cascade.load(eyes_cascade_name)) { printf("--(!)Error loading eyes cascade\n"); return -1; }; //-- 2. Read the video stream capture.open(-1); if (!capture.isOpened()) { printf("--(!)Error opening video capture\n"); return -1; }

opencv 人脸识别 (二)训练和识别

?转为灰度和对齐是后面做训练时EigenFaceRecognizer的要求; ?归一化是防止光照带来的影响 在上一篇的 2.2 Prehelper.cpp文件中加入函数 void resizeandtogray(char* dir,int k, vector &images, vector &labels, vector &testimages, vector &testlabels); [cpp]view plaincopyprint?

1.void resizeandtogray(char* dir,int K, vector &images, vector &l abels, 2. vector &testimages, vector &testlabels) 3.{ 4. IplImage* standard = cvLoadImage("D:\\privacy\\picture\\photo\\2.jpg" ,CV_LOAD_IMAGE_GRAYSCALE); 5. string cur_dir; 6.char id[5]; 7.int i,j; 8. for(int i=1; i<=K; i++) 9. { 10. cur_dir = dir; 11. cur_dir.append("gray\\"); 12. _itoa(i,id,10); 13. cur_dir.append(id); 14. const char* dd = cur_dir.c_str(); 15. CStatDir statdir; 16. if (!statdir.SetInitDir(dd)) 17. { 18. puts("Dir not exist"); 19. return; 20. } 21. cout<<"Processing samples in Class "<file_vec = statdir.BeginBrowseFilenames("*.*"); 23. for (j=0;j

OpenCV最基础的图像处理的例子

?什么是OpenCV ?开源C/C++计算机视觉库. ?面向实时应用进行优化. ?跨操作系统/硬件/窗口管理器. ?通用图像/视频载入、存储和获取. ?由中、高层API构成. ?为Intel?公司的Integrated Performance Primitives (IPP) 提供了透明接口. ?特性: ?图像数据操作(分配,释放, 复制, 设定, 转换). ?图像与视频I/O (基于文件/摄像头输入, 图像/视频文件输出). ?矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解SVD). ?各种动态数据结构(列表, 队列, 集, 树, 图). ?基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态操作, 直方图, 图像金字塔). ?结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough转换, 多边形近似, 线性拟合, 椭圆拟合, Delaunay三角化). ?摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography估计, 立体匹配). ?动作分析(光流, 动作分割, 跟踪). ?对象辨识 (特征方法, 隐马可夫链模型HMM). ?基本GUI(显示图像/视频, 键盘鼠标操作, 滚动条). ?图像标识 (直线, 圆锥, 多边形, 文本绘图) ?OpenCV 模块: ?cv - OpenCV 主要函数. ?cvaux - 辅助(实验性) OpenCV 函数. ?cxcore - 数据结构与线性代数算法. ?highgui - GUI函数. 资料链接 ?参考手册: ?/docs/index.htm ?网络资源: ?官方网页: https://www.sodocs.net/doc/e78744519.html,/technology/computing/opencv/?软件下载: https://www.sodocs.net/doc/e78744519.html,/projects/opencvlibrary/ ?书籍: ?Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006). ?视频处理例程(位于/samples/c/目录中): ?色彩跟踪: camshiftdemo ?点跟踪: lkdemo

linux下第一个OpencV程序

linux下第一个OpencV程序 今天在linux下安装了OpenCV,下面是我的linux下第一个OpencV程序,很简单,但是在编译的过程中还是遇到了不少的问题。下面就简单总结一下。 源代码如下(hello.c): #include "cv.h" #include "highgui.h" int main(int argc,char **argv) { IplImage* pImage; if (argc == 2 && (pImage=cvLoadImage(argv[1],1)) !=0) { cvNamedWindow("Image",1); cvShowImage("Image",pImage); cvWaitKey(0); cvDestroyWindow("Image"); cvReleaseImage(&pImage); return 0; } return -1; } 1.编译:gcc hello.c -o hello 报错如下: hello.c:1:16: 错误:cv.h:没有该文件或目录 hello.c:2:21: 错误:highgui.h:没有该文件或目录 hello.c: 在函数‘main’ 中: hello.c:6: 错误:‘IplImage’ 未声明(在此函数内第一次使用)

hello.c:6: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其 hello.c:6: 错误:所在的函数内只报告一次。) hello.c:6: 错误:‘pImage’ 未声明(在此函数内第一次使用) hello.c:20:2: 警告:文件未以空白行结束 解决方法: 把目录/usr/local/include/opencv拷贝到/usr/include下, 即执行命令:sudo cp -r /usr/local/include/opencv /usr/include 再编译:gcc hello.c -o hello 仍然报错: hello.c:1:16: 错误:cv.h:没有该文件或目录 hello.c:2:21: 错误:highgui.h:没有该文件或目录 hello.c: 在函数‘main’ 中: hello.c:6: 错误:‘IplImage’ 未声明(在此函数内第一次使用) hello.c:6: 错误:(即使在一个函数内多次出现,每个未声明的标识符在其 hello.c:6: 错误:所在的函数内只报告一次。) hello.c:6: 错误:‘pImage’ 未声明(在此函数内第一次使用) hello.c:20:2: 警告:文件未以空白行结束 再改变编译命令: g++ `pkg-config --cflags opencv` -c hello.c 链接命令: g++ `pkg-config --libs opencv` -o hello hello.o 此时编译成功,执行时候,需要进入超级用户模式下,并进入工程目录,执行命令:hello v.jpg即可显示出图片v.jpg 虽然有看到图片但是其中的有些原理还不是很清楚,会进一步跟踪研究~~~

opencv成长之路:特征点检测与图像匹配

OpenCV成长之路(9):特征点检测与图像匹配 特征点检测与图像匹配 称兴趣点、关键点,它是在图像中突出且具有代表意义的一些点,通过这些点我们可以用来识别图像、进行图像配准、进行3D重建等。本文主要介绍OpenCV中几种定位与表示关键点的函数。 一、Harris角点 角点是图像中最基本的一种关键点,它是由图像中一些几何结构的关节点构成,很多都是线条之间产生的交点。Harris 角点是一类比较经典的角点类型,它的基本原理是计算图像中每点与周围点变化率的平均值。 (1) (2) 其中I(x+u,y+u)代表了点(x,y)邻域点的灰度值。通过变换可以将上式变化为一个协方差矩阵求特征值的问题(2),具体数学原理本文不过多描述。 OpenCV的Hairrs角点检测的函数为cornerHairrs(),但是它的输出是一幅浮点值图像,浮点值越高,表明越可能是特征角点,我们需要对图像进行阈值化。我们使用一张建筑图像

来显示: int main() { Mat image=imread("../buliding.png"); Mat gray; cvtColor(image,gray,CV_BGR2GRAY); Mat cornerStrength; cornerHarris(gray,cornerStrength,3,3,0.01); threshold(cornerStrength,cornerStrength,0.001,255,THRESH_B INARY); return 0; } 首先我们来说明一下cornerHairrs()这个函数参数的意思: 前2参数是输入与输出,输入是一个灰度图像,输出是一个浮点图像,第三个参数指定角点分析的邻域,第4个参数实际上在角点求取过程中计算梯度图像的核窗口大小,第5个参数是它原理公式(2)中的一个系数。 从上面的例子的结果我们可以看到,有很多角点都是粘连在一起的,我们下面通过加入非极大值抑制来进一步去除一些粘在一起的角点。 非极大值抑制原理是,在一个窗口内,如果有多个角点则用值最大的那个角点,其他的角点都删除,窗口大小这里我们用3*3,程序中通过图像的膨胀运算来达到检测极大值的目的,因为默认参数的膨胀运算就是用窗口内的最大值替代当前的灰度值。程序的最后使用了一个画角点的函数将角点显示在图像中,这个函数与本系列第5篇中画角点的函数是一致的。

基于opencv的人脸识别程序-代码详解

#include "cv.h" #include "highgui.h" #include #ifdef _EiC #define WIN32 #endif static CvMemStorage* storage = 0; static CvHaarClassifierCascade* cascade = 0; void detect_and_draw( IplImage* image ); const char* cascade_name = "haarcascade_frontalface_alt.xml";//人脸检测分类器 int main( int argc, char** argv ) { CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; int optlen = strlen("--cascade="); const char* input_name; if( argc > 1 && strncmp( argv[1], "--cascade=", optlen ) == 0 ) { cascade_name = argv[1] + optlen; input_name = argc > 2 ? argv[2] : 0; } else { cascade_name = "E:\毕业设计\智能机器人动态人脸识别系统\陈建州程序.xml";//分类器路径 input_name = argc > 1 ? argv[1] : 0; } cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 ); if( !cascade )//如果没有找到分类器,输出以下 { fprintf( stderr, "ERROR: Could not load classifier cascade\n" ); fprintf( stderr, "Usage: facedetect --cascade=\"\" [filename|camera_index]\n" ); return -1;

opencv之HOG特征详解与行人检测

HOG(Histogram of Oriented Gradient)特征在对象检测与模式匹配中是一种常见的特征提取算法,是基于本地像素块进行特征直方图提取的一种算法,对象局部的变形与光照影响有很好的稳定性,最初是用HOG特征来来识别人像,通过HOG特征提取+SVM训练,可以得到很好的效果,OpenCV已经有了。HOG特征提取的大致流程如下: 详细步骤 第一步:灰度化 对HOG特征提取来说第一步是对输入的彩色图像转换为灰度图像,图像灰度化的方法有很多,不同灰度化方法之间有一些微小的差异,从彩色到灰度的图像转换可以表示如下: 第二步:计算图像梯度 计算图像的X方向梯度dx与Y方向梯度dy,根据梯度计算mag与角度,计算梯度时候可以先高斯模糊一下(可选步骤),然后使用sobel或者其它一阶导数算子计算梯度值dx、dy、mag、angle:

第三步:Cell分割与Block 对于图像来说,分成8x8像素块,每个块称为一个Cell,每个2x2大小的 Cell称为一个Block,每个Cell根据角度与权重建立直方图,每20度为一 个BIN,每个Cell得到9个值、每个Block得到36个值(4x9), 图像如下: 每个Block为单位进行L2数据归一化,作用是抵消光照/迁移影响,L2的归一化的公式如下: 第四步:生成描述子 对于窗口64x128范围大小的像素块,可以得到8x16个Cell,使用Block 在窗口移动,得到输出的向量总数为7x15x36=3780特征向量,每次Block 移动步长是八个像素单位,一个Cell大小。

使用HOG特征数据 HOG特征本身是不支持旋转不变性与多尺度检测的,但是通过构建高斯金字塔实现多尺度的开窗检测就会得到不同分辨率的多尺度检测支持。OpenCV中HOG多尺度对象检测API如下: virtual void cv::HOGDescriptor::detectMultiScale( InputArray img, std::vector< Rect > & foundLocations, double hitThreshold = 0, Size winStride = Size(), Size padding = Size(), double scale = 1.05, double finalThreshold = 2.0, bool useMeanshiftGrouping = false ) Img-表示输入图像 foundLocations-表示发现对象矩形框 hitThreshold-表示SVM距离度量,默认0表示,表示特征与SVM分类超平面之间 winStride-表示窗口步长 padding-表示填充 scale-表示尺度空间 finalThreshold-最终阈值,默认为2.0 useMeanshiftGrouping-不建议使用,速度太慢拉 使用OpenCV预训练SVM行人HOG特征分类器实现多尺度行人检测的代码如下: import cv2 as cv if __name__ == '__main__': src = cv.imread("D:/images/pedestrian.png") cv.imshow("input", src)

opencv编译与安装

2012/3/6, 16:55:01 在fedora15的环境下编译与安装opencv,并测试人脸检测程序 第一步:由于opencv是在cmake工具下建立的工程,所以我们先要下载cmake,下载地址随便一搜都有,不多说。下载到home的主目录下,这里我们是/home/lg。看下面的命令: #cd /home/lg #tar xzvf CMake2.4.7.tar.gz . #cd CMake2.4.7 #./boostrap #gmake #make install 这样cmake工具安装好了,并且可以直接使用cmake命令 根据cmake的编译规律,我们选择外部编译。 下载Opencv2.3.0到/home/lg 解压后进入Opencv2.3.0的目录下(这里的opencv与以前版本1.0的不一样,没有configure文件,所以我们执行不了./configure命令): #mkdir build #cd build #cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D BUILD_PYTHON_SUPPORT=ON ..(这条命令解析可以参考cmake教程,但是记住这里的第二个选项,我们将opencv安装在/usr/local目录下的) #make #make install 到这opencv编译完成,接下去是是opencv这个工具能正常使用。 记住这里的做法前一种对fedora有用,也就是说在fedora的环境下只能使用这种做法,但是ubuntu却可以使用两种方法。顺便说一下,经常遇见apt-get命令,这是在ubuntu下使用获取软件包的命令,fedora使用的是yum,记住了,否则经常出现使用apt-get却获取不了软件包的情况。 方法1:在/etc/ld.so.conf.d下新建一个文件opencv.conf,里面输入/usr/local/lib 方法2:在/etc/ld.so.conf文件中加入/usr/local/lib这一行 然后执行 #ldconfig(root权限下) #cp /usr/local/lib/pkconfig/opencv.pc /usr/lib/pkgconfig (或者是输入这个命令 export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH)(pkconfig的用法见以前的博文) 至此opencv安装完成 我们可以找个例子来做实验 #cd /home/lg/Opencv2.3.0 #cd samples/cpp #g++ `pkconfig --cflags --libs opencv` drawing.cpp -o drawing(记住前面的两个引号是通过ESC下面的那个波浪符键获得 页次: 1

图像处理经典算法及OpenCV程序

基于opencv的use摄像头视频采集程序 (1) 基于opencv的两个摄像头数据采集 (3) 能激发你用代码做视频的冲动程序 (6) 图像反转(就是把黑的变白,白的变黑) (11) 图像格式的转换 (12) 从摄像头或者A VI文件中得到视频流,对视频流进行边缘检测 (13) 采用Canny算子进行边缘检测 (15) 角点检测 (18) 图像的旋转加缩放(效果很拽,用地球做就像谷歌地球似的) (21) Log-Polar极坐标变换 (22) 对图像进行形态学操作(图像的开闭,腐蚀和膨胀运算) (24) 用不同的核进行图像的二维滤波 (27) 图像域的填充 (30) 寻找轮廓实现视频流的运动目标检测(超推荐一下) (35) 采用金字塔方法进行图像分割 (40) 图像的亮度变换 (43) 单通道图像的直方图 (46) 计算和显示彩色图像的二维色调-饱和度图像 (48) 图像的直方图均匀化 (50) 用Hongh变换检测线段 (52) 利用Hough变换检测圆(是圆不是椭圆) (57) 距离变换 (59) 椭圆曲线拟合 (64) 由点集序列或数组创建凸外形 (68) Delaunay三角形和V oronoi划分的迭代式构造 (71) 利用背景建模检测运动物体(推荐) (78) 运动模板检测(摄像头) (81) 显示如何利用Camshift算法进行彩色目标的跟踪 (86) 基于opencv的use摄像头视频采集程序 准备工作:你得把opencv库装到电脑上,并把各种头文件,源文件,lib库都连到vc上,然后设置一下系统环境变量,这里这方面就不说了,好像我前面的文章有说过,不懂也可百度一下。 建立一个基于WIN32控制台的工程CameraUSB,在新建一个c++元文件,写代码: #include "cxcore.h" #include "cvcam.h" #include "windows.h" #include "highgui.h"

基于OpenCV的人脸检测算法研究

第8卷第3期 2009年8月  淮阴师范学院学报(自然科学版)JOURNA L OF HUAIYIN TE ACHERS CO LLEGE (NAT URA L SCIE NCE E DITION ) V ol 18N o 13Aug.2009 基于OpenCV 的人脸检测算法研究 齐金山 (淮阴师范学院计算机科学与技术学院,江苏淮安 223300) 摘 要:介绍了一种开放源代码的计算机视觉类库OpenCv ,阐述了该软件的特点及结构,并对 其在Visual C ++2005开发环境下的配置作了详细的说明.然后提出了一个基于OpenCv 的人 脸检测算法.实验结果表明,该算法具有识别效果、实时性好,检测速度快的特点. 关键词:OpenC V ;人脸检测;I pIImage 中图分类号:TP391.41 文献标识码:A 文章编号:167126876(2009)0320216205  收稿日期:2009205222  作者简介:齐金山(19772),男,湖南株洲人,讲师,硕士,研究方向为数字图像处理. 0 引言 人脸的检测是一类具有很大挑战性的问题[1] ,其主要难点在于:人脸是一类高度非刚性的目标,存在相貌、表情、肤色等差异;人脸上可能会存在一些附属物如眼镜、胡须等;人脸的姿态变化万化,并且可能存在遮挡物;待检测图像性质的差异,比如:待检图像的分辨率、摄录器材的质量等.针对以上难点,各国的科研人员作了很多的研究,每年在国际国内的相关期刊和会议上都有大量的关于人脸检测的论文, 如Chellappa 、Zhao 等人分别于1995和2003年发表的两篇人脸识别的综述论文[2,3].人脸检测的算法也 很多,Boosting 算法[4]是其中的一种,但Boosting 算法十分复杂.本文提出了基于OpenC V 进行人脸检测 将比较容易实现,实验结果表明该算法具有识别效果好、实时性好、检测速度快的特点.1 OpenCv 简介 OpenC V (Open S ource C om puter Vision Library )是指Intel 计算机视觉库[5].它由一系列C 函数和少量 C ++类构成,实现了图像处理和计算机视觉方面的很多通用算法.OpenC V 主要用于对图像进行一些高级处理,比如说特征检测与跟踪、运动分析、目标分割与识别以及3 D 重建等.由于OpenCv 的源代码是完全开放的,而且源代码的编写简洁而高效,特别是其中大部分的函数都已经通过汇编最优化,以使之能高效而充分地利用英特尔系列处理芯片的设计体系,对于Pentium M MX 、Pentium 、Pentium HI 及Pentium 4这些处理器而言,OpenCv 的代码执行效率是非常高的,所以近年来在国外的图像处理相关领域中被广泛地使用,成为一种流行的图像处理软件. 111 OpenCv 的特点 相对于MAT LAB 等其它常用的图像处理软件来说,OpenCv 有其显著的不可比拟的优点,主要体现在如下几个方面: 1)OpenCv 是一个包含了超过300个C 函数的应用编程接口,它不依赖于外部库,既可以独立运行,也可在运行时使用其它外部库. 2)高性能:OpenCv 中所有的算法都是基于封装于IP L 的具有很高灵活性的动态数据结构,而且其中有一半以上的函数在设计及汇编时被Intel 公司针对其所生产的处理器优化. 3)提供了一些与诸如E iC 、Ch 、MAT LAB 等其它语言或环境的接口,这些接口在其安装完之后位于安装目录opener/interfaces 下. 4)开放性:不管对于商业的还是非商业的用途,OpenCv 都是完全免费的,其源代码完全开放,开发

[作业]OpenCV人脸识别

摘要 人脸检测主要是基于计算机识别的一项数字化技术,用以准确获取人的脸部大小和位置信息,在进行人脸检测时,突出主要的脸部特征,淡化次要的环境、衣着等因素。对于某些情况下,人脸检测也可以计算出人脸,如眼睛,鼻子和嘴等精确的微妙特征。由于在安全检测系统,医学,档案管理,视频会议和人机交互等领域人脸检测系统都有光明的应用前景,因此人脸检测逐渐成为了两个跨学科领域研究的热门话题:人工智能和当前模式识别。本文基于OpenCV视觉库具体的设计并开发了对数字图像中的人脸检测的程序,所采用的人脸检测的原理主要是分类器训练模式(Adaboost算法)提取Haar特征的方法。它在整个软件极其重要的作用,图像中人脸的准确定位和识别都受图像处理好坏的直接影响。本次所设计的软件在图像处理部分所采用的方法是基于Adaboost算法进行Haar特征的提取,在此之上加以通过积分图方法来获取完整的级联分类器结构,进行人脸检测时,OpenCV级联分类器通过Adaboost人脸检测算法进行训练,此后采用不同情况下的实验样本完成精确定位以及检测试验。经过代码的设计和调试,在最后的测试中针对数字图像进行的人脸检测和定位达到了较好的效果,提高了定位和识别的正确率。 关键词:人脸检测,AdaBoost,分类器,OpenCV

Abstract Face detection is mainly based on computer recognition of a digital technology, face size and location information to accurately obtain the person, during face detection, highlight the main facial features, dilute the secondary environment, clothing, and other factors . For some cases, face detection can also calculate a person's face, such as eyes, nose and mouth, and other subtle features accurate. Because in the field of human security detection systems, medical records management, video conferencing, and human-computer interaction face detection system has bright prospects, and therefore face detection is becoming a two interdisciplinary research fields hot topic: artificial intelligence and The current pattern recognition. This article is based. penCV vision library designed and developed specifically for digital image face detection process, the principles used face detection methods are mainly classifier training mode (Adaboost algorithm) to extract Haar features. It is in the vital role of the software, the image of the human face accurately locate and identify all that is good or bad a direct impact on the image processing. This software is designed image processing method used in part based Haar Adaboost algorithm to extract features, on top of this to be to get the full cascade classifier structure by integrating the diagram method for face detection, OpenCV cascade classifier is trained by Adaboost face detection algorithm, then the use of the experimental sample under different circumstances for accurate positioning and testing. Through design and debugging code, face detection and location in the final test for digital images to achieve better results and improve the accuracy of positioning and recognition. Keywords: face detection ; AdaBoost ; classifier ; openCV

相关主题