算法相关技术专家
原文来自:http://blog.csdn.net/xiazhaoqiang/article/details/6585537 LDA算法入门 一. LDA算法概述: 线性判别式分析(Linear Discriminant Analysis, LDA),也叫做Fisher线性判别(Fisher Linear Discriminant ,FLD),是模式识别的经典算法,它是在1996年由Belhumeur引入模式识别和人工智能领域的。
在前面一篇教程中,我们学习了OpenCV中基于特征脸的人脸识别的代码实现,我们通过代码 Ptr model = createEigenFaceRecognizer(); 创建了人脸识别模型类,该识别模型类基于特征值人脸。
本文主要参考OpenCV人脸识别教程:http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html 1、OpenCV 从2.4开始支持3个新的人脸识别算法。
PCA算法的基本原理可以参考:http://www.cnblogs.com/mikewolf2002/p/3429711.html 对一副宽p、高q的二维灰度图,要完整表示该图像,需要m = p*q维的向量空间,比如100*100的灰度图像,它的向量空间为100*100=10000。
原帖地址:http://blog.codinglabs.org/articles/pca-tutorial.html PCA(Principal Component Analysis)是一种常用的数据分析方法。
在OpenCV中,可以很方便的计算一个像素点到轮廓的距离,计算距离的函数为: double pointPolygonTest(InputArray contour, Point2f pt, bool measureDist) Parameters: contour – 输入参数轮廓。
在OpenCV中,可以很方便的计算多边形区域的3阶特征矩,opencv中的矩主要包括以下几种:空间矩,中心矩和中心归一化矩。 class Moments { public: ...... // 空间矩 double m00, m10, m01, m20, m11, m02, m30,...
在OpenCV中,能够很方便的求轮廓包围盒。包括矩形,圆形,椭圆形以及倾斜的矩形(包围面积最小)集中包围盒。用到的四个函数是: Rect boundingRect(InputArray points) void minEnclosingCircle(InputArray point...
前几年在做毕业设计时候曾用opencv1.0中defects做过简单的手势识别,这几天看OpenCV2.46中的轮廓函数,发现和以前差别挺大,函数调用完全不一样,重新实现了简单手势的代码。 1.首先用简单的肤色检测算法,得到手的区域。
上一篇教程中,我们学习了如何计算轮廓的凸包,其实对一个轮廓而言,可能它的凸包和它本身是重合的,也有可能不是重合的。比如下面左边图像的轮廓本身就是凸包,而右边图像的轮廓则不是。我们可以通过函数bool isContourConvex(InputArray contour),来判定一个轮廓是否是凸包,是的话返回true,否则false[注意测试的轮廓必须是简单轮廓,没有自交叉之类的]。
在opencv中,通过函数convexHulll能很容易的得到一系列点的凸包,比如由点组成的轮廓,通过convexHull函数,我们就能得到轮廓的凸包。下面的图就是一些点集的凸包。 求凸包的代码如下: int main( int /*argc*/, char** /*arg...
OpenCV中可以方便的在一副图像中检测到轮廓,并把这些轮廓画出来。主要用到两个函数:一个是findContours( img, contours0, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);另一个是drawContours( cnt_img...
我们可以利用OpenCV的直方图,backproject直方图和meanshift算法来跟踪物体。下面通过简单的例子来说明如何实现跟踪算法,我们有两幅狒狒的图片,如下图所示:我们首先在左图中框选狒狒的脸,计算出框选区域的色度(HSV空间的H)直方图,然后在image2中,backproject该直方图,得到每个像素点属于该直方图的概率图。
本章中我们学习一下通过backproject直方图,得到一副图像中每个像素属于该直方图的概率。在下边原始图中(左图),我们框选了一块四边形的区域,计算该区域的灰度直方图,然后通过下面的函数calcBackProject,计算图像src中每个像素在直方图中的概率,最终的结果在result中,result中每个像素表示该像素在直方图中的概率,我们对得到的结果进行二值化,就得到下边右图的结果。
在OpenCV中,也可以对三通道的图像,比如BGR,HSV等计算直方图。方法和计算单通道图像直方图相似,下面的代码描述了如何计算一个BGR三通道图像的直方图,需要注意的是,因为是三通道,每个通道取值都是[0,255],所以bin的数目达到了256*256*256,这时如果使用普通三维矩阵输出直方图结果,需要很大的空间,所以我们通常使用稀疏矩阵来保存输出结果。
直方图是对数据的统计,并将统计结果分布于一系列预定义的槽中。这里的数据不仅仅指的是灰度值,它可以是任何能有效描述图像特征的数据,比如图像梯度等等。 假设有一个矩阵包含一张图像的信息 (灰度值 0-255),我们已经知道灰度值范围是0-255,假设有16个槽(bin),则有下面的划分: 我们可以统计落入每个槽中像素的数目,并用直方图的形式显示出来。
原帖地址:http://www.opencvchina.com/thread-749-1-1.html k-means是一种聚类算法,这种算法是依赖于点的邻域来决定哪些点应该分在一个组中。
本章我们用kmeans算法实现一个简单图像的分割。如下面的图像,我们知道图像分3个簇,背景、白色的任务,红色的丝带以及帽子。 Mat img = cv::imread("../kmeans.jpg"); namedWindow("image"); imshow("image", img); 首先我们会生成采样点,采样点包括原始图像中的所有像素点,采样点用32位浮点数表示,接着我们会定义一个标记矩阵labels,用来存放kmeans的结果。
kmeans算法的原理参考:http://www.cnblogs.com/mikewolf2002/p/3368118.html 下面学习一下opencv中kmeans函数的使用。 首先我们通过OpenCV中的随机数产生器RNG,生成一些均匀分布的随机点,这些点的位置对应一副图像中的像素位置,然后使用kmeans算法对这些随机点进行分类,并计算出分类簇的中心点。
grab cut算法是graph cut算法的改进。在理解grab cut算之前,应该学习一下graph cut算法的概念及实现方式。 我搜集了一些graph cut资料:http://yunpan.
在OpenCV中,实现了grabcut分割算法,该算法可以方便的分割出前景图像,操作简单,而且分割的效果很好。算法的原理参见papaer:“GrabCut” — Interactive Foreground Extraction using Iterated Graph Cuts 比如下面的一副图,我们只要选定一个四边形框,把框中的图像作为grabcut的一个输入参数,表示该框中的像素可能属于前景,但框外的部分一定属于背景。
最后再来看一种通过形态学腐蚀和开操作得到骨架的方法。http://felix.abecassis.me/2011/09/opencv-morphological-skeleton/ 代码非常简单: void gThin::cvmorphThin(cv::Mat& src, cv::Mat& dst) { if(src.
本章我们在学习一下基于索引表的细化算法。 假设要处理的图像为二值图,前景值为1,背景值为0。 索引表细化算法使用下面的8邻域表示法: 一个像素的8邻域,我们可以用8位二进制表示,比如下面的8邻域,表示为00111000=0x38=56 我们可以枚举出各种情况下,当前像素能否删除的表,该表大小为256。
本章我们看下Pavlidis细化算法,参考资料http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/theo.html Computer VisiAlgorithms in Image Algebra,second edition 该算法最初是做前景轮廓跟踪的。
本章我们学习Rosenfeld细化算法,参考资料:http://yunpan.cn/QGRjHbkLBzCrn 在开始学习算法之前,我们先看下连通分量,以及4连通性,8连通性的概念: http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/connectivity.html 假设我们有二值图,背景像素值为0,前景像素值为1。
本章我们学习一下Hilditch算法的基本原理,从网上找资料的时候,竟然发现两个有很大差别的算法描述,而且都叫Hilditch算法。不知道那一个才是正宗的,两个算法实现的效果接近,第一种算法更好一些。
前面一篇教程中,我们实现了Zhang的快速并行细化算法,从算法原理上,我们可以知道,算法是基于像素8邻域的形状来决定是否删除当前像素。还有很多与此算法相似的细化算法,只是判断的条件不一样。在综述文章, Thinning Methodologies-A Comprehensive Survey中描述了各种细化算法的实现原理,有兴趣可以阅读一下。
程序编码参考经典的细化或者骨架算法文章: T. Y. Zhang and C. Y. Suen, “A fast parallel algorithm for thinning digital patterns,” Comm. ACM, vol. 27, no. 3, pp. 236-239, 1984. 它的原理也很简单: 我们对一副二值图像进行骨架提取,就是删除不需要的轮廓点,只保留其骨架点。
通过使用不同的结构元素来进行膨胀腐蚀操作,可以检测图像中的角点,下面就一步一步看这个算法如果实现角点检测。 原图像: 首先我们创建四个结构元素 先用十字结构元素对原图像进行膨胀操作,得到下面的图像 再对这个图像用钻石型结构元素进行腐蚀操作,得到图像1,如下图所示: 接着...
先对一副灰度图像进行腐蚀操作,然后在腐蚀后的图像上再进行膨胀操作,我们定义这个操作为开操作。 先对一副图像进行膨胀操作,然后在膨胀后的图像上再进行腐蚀操作,我们定义这个操作为闭操作。 开操作可以去掉场景中一些孤立的点,而闭操作通常可以填充前景中一些小洞,通常通过这两种操作,使得图像看起来更圆润光滑一点。
建议大家看看网络视频教程:http://www.opencvchina.com/thread-886-1-1.html 腐蚀与膨胀都是针对灰度图的形态学操作,比如下面的一副16*16的灰度图。
有时候为了便于调试算法,我们需要从文本文件或二进制文件中读取数据,并把数据放到相应的矩阵中去。我们通常可以通过下面的函数实现。 1、从二进制文件中读取数据。 新建一个txt文件 input.txt,在vs2010中,右键点击该文件,选择open with,然后选择Binary Editor,就可以用二进制的方式打开文件了。
本章我们学习一下Mat中的常用操作,因为在后面其它的教程中,我们经常要对图像进行各种处理,也要使用这些操作。 一、 Mat的复制,就是从一个矩阵A,生成相关的另一个矩阵B。 (1)使用赋值的方法,比如通过构造函数生成矩阵N,通过复制生成矩阵P cv::Mat N(M); ...
图像在OpenCV中都是通过Mat类来存储的,Mat可以用来表示N维矩阵,当然用的最多的还是二维矩阵。 Mat类有两部分组成:第一部分是头信息,这些信息主要用来描述矩阵,比如矩阵维数ndims,rows,cols(这两个成员变量主要用于二维矩阵,用来表示行数和列数),size,sizes, type,step等等;第二部分是data信息,这是一个指针,指向Mat中存储的数据。
OpenCV是一个开源的视觉库,其中包括很多计算机视觉的算法实现。在版本2.2以后,OpenCV采用C++特征的API,在1.x版本中,OpenCV函数都是传统的C语言形式。 OpenCV采用模块化的结构,每个模块都是由一些动态和静态库组成,该模块会实现一些特定的计算机视觉算法。
下面我们在VS2010中编写一个简单的OpenCV程序,来看看如何在程序中使用OpenCV。 创建一个新的Win32 控制台程序,附加选项为空工程(empty project),并添加一个cpp源文件main.
1. 下载文件 下载最新的OpenCV windows版本: 链接:http://sourceforge.net/projects/opencvlibrary/files/opencv-win/ 我下载的版本是2.46,下载后得到OpenCV-2.4.6.0.exe,自解压该文件到目录D:\opencv2.31\opencv2.46。
本教程我学习一下opencv中分水岭算法的具体实现方式。 原始图像和Mark图像,它们的大小都是32*32,分水岭算法的结果是得到两个连通域的轮廓图。 原始图像:(原始图像必须是3通道图像) Mark图像: 结果图像: 初始的mark图像数据如下,黄色的部分为我们的第一个mark区域,值为255,第二个区域为褐红色的区域,值为128,第三个绿色的区域,值为64。
现在我们看看OpenCV中如何使用分水岭算法。 首先我们打开一副图像: // 打开另一幅图像 cv::Mat image= cv::imread("..
分水岭算法主要用于图像分段,通常是把一副彩色图像灰度化,然后再求梯度图,最后在梯度图的基础上进行分水岭算法,求得分段图像的边缘线。 下面左边的灰度图,可以描述为右边的地形图,地形的高度是由灰度图的灰度值决定,灰度为0对应地形图的地面,灰度值最大的像素对应地形图的最高点。
原帖地址:http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.html 记得刚读研究生的时候,学习的第一个算法就是meanshift算法,所以一直记忆犹新,今天和大家分享一下Meanshift算法,如有错误,请在线交流。
http://blog.163.com/liang8421@126/blog/static/894819572009386653912/ 我想把文本文件file1 和文本文件 file2按照相应的行合并成一个文件 file3。
准备2副背景图像,注意图像黑色的部分,是作为mask用的,我们会用灰度图的方式打开它们,这时黑色的部分值为0,则图像融合时候,可以把第二幅图像在黑色的部分显示出来。 代码非常简单,注意就是图像copyTo函数的使用,把背景图像copy到前景图像时候,掩码部分不会拷贝。
有时候,要在打印makefile文件中的变量,可以用下面的语句,它将在编译时候打印出变量PLATFORM_TYPE的值。 $(warning current platform: $(PLATFORM_TYPE))
英文原帖地址:http://lwn.net/Articles/253361/ 原翻译地址:http://www.oschina.net/translate/what-every-programmer-should-know-about-virtual-memory-part3 4 虚拟内存 处理器的虚拟内存子系统为每个进程实现了虚拟地址空间。
原帖地址: http://ogldev.atspace.co.uk/www/tutorial23/tutorial23.html 当光投射到物体上时,会在地面或者墙壁等物体上产生阴影。
grep -F -v -f a.txt b.txt | sort | uniq 通过grep命令,可以求得b.txt中去除a.txt后的内容。 比如b.txt 1 2 3 a.txt 1 则该命令内容为 2 3
原帖地址:http://ogldev.atspace.co.uk/www/tutorial22/tutorial22.html 前面的教程中,我们都是使用手工指定三维模型,渲染一些简单的物体,比如,正方体、四面体金字塔等等。
原帖地址:http://ogldev.atspace.co.uk/www/tutorial21/tutorial21.html 本篇教程中,我们来学习聚光灯的的光照效果,聚光灯有光源位置,也会随着传播距离增加而衰减,还有照射方向,另外聚光灯增加的特性是,它的照射范围在一个圆锥内,类似探照灯的效果。
原帖地址: http://ogldev.atspace.co.uk/www/tutorial20/tutorial20.html 前面的教程中,我们在方向光的前提下,研究了基本的光照模型(环境光,漫反射光,高光)。