200 likes | 492 Views
Introduce to OpenCV. 主讲:刘明友 2008 年 10 月 14 日. OpenCV 简介 图像结构 矩阵结构 点结构 图像 I/O 基本使用 图像处理 打开并显示图像 仿射变换 Canny 边缘检测 角点检测 其他 相关资料 演示程序. O penCV 简介. OpenCV = Intel Open Source Computer Vision Library 由一系列 C 函数和少量 C++ 类构成,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV的几个显著特点:
E N D
Introduce to OpenCV 主讲:刘明友 2008年10月14日
OpenCV简介 • 图像结构 • 矩阵结构 • 点结构 • 图像I/O • 基本使用 • 图像处理 • 打开并显示图像 • 仿射变换 • Canny边缘检测 • 角点检测 • 其他 • 相关资料 • 演示程序
OpenCV简介 • OpenCV = Intel Open Source Computer Vision Library 由一系列C函数和少量C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。 • OpenCV的几个显著特点: • 跨平台:Windows,Linux • 免费,无论非商业还是商业 • 速度快 • 使用方便
OpenCV简介 • 目前OpenCV包含如下几个部分: • CxCore:一些基本函数(各种数据类型的基本运算等) • Cv: 图像处理和计算机视觉功能(图像处理,结构分析,运动分析,物体跟踪,模式识别,摄像机定标) • ml:机器学习模块 • CvAux:一些实验性的函数(View Morphing,三维跟踪,PCA,HMM) • HighGui:用户交互部分(GUI,图像视频I/O,系统调用函数)
图像结构:IplImage • 图像:二维(单通道)或者三维(多通道)的矩阵 • 在OpenCV中,图像数据结构类行为IplImage,其定义如下图: • 支持的像素深度:IPL_DEPTH_8U,…8S,…16U,…16S,…32S,…32F和…64F
矩阵结构:CvMat • CvMat是二维矩阵数据结构: • int rols 行数 • int cols 列数 • union data 可以是uchar*,short*,int*,float*,double* • 矩阵结构还有CvMatND(多维矩阵),CvSparseMat(稀疏矩阵)
点结构:CvPoint • CvPoint结构很简单,只有两个: • int x • int y • 其他点结构:CvPoint2D32f,CvPoint3D32f
图像I/O • cvLoadImage • IplImage* cvLoadImage(const char* filename,int iscolor=1) • 支持的图像格式有:BMP,JPEG,PNG,PGM,PPM,SR,TIFF,JPEG2000 • cvSaveImage • int cvSaveImage(const char* filename,const cvArr* image)
基本使用 • 创建IplImage • IplImage* cvCreateImage(CvSize size,int depth,int channels) • 释放IplImage • void cvReleaseImage(IplImage** image)
基本使用 • 窗口和图像显示: • 创建窗口 • int cvNamedWindow( const char* name, int flags=CV_WINDOW_AUTOSIZE ) • 销毁窗口 • void cvDestroyWindow( const char* name ) • 显示图像 • void cvShowImage( const char* name, const CvArr* image )
图像处理:打开并显示图像 • 在Visual C++ 6.0下新建一个单文档的应用程序,命名为:OpenCVtest。 • 在文档类添加如下变量: • int width; //图像宽度 • int height; //图像高度 • IplImage* pSrcImg; //图像指针 • CvvImage img; //CvvImage类变量 • 在文档类添加如下头文件: • #include "cv.h" • #include "highgui.h"
打开并显示图像 • 在文档类函数OnOpenDocument中添加如下代码: • BOOL COpenCVtestDoc::OnOpenDocument(LPCTSTR lpszPathName) • { • if (!CDocument::OnOpenDocument(lpszPathName)) • return FALSE; • img.Load(lpszPathName); //载入图像 • width = img.Width(); //获取图像宽度 • height = img.Height(); //获取图像高度 • pSrcImg = cvCreateImage(cvSize(width, height), 8, 1); //创建图像 • pSrcImg = img.GetImage(); //得到图像 • return TRUE; • }
打开并显示图像 • 在视图类函数OnDraw添加如下代码: • void COpenCVtestView::OnDraw(CDC* pDC) • { • COpenCVtestDoc* pDoc = GetDocument(); • ASSERT_VALID(pDoc); • pDoc->img.CopyOf(pDoc->pSrcImg,1); • CRect rect; //显示区域 • GetClientRect(rect); • rect.bottom = pDoc->img.Height(); • rect.right = pDoc->img.Width(); • pDoc->img.DrawToHDC(pDC->m_hDC, rect);//显示 • }
仿射变换 • 仿射变换表达式: • 在资源视图插入一个对话框AFDIALOG,加入六个EDIT控件,为每个控件映射一个变量: • float m_xs; //x方向缩放 • float m_ys; //y方向缩放 • float m_xoff; //x方向位移量 • float m_yoff; //y方向位移量 • float m_xr; //x方向旋转 • float m_yr; //y方向旋转
仿射变换 • 在资源视图新建菜单并在视图类添加该菜单的响应事件 • 添加如下代码: • void COpenCVtestView::OnAffinetran() • { • width = GetDocument()->width; //图像宽度 • height = GetDocument()->height; //图像高度 • IplImage* src = NULL; //新建源图像指针 • IplImage* dst = NULL; //新建仿射变换图像指针 • src = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);//创建图像 • cvCopy(GetDocument()->pSrcImg,src); //从文档获取图像 • dst = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3);//创建图像 • float m[6]; // Matrix m • CvMat M = cvMat (2, 3, CV_32F, m); //初始化矩阵
CDialogAffine dlg; //创建dialog • if (dlg.DoModal() != IDOK) • { • return ; • } • //获取参数 • m[0]=dlg.m_xs; • m[1]=dlg.m_xr; • m[3]=dlg.m_yr; • m[4]=dlg.m_ys; • m[2]=dlg.m_xoff; • m[5]=dlg.m_yoff; • delete dlg; //销毁dialog • cvWarpAffine(src,dst,&M,CV_INTER_NN+CV_WARP_FILL_OUTLIERS,cvScalarAll(255)); //进行仿射变换 • cvNamedWindow(“仿射图像”,1);//新建窗口 • cvShowImage(“仿射图像”,dst);//在窗口显示图像 • cvReleaseImage(&src);//释放图像指针 • cvReleaseImage(&dst); • }
Canny边缘检测 • 在资源视图新建菜单并在视图类添加该菜单的响应事件并添加如下代码: • void COpenCVtestView::OnCannyEdge() • { • width = GetDocument()->width; • height = GetDocument()->height; • IplImage* gray; • IplImage* edge; • gray = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 1); • edge = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 1); • cvCvtColor(GetDocument()->pSrcImg, gray, CV_RGB2GRAY); • cvCanny(gray, edge, 30, 150, 3);//Canny边缘检测 • cvNamedWindow("Canny 边缘",1); • cvShowImage("Canny 边缘",edge); • cvReleaseImage(&gray); • cvReleaseImage(&edge); • }
角点检测 • 在资源视图新建菜单并在视图类添加该菜单的响应事件并添加如下代码: • void COpenCVtestView::OnCornerdetect() • { • width = GetDocument()->width; • height = GetDocument()->height; • int cornerCount=max_corners;//#define max_corners 100 最多角点数目 • CvPoint2D32f corners[max_corners];//用来保存角点坐标 • IplImage *srcImage = NULL, *grayImage = NULL, *corners1 = NULL, *corners2 = NULL; • int i; • CvScalar color = CV_RGB(255,0,0);//红色,用来标志角点 • srcImage = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3); • cvCopy(GetDocument()->pSrcImg,srcImage); • grayImage = cvCreateImage(cvSize(width,height), IPL_DEPTH_8U, 1); • cvCvtColor(srcImage, grayImage, CV_BGR2GRAY);
corners1= cvCreateImage(cvSize(width,height), IPL_DEPTH_32F, 1); • corners2= cvCreateImage(cvSize(width,height),IPL_DEPTH_32F, 1); • cvGoodFeaturesToTrack (grayImage, corners1, corners2, corners, • &cornerCount, 0.25, 4, NULL); //角点检测 • if(cornerCount>0) //用圆来标志角点 • { • for (i=0; i<cornerCount; i++) • { • cvCircle(srcImage, cvPoint((int)(corners[i].x), (int)(corners[i].y)), 1, • color, 2, CV_AA, 0); • } • } • cvNamedWindow("角点",1); • cvShowImage("角点",srcImage); • cvReleaseImage(&srcImage); • cvReleaseImage(&grayImage); • cvReleaseImage(&corners1); • cvReleaseImage(&corners2); • }
其他 • 相关资料 • OpenCV中文网址:http://www.opencv.org.cn • 演示程序