您当前的位置: 首页 >  opencv
  • 2浏览

    0关注

    483博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

OpenCV的函数简要说明(不断收集扩充中)

高精度计算机视觉 发布时间:2018-08-23 20:14:12 ,浏览量:2

机器学习函数

关于机器学习的函数,很多在OpenCV的中文官网上有解释,这里不再重复贴出,链接如下,

http://wiki.opencv.org.cn/index.php/机器学习中文参考手册

 

CvSeq内存管理函数简要说明

(1)CreatSeq

功能:

函数cvCreatSeq创建一序列并返回指向该序列的指针.

格式

CvSeq* cvCreatSeq(int seq_flags,int header_size, int elem_size,CvMemStorage* storage);

参数:

seq_flags 序列的符号标志.如果序列不被传递给任何需使用特定序列的函数,则将他设为0,否则从预定义的序列类型中选择一合适类型.

header_size 序列头部的大小,必须大于或等于sizeof(CvSeq).如果指定了序列类型或序列扩展名,则次类型必须适合基类的头部大小.

elem_size 元素的大小,以字节为单位.此大小必须与序列类型一致.例如,对于一个店序列,应当指定元素类型为CV_SEQ_ELTYPE_POINT,参数elem_size必须等于sizeof(CvPoint)

storage 序列的位置.

说明

函数在存储块中分配序列的头部作为一个连续块,并将结构CvSeq的flags,elem_size,header_size和storage各域的值设置为从此函数传递过来的值,设置delta_elems为默认(可通过函数cvSetSeqBlockSize对其重新赋值),清空其他的头部域,包括前sizeof(CvSeq)字节空间.

 

(2)SetSeqBlockSize

功能:

函数cvSetSeqBlockSize设置序列块的大小

格式

void cvSetSeqBlockSize(CvSeq* seq,int delta_emems);

参数

seq 序列

delta_elems 满足元素所需块的大小

说明

函数cvSetSeqBlockSize将对内存分配的粒度产生影响,当序列缓冲区中的空间消耗完时,函数为delta_elems个序列元素分配空间.如果新分配的空间与之前分配的空间相邻,则两块合并;否则,创建一个新的序列块.因此,参数值delta_elems越大,序列中出现碎片的可能性就越小;不过内存中更多的空间被浪费.当序列被创建后,参数delta_elems的大小被设置为默认大小(1K).之后,可随时调用此函数,并影响内存的分配.次函数可修改传递过来的参数值,以满足内存块的大小限制.

(3)SeqPush

功能

函数cvSeqPush添加元素到序列的尾部

格式

char* cvSeqPush(CvSeq* seq,void* element = NULL);

参数

seq 块

element 添加的元素

说明:

函数cvSeqPush在序列块的尾部添加一元素并返回指向该元素的指针.如果输入参数为NULL,则函数仅分配一空间,留给下一个元素使用.下列代码说明了如何使用该函数去分配一个空间.

 

    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* seq = cvCreateSeq(CV_32SC1,sizeof(CvSeq),sizeof(int),storage);
    int i;
    for (int i=0;ih_next)
    {
        int i;
        int count = cont->total;
        CvPoint center;
        CvSize size;
        PointArray = (CvPoint*) malloc(count* sizeof(CvPoint));
        PointArray2D32f = (CvPoint2D32f*)malloc(count* sizeof(CvPoint2D32f));
        //获取点内容
        cvCvtSeqToArray(cont,PointArray,CV_WHOLE_SEQ);
        //把点放置到集合中
        for (i=0;iy - b->y;
    int x_diff = a->x - b->x;
    return  y_diff ? y_diff : x_diff;
}
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* seq = cvCreateSeq(CV_32SC2,sizeof(CvSeq),sizeof(CvPoint),storage);
    int i;
    for (int i=0;itotal;i++)
    {
        CvPoint* pt = (CvPoint*) cvGetSeqElem(seq,i);
        printf("(%d,%d)",pt->x,pt->y);
    }
    cvReleaseMemStorage(&storage);

(22)SeqSearch

功能

函数cvSeqSearch查询序列中的元素

在使用比较函数之前应先进行如下声明

/要实现的比较运算是: a < b ? -1 :a > b ?1 : 0/

typedef int (Cv_CDECL * CvCmpFunc)(Const void* a,const void * b, void * userdata);

格式

char* cvSeqSearch(CvSeq* seq,const void* elem, CvCmpFunc func , int is_sorted , int * elem_idx, void * userdata = NULL);

参数

seq 序列

elem 待查询的元素

func 比较函数,按照元素间的大小关系放回负数,零或正数(见函数cvSeqSort中的解释)

is_sorted 标志序列是否已经排序

elem_idx 输出参数,已查找到的元素索引值

Userdata 传递到比较函数的用户参数,在某些情况下,有助于避免使用全局变量.

说明

函数cvSeqSearch查找序列中的元素.如果序列已被排序,则使用二分查找(事件复杂度为O[log(N)]);否则使用简单线性查找.若查找元素不存在,则函数返回NULL指针,而将索引值设置为序列中的元素数(当使用线性查找时)或者是能够满足表达式seq(i) > elem的最小i值

(23)StartAppendToSeq

功能

函数cvStartAppendToSeq将数据写如序列中,并初始化该过程

格式

void cvStartAppendToSeq(CvSeq* seq,CvSeqWriter* writer);

参数

seq 指向序列的指针

writer 写入部分的状态,由此函数初始化

说明

函数cvStartAppendToSeq对数据写入序列的过程初始化.通过宏CV_WRITE_SEQ_ELEM(wtitten_elem,writer)可以将要写入的元素添加到序列的尾部.

注意 在写入期间,对序列的其他操作可能会产生错误的结果,甚至破坏该序列(具体说明参见函数cvFlishSeqWriter的相关描述,有助于避免这些错误).

(24)StartWriterSeq

功能

函数cvStartWriteSeq创建新序列,并初始化写入状态

格式

void cvStartWriteSeq(int seq_flags, int header_size, int elem_size,CvMemStorage* storage, CvSeqWriter* writer);

参数

seq_flags 标志被创建的序列.如果序列还未传递给任何可处理特定序列类型的函数,则序列值等于0;否则,必须从之前定义的序列类型中选择一个合适的类型.

header_size 头部的大小.此参数值不小于sizeof(CvSeq).如果定义了某一类型或其扩展,则次参数必须与所定义类型的头大小相同

elem_size 元素的大小(以字节计),必须与序列类型一致.例如,如果创建了包含指针的序列(元素类型为CV_SEQ_ELTYPE_POINT),那么elem_size必须等于sizeof(CvPoint).

storage 序列(在内存的位置)

writer 写入部分的状态,由此函数初始化

说明

函数cvStartWriteSeq是函数cvCreateSeq与函数cvStartAppendToSeq的组合.指向被创建的序列指针存放在writer->seq中,该指针通过函数cvEndWriterSeq放回(应当在最后调用).

(25)EndWriteSeq

功能

函数cvEndWriteSeq

格式

CvSeq* cvEndWriteSeq(CvSeqWriter* writer);

参数

writer 写入部分的状态

说明

函数cvEndWriteSeq完成写入操作并返回指向被写入元素的序列的地址,同事,函数将截取最后那个不完整的序列块.块的剩余部分返回到内存之后,序列即可以被安全地读和写.

(26)FlushSeqWriter

功能

函数cvFlushSeqWriter根据写入状态刷新序列头部

格式

void cvFlushSeqWriter(CvSeqWriter* writer);

参数

writer 写入部分的状态

说明

函数cvFlishSeqWriter用来在写入过程中使用户在需要时读取序列中的元素,例如核查指定的条件.函数更新序列的头部,从而使读取序列中的数据成为可能.不过,写如操作并没有被关闭,因此随时都可以将数据写入序列.在某些需要经常刷新的算法中,应考虑使用cvSeqOush来代替此函数.

(27)StartReadSeq

功能

函数cvStartReadSeq初始化序列中的读取过程

格式

void cvStartReadSeq(const CvSeq* seq ,CvSeqRead* redaer,int reverse=0);

参数

seq 序列

reader 读取部分的状态,有此函数初始化

reverse 决定遍历序列的方向.如果为0,则读取顺序为从序列头部的元素开始;否则,从序列尾部开始.

说明

函数cvStartReadSeq初始化读取部分的状态.顺序读取可通过调用宏CV_READ_SEQ_ELEM(read_elem,reader)实现.逆序读取可通过调用宏CV_REV_READ_SEQ_ELEM(read_elem,reader)实现.这两个宏都将序列元素读入read_elem中,并将指针移到下一个元素.下列代码显示如果使用reader和writer

 

    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq* seq = cvCreateSeq(CV_32SC1,sizeof(CvSeq),sizeof(int),storage);
    CvSeqWriter writer;
    CvSeqReader reader;
    int i;
    cvStartAppendToSeq(seq,&writer);
    for (i=0;ielem_size,reader);
#endif
    }
    cvReleaseMemStorage(&storage);

(28)GetSeqReaderPos

功能

函数cvGetSeqReaderPos返回当前读取器的位置

格式

int cvGetSeqReaderPos(CvSeqReader* reader);

参数

reader 读取器的状态

说明

函数cvGetSeqReaderPos放回当前reader的位置在(0到reader->seq->total-1之间)

(29)SetSeqReaderPos

功能

函数cvSetSeqReaderPos移动读取器到指定的位置

格式

void cvSetSeqReaderPos(CvSeqReader* reader,int index, int is_relative = 0);

参数

reader 读取器的状态

index 索引的位置.如果使用绝对位置,则实际位置为index % reader->seq->total.

is_relative 如果不为0,则索引(index)值为相对位置

说明

函数cvSetSeqReaderPos将读取器的位置移动到绝对位置,或相对于当前位置的相对位置上.

1.detectMultiScale函数介绍
打开opencv源码,具体位置在opencv-3.2.0/modules/objdetect/src/cascadedetect.hpp 。 查看源代码可发现detectMultiscale函数有三种:
     void detectMultiScale( InputArray image,
                      CV_OUT std::vector& objects,
                      double scaleFactor = 1.1,
                      int minNeighbors = 3, int flags = 0,
                      Size minSize = Size(),
                      Size maxSize = Size() );
​
void detectMultiScale( InputArray image,
                      CV_OUT std::vector& objects,
                      CV_OUT std::vector& numDetections,
                      double scaleFactor=1.1,
                      int minNeighbors=3, int flags=0,
                      Size minSize=Size(),
                      Size maxSize=Size() );
​
void detectMultiScale( InputArray image,
                      CV_OUT std::vector& objects,
                      CV_OUT std::vector& rejectLevels,
                      CV_OUT std::vector& levelWeights,
                      double scaleFactor = 1.1,
                      int minNeighbors = 3, int flags = 0,
                      Size minSize = Size(),
                      Size maxSize = Size(),
                      bool outputRejectLevels = false );

参数1:image–待检测图片,一般为灰度图像加快检测速度;

参数2:objects–被检测物体的矩形框向量组;为输出量,如人脸检测矩阵Mat

参数3:scaleFactor–表示在前后两次相继的扫描中,搜索窗口的比例系数。默认为1.1即每次搜索窗口依次扩大10%;一般设置为1.1

参数4:minNeighbors–表示构成检测目标的相邻矩形的最小个数(默认为3个)。 如果组成检测目标的小矩形的个数和小于 min_neighbors - 1 都会被排除。 如果min_neighbors 为 0, 则函数不做任何操作就返回所有的被检候选矩形框, 这种设定值一般用在用户自定义对检测结果的组合程序上;

参数5:flags–要么使用默认值,要么使用CV_HAAR_DO_CANNY_PRUNING,如果设置为CV_HAAR_DO_CANNY_PRUNING,那么函数将会使用Canny边缘检测来排除边缘过多或过少的区域,因此这些区域通常不会是人脸所在区域;

参数6、7:minSize和maxSize用来限制得到的目标区域的范围。也就是我本次训练得到实际项目尺寸大小 函数介绍: detectMultiscale函数为多尺度多目标检测: 多尺度:通常搜索目标的模板尺寸大小是固定的,但是不同图片大小不同,所以目标对象的大小也是不定的,所以多尺度即不断缩放图片大小(缩放到与模板匹配),通过模板滑动窗函数搜索匹配;同一副图片可能在不同尺度下都得到匹配值,所以多尺度检测函数detectMultiscale是多尺度合并的结果。 多目标:通过检测符合模板匹配对象,可得到多个目标,均输出到objects向量里面。

关注
打赏
1661664439
查看更多评论
立即登录/注册

微信扫码登录

0.0453s