OpenCV学习笔记: 快速入门例程

  先期基础:

————————— 

Main函数参数argc,argv说明
C/C++语言中的main函数,经常带有参数argc,argv,如下:
int main(int argc, char** argv)
int main(int argc, char* argv[])
这两个参数的作用: argc 是指命令行输入参数的个数(以空白符分隔) argv存储了所有的命令行参数 假如你的程序是hello.exe,如果在命令行运行该程序,(首先应该在命令行下用 cd 命令进入到 hello.exe 文件所在目录) 运行命令为:
hello.exe Shiqi Yu
那么,argc的值是 3,argv[0]是"hello.exe",argv[1]是"Shiqi",argv[2]是"Yu"。
 


—————————————————————————————

 OpenCV模块

自opencv2.2开始,opencv库便被划分为多个模块。这些模块编译成库文件后,位于lib文件夹中。
  • opencv_core 包含核心功能,尤其是底层数据结构和算法函数
  • opencv_imgproc 包含图像处理函数
  • opencv_highgui 包含读写图像及视频的函数,以及操作图形用户界面函数
  • opencv_features2d 包含兴趣点检测子、描述子以及兴趣点匹配框架
  • opencv_calib3d 包含相机标定,双目几何估算以及立体视觉函数
  • opencv_video 包含运动估算、特征跟踪以及前景提取函数与类
  • opencv_objectect 包括物体检测函数,如脸部与行人检测
———————————————————

OpenCV 命名规则


(1) 函数名:
   cvActionTargetMod(...) 

   Action = 核心功能(core functionality) (e.g. set, create)
   Target = 目标图像区域(target image area) (e.g. contour, polygon)
   Mod    = (可选的)调整语(optional modifiers) (e.g. argument type)


(2) 矩阵数据类型:
   CV_<bit_depth>(S|U|F)C<number_of_channels> 

   S = 符号整型
   U = 无符号整型
   F = 浮点型 
   E.g. :  CV_8UC1 是指一个8位无符号整型单通道矩阵, 
             CV_32FC2是指一个32位浮点型双通道矩阵.


(3) 图像数据类型:
   IPL_DEPTH_<bit_depth>(S|U|F) 
  
 E.g.: IPL_DEPTH_8U 图像像素数据是8位无符号整型.
         IPL_DEPTH_32F图像像素数据是32位浮点型.


(4) 头文件:
    #include <cv.h>
    #include <cvaux.h>
    #include <highgui.h>  
    #include <ml.h>
    #include <cxcore.h>   // 一般不需要,cv.h 内已包含该头文件
_________________________________________________

指向const对象的指针:

若指针指向const对象,则不允许使用指针来改变其所指的const值。

为了保证这个特性,C++强制要求指向const对象的指针也必须具有const特性

const double * cptr;(


  1.  const char *pstrImageName = "c:\\Baboon.jpg"
)

这里的cptr是一个指向double类型const对象的指针,const限定了cptr指针所指向的对象类型,而并非cptr本身,即cptr本身并不是const。在定义时不需要对它进行初始化,若需要允许给cptr重新赋值,使其指向另一个const对象,但不能通过cptr修改其所指向对象的值。

在实际应用中,指向const的指针常用作函数的形参,将形参定义为指向const的指针以确保传递给函数的实际对象在函数中不因为形参而被修改。


第一个例程:很简单,图像的读取和显示

[cpp]  view plain copy
  1.  
  2. #include "stdafx.h"  
  3. #include <string>  
  4. #include <opencv2/opencv.hpp>  
  5.    
  6. using namespace std;  
  7. using namespace cv;  
  8.    
  9. int _tmain(int argc, _TCHAR* argv[])  
  10. {  
  11.     string imagename="c:\\lena.jpg"//要用绝对路径才行  
  12.     //const char* imagename = "c:\\lena.jpg";  
  13.    
  14.     //从文件中读入图像  
  15.     Mat img = imread(imagename);  
  16.    
  17.     //如果读入图像失败  
  18.     if(img.empty())  
  19.     {  
  20.         fprintf(stderr, "Can not load image %s\n", imagename);  
  21.         return -1;  
  22.     }  
  23.    
  24.     //显示图像  
  25.     imshow("image", img);  
  26.    
  27.     //此函数等待按键,按键盘任意键就返回  
  28.     waitKey();  
  29.    
  30.     return 0;  
  31. }  
第二个例程:图像缩放
[cpp]  view plain copy
  1. <span style="font-size:18px">//功能:图像缩放实现  
  2.   
  3. #include <opencv2/opencv.hpp>  
  4.   
  5. using namespace std;  
  6.   
  7. //隐藏控制台窗口  
  8. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
  9.   
  10. int main()  
  11. {  
  12.     const char *pstrImageName = "c:\\Baboon.jpg";  
  13.     const char *pstrSaveImageName = "结果图.jpg";  
  14.     const char *pstrWindowsSrcTitle = "Original image";  
  15.     const char *pstrWindowsDstTitle = "Scaled image";  
  16.       
  17.     double fScale = 0.422;      //缩放倍数  
  18.     CvSize czSize;              //目标图像尺寸  
  19.       
  20.     //从文件中读取图像    
  21.     IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);  
  22.     IplImage *pDstImage = NULL;   
  23.       
  24.     //计算目标图像大小  
  25.     czSize.width = pSrcImage->width * fScale;  
  26.     czSize.height = pSrcImage->height * fScale;  
  27.       
  28.     //创建图像并缩放  
  29.     pDstImage = cvCreateImage(czSize, pSrcImage->depth, pSrcImage->nChannels);  
  30.     cvResize(pSrcImage, pDstImage, CV_INTER_AREA);  
  31.       
  32.     //创建窗口  
  33.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
  34.     cvNamedWindow(pstrWindowsDstTitle, CV_WINDOW_AUTOSIZE);  
  35.       
  36.     //在指定窗口中显示图像  
  37.     cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
  38.     cvShowImage(pstrWindowsDstTitle, pDstImage);  
  39.       
  40.     //等待按键事件  
  41.     cvWaitKey();  
  42.       
  43.     //保存图片  
  44.     cvSaveImage(pstrSaveImageName, pDstImage);  
  45.       
  46.     cvDestroyWindow(pstrWindowsSrcTitle);  
  47.     cvDestroyWindow(pstrWindowsDstTitle);  
  48.     cvReleaseImage(&pSrcImage);  
  49.     cvReleaseImage(&pDstImage);  
  50.     return 0;  
  51. }</span>  

OpenCV学习笔记: 快速入门例程_第1张图片


函数介绍

 cvResize  函数功能:图像大小变换

函数原型:

void cvResize(

  const CvArr* src,

  CvArr* dst,

  int interpolation=CV_INTER_LINEAR

);

函数说明:

第一个参数表示输入图像。第二个参数表示输出图像。第三个参数表示插值方法,可以有以下四种:

CV_INTER_NN - 最近邻插值,

CV_INTER_LINEAR - 双线性插值 (缺省使用)

CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 CV_INTER_NN 方法..

CV_INTER_CUBIC - 立方插值.

 

 cvCreateImage 函数功能:创建图像

函数原型:

IplImage* cvCreateImage(CvSize sizeint depthint channels);

函数说明:

第一个参数表示图像的大小。第二个参数表示图像的深度,可以为IPL_DEPTH_8UIPL_DEPTH_16U等等。第三个参数表示图像的通道数。


第三个例程:图像边缘检测

[cpp]  view plain copy
  1. //图像的Canny边缘检测  
  2.   
  3.   
  4. #include <opencv2/opencv.hpp>  
  5.   
  6. using namespace std;  
  7.   
  8. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
  9.   
  10. IplImage *g_pSrcImage, *g_pCannyImg;  
  11.   
  12. const char *pstrWindowsCannyTitle = "边缘图";  
  13.   
  14. //cvCreateTrackbar的回调函数  
  15. void on_trackbar(int threshold)  
  16. {  
  17.     //canny边缘检测  
  18.     cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * 3, 3);  
  19.     cvShowImage(pstrWindowsCannyTitle, g_pCannyImg);  
  20. }  
  21.   
  22. int main()  
  23. {  
  24.     const char *pstrImageName = "C:\\Fruits.jpg";  
  25.     const char *pstrWindowsSrcTitle = "Original image";  
  26.     const char *pstrWindowsToolBar = "Threshold";  
  27.   
  28.     //从文件中载入图像的灰度图CV_LOAD_IMAGE_GRAYSCALE - 灰度图  
  29.     g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);  
  30.     g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, 1);  
  31.   
  32.     //创建窗口  
  33.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
  34.     cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE);  
  35.   
  36. //创建滑动条  
  37.     int nThresholdEdge = 1;  
  38.     cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, 50, on_trackbar);  
  39.   
  40.     //在指定窗口中显示图像  
  41.     cvShowImage(pstrWindowsSrcTitle, g_pSrcImage);  
  42.     on_trackbar(1);  
  43.   
  44.     //等待按键事件  
  45.     cvWaitKey();  
  46.   
  47.     cvDestroyWindow(pstrWindowsSrcTitle);  
  48.     cvDestroyWindow(pstrWindowsCannyTitle);  
  49.     cvReleaseImage(&g_pSrcImage);  
  50.     cvReleaseImage(&g_pCannyImg);  
  51.     return 0;  
  52. }  

OpenCV学习笔记: 快速入门例程_第2张图片



第四个例程: 图像二值化
[cpp]  view plain copy
  1. <span style="font-size:18px">//图像的二值化  
  2.   
  3. #include <opencv2/opencv.hpp>  
  4. using namespace std;  
  5.   
  6. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
  7.   
  8. IplImage *g_pGrayImage = NULL;  
  9. IplImage *g_pBinaryImage = NULL;  
  10. const char *pstrWindowsBinaryTitle = "Binary Image";  
  11.   
  12. void on_trackbar(int pos)  
  13. {  
  14.     // 转为二值图  
  15.     cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);  
  16.     // 显示二值图  
  17.     cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);  
  18. }  
  19.   
  20. int main( int argc, char** argv )  
  21. {     
  22.     const char *pstrWindowsSrcTitle = "原图";  
  23.     const char *pstrWindowsToolBarName = "二值图阈值";  
  24.   
  25.     // 从文件中加载原图  
  26.     IplImage *pSrcImage = cvLoadImage("C:\\lena.jpg", CV_LOAD_IMAGE_UNCHANGED);  
  27.   
  28.     // 转为灰度图  
  29.     g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);  
  30.     cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);  
  31.   
  32.     // 创建二值图  
  33.     g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);  
  34.   
  35.     // 显示原图  
  36.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
  37.     cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
  38.     // 创建二值图窗口  
  39.     cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);  
  40.   
  41.     // 滑动条    
  42.     int nThreshold = 0;  
  43.     cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);  
  44.   
  45.     on_trackbar(1);  
  46.   
  47.     cvWaitKey(0);  
  48.   
  49.     cvDestroyWindow(pstrWindowsSrcTitle);  
  50.     cvDestroyWindow(pstrWindowsBinaryTitle);  
  51.     cvReleaseImage(&pSrcImage);  
  52.     cvReleaseImage(&g_pGrayImage);  
  53.     cvReleaseImage(&g_pBinaryImage);  
  54.     return 0;  
  55. }</span>  


OpenCV学习笔记: 快速入门例程_第3张图片

第五个例程:轮廓检测

本篇介绍轮廓检测,轮廓检测的原理通俗的说就是掏空内部点,比如原图中有3*3的矩形点。那么就可以将中间的那一点去掉。在OpenCV中使用轮廓检测是非常方便。直接使用cvFindContours函数就能完成对图像轮廓的检测。下面就来看看这个函数的用法。


  cvFindContours 函数功能:对图像进行轮廓检测,这个函数将生成一条链表以保存检测出的各个轮廓信息,并传出指向这条链表表头的指针。

函数原型:

[cpp]  view plain copy
  1. int cvFindContours(CvArr* image, CvMemStorage* storage, CvSeq** first_contour,     
  2.   int header_size=sizeof(CvContour),  
  3.   int mode=CV_RETR_LIST,     
  4.   int method=CV_CHAIN_APPROX_SIMPLE,  
  5.   CvPoint offset=cvPoint(0,0)  
  6. );  

函数说明:

第一个参数表示输入图像,必须为一个8位的二值图像。

第二参数表示存储轮廓的容器。为CvMemStorage类型,定义在OpenCV\core\types_c.h中。

第三个参数为输出参数,这个参数将指向用来存储轮廓信息的链表表头。

第四个参数表示存储轮廓链表的表头大小,当第六个参数传入CV_CHAIN_CODE时,要设置成sizeof(CvChain),其它情况统一设置成sizeof(CvContour)。

第五个参数为轮廓检测的模式,有如下取值:

CV_RETR_EXTERNAL:只检索最外面的轮廓;

CV_RETR_LIST:检索所有的轮廓,并将其保存到一条链表当中;

CV_RETR_CCOMP:检索所有的轮廓,并将他们组织为两层:顶层是各部分的外部边界,第二层是空洞的边界;

CV_RETR_TREE:检索所有的轮廓,并重构嵌套轮廓的整个层次,可以参见下图。

OpenCV学习笔记: 快速入门例程_第4张图片

第六个参数用来表示轮廓边缘的近似方法的,常用值如下所示:

CV_CHAIN_CODE:以Freeman链码的方式输出轮廓,所有其他方法输出多边形(顶点的序列)。

CV_CHAIN_APPROX_SIMPLE:压缩水平的、垂直的和斜的部分,也就是,函数只保留他们的终点部分。

第七个参数表示偏移量,比如你要从图像的(100, 0)开始进行轮廓检测,那么就传入(100, 0)。

 

使用cvFindContours函数能检测出图像的轮廓,将轮廓绘制出来则需要另一函数——cvDrawContours来配合了。下面介绍cvDrawContours函数。

 

  cvDrawContours 函数功能:在图像上绘制外部和内部轮廓

函数原型:

[cpp]  view plain copy
  1. void cvDrawContours( CvArr *img,  
  2.   CvSeq* contour,  
  3.   CvScalar external_color,  
  4.   CvScalar hole_color,  
  5.   int max_level,  
  6.   int thickness=1,  
  7.   int line_type=8,  
  8.   CvPoint offset=cvPoint(0,0));  

第一个参数表示输入图像,函数将在这张图像上绘制轮廓。

第二个参数表示指向轮廓链表的指针。

第三个参数和第四个参数表示颜色,绘制时会根据轮廓的层次来交替使用这二种颜色。

第五个参数表示绘制轮廓的最大层数,如果是0,只绘制contour;如果是1,追加绘制和contour同层的所有轮廓;如果是2,追加绘制比contour低一层的轮廓,以此类推;如果值是负值,则函数并不绘制contour后的轮廓,但是将画出其子轮廓,一直到abs(max_level) - 1层。

第六个参数表示轮廓线的宽度,如果为CV_FILLED则会填充轮廓内部。

第七个参数表示轮廓线的类型。

第八个参数表示偏移量,如果传入(1020),那绘制将从图像的(1020)处开始。


[cpp]  view plain copy
  1. //图像的轮廓检测  
  2.   
  3. #include <opencv2/opencv.hpp>  
  4. using namespace std;  
  5. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
  6.   
  7. int main( int argc, char** argv )  
  8. {     
  9.     const char *pstrWindowsSrcTitle = "原图";  
  10.     const char *pstrWindowsOutLineTitle = "轮廓图";  
  11.       
  12.     const int IMAGE_WIDTH = 400;  
  13.     const int IMAGE_HEIGHT = 200;  
  14.   
  15.     // 创建图像  
  16.     IplImage *pSrcImage = cvCreateImage(cvSize(IMAGE_WIDTH, IMAGE_HEIGHT), IPL_DEPTH_8U, 3);  
  17.     // 填充成白色  
  18.     cvRectangle(pSrcImage, cvPoint(0, 0), cvPoint(pSrcImage->width, pSrcImage->height), CV_RGB(255, 255, 255), CV_FILLED);  
  19.     // 画圆  
  20.     CvPoint ptCircleCenter = cvPoint(IMAGE_WIDTH / 4, IMAGE_HEIGHT / 2);  
  21.     int nRadius = 80;  
  22.     cvCircle(pSrcImage, ptCircleCenter, nRadius, CV_RGB(255, 255, 0), CV_FILLED);  
  23.     ptCircleCenter = cvPoint(IMAGE_WIDTH / 4, IMAGE_HEIGHT / 2);  
  24.     nRadius = 30;  
  25.     cvCircle(pSrcImage, ptCircleCenter, nRadius, CV_RGB(255, 255, 255), CV_FILLED);  
  26.     // 画矩形  
  27.     CvPoint ptLeftTop = cvPoint(IMAGE_WIDTH / 2 + 20, 20);  
  28.     CvPoint ptRightBottom = cvPoint(IMAGE_WIDTH - 20, IMAGE_HEIGHT - 20);  
  29.     cvRectangle(pSrcImage, ptLeftTop, ptRightBottom, CV_RGB(0, 255, 255), CV_FILLED);  
  30.     ptLeftTop = cvPoint(IMAGE_WIDTH / 2 + 60, 40);  
  31.     ptRightBottom = cvPoint(IMAGE_WIDTH - 60, IMAGE_HEIGHT - 40);  
  32.     cvRectangle(pSrcImage, ptLeftTop, ptRightBottom, CV_RGB(255, 255, 255), CV_FILLED);  
  33.     // 显示原图  
  34.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
  35.     cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
  36.   
  37.   
  38.     // 转为灰度图  
  39.     IplImage *pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);  
  40.     cvCvtColor(pSrcImage, pGrayImage, CV_BGR2GRAY);  
  41.     // 转为二值图  
  42.     IplImage *pBinaryImage = cvCreateImage(cvGetSize(pGrayImage), IPL_DEPTH_8U, 1);  
  43.     cvThreshold(pGrayImage, pBinaryImage, 250, 255, CV_THRESH_BINARY);  
  44.   
  45.   
  46.     // 检索轮廓并返回检测到的轮廓的个数  
  47.     CvMemStorage *pcvMStorage = cvCreateMemStorage();  
  48.     CvSeq *pcvSeq = NULL;  
  49.     cvFindContours(pBinaryImage, pcvMStorage, &pcvSeq, sizeof(CvContour), CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, cvPoint(0, 0));  
  50.       
  51.     // 画轮廓图  
  52.     IplImage *pOutlineImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 3);  
  53.     int nLevels = 5;  
  54.     // 填充成白色  
  55.     cvRectangle(pOutlineImage, cvPoint(0, 0), cvPoint(pOutlineImage->width, pOutlineImage->height), CV_RGB(255, 255, 255), CV_FILLED);  
  56.     cvDrawContours(pOutlineImage, pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), nLevels, 2);  
  57.     // 显示轮廓图  
  58.     cvNamedWindow(pstrWindowsOutLineTitle, CV_WINDOW_AUTOSIZE);  
  59.     cvShowImage(pstrWindowsOutLineTitle, pOutlineImage);  
  60.   
  61.     cvWaitKey(0);  
  62.   
  63.     cvReleaseMemStorage(&pcvMStorage);  
  64.   
  65.     cvDestroyWindow(pstrWindowsSrcTitle);  
  66.     cvDestroyWindow(pstrWindowsOutLineTitle);  
  67.     cvReleaseImage(&pSrcImage);  
  68.     cvReleaseImage(&pGrayImage);  
  69.     cvReleaseImage(&pBinaryImage);  
  70.     cvReleaseImage(&pOutlineImage);  
  71.     return 0;  
  72. }  

OpenCV学习笔记: 快速入门例程_第5张图片




[cpp]  view plain copy
  1. //图像的轮廓检测  
  2. #include <opencv2/opencv.hpp>  
  3. using namespace std;  
  4. #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
  5. IplImage *g_pGrayImage = NULL;  
  6. const char *pstrWindowsBinaryTitle = "二值图";  
  7. const char *pstrWindowsOutLineTitle = "轮廓图";  
  8. CvSeq *g_pcvSeq = NULL;  
  9.   
  10. void on_trackbar(int pos)  
  11. {  
  12.     // 转为二值图  
  13.     IplImage *pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);  
  14.     cvThreshold(g_pGrayImage, pBinaryImage, pos, 255, CV_THRESH_BINARY);  
  15.     // 显示二值图  
  16.     cvShowImage(pstrWindowsBinaryTitle, pBinaryImage);  
  17.   
  18.     CvMemStorage* cvMStorage = cvCreateMemStorage();  
  19.     // 检索轮廓并返回检测到的轮廓的个数  
  20.     cvFindContours(pBinaryImage,cvMStorage, &g_pcvSeq);  
  21.   
  22.     IplImage *pOutlineImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 3);  
  23.     int _levels = 5;  
  24.     cvZero(pOutlineImage);  
  25.     cvDrawContours(pOutlineImage, g_pcvSeq, CV_RGB(255,0,0), CV_RGB(0,255,0), _levels);  
  26.     cvShowImage(pstrWindowsOutLineTitle, pOutlineImage);  
  27.   
  28.     cvReleaseMemStorage(&cvMStorage);  
  29.     cvReleaseImage(&pBinaryImage);  
  30.     cvReleaseImage(&pOutlineImage);  
  31. }  
  32.   
  33. int main( int argc, char** argv )  
  34. {     
  35.     const char *pstrWindowsSrcTitle = "原图(http://blog.csdn.net/MoreWindows)";  
  36.     const char *pstrWindowsToolBarName = "二值化";  
  37.   
  38.     // 从文件中加载原图  
  39.     IplImage *pSrcImage = cvLoadImage("C:\\xy.jpg", CV_LOAD_IMAGE_UNCHANGED);  
  40.     // 显示原图  
  41.     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);  
  42.     cvShowImage(pstrWindowsSrcTitle, pSrcImage);  
  43.   
  44.     // 转为灰度图  
  45.     g_pGrayImage =  cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);  
  46.     cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);  
  47.   
  48.     // 创建二值图和轮廓图窗口  
  49.     cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);  
  50.     cvNamedWindow(pstrWindowsOutLineTitle, CV_WINDOW_AUTOSIZE);  
  51.   
  52.   
  53.     // 滑动条    
  54.     int nThreshold = 0;  
  55.     cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 254, on_trackbar);  
  56.   
  57.     on_trackbar(1);  
  58.   
  59.     cvWaitKey(0);  
  60.   
  61.     cvDestroyWindow(pstrWindowsSrcTitle);  
  62.     cvDestroyWindow(pstrWindowsBinaryTitle);  
  63.     cvDestroyWindow(pstrWindowsOutLineTitle);  
  64.     cvReleaseImage(&pSrcImage);  
  65.     cvReleaseImage(&g_pGrayImage);  
  66.     return 0;  
  67. }  

OpenCV学习笔记: 快速入门例程_第6张图片

你可能感兴趣的:(OpenCV学习笔记: 快速入门例程)