Opencv特征:
1.开源计算机视觉库采用C/C++编写
2.目的是开发实时应用程序
3.于操作系统、硬件和图形管理器
4.具有通用的图像、视频载入,保存和获取模块
5.具有底层和高层的应用开发包
Opencv目标:为解决计算机视觉问题提供基本工具
基本组成:高层函数、基本函数
Opencv模块(主要)
1、CV 主要的OpenCV函数:图像处理与视觉算法
2、ML 机器学习、模式分类和回归分析,统计分离器
3、HighGUI 图像视频输入/出
4、CXcore 数据结构与线性代数支持,基本函数
常用的视频处理:
彩色跟踪,点跟踪,动运分割,边缘检测
常用的图像处理:
边缘检测,分割,形态学操作,直方图,距离变换,椭圆拟合
命名规则:
1.通用矩阵数据类型 :CV_(位数)(S|U|F)C(通道数) ---位数也叫作深度
S:带符,U:无符,F:浮点, CV_32FC2 :32位浮点数双通道矩阵
2.通用图像数据类型:IPL_DEPTH_(位数)( S|U|F)
IPL_DEPTH_8U :8位无符号整数图像
一、基础知识
1.基础数据结构
1.1. CvPoint
CvPoint 二维坐标系下的点,类型为整型
typedef struct CvPoint
{
int x; /* X坐标, 通常以0为基点 */
int y; /* y坐标, 通常以0为基点 */
}
1.2. CvSize 矩形框大小,以像素为精度
typedef struct CvSize
{
int width; /* 矩形宽 */
int height; /* 矩形高 */
}
1.3.CvRect 矩形框的偏移和大小
typedef struct CvRect
{
int x; /* 方形的最左角的x-坐标 */
int y; /* 方形的最上或者最下角的y-坐标 */
int width; /* 宽 */
int height; /* 高 */
}
1.4. CvScalar 定义存放1- 4个数值的数组。
typedef struct Cvscalar{
double val[4];
}CvScalar; //可用来表示RGBA的值,A=alpha透明度
1.5. IplImage
width, height ,depth (深度),nchannels (通道数) , origin (原点坐标)
imageData , ROI
1.6 CvMemStorage 内存存储器
typedef struct CvMemStorage
{
struct CvMemBlock* bottom;/* first allocated block */
struct CvMemBlock* top; /* the current memory block - top of the stack */
struct CvMemStorage* parent; /* borrows new blocks from */
int block_size; /* block size */
int free_space; /* free space in the top block (in bytes) */
} CvMemStorage;
内存存储器是一个可用来存储诸如序列,轮廓,图形,子划分等动态增长数据结构的底层结构。它是由一系列以同等大小的内存块构成,呈列表型 ---bottom 域指的是列首,top 域指的是当前指向的块但未必是列尾.在bottom和top之间所有的块(包括bottom, 不包括top)被完全占据了空间;在 top和列尾之间所有的块(包括块尾,不包括top)则是空的;而top块本身则被占据了部分空间 -- free_space 指的是top块剩馀的空字节数。
新分配的内存缓冲区(或显式的通过 cvMemStorageAlloc 函数分配,或隐式的通过 cvSeqPush, cvGraphAddEdge等高级函数分配)总是起始于当前块(即top块)的剩馀那部分,如果剩馀那部分能满足要求(够分配的大小)。分配后,free_space 就减少了新分配的那部分内存大小,外加一些用来保存适当列型的附加大小。当top块的剩馀空间无法满足被分配的块(缓冲区)大小时,top块的下一个存储块被置为当前块(新的top块) -- free_space 被置为先前分配的整个块的大小。
如果已经不存在空的存储块(即:top块已是列尾),则必须再分配一个新的块(或从parent那继承,见 cvCreateChildMemStorage)并将该块加到列尾上去。于是,存储器(memory storage)就如同栈(Stack)那样, bottom指向栈底,(top, free_space)对指向栈顶。栈顶可通过 cvSaveMemStoragePos保存,通过 cvRestoreMemStoragePos 恢复指向, 通过 cvClearStorage 重置。
二、矩阵
1.分配与释放
1.1. 分配矩阵 CvMat* cvCreateMat( int rows, int cols, int type );
例如:CvMat* M = cvCreateMat( 4 , 4, CV_32FC1 );
1.2. 释放矩阵 void cvReleaseMat( CvMat * * );
例如:CvMat* M = cvCreateMat( 4 , 4, CV_32FC1 );
cvReleaseMat(&M);
1.3. 复制矩阵 CvMat* cvCloneMat( CvMat * );
例如:CvMat* M2 = cvCloneMat( M1 );
1.4. 初始化矩阵 double a[] ={ 1,2,3,4, 5,6,7,8, 9,10,11,12};
CvMat Ma = cvMat( 3 , 4, CV_FC1 , a );
Or cvInitMatHeader( &Ma , 3 , 4, CV_FC1 , a);
2.矩阵的访问
2.1. 直接访问(常用) cvmSet( M , i , j , 2.0 ); == set M( i , j )
t = cvmGet ( M , i , j ); == get M( i , j )
2.2. 已知对齐方式直接访问
CvMat * M = cvCreateMat( 4 , 4 , CV_32FC1 );
int n = M->cols;
float * data = M->data.fl; (若位是data.db)
data[i*n+j] = 3.0;
2.3.未知对齐方式直接访问
int step = M->step / sizeof (float); float * data = M->data.fl;
(data+i*step)[j] = 3.0;
3.矩阵的操作
3.1.cvAdd( Ma , Mb , Mc );矩阵加 ||cvsub减,cvMatMul( Ma, Mb, Mc)矩阵乘
3.2.cvTranspose(&Ma,&Mb);转置 (注意,Ma与Mb必须是对应的,Ma行=Mb列)
3.3. cvInvert(&Ma,&Ma,CV_LU); 求逆矩阵
三、 GUI命令
1. 基本操作
IplImage* img = cvLoadImage(filename,1); //声明IplImage指针
cvNamedWindow( "Image", 1 ); //创建窗口
cvMoveWindow( “Image” , 100 ,100); 偏移量从左上角起
cvResizeWindow( “Image” , 100 , 100 ); 缩放窗口
cvShowImage( "Image", img ); //显示图像
cvWaitKey(0); //等待按键
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &img ); //释放图像
四、图像的使用与操作
1.分配与释放,如上
1.1. IplImage * cvCreateImage ( CvSize size , int depth , int channels );
其中,size 是一个cvSize结构,
depth 为像素深度,用比特表示,IPL_DEPTH_(8U|16S|F)等
channels 为每个像素的通道数,通道为交叉排列,一幅彩色图像通常排列为 b0 g0 r0 b1 g1 r1 b2 g2 r2
例如:IplImage * img = cvCreateImage( cvSize (0,480) , IPL_DEPTH_F, 3 )
2. 复制图像 IplImage * img2 = cvCloneImage(img1);
3.反转图像
4.图像操作
4.1. 从文件读
IplImage * img = 0;
img = cvLoadImage (filename , flag );
if (!img) printf ( “不能打开图像” );
其中,flag>0载入图像强制为3通道彩色,=0强制为灰度图像 ,<0通道数由图像定
4.2 写图像入文件 (例3-3 改图像文件格式)
不能保存图像” );
4.3. 绘制命令
4.3.1. 画矩形 (下面语句画一个对角(100,100)(200,200)线粗1的红色矩形)
cvRectangle (img , cvPoint (100, 100) , cvPoint ( 200, 200 ) , cvScalar (255 , 0 ,0), 1 );
4.3.2. 画圆 [中心点,半径,绿色,线粗]
cvCircle ( img , cvPoint ( 100, 100) , 20 , cvScalar( 0, 255 , 0) , 1 );
4.3.3. 画线段 [起点,终点,绿色,线粗]
cvLine ( img , cvPoint (100 , 100),cvPoint (200, 200 ) , cvScalar(0, 255 , 0) , 1 );
4.3.4. 画多边形
CvPoint curve1[] = {10,10, 10,100, 100,100, 100,10};
CvPoint curve2[] = {30,30, 30,130, 130,130, 130,10};
CvPoint * curveArr[ 2 ] = { curve1 , curve2};
int nCurvePts[ 2 ] = {4,5};
int nCurves = 2;
int isCurveClosed = 1;
cvPolyLine(img, curveArr, nCurvePts, nCurves, isCurveClosed, cvScalar(0,255,0,0), 1,1,0);
(图像文件,顶点指针数组,顶点数数组,多边形个数,封闭,颜色,粗细,线类型,0)
五、视频的使用与操作
5.1 从视频序列中捕捉图像帧
5.1.1. 对摄像头的初始化捕捉
CvCapture * capture = cvCaptureFromCAM(0);
5.1.2.对文件的初始化捕捉
CvCapture * capture = cvCaptureFormAVI( *infile.avi );
5.1.3.捕捉某一帧
5.1.4.释放捕捉源
cvReleaseCapture (&capture); 注意,从视频捕捉的帧不用释放
5.2 从摄像头获取信息
5.3. 对AVI文件的处理
cvcamPlayAVI(filename, HWND, 320, 240, callback);
六、模式识别与图像处理
1.图像处理
1.1 边缘检测
1.2数图像中的拐点数