OPENCV初级教程及范例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
http://www.intel.com/technology/computing/opencv/ o 软件下载: http://sourceforge.net/projects/opencvlibrary/
书籍: o Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006).
C 程序实例
///////////////////////////////////////////////////////////////////// /// // // hello-world.cpp // // 一个简单的 OpenCV 程序 // 它从一个文件中读取图像,将色彩值颠倒,并显示结果. // ///////////////////////////////////////////////////////////////////// /// #include <stdlib.h> #include <stdio.h>
mouseParam=5; cvSetMouseCallback("win1",mouseHandler,&mouseParam);
响应键盘事件: o 键盘没有事件 handler. o 直接获取键盘操作:
int key; key=cvWaitKey(10); // 输入等待 10ms
o 等待按键并获取键盘操作:
读入图像:
IplImage* img=0; img=cvLoadImage(fileName); if(!img) printf("Could not load image file: %s\n",fileName);
显示图像:
cvShowImage("win1",img);
可显示彩色或灰度的字节/浮点图像。 彩色图像数据认定为 BGR 顺序.
特性: o 图像数据操作 (分配,释放, 复制, 设定, 转换). o 图像与视频 I/O (基于文件/摄像头输入, 图像/视频文件输出). o 矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解 SVD). o 各种动态数据结构(列表, 队列, 集, 树, 图). o 基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态 操作, 直方图, 图像金字塔). o 结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough 转换, 多边 形近似, 线性拟合, 椭圆拟合, Delaunay 三角化). o 摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography 估计, 立体匹配). o 动作分析(光流, 动作分割, 跟踪). o 对象辨识 (特征方法, 隐马可夫链模型 HMM). o 基本 GUI(显示图像/视频, 键盘鼠标操作, 滚动条). o 图像标识 (直线, 圆锥, 多边形, 文本绘图)
// 显示图像 cvShowImage("mainWin", img );
// wait for a key cvWaitKey(0);
// release the image cvReleaseImage(&img ); return 0; }
GUI 命令
窗口管理
创建并放置一个窗口:
cvNamedWindow("win1", CV_WINDOW_AUTOSIZE); cvMoveWindow("win1", 100, 100); // 以屏幕左上角为起点的偏移量
// 创建窗口 cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin", 100, 100);
// 反色图像 for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++) data[i*step+j*channels+k]=255-data[i*step+j*chLeabharlann Baidunnels+k];
关闭窗口:
cvDestroyWindow("win1");
改变窗口尺寸:
cvResizeWindow("win1",100,100); // 新的宽/高值(象素点)
输入设备
响应鼠标事件: o 定义鼠标 handler:
void mouseHandler(int event, int x, int y, int flags, void* param) { switch(event){ case CV_EVENT_LBUTTONDOWN: if(flags & CV_EVENT_FLAG_CTRLKEY) printf("Left button down with CTRL pressed\n"); break;
// 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:
图像处理 o 创建与释放图像结构空间 o 读入与存储图像 o 读取图像元素 o 图像转换 o 绘图命令
矩阵操作
o 创建与释放矩阵结构空间 o 读取矩阵元素 o 矩阵/向量操作
视频序列处理 o 从视频序列中抓取一帧 o 获取/设定帧信息 o 存储视频文件
简介
OpenCV 概述
什么是 OpenCV o 开源 C/C++计算机视觉库. o 面向实时应用进行优化. o 跨操作系统/硬件/窗口管理器. o 通用图像/视频载入、存储和获取. o 由中、高层 API 构成. o 为 Intel®公司的 Integrated Performance Primitives (IPP) 提供了透明 接口.
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_<bit_depth>(S|U|F)
if(argc<2){ printf("Usage: main <image-file-name>\n\7"); exit(0); }
// 载入图像 img=cvLoadImage(argv[1]); if(!img){ printf("Could not load image file: %s\n",argv[1]); exit(0); }
OpenCV 编程入门
美国伊力诺理工学院计算机科学系 Gady Adam 翻译:Mensch
2006 年 11 月 22 日
内容
简介 o OpenCV 概述 o 资料链接 o OpenCV 命名约定 o 编译命令 o C 程序实例
GUI 命令 o 窗口管理 o 输入设备
OpenCV 基础数据结构 o 图像数据结构 o 矩阵与向量 o 其他数据结构
例: IPL_DEPTH_8U 表示一个 8 位无符号图像. IPL_DEPTH_32F 表示一个 32 位浮点数图像.
头文件:
#include <cv.h> #include <cvaux.h> #include <highgui.h> #include <cxcore.h> // 不必要 - 该头文件已在 cv.h 文件中包含
#include <math.h> #include <cv.h> #include <highgui.h>
int main(int argc, char *argv[]) { IplImage* img = 0; int height,width,step,channels; uchar *data; int i,j,k;
编译命令
Linux 系统:
g++ hello-world.cpp -o hello-world \ -I /usr/local/include/opencv -L /usr/local/lib \ -lm -lcv -lhighgui -lcvaux
Windows 系统:
注意在项目属性中设好 OpenCV 头文件以及库文件的路径.
视频处理例程 (位于 <opencv-root>/samples/c/目录中): o 色彩跟踪: camshiftdemo o 点跟踪: lkdemo o 动作分割: motempl o 边缘检测: laplace
图像处理例程(位于<opencv-root>/samples/c/目录中): o 边缘检测: edge o 分割: pyramid_segmentation o 形态: morphology o 直方图: demhist o 距离转换: distrans o 椭圆拟合 fitellipse
int key; key=cvWaitKey(0); // 无限等待键盘输入
o 键盘输入循环:
while(1){ key=cvWaitKey(10); if(key==27) break;
switch(key){ case 'h': ... break; case 'i': ... break; } }
OpenCV 模块: o cv - OpenCV 主要函数. o cvaux - 辅助 (实验性) OpenCV 函数. o cxcore - 数据结构与线性代数算法. o highgui - GUI 函数.
资料链接
参考手册:
o <opencv-root>/docs/index.htm
网络资源: o 官方网页:
case CV_EVENT_LBUTTONUP: printf("Left button up\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:
// 获取图像数据 height = img->height; width = img->width; step = img->widthStep; channels = img->nChannels; data = (uchar *)img->imageData; printf("Processing a %dx%d image with %d channels\n",height,width,channels);
处理滚动条事件: o 定义滚动条 handler:
void trackbarHandler(int pos) { printf("Trackbar position: %d\n",pos); }
o 注册 handler:
int trackbarVal=25; int maxVal=100; cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler);
书籍: o Open Source Computer Vision Library by Gary R. Bradski, Vadim Pisarevsky, and Jean-Yves Bouguet, Springer, 1st ed. (June, 2006).
C 程序实例
///////////////////////////////////////////////////////////////////// /// // // hello-world.cpp // // 一个简单的 OpenCV 程序 // 它从一个文件中读取图像,将色彩值颠倒,并显示结果. // ///////////////////////////////////////////////////////////////////// /// #include <stdlib.h> #include <stdio.h>
mouseParam=5; cvSetMouseCallback("win1",mouseHandler,&mouseParam);
响应键盘事件: o 键盘没有事件 handler. o 直接获取键盘操作:
int key; key=cvWaitKey(10); // 输入等待 10ms
o 等待按键并获取键盘操作:
读入图像:
IplImage* img=0; img=cvLoadImage(fileName); if(!img) printf("Could not load image file: %s\n",fileName);
显示图像:
cvShowImage("win1",img);
可显示彩色或灰度的字节/浮点图像。 彩色图像数据认定为 BGR 顺序.
特性: o 图像数据操作 (分配,释放, 复制, 设定, 转换). o 图像与视频 I/O (基于文件/摄像头输入, 图像/视频文件输出). o 矩阵与向量操作与线性代数计算(相乘, 求解, 特征值, 奇异值分解 SVD). o 各种动态数据结构(列表, 队列, 集, 树, 图). o 基本图像处理(滤波, 边缘检测, 角点检测, 采样与插值, 色彩转换, 形态 操作, 直方图, 图像金字塔). o 结构分析(连接成分, 轮廓处理, 距离转换, 模板匹配, Hough 转换, 多边 形近似, 线性拟合, 椭圆拟合, Delaunay 三角化). o 摄像头标定 (寻找并跟踪标定模板, 标定, 基础矩阵估计, homography 估计, 立体匹配). o 动作分析(光流, 动作分割, 跟踪). o 对象辨识 (特征方法, 隐马可夫链模型 HMM). o 基本 GUI(显示图像/视频, 键盘鼠标操作, 滚动条). o 图像标识 (直线, 圆锥, 多边形, 文本绘图)
// 显示图像 cvShowImage("mainWin", img );
// wait for a key cvWaitKey(0);
// release the image cvReleaseImage(&img ); return 0; }
GUI 命令
窗口管理
创建并放置一个窗口:
cvNamedWindow("win1", CV_WINDOW_AUTOSIZE); cvMoveWindow("win1", 100, 100); // 以屏幕左上角为起点的偏移量
// 创建窗口 cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin", 100, 100);
// 反色图像 for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++) data[i*step+j*channels+k]=255-data[i*step+j*chLeabharlann Baidunnels+k];
关闭窗口:
cvDestroyWindow("win1");
改变窗口尺寸:
cvResizeWindow("win1",100,100); // 新的宽/高值(象素点)
输入设备
响应鼠标事件: o 定义鼠标 handler:
void mouseHandler(int event, int x, int y, int flags, void* param) { switch(event){ case CV_EVENT_LBUTTONDOWN: if(flags & CV_EVENT_FLAG_CTRLKEY) printf("Left button down with CTRL pressed\n"); break;
// 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:
图像处理 o 创建与释放图像结构空间 o 读入与存储图像 o 读取图像元素 o 图像转换 o 绘图命令
矩阵操作
o 创建与释放矩阵结构空间 o 读取矩阵元素 o 矩阵/向量操作
视频序列处理 o 从视频序列中抓取一帧 o 获取/设定帧信息 o 存储视频文件
简介
OpenCV 概述
什么是 OpenCV o 开源 C/C++计算机视觉库. o 面向实时应用进行优化. o 跨操作系统/硬件/窗口管理器. o 通用图像/视频载入、存储和获取. o 由中、高层 API 构成. o 为 Intel®公司的 Integrated Performance Primitives (IPP) 提供了透明 接口.
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_<bit_depth>(S|U|F)
if(argc<2){ printf("Usage: main <image-file-name>\n\7"); exit(0); }
// 载入图像 img=cvLoadImage(argv[1]); if(!img){ printf("Could not load image file: %s\n",argv[1]); exit(0); }
OpenCV 编程入门
美国伊力诺理工学院计算机科学系 Gady Adam 翻译:Mensch
2006 年 11 月 22 日
内容
简介 o OpenCV 概述 o 资料链接 o OpenCV 命名约定 o 编译命令 o C 程序实例
GUI 命令 o 窗口管理 o 输入设备
OpenCV 基础数据结构 o 图像数据结构 o 矩阵与向量 o 其他数据结构
例: IPL_DEPTH_8U 表示一个 8 位无符号图像. IPL_DEPTH_32F 表示一个 32 位浮点数图像.
头文件:
#include <cv.h> #include <cvaux.h> #include <highgui.h> #include <cxcore.h> // 不必要 - 该头文件已在 cv.h 文件中包含
#include <math.h> #include <cv.h> #include <highgui.h>
int main(int argc, char *argv[]) { IplImage* img = 0; int height,width,step,channels; uchar *data; int i,j,k;
编译命令
Linux 系统:
g++ hello-world.cpp -o hello-world \ -I /usr/local/include/opencv -L /usr/local/lib \ -lm -lcv -lhighgui -lcvaux
Windows 系统:
注意在项目属性中设好 OpenCV 头文件以及库文件的路径.
视频处理例程 (位于 <opencv-root>/samples/c/目录中): o 色彩跟踪: camshiftdemo o 点跟踪: lkdemo o 动作分割: motempl o 边缘检测: laplace
图像处理例程(位于<opencv-root>/samples/c/目录中): o 边缘检测: edge o 分割: pyramid_segmentation o 形态: morphology o 直方图: demhist o 距离转换: distrans o 椭圆拟合 fitellipse
int key; key=cvWaitKey(0); // 无限等待键盘输入
o 键盘输入循环:
while(1){ key=cvWaitKey(10); if(key==27) break;
switch(key){ case 'h': ... break; case 'i': ... break; } }
OpenCV 模块: o cv - OpenCV 主要函数. o cvaux - 辅助 (实验性) OpenCV 函数. o cxcore - 数据结构与线性代数算法. o highgui - GUI 函数.
资料链接
参考手册:
o <opencv-root>/docs/index.htm
网络资源: o 官方网页:
case CV_EVENT_LBUTTONUP: printf("Left button up\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:
// 获取图像数据 height = img->height; width = img->width; step = img->widthStep; channels = img->nChannels; data = (uchar *)img->imageData; printf("Processing a %dx%d image with %d channels\n",height,width,channels);
处理滚动条事件: o 定义滚动条 handler:
void trackbarHandler(int pos) { printf("Trackbar position: %d\n",pos); }
o 注册 handler:
int trackbarVal=25; int maxVal=100; cvCreateTrackbar("bar1", "win1", &trackbarVal ,maxVal , trackbarHandler);