openCV快速入门.docx

上传人:b****8 文档编号:10621742 上传时间:2023-02-21 格式:DOCX 页数:90 大小:37.87KB
下载 相关 举报
openCV快速入门.docx_第1页
第1页 / 共90页
openCV快速入门.docx_第2页
第2页 / 共90页
openCV快速入门.docx_第3页
第3页 / 共90页
openCV快速入门.docx_第4页
第4页 / 共90页
openCV快速入门.docx_第5页
第5页 / 共90页
点击查看更多>>
下载资源
资源描述

openCV快速入门.docx

《openCV快速入门.docx》由会员分享,可在线阅读,更多相关《openCV快速入门.docx(90页珍藏版)》请在冰豆网上搜索。

openCV快速入门.docx

openCV快速入门

摘要:

本文旨在帮助读者快速入门OpenCV,而无需阅读冗长的参考手册。

掌握了OpenCV的以下基础知识后,有需要的话再查阅相关的参考手册。

目录

[隐藏]

1一、简介

1.11、OpenCV的特点

1.1.1

(1)总体描述

1.1.2

(2)功能

1.1.3(3)OpenCV模块

1.22、有用的学习资源

1.2.1

(1)参考手册:

1.2.2

(2)网络资源:

1.2.3(3)书籍:

1.2.4(4)视频处理例程(在/samples/c/):

1.2.5(5)图像处理例程(在/samples/c/):

1.33、OpenCV命名规则

1.3.1

(1)函数名:

1.3.2

(2)矩阵数据类型:

1.3.3(3)图像数据类型:

1.3.4(4)头文件:

1.44、编译建议

1.4.1

(1)Linux:

1.4.2

(2)Windows:

1.55、C例程

2二、GUI指令

2.11、窗口管理

2.1.1

(1)创建和定位一个新窗口:

2.1.2

(2)载入图像:

2.1.3(3)显示图像:

2.1.4(4)关闭窗口:

2.1.5(5)改变窗口大小:

2.22、输入处理

2.2.1

(1)处理鼠标事件:

2.2.2

(2)处理键盘事件:

2.2.3(3)处理滑动条事件:

3三、OpenCV的基本数据结构

3.11、图像数据结构

3.1.1

(1)IPL图像:

3.22、矩阵与向量

3.2.1

(1)矩阵:

3.2.2

(2)一般矩阵:

3.2.3(3)标量:

3.33、其它结构类型

3.3.1

(1)点:

3.3.2

(2)矩形框大小(以像素为精度):

3.3.3(3)矩形框的偏置和大小:

4四、图像处理

4.11、图像的内存分配与释放

4.1.1

(1)分配内存给一幅新图像:

4.1.2

(2)释放图像:

4.1.3(3)复制图像:

4.1.4(4)设置/获取感兴趣区域ROI:

4.1.5(5)设置/获取感兴趣通道COI:

4.22、图像读写

4.2.1

(1)从文件中读入图像:

4.2.2

(2)保存图像:

4.33、访问图像像素

4.3.1

(1)假设你要访问第k通道、第i行、第j列的像素。

4.3.2

(2)间接访问:

(通用,但效率低,可访问任意格式的图像)

4.3.3(3)直接访问:

(效率高,但容易出错)

4.3.4(4)基于指针的直接访问:

(简单高效)

4.3.5(5)基于c++wrapper的直接访问:

(更简单高效)

4.44、图像转换

4.4.1

(1)字节型图像的灰度-彩色转换:

4.4.2

(2)彩色图像->灰度图像:

4.4.3(3)不同彩色空间之间的转换:

4.55、绘图指令

4.5.1

(1)绘制矩形:

4.5.2

(2)绘制圆形:

4.5.3(3)绘制线段:

4.5.4(4)绘制一组线段:

4.5.5(5)绘制一组填充颜色的多边形:

4.5.6(6)文本标注:

5五、矩阵处理

5.11、矩阵的内存分配与释放

5.1.1

(1)总体上:

5.1.2

(2)为新矩阵分配内存:

5.1.3(3)释放矩阵内存:

5.1.4(4)复制矩阵:

5.1.5(5)初始化矩阵:

5.1.6(6)初始化矩阵为单位矩阵:

5.22、访问矩阵元素

5.2.1

(1)假设需要访问一个2D浮点型矩阵的第(i,j)个单元.

5.2.2

(2)间接访问:

5.2.3(3)直接访问(假设矩阵数据按4字节行对齐):

5.2.4(4)直接访问(当数据的行对齐可能存在间隙时possiblealignmentgaps):

5.2.5(5)对于初始化后的矩阵进行直接访问:

5.33、矩阵/向量运算

5.3.1

(1)矩阵之间的运算:

5.3.2

(2)矩阵之间的元素级运算:

5.3.3(3)向量乘积:

5.3.4(4)单一矩阵的运算:

5.3.5(5)非齐次线性方程求解:

5.3.6(6)特征值与特征向量(矩阵为方阵):

6六、视频处理

6.11、从视频流中捕捉一帧画面

6.1.1

(1)OpenCV支持从摄像头或视频文件(AVI格式)中捕捉帧画面.

6.1.2

(2)初始化一个摄像头捕捉器:

6.1.3(3)初始化一个视频文件捕捉器:

6.1.4(4)捕捉一帧画面:

6.1.5(5)释放视频流捕捉器:

6.22、获取/设置视频流信息

6.2.1

(1)获取视频流设备信息:

6.2.2

(2)获取帧图信息:

6.2.3(3)设置从视频文件抓取的第一帧画面的位置:

6.33、保存视频文件

6.3.1

(1)初始化视频编写器:

6.3.2

(2)保持视频文件:

6.3.3(3)释放视频编写器:

[编辑]

一、简介

[编辑]

1、OpenCV的特点

[编辑]

(1)总体描述

OpenCV是一个基于C/C++语言的开源图像处理函数库

其代码都经过优化,可用于实时处理图像

具有良好的可移植性

可以进行图像/视频载入、保存和采集的常规操作

具有低级和高级的应用程序接口(API)

提供了面向IntelIPP高效多媒体函数库的接口,可针对你使用的IntelCPU优化代码,提高程序性能(译注:

OpenCV2.0版的代码已显着优化,无需IPP来提升性能,故2.0版不再提供IPP接口)

[编辑]

(2)功能

图像数据操作(内存分配与释放,图像复制、设定和转换)

Imagedatamanipulation(allocation,release,copying,setting,conversion).

图像/视频的输入输出(支持文件或摄像头的输入,图像/视频文件的输出)

ImageandvideoI/O(fileandcamerabasedinput,image/videofileoutput).

矩阵/向量数据操作及线性代数运算(矩阵乘积、矩阵方程求解、特征值、奇异值分解)

Matrixandvectormanipulationandlinearalgebraroutines(products,solvers,eigenvalues,SVD).

支持多种动态数据结构(链表、队列、数据集、树、图)

Variousdynamicdatastructures(lists,queues,sets,trees,graphs).

基本图像处理(去噪、边缘检测、角点检测、采样与插值、色彩变换、形态学处理、直方图、图像金字塔结构)

Basicimageprocessing(filtering,edgedetection,cornerdetection,samplingandinterpolation,colorconversion,morphologicaloperations,histograms,imagepyramids).

结构分析(连通域/分支、轮廓处理、距离转换、图像矩、模板匹配、霍夫变换、多项式逼近、曲线拟合、椭圆拟合、狄劳尼三角化)

Structuralanalysis(connectedcomponents,contourprocessing,distancetransform,variousmoments,templatematching,Houghtransform,polygonalapproximation,linefitting,ellipsefitting,Delaunaytriangulation).

摄像头定标(寻找和跟踪定标模式、参数定标、基本矩阵估计、单应矩阵估计、立体视觉匹配)

Cameracalibration(findingandtrackingcalibrationpatterns,calibration,fundamentalmatrixestimation,homographyestimation,stereocorrespondence).

运动分析(光流、动作分割、目标跟踪)

Motionanalysis(opticalflow,motionsegmentation,tracking).

目标识别(特征方法、HMM模型)

Objectrecognition(eigen-methods,HMM).

基本的GUI(显示图像/视频、键盘/鼠标操作、滑动条)

BasicGUI(displayimage/video,keyboardandmousehandling,scroll-bars).

图像标注(直线、曲线、多边形、文本标注)

Imagelabeling(line,conic,polygon,textdrawing)

[编辑]

(3)OpenCV模块

cv–核心函数库

cvaux–辅助函数库

cxcore–数据结构与线性代数库

highgui–GUI函数库

ml–机器学习函数库

[编辑]

2、有用的学习资源

[编辑]

(1)参考手册:

/docs/index.htm(译注:

在你的OpenCV安装目录内)

[编辑]

(2)网络资源:

官方网站:

软件下载:

[编辑]

(3)书籍:

OpenSourceComputerVisionLibrary

byGaryR.Bradski,VadimPisarevsky,andJean-YvesBouguet,Springer,1sted.(June,2006).chenyusiyuan:

补充以下书籍

LearningOpenCV-ComputerVisionwiththeOpenCVLibrary

byGaryBradski&AdrianKaehler,O'ReillyMedia,1sted.(September,2008).

OpenCV教程——基础篇

作者:

刘瑞祯于仕琪,北京航空航天大学出版社,出版日期:

200706

[编辑]

(4)视频处理例程(在/samples/c/):

颜色跟踪:

camshiftdemo

点跟踪:

lkdemo

动作分割:

motempl

边缘检测:

laplace

[编辑]

(5)图像处理例程(在/samples/c/):

边缘检测:

edge

图像分割:

pyramid_segmentation

形态学:

morphology

直方图:

demhist

距离变换:

distrans

椭圆拟合:

fitellipse

[编辑]

3、OpenCV命名规则

[编辑]

(1)函数名:

cvActionTargetMod(...)

Action=核心功能(corefunctionality)(e.g.set,create)

Target=目标图像区域(targetimagearea)(e.g.contour,polygon)

Mod=(可选的)调整语(optionalmodifiers)(e.g.argumenttype)

[编辑]

(2)矩阵数据类型:

CV_(S|U|F)C

S=符号整型

U=无符号整型

F=浮点型

E.g.:

CV_8UC1是指一个8位无符号整型单通道矩阵,

CV_32FC2是指一个32位浮点型双通道矩阵.

[编辑]

(3)图像数据类型:

IPL_DEPTH_(S|U|F)

E.g.:

IPL_DEPTH_8U图像像素数据是8位无符号整型.

IPL_DEPTH_32F图像像素数据是32位浮点型.

[编辑]

(4)头文件:

#include

#include

#include

#include

#include//一般不需要,cv.h内已包含该头文件

[编辑]

4、编译建议

[编辑]

(1)Linux:

g++hello-world.cpp-ohello-world\

-I/usr/local/include/opencv-L/usr/local/lib\

-lm-lcv-lhighgui-lcvaux

[编辑]

(2)Windows:

在VisualStudio的‘选项’和‘项目’中设置好OpenCV相关文件的路径。

[编辑]

5、C例程

////////////////////////////////////////////////////////////////////////

//

//hello-world.cpp

//

//该程序从文件中读入一幅图像,将之反色,然后显示出来.

//

////////////////////////////////////////////////////////////////////////

#include

#include

#include

#include

#include

 

intmain(intargc,char*argv[])

{

IplImage*img=0;

intheight,width,step,channels;

uchar*data;

inti,j,k;

 

if(argc<2){

printf("Usage:

main\n\7");

exit(0);

}

 

//loadanimage

img=cvLoadImage(argv[1]);

if(!

img){

printf("Couldnotloadimagefile:

%s\n",argv[1]);

exit(0);

}

 

//gettheimagedata

height=img->height;

width=img->width;

step=img->widthStep;

channels=img->nChannels;

data=(uchar*)img->imageData;

printf("Processinga%dx%dimagewith%dchannels\n",height,width,channels);

 

//createawindow

cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);

cvMoveWindow("mainWin",100,100);

 

//inverttheimage

//相当于cvNot(img);

for(i=0;i

data[i*step+j*channels+k]=255-data[i*step+j*channels+k];

 

//showtheimage

cvShowImage("mainWin",img);

 

//waitforakey

cvWaitKey(0);

 

//releasetheimage

cvReleaseImage(&img);

return0;

}

[编辑]

二、GUI指令

[编辑]

1、窗口管理

[编辑]

(1)创建和定位一个新窗口:

cvNamedWindow("win1",CV_WINDOW_AUTOSIZE);

cvMoveWindow("win1",100,100);//offsetfromtheULcornerofthescreen

[编辑]

(2)载入图像:

IplImage*img=0;

img=cvLoadImage(fileName);

if(!

img)printf("Couldnotloadimagefile:

%s\n",fileName);

[编辑]

(3)显示图像:

cvShowImage("win1",img);

该函数可以显示彩色或灰度的字节型/浮点型图像。

字节型图像像素值范围为[0-255];浮点型图像像素值范围为[0-1]。

彩色图像的三色元素按BGR(蓝-红-绿)顺序存储。

[编辑]

(4)关闭窗口:

cvDestroyWindow("win1");

[编辑]

(5)改变窗口大小:

cvResizeWindow("win1",100,100);//newwidth/heighinpixels

[编辑]

2、输入处理

[编辑]

(1)处理鼠标事件:

定义一个鼠标处理程序:

voidmouseHandler(intevent,intx,inty,intflags,void*param)

{

switch(event){

caseCV_EVENT_LBUTTONDOWN:

if(flags&CV_EVENT_FLAG_CTRLKEY)

printf("LeftbuttondownwithCTRLpressed\n");

break;

 

caseCV_EVENT_LBUTTONUP:

printf("Leftbuttonup\n");

break;

}

}

x,y:

相对于左上角的像素坐标

event:

CV_EVENT_LBUTTONDOWN,CV_EVENT_RBUTTONDOWN,CV_EVENT_MBUTTONDOWN,

CV_EVENT_LBUTTONUP,CV_EVENT_RBUTTONUP,CV_EVENT_MBUTTONUP,

CV_EVENT_LBUTTONDBLCLK,CV_EVENT_RBUTTONDBLCLK,CV_EVENT_MBUTTONDBLCLK,

CV_EVENT_MOUSEMOVE:

flags:

CV_EVENT_FLAG_CTRLKEY,CV_EVENT_FLAG_SHIFTKEY,CV_EVENT_FLAG_ALTKEY,

CV_EVENT_FLAG_LBUTTON,CV_EVENT_FLAG_RBUTTON,CV_EVENT_FLAG_MBUTTON

注册该事件处理程序:

mouseParam=5;

cvSetMouseCallback("win1",mouseHandler,&mouseParam);

[编辑]

(2)处理键盘事件:

实际上对于键盘输入并没有专门的事件处理程序.

按一定间隔检测键盘输入(适用于循环体中):

intkey;

key=cvWaitKey(10);//wait10msforinput

中止程序等待键盘输入:

intkey;

key=cvWaitKey(0);//waitindefinitelyforinput

键盘输入的循环处理程序:

while

(1){

key=cvWaitKey(10);

if(key==27)break;

 

switch(key){

case'h':

...

break;

case'i':

...

break;

}

}

[编辑]

(3)处理滑动条事件:

定义一个滑动条处理程序:

voidtrackbarHandler(intpos)

{

printf("Trackbarposition:

%d\n",pos);

}

注册该事件处理程序:

inttrackbarVal=25;

intmaxVal=100;

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

获取当前的滑动条位置:

intpos=cvGetTrackbarPos("bar1","win1");

设置滑动条位置:

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

[编辑]

三、OpenCV的基本数据结构

(译注:

OpenCV1.1、1.2或2.0版本中各数据结构的结构体元素有所调整,以下仅作参考)

[编辑]

1、图像数据结构

[编辑]

(1)IPL图像:

IplImage

|--intnChannels;//颜

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 表格模板 > 书信模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1