OpenCV 编程入门Word文档下载推荐.docx

上传人:b****7 文档编号:22112336 上传时间:2023-02-02 格式:DOCX 页数:25 大小:25.87KB
下载 相关 举报
OpenCV 编程入门Word文档下载推荐.docx_第1页
第1页 / 共25页
OpenCV 编程入门Word文档下载推荐.docx_第2页
第2页 / 共25页
OpenCV 编程入门Word文档下载推荐.docx_第3页
第3页 / 共25页
OpenCV 编程入门Word文档下载推荐.docx_第4页
第4页 / 共25页
OpenCV 编程入门Word文档下载推荐.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

OpenCV 编程入门Word文档下载推荐.docx

《OpenCV 编程入门Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《OpenCV 编程入门Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。

OpenCV 编程入门Word文档下载推荐.docx

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<

opencv-root>

/docs/index.htm

∙网络资源:

o官方网页:

o软件下载:

∙书籍:

oOpenSourceComputerVisionLibrarybyGaryR.Bradski,VadimPisarevsky,andJean-YvesBouguet,Springer,1sted.(June,2006).

∙视频处理例程(位于<

/samples/c/目录中):

o色彩跟踪:

camshiftdemo

o点跟踪:

lkdemo

o动作分割:

motempl

o边缘检测:

laplace

∙图像处理例程(位于<

edge

o分割:

pyramid_segmentation

o形态:

morphology

o直方图:

demhist

o距离转换:

distrans

o椭圆拟合 

fitellipse

OpenCV命名约定

∙函数命名:

cvActionTarget[Mod](...)

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

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

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

∙矩阵数据类型:

CV_<

bit_depth>

(S|U|F)C<

number_of_channels>

S=带符号整数

U=无符号整数

F=浮点数

例:

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

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

∙图像数据类型:

IPL_DEPTH_<

(S|U|F)

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

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

∙头文件:

#include<

cv.h>

cvaux.h>

highgui.h>

cxcore.h>

//不必要-该头文件已在cv.h文件中包含

编译命令

∙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程序

//它从一个文件中读取图像,将色彩值颠倒,并显示结果.

stdlib.h>

stdio.h>

math.h>

intmain(intargc,char*argv[])

{

IplImage*img=0;

intheight,width,step,channels;

uchar*data;

inti,j,k;

if(argc<

2){

printf("

Usage:

main<

image-file-name>

\n\7"

);

exit(0);

}

//载入图像

img=cvLoadImage(argv[1]);

if(!

img){

Couldnotloadimagefile:

%s\n"

argv[1]);

//获取图像数据

height=img->

height;

width=img->

width;

step=img->

widthStep;

channels=img->

nChannels;

data=(uchar*)img->

imageData;

Processinga%dx%dimagewith%dchannels\n"

height,width,channels);

//创建窗口

cvNamedWindow("

mainWin"

CV_WINDOW_AUTOSIZE);

cvMoveWindow("

100,100);

//反色图像

for(i=0;

i<

i++)for(j=0;

j<

j++)for(k=0;

k<

channels;

k++)

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

//显示图像

cvShowImage("

img);

//waitforakey

cvWaitKey(0);

//releasetheimage

cvReleaseImage(&

img);

return0;

GUI命令

窗口管理

∙创建并放置一个窗口:

win1"

//以屏幕左上角为起点的偏移量

∙读入图像:

IplImage*img=0;

img=cvLoadImage(fileName);

img)printf("

fileName);

∙显示图像:

img);

可显示彩色或灰度的字节/浮点图像。

 

彩色图像数据认定为BGR顺序.

∙关闭窗口:

cvDestroyWindow("

∙改变窗口尺寸:

cvResizeWindow("

100,100);

//新的宽/高值(象素点)

输入设备 

∙响应鼠标事件:

o定义鼠标handler:

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

switch(event){

caseCV_EVENT_LBUTTONDOWN:

if(flags&

CV_EVENT_FLAG_CTRLKEY)

LeftbuttondownwithCTRLpressed\n"

break;

caseCV_EVENT_LBUTTONUP:

Leftbuttonup\n"

//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("

mouseHandler,&

mouseParam);

∙响应键盘事件:

o键盘没有事件handler.

o直接获取键盘操作:

intkey;

key=cvWaitKey(10);

//输入等待10ms

o等待按键并获取键盘操作:

key=cvWaitKey(0);

//无限等待键盘输入

o键盘输入循环:

while

(1){

if(key==27)break;

switch(key){

case'

h'

:

...

i'

∙处理滚动条事件:

o定义滚动条handler:

voidtrackbarHandler(intpos)

Trackbarposition:

%d\n"

pos);

inttrackbarVal=25;

intmaxVal=100;

cvCreateTrackbar("

bar1"

"

&

trackbarVal,maxVal,trackbarHandler);

o获取滚动条当前位置:

intpos=cvGetTrackbarPos("

"

o设定滚动条位置:

cvSetTrackbarPos("

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-维数组

|--intdims;

//数组维数

||--uchar*ptr;

||--short*s;

||--int*i;

||--float*fl;

||--double*db;

|--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);

img);

∙复制图像:

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.

读取存储图像

∙从文件中载入图像:

Supportedimageformats:

BMP,DIB,JPEG,JPG,JPE,PNG,PBM,PGM,PPM,

SR,RAS,TIFF,TIF

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

img=cvLoadImage(fileName,flag);

flag:

>

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

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

<

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

∙图像存储为图像文件:

cvSaveImage(outFileName,img))printf("

Couldnotsave:

outFileName);

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

存取图像元素

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

∙间接存取:

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

o对单通道字节图像:

CvScalars;

s=cvGet2D(img,i,j);

//getthe(i,j)pixelvalue

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);

B=%f,G=%f,R=%f\n"

s.val[0],s.val[1],s.val[2]);

s.val[1]=111;

s.val[2]=111

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

当前位置:首页 > 解决方案 > 学习计划

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

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