📄 opencv-intro.tex.svn-base
字号:
\documentclass[cjk]{beamer}\usepackage{CJK}\usetheme{Warsaw}\begin{document}\begin{CJK}{GBK}{kai}\pgfdeclareimage[height=.25cm]{logo}{fsa-logo}\logo{\pgfuseimage{logo}}\title[OpenCV]{使用OpenCV进行图像处理}\author[于仕琪]{于仕琪\\shiqi.yu@gmail.com}\date{2006年3月15日} \frame{\titlepage} %\section*{提纲}\frame{\tableofcontents}\setlength{\parskip}{+7pt}\section{OpenCV简介}\frame{ \frametitle{\secname} OpenCV = Intel(c) Open Source Computer Vision Library 包含了几百个图像处理和计算机视觉方面的C语言函数 OpenCV的几个显著特点: \begin{itemize} \item 跨平台:Windows,Linux \item 免费,无论非商业还是商业应用 \item 速度快 \item 使用方便 \end{itemize}}\begin{frame}[fragile] \frametitle{一个小例子}\begin{example}[读副图像,并显示:ex01.c]\begin{verbatim}#include "cv.h"#include "highgui.h"int main( int argc, char** argv ){ IplImage* pImg; //声明IplImage指针 //载入图像 if( argc == 2 && (pImg = cvLoadImage( argv[1], 1)) != 0 ) { cvNamedWindow( "Image", 1 );//创建窗口 cvShowImage( "Image", pImg );//显示图像\end{verbatim}\end{example}\end{frame}\begin{frame}[fragile] \frametitle{例子一}\begin{example}[读入一副图像,并显示]\begin{verbatim} cvWaitKey(0); //等待按键 cvDestroyWindow( "Image" );//销毁窗口 cvReleaseImage( &pImg ); //释放图像 return 0; } return -1;}\end{verbatim}\end{example}\end{frame}%\section{几个重要数据结构}\subsection{图像结构}\frame{ \frametitle{\subsecname:IplImage} 图像:二维(单通道)或者三维(多通道)的矩阵。\\ \pause 在OpenCV中,图像数据结构类行为IplImage,其定义如下图: \begin{center} \includegraphics[width=0.5\textwidth]{iplimage.pdf} \end{center} 支持的像素深度:IPL\_DEPTH\_8U, ...8S, ...16U, ...16S, ...32S, ...32F和...64F}\subsection{矩阵结构}\frame{ \frametitle{\subsecname:CvMat} CvMat是二维矩阵数据结构,结构内元素如下: \begin{itemize} \item $int\;\;\; rols$ 行数 \item $int\;\;\; cols$ 列数 \item $union\;\;\; data$ 可以是$uchar*$,$short*$,$int*$,$float*$,$double*$ \item $\cdots$ \end{itemize}矩阵结构除了 CvMat, 还有 CvMatND (多维矩阵), CvSparseMat (稀疏矩阵) }\subsection{点结构}\frame{ \frametitle{\subsecname:CvPoint} CvPoint结构很简单,只有两个: \begin{itemize} \item $int\;\;\; x$ \item $int\;\;\; y$ \end{itemize}其他点结构:CvPoint2D32f,CvPoint3D32f }\section{图像I/O和显示}\frame{ \frametitle{图像I/O} \begin{block}{cvLoadImage} IplImage* cvLoadImage( const char* filename, int iscolor=1 ) \\ 支持的图像格式有:BMP, JPEG, PNG, PBM, PGM, PPM, SR, TIFF \end{block}\pause \begin{block}{cvSaveImage} int cvSaveImage( const char* filename, const CvArr* image )\\ \begin{itemize} \item CvArr可以是IplImage, cvMat, cvSeq。参数image类型在这个函数里只可能是IplImage或者CvMat。\\ \item 保存的图像文件格式由filename的扩展名确定。 \item 只有8bit的单通道或者3通道(只可BGR顺序)的图像可以被保存,不支持alpha通道。 \end{itemize} \end{block}}\frame{ \frametitle{创建IplImage} \begin{block}{cvCreateImage} IplImage* cvCreateImage( CvSize size, int depth, int channels )\\ 这个函数等价于:\\ header = cvCreateImageHeader(size,depth,channels);\\ cvCreateData(header);\\ \end{block}\pause \begin{block}{其他相关函数} cvReleaseImage \\ cvCreateMat\\ cvReleaseMat\\ cvCloneImage\\ cvClonemat \end{block}}\frame{ \frametitle{窗口与图像显示} \begin{block}{GUI函数} cvNamedWindow:创建窗口\\ cvDestroyWindow:销毁窗口 \\ cvShowImage:显示图像 \end{block}\pause \begin{block}{cvWaitKey} int cvWaitKey( int delay=0 )\\ 等待按键。如果delay$\leq$0,那么无限等待;否则则等待delay毫秒则返回。\\ 在程序循环中,有时候由于程序一直处于计算中,窗口无法重恢(比如读出视频中的所有帧并显示),可以加入cvWaitKey,使之程序等待几毫秒,让窗口完成重绘再执行其他操作。 \end{block}}\begin{frame}[fragile] \frametitle{例子二}\begin{example}[读/写图像,显示图像:ex02.c]\begin{verbatim}int main( int argc, char** argv ){ IplImage* pImg; //声明IplImage指针 //载入图像,强制转化为Gray if( argc == 3 && (pImg = cvLoadImage( argv[1], 0)) != 0 ) { IplImage* pImg2 = cvCreateImage(cvGetSize(pImg), pImg->depth, pImg->nChannels); cvCopy(pImg, pImg2, NULL); cvSaveImage(argv[2], pImg2);//把图像写入文件\end{verbatim}\end{example}\end{frame}\begin{frame}[fragile] \frametitle{例子二}\begin{example}[读/写图像,显示图像:ex02.c]\begin{verbatim} cvNamedWindow( "Image", 1 );//创建窗口 cvShowImage( "Image", pImg );//显示图像 cvWaitKey(0); //等待按键 cvDestroyWindow( "Image" );//销毁窗口 cvReleaseImage( &pImg ); //释放图像 return 0; } return -1;}\end{verbatim}\end{example}\end{frame}\section{图像处理}\subsection{Canny边缘检测}\frame{ \frametitle{\subsecname} \begin{block}{cvCanny} void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture\_size=3 ); \end{block} 例子三: \pause 其他常用图像处理函数:cvSobel, cvLaplace, cvResize, cvErode, cvDilate, cvSmooth, cvThreshold, $ \cdots $}\subsection{轮廓(Contour)检测}\frame{ \frametitle{\subsecname} \begin{center} \includegraphics[width=0.3\textwidth]{silh.png} $ $ \includegraphics[width=0.3\textwidth]{contour.png} \end{center} 如何快速检测轮廓的外边缘和内边缘?}\frame{ \frametitle{\subsecname} \begin{block}{cvFindContours} int cvFindContours( CvArr* image, CvMemStorage* storage, \\ $\;\;\;\;$ CvSeq** first\_contour, int header\_size=sizeof(CvContour),\\ $\;\;\;\;$ int mode=CV\_RETR\_LIST, int method=CV\_CHAIN\_APPROX\_SIMPLE,\\ $\;\;\;\;$ CvPoint offset=cvPoint(0,0) ); \end{block} 宏CV\_GET\_SEQ可以读出轮廓中的任意一个点 \begin{block}{GET\_ELEMENT} CV\_GET\_SEQ\_ELEM( TYPE, seq, index ) $\Longleftrightarrow$ (TYPE*)cvGetSeqElem( (CvSeq*)(seq), (index) ) \end{block} 例子四:}\section{视频处理}\subsection{视频I/O}\frame{ \frametitle{\subsecname}打开视频文件,摄像头 \begin{block}{cvCaptureFromFile/cvCaptureFromCAM} CvCapture* cvCaptureFromFile( const char* filename ); CvCapture* cvCaptureFromCAM( int index ); \end{block}CvCapture结构需要用cvReleaseCapture函数释放。}\frame{ \frametitle{\subsecname}从视频或者摄像头中读取一帧 \begin{block}{Grab/Retrieve/Query Frame} int cvGrabFrame( CvCapture* capture ); 抓取一帧,并存贮于内部 IplImage* cvRetrieveFrame( CvCapture* capture ); 把Grab的帧取出(返回的图像不可被用户释放) IplImage* cvQueryFrame( CvCapture* capture ); $\Longleftrightarrow$ cvGrabFrame $+$ cvRetrieveFrame \end{block}\pause设计cvGrabFrame是为了快速遍历视频中的帧,或者同步多个摄像头。}\frame{ \frametitle{\subsecname} 将图像序列写入视频文件 \begin{block}{Video write}CvVideoWriter* cvCreateVideoWriter($\cdots$); \\int cvWriteFrame( CvVideoWriter* writer, const IplImage* image ); \end{block}}\subsection{背景建模}\frame{ \frametitle{\subsecname} 检测出一个视频中的运动物体流程: 每读入一帧$M_C$(cvQueryFrame) \begin{itemize} \item 对当前帧进行平滑;(cvSmooth) \item 当前帧$M_C$跟背景$M_B$相减,求差值$M_D$;(cvAbsDiff) \item 二值化$M_D$ ;(cvThreshold) \item 形态学操作过滤噪声;(cvErode,cvDilate) \item 更新背景。(cvRunningAvg) \end{itemize}例子五:}\section{其他}\subsection{OpenCV全观}\frame{ \frametitle{\subsecname} 目前OpenCV包含如下几个部分: \begin{itemize} \item cxcore:一些基本函数(各种数据类型的基本运算等) \item cv:图像处理和计算机视觉功能(图像处理,结构分析,运动分析,物体跟踪,模式识别,摄像机定标) \item cvaux:一些实验性的函数(View Morphing,三维跟踪,PCA,HMM) \item highgui:用户交互部分(GUI,图像视频I/O,系统调用函数) \end{itemize}另外还有cvcam,不过linux版本中已经抛弃。Windows版本中将DirectX支持加入highgui后,cvcam将被彻底去掉。在未来OpenCV版本中,可能对cv进行更细的划分。}\subsection{相关资料}\frame{ \frametitle{\subsecname} \begin{itemize} \item 项目主页:https://sourceforge.net/projects/opencvlibrary \item Mail list: http://groups.yahoo.com/group/OpenCV \item 中文论坛:http://www.assuredigit.com/forum \item 中文文档:http://fsa.ia.ac.cn/?q=node/87 \end{itemize}}\subsection{关于我}\frame{ \frametitle{\subsecname} 于仕琪 Email: shiqi.yu@gmail.com 主页:http://www.ia.ac.cn/personal/shiqi.yu 中科院自动化所自由软件协会}\end{CJK}\end{document}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -