邂逅opencv

初识OpenCV

OpenCV简介:

OpenCV (Open Source Computer Version)是一个基于开源的跨平台的计算机视觉库,可以实现图像处理和计算机视觉方面的很多通用算法。

OpenCV官方主页:http://opencv.org

OpenCV Github 主页:https://github.com/Itseez/opencv

OpenCV 开发版 Wiki 主页:http://code.open.org

Opencv可以解决如下领域问题:人机交互、物体识别 、图像分区 、人脸识别、动作识别、运动追踪、机器人。

OpenCV常见模块介绍:

  • calib3d ———Calibration (校准)和3D的组合缩写,主要是相机校准和三维重建相关的内容。包括基本的多视角几何算法,单个立体摄像头标定,物体姿态估计,立体相似性算法,3D信息的重建等。

  • contrib ——— Contributed / Experimental Stuf 的缩写。该模块包含了一些最近添加的不太稳定的可选功能。如人脸识别,立体匹配,人工视网膜模型等技术。

  • core ——— 核心功能模块,主要包含:Opencv 基本数据结构、动态数据结构、绘图函数、数组操作相关函数、辅助功能与系统函数和宏、与OpenGL的互操作。

  • imgproc ——— Image Process ,图像处理模块。主要包含线性与非线性的图片滤波、图像的集合变换、其他图像变换、直方图相关结构分析和形状描述、运动分析和对象追踪、特征检测、目标检测等内容。

  • features2d ——— Features2D,也就是 Features 2D,即2D 功能框架,包含如下内容: 特征检测和描述 特征检测器通用接口,描述符提取器通用接口 描述符匹配器通用接口 通用描述符匹配器通用接口 关键点绘制函数和匹配功能绘制函数

  • flann 高维的近似快速搜索算法库,主要包含: 快速近似最近邻搜索和聚类

  • gpu ——— 运用GPU 加速的计算机视觉模块

  • highgui ——— 高层 GUI 图形用户界面,包含媒体的输入和输出、视频捕捉、图像和视频的编码解码、图形交互的接口等内容。

  • legacy ——— 一些已经废弃的代码库,保留作为向下兼容使用。

  • ml ——— Machine Learning 机器学习模块,基本上是统计模型和分类算法,包含如下内容:统计模型、一般贝叶斯分类器、K-近邻、支持向量机、决策树、提升、梯度提高树、随机数、超随机数、期望最大化、神经网络、MLData。

  • non free ——— 一些具有专利的算法

  • objdetect ——— 目标检测模块,包含 Cascade Classification (级联分类)和 Latent SVM 这两个部分

  • photo ——— Computational Photograpy,包含图像修复和图像去噪两部分

  • stitching ——— images stitching, 图像拼接模块

  • suppers ——— superResolution, 超分辨率的相关功能模块

  • ts ——— OpenCV 测试相关代码

  • video ——— 视频分析组件

  • Videostab ———视频稳定相关组件

Opencv 头文件

opencv.hpp中已经包含了OpenCV各个模块的头文件,,我们在编写core, objdetect, imgproc,photo,vedio,features2d,calib3d,ml,highgui,contrib 等模块应用程序时,原则上仅写上一句#include <opencv2/opencv.hpp> 即可,这样可以精简代码。

命名规范

  • 类名,类型定义,包括枚举和typedef,混合使用大小写,首字母大写。 如ClassNameTypeName
  • 局部变量混合使用大小写,首字母小写,其名字应该与底层数据类型无关,并且应该反映该变量所代表的事物。如 localVariable
  • 函数名混合使用大小写,首字母大写。如 ChildFunc
  • 对类的多个子程序可见的成员变量名用m_前缀表示 如m_ClassVariable
  • 全局变量名 用g_ 前缀。 如 g_GlobalVariable
  • 具名常量全部大写。 如 CONSTANT
  • 宏全部大写,单词间用分隔符”_” 隔开。 如 SCREEN_WIDTH

常见的关键字字母组合包括:

  • Max 最大值
  • Min 最小值
  • Init 初始化
  • T(Temp) 临时变量
  • Src 源对象
  • Dst 目的对象

虽然命名规则在这里,但是我们在应用中切记不要迂腐,不要墨守成规,该变通的时候还可以做适当的变通。

agrc与argv 认识
argc 和 argv[] 中的arg 指的是”参数”, 其中,argc为整数,用来统计运行程序时送给main函数的命令行的个数,默认值为1(程序的全路径名)。argv[ ] 表示字符串数组,用来存放指向字符串参数的指针数组,每一个元素指向一个参数。这两个参数在用命令行编译是有效。
图片的声明,读取和显示

简单体验

1.声明一副图像:

 Mat srcImage;
  1. 读取图片

     srcImage = imread(“PathOfImage”);
    
  2. 显示图像

     imshow(“Title”,srcImage);
    

图像的简单处理:

  1. 图像腐蚀:

     Met element = getStructuringElement(MORPH_RECT, Size(15,15)); // 设置参数
    
     erode(srcImage, dstImage, element);  // 进行图像腐蚀
    
  2. 图像模糊:

     blur(srcImage,dstImage,Size(7,7));
    
  3. 边缘检测

    cvtColor(srcImage,garyImage,CV_BG2GRAY);// 将图像转换为 灰度图像
    
    blur(grayImage,edge,Size(3,3));//对灰度图像使用 3* 3 内核来降噪
    
    Canny(edge, edge, 3, 9, 3);   // 进行边缘检测
    

由视频/相机采集图像

   VideoCaputure capture(“1.avi”);   // 读入视频

   // VideoCapture capture(0)  调用摄像头

  while(1){

      Mat frame;  // 定义Mat变量,用于存储每一帧图像

      capture >> frame;  // 读取当前帧

      imshow(“读取视频”, frame);  // 显示当前帧

       waitKey(30);  // 延迟30ms

   }

图像的载入,显示和输出

Imread 函数

函数原型为: Mat imread( const String& filename, int flags = IMREAD_COLOR );

其中第一个参数const String &类型的 filename,填我们需要载入的图片路径。Opencvimread 函数支持如下类型的图像载入。

  • Windows bitmaps - *.bmp, *.dib (always supported)

  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Notes section)

  • JPEG 2000 files - *.jp2 (see the Notes section)

  • Portable Network Graphics - *.png (see the Notes section)

  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)

  • Sun rasters - *.sr, *.ras (always supported)

  • TIFF files - *.tiff, *.tif (see the Notes section)
    第二个参数,int 类型的 flags,为载入标识,它指定加载图像的颜色类型,可以看到其默认值为1,所有这个参数可以缺省。如下为

     enum ImreadModes {
         IMREAD_UNCHANGED  = -1,   //这个标识在新版本已被废弃,可以忽略
         IMREAD_GRAYSCALE    = 0,    //将图像转换成为灰度图  
         IMREAD_COLOR             = 1,     //总是将图像转换为彩色再返回
         IMREAD_ANYDEPTH      = 2,    
        //如果 载入图像深度为16位或者32位,就返回对应深度的图像。否则转换为8位图像返回
    };
    

如果不在上述枚举范围内取值,可以按照如下方式进行:

  • flags > 0 返回一个三通道彩色图像
  • flags = 0 返回灰度图像
  • flags < 0 返回Alpha 通道的加载图像

imshow函数

void imshow(const String& winname, InputArray mat);
第一个参数: const String& 类型的winname,填需要显示的图像标识名称。
第二个参数:InputArray 类型的 mat, 填需要显示的图像。函数原型中的InputArray可以简单的当做Mat类型即可。
imshow 函数用于在指定的窗口中显示图像。如果窗口用的而是CV_WINDOW_AUTOSIZE(默认值)标识创建的,那么显示图像的原始大小。否则,将图像以合适窗口缩放。

  • 如果载入图像是8为无符号类型,显示图像原来样子。
  • 如果图像是16位无符号类型或32位整形,用像素数除以256。也就是说,该值范围从[0, 255 * 256]映射到[0,255]。
  • 如果图像是32位浮点数,像素便要乘以255.也就是说该值范围是从[0,1]映射到[0,255]

namedwindow()函数

namedWindow 的作用是通过制定窗口的名称,创建一个可以作为图像或者进度条的容器窗口。
函数原型:

 void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);

第一个参数const String &类型的 name,填写被用作窗口的标识符的窗口名称。第二个参数,int类型的flags,窗口的标识,可以填写以下值:

  WINDOW_NORMAL     = 0x00000000,  用户可以改变窗口大小
  WINDOW_AUTOSIZE   = 1, 窗口大小会自动调整,以适应所显示的图像,并且用户不能手动改变窗口大小
  WINDOW_OPENGL     = 0x00001000,  窗口会支持OpenGL

imwrite 函数

imwrite函数用于将图像保存到制定的文件。图像格式是基于文件扩展名的,可以保存的扩展名和imread中可以读取的图像扩展名一致。

bool imwrite( const String& filename, InputArray img,
          const std::vector<int>& params = std::vector<int>());

第一个参数,const String & ,类型的filename, 填写需要写入的图像数据。注意,要带上后缀。

第二个参数,InputArray类型的 img,一般填一个Mat类型的图像数据。

第三个参数,为特定格式保存的参数编码。
对于JPEG 格式的图片,这个参数表示从0 到100 的图片质量。默认值为95。
对于PNG格式的图片,这个参数表示压缩级别从0 到9。 较高意味着更小的压缩尺寸和更长的压缩时间。
对于 PPM,PGMPBM 格式的图片。这个参数表示二进制格式标识,取值为0或者1,默认值为1.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容