http://blog.csdn.net/thefutureisour
我的OpenCV学习笔记(25):c++版本的高斯混合模型的源代码完全注释
之前看到过C版本的,感觉写的很长,没有仔细看,但是C++版本的写的还是很不错的。我仔细看了一下,并对内容进行了仔细的注释,如果有人没有看懂,欢迎留言讨论。 先看一眼头文件,在background_segm.hpp中 class CV_EXPORTS_W BackgroundSubtractorMOG : public BackgroundSubtractor { public: /...
2013-01-08 14:46 阅读(1583) 评论(5)
我的OpenCV学习笔记(24):详细讨论OpenCV中的数据结构
最近在写自己的算法,其实就是对一些传统算法的改进。传统算法可以参考opecv的源代码。在阅读源代码的过程中,我慢慢领会到了opencv的强大之处,并不是因为它实现了各种算法,而是在于它对于基本数据结构的设计,是得其他人可以很方便的使用这些数据结构来实现自己的算法。在帮助手册中,已经对于这些数据结构有比较详细的描述了。今天我就为英语不好的孩子们服务一下,简单的介绍一下它们。 首先介绍2维点...
2012-12-31 15:18 阅读(638) 评论(1)
我的OpenCV学习笔记(23):Mat中实际数据是如何保存的
看上去这是一个比较简单的问题,在2.0以上的版本中,使用Mat类来储存一幅图像。但是具体的说,Mat类中,又是如何储存的呢? 在opencv自带的帮助手册上有这么一段话: 通过这两个式子,我们可以略知一二:首先,Mat不仅可以存图像,也可以用来存放其他高维的数据。数据存在data指针所指向的地址中的,对于高维数据(dim维),每个数据的地址是用上面式子算的;它的一个特例是2维数...
2012-12-21 12:57 阅读(657) 评论(0)
我的OpenCV学习笔记(22):如何区别一幅图像是否是黑白图像
其实按理说这并不是一件困难的工作,但是由于种种原因,在OpenCV中读取的黑白图像并不是我们想像的只有一个通道,而是3通道的。但是当我们使用Mat image = imread("D:/picture/images/baboon2.jpg",0);之后,不论是彩色图像还是黑白图像都会转换为单通道。明白了这个之后,我们的程序就简单了: #include #include #include u...
2012-05-29 16:58 阅读(860) 评论(9)
我的OpenCV学习笔记(21):C语言描述的OpenCV程序
我之前的OpenCV的学习,都是C++的,主要的参数资料是用户手册和一本书《OpenCV 2 Computer Vision Application Programming Cookbook》(网上可以下载到,但是没有中文版),这本书的前七章的主要内容我基本都放到了博客上。(后面的内容有时间在与大家继续分享。)这本书最大的特点是通俗易懂—因为它是一本“Cookbook”。对很多理论性的内容,都是浅...
2012-05-29 11:31 阅读(499) 评论(0)
我的OpenCV学习笔记(20):提取元素的轮廓及形状描述子
先看提取轮廓的代码: Mat image = imread("D:/picture/images/binaryGroup.bmp",0); if(!image.data) return -1; imshow("源图像",image); //获取轮廓 std::vector> contours; //获取轮廓: findContours(image, //图...
2012-05-25 17:28 阅读(2808) 评论(9)
我的OpenCV学习笔记(19):检测轮廓,直线,圆以及直线拟合
检测轮廓时我们使用canny边沿检测算法,这个算法其实也是基于梯度的。但是,与传统的梯度算法求边沿不同的是: 1.它可以精确的定位边沿的位置。通过沿幅角方向检测模值的极大值点,即边缘点,遍历8个方向图像像素,把每个像素偏导值与相邻像素的模值比较,取其MAX值为边缘点,置像素灰度值为0。这样做的结果使得边沿非常细。 2.双阈值检测。通常一个较小的阈值会保留很多边沿,他们中的一部分是没有用的;而一...
2012-05-25 09:01 阅读(5095) 评论(2)
我的OpenCV学习笔记(18):使用Sobel变化和拉普拉斯变换检测图像边沿
Sobel变换和拉普拉斯变换都是高通滤波器。什么是高通滤波器呢?就是保留图像的高频分量(变化剧烈的部分),抑制图像的低频分量(变化缓慢的部分)。而图像变化剧烈的部分,往往反应的就是图像的边沿信息了。 在OpenCV中,调用sobel函数很简单: Mat image = imread("D:/picture/images/boldt.jpg",0); if(!image.data) re...
2012-05-17 09:56 阅读(1300) 评论(0)
我的OpenCV学习笔记(17):利用形态学学滤波检测边沿和角点
首先如何理解对灰度图像进行形态学操作? 一种比较形象的方法是将灰度图像看做是“等高线”:亮的区域代表山峰,而暗的区域代表山谷,图像的边沿就对应于峭壁。如果腐蚀一幅图像,会导致山谷被扩展,而峭壁减少了。相反的,如果膨胀一幅图像,峭壁则会增加。但是这两种情况下,中间的部分(大片的谷底和高原)基本保持不变。 在上述理解的基础上,如果我们对图像的腐蚀和膨胀的结果做差,就能提取图像的边界:因为边界区域,...
2012-05-17 09:06 阅读(705) 评论(0)
我的OpenCV学习笔记(16):利用工具条调用基本的形态学操作
这次主要介绍两方面的内容,一部分是形态学操作,另一部分是工具条。 先说形态学操作。这里只介绍4种简单的:腐蚀、膨胀、开、闭。最基本的形态学操作是腐蚀和膨胀。其他的操作可以通过腐蚀和膨胀推导出来。 用集合论的观点介绍他们非常麻烦。这里换一种思路:我们先做一定的假设:对于一幅图像:前景(我们感兴趣的部分)是白色的;背景(不感兴趣的部分)是黑色的。然后就可以望文生义一下了:腐蚀操作会使得前景变小,而...
2012-05-14 22:26 阅读(1680) 评论(2)
我的OpenCV学习笔记(15):利用反向投影直方图查找特定的内容
什么是反向投影直方图呢?简单的说在灰度图像的每个点(x,y),用它对应的直方图的bin的值(就是有多少像素落在bin内)来代替它。所以·如果这个bin的值比较大,那么反向投影显示的结果会比较亮,否则就比较暗。 从统计学的角度,反输出图像象素点的值是观测数组在某个分布(直方图)下的的概率。 所以加入我们已经得到了一个物体的直方图,我们可以计算它在另一幅图像中的反向投影,来判断这幅图像中是否有该物...
2012-05-10 18:30 阅读(1113) 评论(4)
我的OpenCV学习笔记(14):用直方图对比完成基于内容的图像检索
我们知道,直方图可以在一定程度上反应图像的一些统计信息。所以,可以考虑用直方图对比的方法,进行基于内容的图像检索。 通常我们搜索图片,都是根据图片的标签搜索的。基于内容的搜索,就是假设我们不知道标签,而是直接输入一幅图像,然后从得出一些跟这幅图像的直方图比较相似的图像。 那么我们不禁要问,如何度量两幅直方图的相似程度呢? OpenCV的compareHist函数提供了一个参数供你选择。最简单...
2012-05-10 16:18 阅读(1164) 评论(0)
我的OpenCV学习笔记(13):计算直方图,利用查找表拉伸直方图,直方图均衡
一些头文件: #include #include #include #include using namespace std; using namespace cv; 首先建立一个类: class Histogram1D { private: //直方图的点数 int histSize[1]; //直方图的范围 float hranges[2]; //指向该...
2012-05-03 20:53 阅读(880) 评论(1)
我的OpenCV学习笔记(12):VideoCapture类
这次通过一个读取视频的综合例子来介绍VideoCapture类的一些基本操作: #include #include #include #include using namespace std; using namespace cv; int main() { //打开视频文件:其实就是建立一个VideoCapture结构 VideoCapture capture("D:/vide...
2012-05-03 09:51 阅读(4973) 评论(16)
我的OpenCV学习笔记(11):启动摄像头
在网上看了许多关于OpenCV启动摄像头的资料,但是,都是基于C语言的,代码又臭又长,(其实主要是因为我学的OpenCV就是用C++的,C语言的基本数据结构不太熟悉),所以一直想找一个用C++写的程序,最后让我在OpenCV自带的英文参考手册上找见了,整个代码30行都不到!nice啊!我对代码做了一点修改,发上来吧! #include #include #include using na...
2012-05-03 09:16 阅读(1559) 评论(4)
我的OpenCV学习笔记(10):空域滤波之锐化滤波器
锐化的作用是加强图像的边沿和轮廓,通常也成为高通滤波器: 模板一般设计为中心处的值为正,外围的值为负(总系数之和为0): int main() { //源图像 Mat scr = imread("D:/picture/img.tif"); Mat rst; imshow("原图像",scr); Mat kernel(3,3,CV_32F,Scalar(-1)); // 分配像素...
2012-05-01 13:03 阅读(1715) 评论(3)
我的OpenCV学习笔记(九):空域滤波之中值滤波
中值滤波就是将当前像素值替换为模板覆盖范围内的所有像素值中大小居中那一个:对于一个3*3的模板,第5大的就是中值: (10,15,20,20,20,20,20,25,100) 中值滤波使得那些更亮(或者更暗)的点更像他周围的值。所以它在滤除噪音的同时,可以较好地保留细节轮廓。 为了验证上述结论,我先给一幅图像加入椒盐噪声,然后用分别用中值滤波、均值滤波处理图像,进行对比: #include...
2012-04-30 16:06 阅读(1127) 评论(6)
我的OpenCV学习笔记(八):空域滤波之均值滤波
空域滤波按照对像素的操作方法,可以分为两类:线性滤波(低通、高通、带通)和非线性滤波(最大值、最小值、中值) 按照图像处理的效果,可以分为平滑滤波和锐化滤波。 “线性滤波”这个概念其实是从信号与系统里面借用过来的。输入信号通过一个线性系统时,输出的结果是输入信号与系统时域冲击响应的卷积。而在图像处理中,则使用模板对像素(及其周围像素)进行线型加权运算,权值取决于模板的像素值。运算方法与卷积类似...
2012-04-30 15:45 阅读(1060) 评论(0)
我的OpenCV学习笔记(七):绘图操作
OpenCV提供了一些基本的绘图操作,比如画圆,画椭圆,画线,画矩形,在图像里插入文字等功能。 画圆使用的是circle函数,必须提供的参数是:画在出的圆显示在哪里,圆心,半径,以及画线的颜色。 //圆心 Point center = Point(255,255); //半径 int r = 100; //承载图像 Mat picture(500,500,CV_8UC3,Scala...
2012-04-30 14:08 阅读(2154) 评论(0)
我的OpenCV学习笔记(六):使用支持向量机(SVM)
SVM是2000年左右提出的一种新的分类方法,着重解决了小样本分类问题。具体原理可以参看模式识别的书籍。OpenCV中的SVM的实现也是基于大名鼎鼎的SVM 库:http://www.csie.ntu.edu.tw/~cjlin。OpenCV教程中有两个例子,一个是线性可分的,一个是线性不可分的,我对他们做了详尽的注释: 先看线性可分时: #include #include #includ...
2012-04-23 22:19 阅读(1152) 评论(0)
我的OpenCV学习笔记(五):给图像加上边框
这段程序来自OpenCV教程,使用copyMakeBorder函数来给图像加上边框: #include #include #include #include using namespace std; using namespace cv; int main() { Mat image,result; //获得边界的类型 int borderT...
2012-04-22 23:33 阅读(836) 评论(0)
我的OpenCV学习笔记(四):给图像加上水印效果
当两幅图像尺寸相同时,给图像加上水印效果其实很简单,就是简单的将一幅图像加到另一幅图像上(两幅图像乘以一定的系数就可以控制相加的效果): #include #include using namespace cv; int main() { Mat image1 = imread("D:/picture/images/boldt.jpg"); Mat image2 = imre...
2012-04-22 22:59 阅读(759) 评论(0)
我的OpenCV学习笔记(三):利用操作像素完成简单的图像处理:加入椒盐噪声、图像翻转、改变对比度、图像锐化
在第二讲中,我介绍了如何操作每个像素,这次利用操作像素完成简单的图像处理操作。 首先从给图像加入椒盐噪声开始,椒盐噪声其实就是使图像的一些随机的像素为黑色(255)或者白色(0): #include #include using namespace cv; void salt(Mat& image, int n) { for(int k=0; k
2012-04-22 11:18 阅读(2579) 评论(5)
我的OpenCV学习笔记(二):操作每个像素
首先推荐一本书:《OpenCV 2 Computer Vision Application Programming Cookbook》网上可以下载到这本书的英文版,貌似没有翻译的。这本书的特点是里面的程序不是那种为了演示函数功能而写的面向过程的小程序,而是用面向对象的思路写的大程序,不过他是一步一步教你写出来的,也不要有太大压力。 任何图像处理算法,都是从操作每个像素开始的。即使你不会使用Ope...
2012-04-21 23:30 阅读(857) 评论(1)
我的OpenCV学习笔记(一):OpneCV中的数据共享机制
OpenCV是一个很不错的开源计算机视觉库。我自己已经玩了一段时间了,决定把一些学习成果整理出来,分享给大家。学习OpenCV最好的助手当然是opencv自带的手册和教程了。手册是英文版的,方便查找函数。教程有部分是中文版的,也有一部分没有汉化。可以通过网址:http://www.opencv.org.cn/opencvdoc/2.3.2/html/index.html查看。 这次主要是想说一个...
2012-04-18 09:48 阅读(788) 评论(0)