Opencv..2

来源:互联网 发布:网络安全 书 知乎 编辑:程序博客网 时间:2024/05/22 10:54
 boss要求:看懂API,把术语给我搞清楚。
http://opencv.willowgarage.com/documentation/cpp/index.html


1。不能看图形学基础东东,要看项目有关的函数和方法,否则时间和精力都不允许。
2。看英文Api,
http://download.csdn.net/tag/opencv%EF%BC%8C%E5%9B%BE%E5%83%8F%E5%8C%B9%E9%85%8D
3。问boss:这个usb摄像头硬件会不会升级到有颜色,而不仅仅只是一个轮廓线条。还是我们就在这个基础上来作开发
因为我查资料也是可以通过颜色等一些东西来进行比较,所以我想问问,如果我们不涉及到颜色,我就不用再看。




解决方案:page 247
从上,下,左,右,停,OK 等 手势中得到边缘梯度,然后设置一个摄像机,该摄像机观察人的各种手势以控制网络
视频。在每祯中,从输入的视频中检测检测"-感兴趣的色彩区域",然后计算这些感兴趣区域周围的"-边缘梯度方向",
将得到的边缘梯度方向放到一个方向直方图相应的bin中,然后将该直方图与手势模板进行匹配,从而识别出各种手势。




直方图:
1。数据结构 CvHistogram; 
2.创建一个新的直方图: CvHistogram* cvCreateHist();
3.在使用直方图之前给rangs设置数值,cvSetHistBinRanges();
4.清0直方图,和,释放直方图: cvClearHist() , cvReleaseHist();
5.根据已给出的数据创建直方图。cvMakeHistHeaderForArray();
6.访问直方图:cvQueryHistValue_1D or 2D or 3D or nD 每个函数都返回相应bin中的值的浮点数。可以得到直方图的维数或每个单独的bin表示的区域等。
7.直方图的基本操作:
  cvNormalizeHist();貌似是归一化函数  . 归一化是什么?:就是把数据做成图形 或者 把数据百分比化
  cvThreshHist();闷或值函数
  cvCopyHist()表示将一个直方图的信息复制到另一个直方图
  cvGetMinMaxHistValue()他输出直方图中找到的最小值和最大值。
  cvCalcHist(),从图像这哦姑娘自动计算直方图。 page 256.
对于多通道图像,在调用cvCalcHist()之前,先要用函数cvSplit()将图像分为但通道的。
8.对比2个直方图。相似度。cvCompareHist() 用来比较两个直方图的相似度。page 257
    完全匹配的值为0,完全不匹配为无限值,对于chi-square,低分比高分匹配的匹配程度高。
9。直方图相交 page 257
10。距离测量:利用直方图的距离测量来代替直方图的匹配策略,那么我们仍然可以像直方图对比一样对比两个直方
图的距离,即使第二个直方图发生飘逸,也能找到最小的距离度量。
---------------
轮廓:
Canny之类的边缘检测算法并没有将轮廓作为一个整体,下一步是要把这些边缘像素组装成轮廓。
cvFindContours()轮廓检测。
1。查找轮廓:
一个轮廓一般对应一系列的点,也就是图像中的一条曲线,表示方法可能根据不同情况而有所不同,有多种方法可以
表示曲线。在Opencv中一般用序列来存储轮廓信息。(同vector差不多啦),序列中每一个元素是曲线中一个点的
位置。只要简单把轮廓想象为CvSeq就可以了,CvSeq表示一系列的点就可以了。
cvFindContours()从二值图像中寻找轮廓,他们可以是从cvCanny()函数得到的有边缘像素的图像,也可以是
cvThreshold() or cvAdaptiveThreshold()得到的图像。这时的边缘是正和负区域之间的边界。


2。cvFindContours()会把图像会被直接涂改,因此如果是将来还有用的图像,应该留有备份
 1)参数1,图像 参数2,内存存储器 cvFindContours()找到的轮廓记录在此内存里,找到的轮廓就存储在此内存里面
参数3,随便传一个指向CvSeq*的指针,系统会自动设置他, 他指向轮廓树的首地址。
 2)返回值:找到的所有轮廓的个数。
 3)几种不同的检测模式 page 295, 比如:只检测出最外面的轮廓,内外都检测出来等。


3。几种处理轮廓/序列轮廓的函数
 cvFindContours();
 cvStartFindContours();与上面这个函数一样,但是他不同在于,每次返回一个轮廓。返回的结构是CvSequenceScanner
,你可以通过在CvSequenceScanner上依次调用cvFindNextContour()来查找剩余的轮廓。当全部轮廓找完后,就
返回NULL.
 cvFindNextContour();
 cvSubstituteContour();用于替换scanner指向的轮廓 page 296
 cvEndFindContour();结束轮廓查找,并将scanner设置为结束状态。
 cvApproxChains();该函数将Freeman链转换为多边形表示
 
Freeman 链码:
    对于识别一些形状的物体很有帮助
 1。cvFindContours的method参数为CV_CHAIN_CODE时,检测的轮廓通过Freeman链码方式返回。

 2。如果得到的是Freeman链码,可以通过以下2个函数读出每个点:。。。297左右吧。

--------------------------------------------------------------------------------------
    1)cvStartReadChainPoints();第一个函数用来初始化Freeman链CvChainPtReader结构,
    2)cvReadChainPoinit();第二个函数通过CvChainPtReader来读每个点,CvChainPtReader对应当前 状态。


多边形逼近: cvApproPoly . 
特性概括: 长度, 边界框,圆形和椭圆形边界框,几何,


轮廓的匹配   :
矩:是一个粗略的特征。归一化都是小于1的。所以指数 越大所得到的数值就越小。




打开视频文件,摄像头  :
 CvCapture* cvCaptureFromFile(const  char * filename) / cvCaptureFromCAM(int index)
CvCapture结构需要用cvReleaseCapture函数释放。
从视频或者摄像头中读取每一侦,
  int cvGrabFrame(CvCapture* capture 抓取一阵,并存储于内部);
  IplImage* cvRetrieveFrame(CvCapture* capture); 把Grab的侦取出(返回的图像不可以被用户释放)
  IplImage* cvQueryFrame(CvCapture* capture);  ==>     cvGrabFrame + cvRetrieveFrame
设计cvGrabFrame是为了快速遍历视频中的侦,或者同步多个摄像头。
  将图像序列写入视频文件。   









原创粉丝点击