⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 opencv-intro.tex.svn-base

📁 opencv 中科院数字图像处理入门教程
💻 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 + -