因为自己想做一个关于图像识别的项目,需要学习计算机视觉这一块的知识,经过一番搜索,终于让我找到了OpenCV。但是对于我这么一个菜鸟级的新手来说无疑是没用的,因为很多东西需要图像处理以及模式识别这块的基础知识。于是自己一番借书,拿回家看了一个寒假,算是有了那么一些了解。终于知道了模式识别中的决策方法、特征、特征向量、分类器、贝叶斯决策理论、聚类方法、GA……这些东西感觉太深奥了,没有一定的基础看起来非常吃力。但是,看了那么长时间,我好歹有了一些感性的认识。同时,也让我认识到之前学的知识是多么的重要

,因为很多东西都要用到从前的知识,像矩阵、行列式、概率论里德贝叶斯公式等等。

开学之后,我又借书,继续看,看到现在,感觉有些进步,至少我能用OpenCV写一些小程序了。然后又买了本《学习OpenCV》,看了几天,收获也不少。随着接触OpenCV的时间变长,越来越感觉这个库棒极了,至少我现在在不了解它是怎么实现的情况下用一些函数实现自己想要的效果。

期间我也向学校的实验室的老师请教过,他给了我很多的指导,我的一些疑惑也很快解决。我本来用手上标以颜色来区分我的手,然后直接在程序中以B < 10 && G < 10 && R > 200来简单的区分,我当然知道这很弱,但是老师没有嘲笑我,反而给了我鼓励,让我简单知道了背景建模这些运动物体追踪的方法,然我让我先想办法去实现。

本来我的想法是以皮肤的颜色先找出手所在的地方,然后通过标记的颜色找出位置,但是试了很多次,效果不理想,一旦场景复杂了我就没法识别了。我现在的想法就是直接在视频中找出运动的部分,然后再在这运动的地方找到我标记颜色的部位就行了,然后就是识别动作。我觉得,只有一步一步来,不要急,毕竟自己的基础知识有限,努力学习,慢慢去实现自己的目标!

这些天一直在看图像处理以及模式识别方面的基础知识,学了滤波器也就是图像噪声的消除,了解了cvSmooth函数的原理,不过一旦涉及到数学方面的知识什么高斯滤波之类的我就犯迷糊了,自己的基础知识不扎实啊!

简单总结下:

1.线性滤波器:空域滤波器和空域平滑滤波器,比较适合高斯噪声的消除;

2.非线性滤波器:中值滤波器,比较适合椒盐噪声的消除;

3.混合滤波器:效率高一点,如线性和中值混合的滤波器;

4.组合滤波器:利用噪声检测器判断是椒盐噪声还是高斯噪声,然后选择滤波器消除噪声;

对了,顺便提一下IplImage这个结构:

1.这个结构中,常用的:width height nChannels depth,不多说

2.重要的origin:/* 0 - 顶—左结构,1 - 底—左结构 (Windows bitmaps 风格) */dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.cvCreateImage只能创建交叉存取图像 */虽然用的不多,但是有时候的bug就在这里;

3.自己要写实现某个算法要用的:imageData以及imageStep用法如下,以3通道的图像为例:(别用cvGet2D/cvSet2D,慢死的!!!)

for(int y = 0;y < src->height;y++)
    for(int x = 0;x < src->width;x++)
        {
          data = (uchar*)(src->imageData + src->widthStep * y);
          B = double(data[x*3]);
          G = double(data[x*3 + 1]);
          R = double(data[x*3 + 2]);
          /*Do your algorithm*/
        }

我知道图像模式识别对我来说是比较难的,既然选择了这个项目,我就绝不轻言放弃。

自己要学的东西还有很多,慢慢来吧~