OpenCV 编程入门.docx
- 文档编号:8976195
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:25
- 大小:25.87KB
OpenCV 编程入门.docx
《OpenCV 编程入门.docx》由会员分享,可在线阅读,更多相关《OpenCV 编程入门.docx(25页珍藏版)》请在冰豆网上搜索。
OpenCV编程入门
OpenCV编程入门
美国伊力诺理工学院计算机科学系GadyAdam
翻译:
Mensch
2006年11月22日
内容
∙简介
oOpenCV概述
o资料链接
oOpenCV命名约定
o编译命令
oC程序实例
∙GUI命令
o窗口管理
o输入设备
∙ OpenCV基础数据结构
o图像数据结构
o矩阵与向量
o其他数据结构
∙图像处理
o创建与释放图像结构空间
o读入与存储图像
o读取图像元素
o图像转换
o绘图命令
∙矩阵操作
o创建与释放矩阵结构空间
o读取矩阵元素
o矩阵/向量操作
∙视频序列处理
o从视频序列中抓取一帧
o获取/设定帧信息
o存储视频文件
简介
OpenCV概述
∙什么是OpenCV
o开源C/C++计算机视觉库.
o面向实时应用进行优化.
o跨操作系统/硬件/窗口管理器.
o通用图像/视频载入、存储和获取.
o由中、高层API构成.
o为Intel®公司的IntegratedPerformancePrimitives(IPP)提供了透明接口.
∙特性:
o图像数据操作(分配,释放,复制,设定,转换).
o图像与视频I/O(基于文件/摄像头输入,图像/视频文件输出).
o矩阵与向量操作与线性代数计算(相乘,求解,特征值,奇异值分解SVD).
o各种动态数据结构(列表,队列,集,树,图).
o基本图像处理(滤波,边缘检测,角点检测,采样与插值,色彩转换,形态操作,直方图,图像金字塔).
o结构分析(连接成分,轮廓处理,距离转换,模板匹配,Hough转换,多边形近似,线性拟合,椭圆拟合,Delaunay三角化).
o摄像头标定 (寻找并跟踪标定模板,标定,基础矩阵估计,homography估计,立体匹配).
o动作分析(光流,动作分割,跟踪).
o对象辨识 (特征方法,隐马可夫链模型HMM).
o基本GUI(显示图像/视频, 键盘鼠标操作,滚动条).
o图像标识 (直线,圆锥,多边形,文本绘图)
∙OpenCV模块:
ocv-OpenCV主要函数.
ocvaux- 辅助(实验性)OpenCV函数.
ocxcore-数据结构与线性代数算法.
ohighgui-GUI函数.
资料链接
∙参考手册:
o
∙网络资源:
o官方网页:
o软件下载:
∙书籍:
oOpenSourceComputerVisionLibrarybyGaryR.Bradski,VadimPisarevsky,andJean-YvesBouguet,Springer,1sted.(June,2006).
∙视频处理例程(位于
o色彩跟踪:
camshiftdemo
o点跟踪:
lkdemo
o动作分割:
motempl
o边缘检测:
laplace
∙图像处理例程(位于
o边缘检测:
edge
o分割:
pyramid_segmentation
o形态:
morphology
o直方图:
demhist
o距离转换:
distrans
o椭圆拟合 fitellipse
OpenCV命名约定
∙函数命名:
cvActionTarget[Mod](...)
Action=核心功能(例如设定set,创建create)
Target=操作目标(例如轮廓contour,多边形polygon)
[Mod]=可选修饰词(例如说明参数类型)
∙矩阵数据类型:
CV_
S=带符号整数
U=无符号整数
F=浮点数
例:
CV_8UC1表示一个8位无符号单通道矩阵,
CV_32FC2表示一个32位浮点双通道矩阵.
∙图像数据类型:
IPL_DEPTH_
例:
IPL_DEPTH_8U表示一个8位无符号图像.
IPL_DEPTH_32F表示一个32位浮点数图像.
∙头文件:
#include
#include
#include
#include
编译命令
∙Linux系统:
g++hello-world.cpp-ohello-world\
-I/usr/local/include/opencv-L/usr/local/lib\
-lm-lcv-lhighgui-lcvaux
∙Windows系统:
注意在项目属性中设好OpenCV头文件以及库文件的路径.
C程序实例
////////////////////////////////////////////////////////////////////////
//
//hello-world.cpp
//
//一个简单的OpenCV程序
//它从一个文件中读取图像,将色彩值颠倒,并显示结果.
//
////////////////////////////////////////////////////////////////////////
#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
exit(0);
}
//载入图像
img=cvLoadImage(argv[1]);
if(!
img){
printf("Couldnotloadimagefile:
%s\n",argv[1]);
exit(0);
}
//获取图像数据
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);
//创建窗口
cvNamedWindow("mainWin",CV_WINDOW_AUTOSIZE);
cvMoveWindow("mainWin",100,100);
//反色图像
for(i=0;i data[i*step+j*channels+k]=255-data[i*step+j*channels+k]; //显示图像 cvShowImage("mainWin",img); //waitforakey cvWaitKey(0); //releasetheimage cvReleaseImage(&img); return0; } GUI命令 窗口管理 ∙创建并放置一个窗口: cvNamedWindow("win1",CV_WINDOW_AUTOSIZE); cvMoveWindow("win1",100,100);//以屏幕左上角为起点的偏移量 ∙读入图像: IplImage*img=0; img=cvLoadImage(fileName); if(! img)printf("Couldnotloadimagefile: %s\n",fileName); ∙显示图像: cvShowImage("win1",img); 可显示彩色或灰度的字节/浮点图像。 彩色图像数据认定为BGR顺序. ∙关闭窗口: cvDestroyWindow("win1"); ∙改变窗口尺寸: cvResizeWindow("win1",100,100);//新的宽/高值(象素点) 输入设备 ∙响应鼠标事件: o定义鼠标handler: 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 o注册handler: mouseParam=5; cvSetMouseCallback("win1",mouseHandler,&mouseParam); ∙响应键盘事件: o键盘没有事件handler. o直接获取键盘操作: intkey; key=cvWaitKey(10);//输入等待10ms o等待按键并获取键盘操作: intkey; key=cvWaitKey(0);//无限等待键盘输入 o键盘输入循环: while (1){ key=cvWaitKey(10); if(key==27)break; switch(key){ case'h': ... break; case'i': ... break; } } ∙处理滚动条事件: o定义滚动条handler: voidtrackbarHandler(intpos) { printf("Trackbarposition: %d\n",pos); } o注册handler: inttrackbarVal=25; intmaxVal=100; cvCreateTrackbar("bar1","win1",&trackbarVal,maxVal,trackbarHandler); o获取滚动条当前位置: intpos=cvGetTrackbarPos("bar1","win1"); o设定滚动条位置: cvSetTrackbarPos("bar1","win1",25); OpenCV基础数据结构 图像数据结构 ∙IPL图像: IplImage |--intnChannels;//色彩通道数(1,2,3,4) |--intdepth;//象素色深: |//IPL_DEPTH_8U,IPL_DEPTH_8S, |//IPL_DEPTH_16U,IPL_DEPTH_16S, |//IPL_DEPTH_32S,IPL_DEPTH_32F, |//IPL_DEPTH_64F |--intwidth;//图像宽度(象素点数) |--intheight;//图像高度(象素点数) |--char*imageData;//指针指向成一列排列的图像数据 |//注意色彩顺序为BGR |--intdataOrder;//0-彩色通道交叉存取BGRBGRBGR, |//1-彩色通道分隔存取BBBGGGRRR |//函数cvCreateImage只能创建交叉存取的图像 |--intorigin;//0-起点为左上角, |//1-起点为右下角(Windows位图bitmap格式) |--intwidthStep;//每行图像数据所占字节大小 |--intimageSize;//图像数据所占字节大小=高度*每行图像数据字节大小 |--struct_IplROI*roi;//图像ROI.若不为NULL则表示需要处理的图像 |//区域. |--char*imageDataOrigin;//指针指向图像数据原点 |//(用来校准图像存储单元的重新分配) | |--intalign;//图像行校准: 4或8字节校准 |//OpenCV不采用它而使用widthStep |--charcolorModel[4];//图像色彩模型-被OpenCV忽略 矩阵与向量 ∙矩阵: CvMat//2维数组 |--inttype;//元素类型(uchar,short,int,float,double) |--intstep;//一行所占字节长度 |--introws,cols;//尺寸大小 |--intheight,width;//备用尺寸参照 |--uniondata; |--uchar*ptr;//针对unsignedchar矩阵的数据指针 |--short*s;//针对short矩阵的数据指针 |--int*i;//针对integer矩阵的数据指针 |--float*fl;//针对float矩阵的数据指针 |--double*db;//针对double矩阵的数据指针 CvMatND//N-维数组 |--inttype;//元素类型(uchar,short,int,float,double) |--intdims;//数组维数 |--uniondata; ||--uchar*ptr;//针对unsignedchar矩阵的数据指针 ||--short*s;//针对short矩阵的数据指针 ||--int*i;//针对integer矩阵的数据指针 ||--float*fl;//针对float矩阵的数据指针 ||--double*db;//针对double矩阵的数据指针 | |--structdim[];//每个维的信息 |--size;//该维内元素个数 |--step;//该维内元素之间偏移量 CvSparseMat//稀疏N维数组 ∙通用数组: CvArr*//仅作为函数参数,说明函数接受多种类型的数组,例如: //IplImage*,CvMat*或者CvSeq*. //只需通过分析数组头部的前4字节便可确定数组类型 ∙标量: CvScalar |--doubleval[4];//4D向量 初始化函数: CvScalars=cvScalar(doubleval0,doubleval1=0,doubleval2=0,doubleval3=0); 举例: CvScalars=cvScalar(20.0); s.val[0]=10.0; 注意: 初始化函数与数据结构同名,只是首字母小写.它不是C++的构造函数. 其他数据结构 ∙点: CvPointp=cvPoint(intx,inty); CvPoint2D32fp=cvPoint2D32f(floatx,floaty); CvPoint3D32fp=cvPoint3D32f(floatx,floaty,floatz); 例如: p.x=5.0; p.y=5.0; ∙长方形尺寸: CvSizer=cvSize(intwidth,intheight); CvSize2D32fr=cvSize2D32f(floatwidth,floatheight); ∙带偏移量的长方形尺寸: CvRectr=cvRect(intx,inty,intwidth,intheight); 图像处理 分配与释放图像空间 ∙分配图像空间: IplImage*cvCreateImage(CvSizesize,intdepth,intchannels); 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,3or4. 注意数据为交叉存取.彩色图像的数据编排为b0g0r0b1g1r1... 举例: //分配一个单通道字节图像 IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); //分配一个三通道浮点图像 IplImage*img2=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); ∙释放图像空间: IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); cvReleaseImage(&img); ∙复制图像: IplImage*img1=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); IplImage*img2; img2=cvCloneImage(img1); ∙设定/获取兴趣区域: voidcvSetImageROI(IplImage*image,CvRectrect); voidcvResetImageROI(IplImage*image); vRectcvGetImageROI(constIplImage*image); 大部分OpenCV函数都支持ROI. ∙设定/获取兴趣通道: voidcvSetImageCOI(IplImage*image,intcoi);//0=all intcvGetImageCOI(constIplImage*image); 大部分OpenCV函数暂不支持COI. 读取存储图像 ∙从文件中载入图像: IplImage*img=0; img=cvLoadImage(fileName); if(! img)printf("Couldnotloadimagefile: %s\n",fileName); Supportedimageformats: 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("Couldnotsave: %s\n",outFileName); 输入文件格式由文件扩展名决定. 存取图像元素 ∙假设需要读取在i行j列像点的第k通道.其中,行数i的范围为[0,height-1],列数j的范围为[0,width-1],通道k的范围为[0,nchannels-1]. ∙间接存取: (比较通用,但效率低,可读取任一类型图像数据) o对单通道字节图像: IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); CvScalars; s=cvGet2D(img,i,j);//getthe(i,j)pixelvalue printf("intensity=%f\n",s.val[0]); s.val[0]=111; cvSet2D(img,i,j,s);//setthe(i,j)pixelvalue o对多通道浮点或字节图像: IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); CvScalars; s=cvGet2D(img,i,j);//getthe(i,j)pixelvalue printf("B=%f,G=%f,R=%f\n",s.val[0],s.val[1],s.val[2]); s.val[0]=111; s.val[1]=111; s.val[2]=111
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenCV 编程入门 编程 入门