基础学习笔记之opencv(24):imwrite函数的使用
摘要:前言 OpenCV中保存图片的函数在c++版本中变成了imwrite(),这应该是向matlab中图像处理的的一些函数风格靠近吧。保存图片这个功能还是很重要的,比如说在写科研论文的时候需要把一些中间图片给贴出来,这样就可以在程序中间利用该函数保存图片了。甚至还可以将这些保存的图片供后续的matlab处理。本文就简单介绍下OpenCV中imwrite()函数的用法。不过个人感觉这个函数功能还是不够强大,使用时有很多限制。 开发环境:QtCreato2.5.1+OpenCV2.4.3 实验基础 本次实验主要是测试imwrite()函数的2个功能: 1. 测试其是否能够保存Mat图像中...
阅读全文
posted @
2012-12-26 16:36
tornadomeet
阅读(127150)
推荐(2) 编辑
基础学习笔记之opencv(23):OpenCV坐标体系的初步认识
摘要:前言 相信很多朋友在使用OpenCV的时候会遇到一个小问题,且有时候对这样的小问题没有引起足够的重视,或者通过表面想当然的去编程,所以调试代码时出现一些莫名其妙的问题,最后发现问题时时间已经过去了一大把。最近我在调试一个项目时就遇到过这种情况,即Mat::at(x,y)和Mat::at(Point(x, y))的区别,我在项目中把这2种看成效果一样的,结果这个问题调试时纠结了2天(因为该工程有关OpenCV的代码有上千行,且没有怀疑这两者的区别,因此有时候出现一些莫名其妙的结果,花了很多时间才找问题所在)。其实关于Mat的at访问时这2者的区别我以前也做过笔记,只是此时不小心忘记了。这次...
阅读全文
posted @
2012-12-12 00:25
tornadomeet
阅读(18735)
推荐(7) 编辑
基础学习笔记之opencv(22):learning OpenCV书中一个连通域处理函数
摘要:前言 在图像处理过程中,经常会遇到这样一部分图像,图像的整体部分如果人来看的话一眼就能看出,但是它的内部由于有各种小缺口,导致断开了,这样在计算机“眼”里就被认为是断开的,为了使图像达到适应人眼的感觉,需要将这些缺口和断开的口给连接上去,这就需要用到计算机图形学中的连通域处理技术。本文给出一个简单的连通域处理函数,当然这个函数是来自OpenCV著名教程Learning OpenCV中,只不过它的接口是基于c版本的OpenCV,而到目前为止,基于C++接口的OpenCV已经是主流,所以我将其接口改成了c++版的,但是其内部一些代码基本没有动它。 开发环境:OpenCV2.4.3+Qt...
阅读全文
posted @
2012-12-11 21:08
tornadomeet
阅读(21950)
推荐(2) 编辑
基础学习笔记之opencv(21):一个简单有趣的皮肤检测代码
摘要:前言 最近课题研究上想采用皮肤信息,但是个人总是对皮肤信息应用在目标检测和目标识别上有排斥,认为皮肤信息完全不足以胜任这个工作。其实计算机视觉的最终实现是一个长期的过程,是AI领域一个经典的问题,所以在AI完全突破之前,任何对CV有用的信息都值得去深入研究,除非有一种算法能够在所有情况下都工作。好了,废话不扯了,进入正题,有偏见但是还是得使用它。皮肤模型中有单高斯,混合高斯,贝叶斯模型和椭圆模型等。经过前人学者大量的皮肤统计信息可以知道,如果将皮肤信息映射到YCrCb空间,则在CrCb二维空间中这些皮肤像素点近似成一个椭圆分布。因此如果我们得到了一个CrCb的椭圆,下次来一个坐标(Cr,...
阅读全文
posted @
2012-12-05 08:32
tornadomeet
阅读(17305)
推荐(3) 编辑
基础学习笔记之opencv(20):OpenCV中的颜色空间(ing...)
摘要:YCrCb YCrCb在视频压缩和一些数字图像处理中使用得比较多,是一种基于人眼感知的颜色空间。 在OpenCV中,从RGB空间转换到YCrCb空间的公式如下: 注意从RGB到YcrCb的公式并不是唯一的,这里OpenCV只是采用的是Intel IPP中的公式而已。 其中的delta的取值为: 这里我们以RGB三通道都为8bit来举例说明,即delta取128。通过上面的公式推导,可以求出Y的取值范围为(0, 255),Cr的取值范围为(0.54768, 255.452315),Cb的取值范围为(0.57548, 255.42452)。因此我们有很大的理由近似认为Y,Cr...
阅读全文
posted @
2012-12-04 09:14
tornadomeet
阅读(9799)
推荐(5) 编辑
基础学习笔记之opencv(19):有关图像序列的直方图计算
摘要:前言 直方图是计算机视觉中一个很重要的工具,OpenCV里面提供了不少有关直方图处理的函数。其中最基本的是计算直方图的函数calcHist()。有关直方图在前面的博文中也有所介绍:基础学习笔记之opencv(4):直方图使用学习。不过目前由于本人课题研究上需要计算多张图片的一维直方图特性,且每张图片对应有自己不同的掩膜矩阵,开始以为OpenCV中提供的calcHist()函数能够实现这个功能,因为其中一个重载函数中有一个参数为InputArrayOfArrays,咋一看会觉得这不就是可以处理多张图片的吗?后面仔细研究后发现其实它实现的功能和我的需求是不同的,因此需要自己单独写函数来完成这...
阅读全文
posted @
2012-12-01 22:21
tornadomeet
阅读(9116)
推荐(1) 编辑
opencv源码解析之(7):CvAdaptiveSkinDetectorl类
摘要:前言 在前面的博文皮肤检测类CvAdaptiveSkinDetector的使用中,已经介绍过了这个皮肤检测类的使用方法,因为本人对算法比较好奇,又继续阅读了下该算法的源码,所以这篇文章是对该源码做的一个简单分析。 基础 本算法内容是来自论文An adaptive real-time skin detector based on Hue thresholding: A comparison on two motion tracking methods。一般的皮肤检测都是统计大量不同光照不同环境下的皮肤特性,然后利用皮肤的这些统计信息来分割。当然了本算法的前面也是利用这些统计信息来预处理...
阅读全文
posted @
2012-11-28 22:45
tornadomeet
阅读(5108)
推荐(1) 编辑
基础学习笔记之opencv(18):kmeans函数使用实例
摘要:前言 一提到聚类算法,必然首先会想到的是kmeans聚类,因为它的名气实在太大了。既然这样,OpenCV中这个函数也自然必不可少了。这节内容主要是讲讲OpenCV中kmeans函数的使用方法。 开发环境:OpenCV2.4.3+QtCreator2.5.1 实验基础 在使用kmeans之前,必须先了解kmeans算法的2个缺点:第一是必须人为指定所聚的类的个数k;第二是如果使用欧式距离来衡量相似度的话,可能会得到错误的结果,因为没有考虑到属性的重要性和相关性。为了减少这种错误,在使用kmeans距离时,一定要使样本的每一维数据归一化,不然的话由于样本的属性范围不同会导致错误的结果。...
阅读全文
posted @
2012-11-23 00:21
tornadomeet
阅读(35656)
推荐(4) 编辑
基础学习笔记之opencv(17):皮肤检测类CvAdaptiveSkinDetector的使用
摘要:前言 皮肤检测是利用皮肤的颜色信息的阈值来进行检测的,不过这些阈值一般不是使用rgb空间,而是用HSV或者YCrCb等空间。皮肤检测是使用统计的方法统计出大量人的皮肤信息,然后就可以得到色彩空间某一分量的阈值了,利用该阈值就可以初步对皮肤进行分割。当然了,OpenCV中也自带了皮肤检测算子,包含在类CvAdaptiveSkinDetector中。本节内容就是来试试OpenCV自带的皮肤检测算法的性能。 开发环境:OpenCV2.4.3+QtCreator2.5.1 实验基础 OpenCV自带是算法的参考文献有网友说是An adaptive real-time skin detect...
阅读全文
posted @
2012-11-20 11:37
tornadomeet
阅读(11188)
推荐(1) 编辑
Kinect+OpenNI学习笔记之14(关于Kinect的深度信息)
摘要:前言 由于最近要研究kinect采集到的深度信息的一些统计特征,所以必须先对kinect深度信息做进一步的了解。这些了解包括kinect的深度值精度,深度值的具体代表的距离是指哪个距离以及kinect深度和颜色扫描范围等。经过查找资料可以解决这些问题,并且后面通过实验也验证了这些问题的答案。 ...
阅读全文
posted @
2012-11-16 09:57
tornadomeet
阅读(21995)
推荐(1) 编辑
Kinect+OpenNI学习笔记之13(Kinect驱动类,OpenCV显示类和手部预分割类的设计)
摘要:前言 为了减小以后项目的开发效率,本次实验将OpenNI底层驱动Kinect,OpenCV初步处理OpenNI获得的原始数据,以及手势识别中的分割(因为本系统最后是开发手势识别的)这3个部分的功能单独做成类,以便以后移植和扩展。其实在前面已经有不少文章涉及到了这3部分的设计,比如说:Kinect+OpenNI学习笔记之3(获取kinect的数据并在Qt中显示的类的设计),Kinect+OpenNI学习笔记之11(OpenNI驱动kinect手势相关的类的设计),Kinect+OpenNI学习笔记之12(简单手势所表示的数字的识别)。这次是综合前面几次的设计,优化了下这几个类。 开发环境...
阅读全文
posted @
2012-11-13 15:11
tornadomeet
阅读(5419)
推荐(0) 编辑
基础学习笔记之opencv(16):grabcut使用例程
摘要:前言 grabcut是在graph cut基础上改进的一种图像分割算法,它同样是基于图割理论的,关于图割的简单介绍可以参考本人前面的博文:一些知识点的初步理解_8(Graph Cuts,ing...) 。稍微看了下grabcut方面的论文,论文中一般都是在graph cut上作改进,比如说引入了GMM模型等。同graph cut一样,在使用grabcut是也是需要人机交互的,即人工先给定一定区域的目标或者背景,然后送给grabcut算法来分割。通过实验发现,其分割效果一般般,且分割速度比较慢,一张普通大小的图片差不多需要1s左右的时间, 实验说明 因为在使用该算法的过程中需要人机交互...
阅读全文
posted @
2012-11-09 21:14
tornadomeet
阅读(49603)
推荐(4) 编辑
Kinect+OpenNI学习笔记之12(简单手势所表示的数字的识别)
摘要:前言 这篇文章是本人玩kinect时做的一个小实验,即不采用机器学习等类似AI的方法来做简单的手势数字识别,当然了,该识别的前提是基于本人前面已提取出手部的博文Robert Walter手部提取代码的分析的基础上进行的。由于是纯数学形状上来判别手势,所以只是做了个简单的0~5的数字识别系统,其手势的分割部分效果还不错(因为其核心代码是由OpenNI提供的),手势数字识别时容易受干扰,效果一般般,毕竟这只是个简单的实验。 实验基础 首先来看下本系统的流程图,如下所示: 其中轮廓的提取,多边形拟合曲线的求法,凸包集和凹陷集的求法都是采用opencv中自带的函数。手势数字的识别是利用...
阅读全文
posted @
2012-11-04 00:18
tornadomeet
阅读(16677)
推荐(8) 编辑
Kinect+OpenNI学习笔记之10(不需要骨骼跟踪的人体多个手部分割)
摘要:前言 这篇文章主要是介绍多个手部的分割,是在前面的博文:不需要骨骼跟踪的人体手部分割的基础上稍加改进的。因为识别有的一个应用场合就是手势语言识别,而手势一般都需要人的2只手相配合完成,因此很有必要对人体的多个手部来进行分割。 实验说明 其实本文中使用的还是OpenNI自带的一些算法实现的,因为OpenNI中自己本身就对每个手部有一个UserID的标志,所以我们每当检测到一只手时就可以把手的位置连同他的ID一起存下来,后面进行手势分割时按照检测到的不同手势分别进行分割即可。其程序流程图如下所示: 下面是本次实验特别需要注意的一些细节。 OpenNI知识点总结: 一般情况下Open...
阅读全文
posted @
2012-11-01 00:29
tornadomeet
阅读(6019)
推荐(1) 编辑
Kinect+OpenNI学习笔记之9(不需要骨骼跟踪的人体手部分割)
摘要:前言 手势识别非常重要的一个特点是要体验要好,即需要以用户为核心。而手势的定位一般在手势识别过程的前面,在上一篇博文Kinect+OpenNI学习笔记之8(Robert Walter手部提取代码的分析) 中已经介绍过怎样获取手势区域,且取得了不错的效果,但是那个手势部位的提取有一个大的缺点,即需要人站立起来,当站立起来后才能够分隔出手。而手势在人之间的交流时,并不一定要处于站立状态,所以这不是一个好的HCI。因此本文介绍的手势部位的提取并不需要人处于站立状态,同样取得了不错的效果。 实验说明 其实,本实验实现的过程非常简单。首先通过手部的跟踪来获取手所在的坐标,手部跟踪可以参考本...
阅读全文
posted @
2012-10-19 12:54
tornadomeet
阅读(7139)
推荐(3) 编辑
Kinect+OpenNI学习笔记之8(Robert Walter手部提取代码的分析)
摘要:前言 一般情况下,手势识别的第一步就是先手势定位,即手势所在部位的提取。本文是基于kinect来提取手势识别的,即先通过kinect找出人体的轮廓,然后定位轮廓中与手部有关的点,在该点的周围提取出满足一定要求的区域,对该区域进行滤波后得到的区域就是手部了。然后利用凸包和凹陷的数学几何方法,画出手指和手指凹陷处的点,以及手的轮廓线,并在图像中显示出来。文章所有代码都是网友Robert Walter提供的,它的代码下载网站为:http://dl.dropbox.com/u/5505209/FingertipTuio3d.zip 本人因为要做这方面的研究,所有本文只是读了他的代码,并稍加分析...
阅读全文
posted @
2012-10-18 09:34
tornadomeet
阅读(12206)
推荐(1) 编辑
Kinect+OpenNI学习笔记之5(使用OpenNI自带的类进行简单手势识别)
摘要:前言 因为OpenNI可以获取到kinect的深度信息,而深度信息在手势识别中有很大用处,因此本文就来使用OpenNI自带的类来做简单的手势识别。识别的动作为4种,挥手,手移动,举手,往前推手。通过后面的实验可以发现,其实提供的类的效果非常不好。 开发环境:QtCreator2.5.1+OpenNI1.5.4.0+Qt4.8.2+OpenCV2.4.2 实验说明 跟手势相关的是GestureGenerator这个类,它的初始化过程和depth_metadata,image_metadata都一样,因此首先在上2篇文章的COpenNI类中增加一个public类对象GestureG...
阅读全文
posted @
2012-10-02 08:39
tornadomeet
阅读(7663)
推荐(1) 编辑
Kinect+OpenNI学习笔记之4(OpenNI获取的图像结合OpenCV显示)
摘要:前言 本文来结合下opencv的highgui功能显示kinect采集得来的颜色图和深度图。本来在opencv中自带了VideoCapture类的,使用该类可以直接驱动kinect设备,具体的可以参考下面的文章:http://blog.csdn.net/moc062066/article/details/6949910,也可以参考opencv提供的官方文档:http://docs.opencv.org/doc/user_guide/ug_highgui.html。这种方法用起来非常简单,不需要考虑OpenNI的驱动过程,有点像傻瓜式的操作。不过本人在使用该种方法时kinect一直驱动不成...
阅读全文
posted @
2012-10-01 18:11
tornadomeet
阅读(11603)
推荐(1) 编辑
PCA算法学习_1(OpenCV中PCA实现人脸降维)
摘要:前言: PCA是大家经常用来减少数据集的维数,同时保留数据集中对方差贡献最大的特征来达到简化数据集的目的。本文通过使用PCA来提取人脸中的特征脸这个例子,来熟悉下在oepncv中怎样使用PCA这个类。 开发环境:ubuntu12.04+Qt4.8.2+QtCreator2.5.1+opencv2.4.2 PCA数学理论: 关于PCA的理论,资料很多,公式也一大把,本人功底有限,理论方面这里就不列出了。下面主要从应用的角度大概来讲讲具体怎么实现数据集的降维。把原始数据中每个样本用一个向量表示,然后把所有样本组合起来构成一个矩阵。当然了,为了避免样本的单位的影响,样本集需要标准化。求该...
阅读全文
posted @
2012-09-06 11:13
tornadomeet
阅读(58567)
推荐(3) 编辑
目标跟踪学习笔记_5(opencv中kalman点跟踪例子)
摘要:一些网络资料 关于Kalman滤波器的理论,其数学公式太多,大家可以去查看一些这方面的文献.下面这篇文章对Kalman滤波做了个通俗易懂的介绍,通过文章举的例子可以宏观上理解一下该滤波器,很不错,推荐一看: http://www.cnblogs.com/feisky/archive/2009/11/09/1599247.html, 他的另一篇博客http://www.cnblogs.com/feisky/archive/2009/12/04/1617287.html中介绍了opencv1.0版本的卡尔曼滤波的结构和函数定义等。 另外博文:http://blog.csdn.net/o...
阅读全文
posted @
2012-08-19 15:00
tornadomeet
阅读(44907)
推荐(3) 编辑