OpenCV中文入门

  • 格式:doc
  • 大小:24.00 KB
  • 文档页数:5

百度文库 - 让每个人平等地提升自我

1 书籍:

Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves

Bouguet, Springer, 1st ed. (June, 2006).

视频处理例程 (位于 /samples/c/目录中):

色彩跟踪: camshiftdemo

点跟踪: lkdemo

动作分割: motempl

边缘检测: laplace

图像处理例程(位于/samples/c/目录中):

边缘检测: edge

分割: pyramid_segmentation

形态: morphology

直方图: demhist

距离转换: distrans

椭圆拟合 fitellipse

OpenCV 命名约定

函数命名:

cvActionTarget[Mod](...)

Action = 核心功能(例如 设定set, 创建create)

Target = 操作目标 (例如 轮廓contour, 多边形polygon)

[Mod] = 可选修饰词 (例如说明参数类型)

矩阵数据类型:

CV_(S|U|F)C

S = 带符号整数

U = 无符号整数

F = 浮点数

例: CV_8UC1 表示一个8位无符号单通道矩阵,

CV_32FC2 表示一个32位浮点双通道矩阵.

图像数据类型:

IPL_DEPTH_(S|U|F)

例: IPL_DEPTH_8U 表示一个8位无符号图像.

IPL_DEPTH_32F 表示一个32位浮点数图像.

头文件:

#include <>

#include <>

#include <>

#include <> C程序实例

关闭窗口:

cvDestroyWindow("win1");

改变窗口尺寸:

cvResizeWindow("win1",100,100);

直接获取键盘操作: 百度文库 - 让每个人平等地提升自我

2 int key;

key=cvWaitKey(10); .

break;

case 'i':

...

break;

}

}

处理滚动条事件:

定义滚动条handler:

void trackbarHandler(int pos)

{

printf("Trackbar ",pos);

}

注册handler:

int trackbarVal=25;

int maxVal=100;

cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler);

获取滚动条当前位置:

int pos = cvGetTrackbarPos("bar1","win1");

设定滚动条位置:

cvSetTrackbarPos("bar1", "win1", 25);

OpenCV基础数据结构

图像数据结构

IPL 图像:

IplImage

|-- int nChannels; 若不为NULL则表示需要处理的图像

| |-- char *imageDataOrigin;

它不是C++的构造函数.

其他数据结构

点:

CvPoint p = cvPoint(int x, int y);

CvPoint2D32f p = cvPoint2D32f(float x, float y);

CvPoint3D32f p = cvPoint3D32f(float x, float y, float z);

例如:

=;

=;

长方形尺寸:

CvSize r = cvSize(int width, int height);

CvSize2D32f r = cvSize2D32f(float width, float height);

带偏移量的长方形尺寸:

CvRect r = cvRect(int x, int y, int width, int height);

图像处理

分配与释放图像空间 百度文库 - 让每个人平等地提升自我

3 分配图像空间:

IplImage* cvCreateImage(CvSize size, int depth, int channels);

size: cvSize(width,height);

depth: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,

IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F

channels: 1, 2, 3 or 4.

注意数据为交叉存取.彩色图像的数据编排为b0 g0 r0 b1 g1 r1 ...

举例:

设定/获取兴趣通道:

void cvSetImageCOI(IplImage* image, int coi); 读取存储图像

从文件中载入图像:

IplImage* img=0;

img=cvLoadImage(fileName);

if(!img) printf("Could not load image file: %s\n",fileName);

Supported image formats: BMP, DIB, JPEG, JPG, JPE, PNG, PBM, PGM, PPM,

SR, RAS, TIFF, TIF

载入图像默认转为3通道彩色图像. 如果不是,则需加flag:

img=cvLoadImage(fileName,flag);

flag: >0 载入图像转为三通道彩色图像

=0 载入图像转为单通道灰度图像

<0 不转换载入图像(通道数与图像文件相同).

图像存储为图像文件:

if(!cvSaveImage(outFileName,img)) printf("Could not save: %s\n",outFileName);

输入文件格式由文件扩展名决定.

存取图像元素

假设需要读取在i行j列像点的第k通道. 其中, 行数i的范围为[0, height-1], 列数j的范围为[0, width-1], 通道k的范围为[0, nchannels-1].

间接存取: (比较通用, 但效率低, 可读取任一类型图像数据)

对单通道字节图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);

CvScalar s;

s=cvGet2D(img,i,j); = 111;

imgA[i][j].g = 111;

imgA[i][j].r = 111;

多通道浮点图像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3);

RgbImageFloat imgA(img);

imgA[i][j].b = 111;

imgA[i][j].g = 111;

imgA[i][j].r = 111;

图像转换

转为灰度或彩色字节图像:

cvConvertImage(src, dst, flags=0);

src = float/byte grayscale/color image 百度文库 - 让每个人平等地提升自我

4 dst = byte grayscale/color image

flags = CV_CVTIMG_FLIP (flip vertically)

CV_CVTIMG_SWAP_RB (swap the R and B channels)

转换彩色图像为灰度图像:

使用OpenCV转换函数:

cvCvtColor(cimg,gimg,CV_BGR2GRAY); * +

cimgA[i][j].g* +

cimgA[i][j].r*;

颜色空间转换:

cvCvtColor(src,dst,code); CV_BGR2GRAY, CV_BGR2HSV, CV_BGR2Lab

绘图命令

画长方体:

许多其他方法提供了更加方便的C++接口,其效率与OpenCV一样.

OpenCV将向量作为1维矩阵处理.

矩阵按行存储,每行有4字节的校整.

分配矩阵空间:

CvMat* cvCreateMat(int rows, int cols, int type);

type: 矩阵元素类型. 格式为CV_(S|U|F)C.

例如: CV_8UC1 表示8位无符号单通道矩阵, CV_32SC2表示32位有符号双通道矩阵.

例程:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

释放矩阵空间:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

cvReleaseMat(&M);

复制矩阵:

CvMat* M1 = cvCreateMat(4,4,CV_32FC1);

CvMat* M2;

M2=cvCloneMat(M1);

初始化矩阵:

double a[] = { 1, 2, 3, 4,

5, 6, 7, 8,

9, 10, 11, 12 };

CvMat Ma=cvMat(3, 4, CV_64FC1, a);

另一种方法:

CvMat Ma;

cvInitMatHeader(&Ma, 3, 4, CV_64FC1, a);

初始化矩阵为单位阵:

CvMat* M = cvCreateMat(4,4,CV_32FC1);

cvSetIdentity(M);

间接存取矩阵元素:

cvmSet(M,i,j,; Mb -> Mc

cvDiv(Ma, Mb, Mc); Mb -> Mc

cvAddS(Ma, cvScalar, Mc); Vb -> res

cvCrossProduct(&Va, &Vb, &Vc);