Opencv3 当前模块

  1.   Core    // 该模块包含Opencv库的基础结构以及基本操作.
  2.   Improc    // 图像处理模块,包含基本的图像转换,包括滤波以及类似的卷积操作.
  3. High // 包括三个部分,分别为imcodecs,videoio,以及highui.
  4.         包含用于显示图像或者简单的输入的用户交互函数.可视为轻量级的Windows UI工具包.
  5. Video // 视频模块,包含读取和写视频流的函数.
  6. Calib3d // 该模块包含校准单个,双目以及多个相机的算法实现.
  7. Feature2d // 该模块包含用于检测,描述以及匹配特征点的算法.
  8. Objdectect // 该模块包含检测特定目标,比如人脸或者行人的算法;也可以训练检测器并用来检测其他物体.
  9. Ml // 本身完备的机器学习模块,包含大量的机器学习算法实现并且这些算法都能和Opencv的数据类型自然交互.
  10. Flann // 快速最邻近库,该库包含在数据集中进行最邻近搜索的相关算法
  11. GPU // GPU模块主要是函数在CUDA GPU上的优化实现,
  12. 有一些仅用于GPU的功能,其中一些函数能够返回很好的结果,但是需要足够好的计算资源.
  13. 若硬件没有GPU,则不会有什么提升.
  14. Photo // 这个一个新的模块,包含计算摄影学的一些函数工具
  15. Stitching // 该模块是一个精巧的图像拼接流程实现
  16. Nonfree (在opencv3.0中,被移到opencv_contrib/xfeatures2d)
  17.      // 该模块包含一些受到专利保护的或者受到使用限制的(比如SIFT算法)
  18. 这些算法被隔离到他们自己的模块中,以表明你需要做一些特殊的工作,才可以在商业产品中使用它们.
  19. Contrib (在opencv3.0中,被融合到opencv_contrib) //该模块包含了一些新的,但还没有被集成进Opencv库里的东西
  20. Legacy (在opencv3.0中,被取消) //该模块包含了一些老的尚未完全被取消的东西
  21. Ocl (在opencv3.0中,被取消,取而代之的是T-API) //一个较新的模块,可以认为它和GPU模块相似,实现了开放并行编程的Khronos OpenCL标准.
  22. 虽然现在模块的特性比GPU模块少很多,但Ocl模块的目标是提供可以运行在任何GPU或者其他可以搭载Khronos的并行设备.

OpenCV 贡献库(opencv_contrib)

包含的模块列表

  1.   Dnn          // 深度神经网络
  2. Face        // 人脸识别
  3.   Text        // 文本检测以及识别,基于许多开源的OCR算法
  4. Rgbd         // 处理由Kinect或者其他深度传感器(或者简单的由双目匹配得到的)获取的RGB+深度图像
  5. Bioinspired      // 一些基于生物学启发的视觉技术
  6. ximgprocxphoto   // 先进的图像处理以及计算摄影学方法
  7. Tracking      // 现代目标追踪算法

OpenCV 头文件

../include/opencv2/opencv.hpp 包含各个模块的头文件:

旧式C风格头文件

  1. #include "opencv2/core/core_c.h" // 旧式C风格的结构以及运算
  2. #include "opencv2/imgproc/imgproc_c.h" // 旧式C风格的图像处理函数
  3. #include "opencv2/highgui/highgui_c.h" // 旧式C风格的显示,滑动条,鼠标操作以及输入输出相关

新式C++风格头文件

  1. #include "opencv2/core/core.hpp" //C++数据结构和算术例程
  2. #include "opencv2/flann/miniflann.hpp" //近似最近邻匹配函数
  3. #include "opencv2/imgproc/imgproc.hpp" //特定于处理和恢复照片的算法
  4. #include "opencv2/video/photo.hpp" //视频跟踪和背景分割例程
  5. #include "opencv2/features2d/features2d.hpp" //二维功能跟踪支持
  6. #include "opencv2/objdetect/objdetect/hpp" //级联人脸检测器;检测的SVM;系首长;平面斑块检测器
  7. #include "opencv2/calib3d/calib3d.hpp" //校准和立体声
  8. #include "opencv2/ml/ml.hpp" //机器学习:聚类和模式识别
  9. #include "opencv2/highgui/highgui.hpp" //C++图像显示,滑块,按钮,鼠标,I/O
  10. #include "opencv2/contrib/contrib.hpp" //用户贡献的代码:肉体检测,模糊均值平移跟踪,自旋图像,自相似特征

[注]若使用头文件opencv.hpp来包含所有可能在openCV函数中用到的头文件,这样的好处是使用简单不用单独使用某一模块的头文件,但带来的弊端是这会减慢编译的速度.相反,如果只针对图像处理相关的函数使用某一个头文件,那么程序用于编译的时间会少上很多.

具体导入方式,还需视情况而定.

例程

DEMO1 - 显示图片

  1. #include <opencv2/opencv.hpp> //包含每个支持的Open函数的文件
  2. int main()
  3. {
  4. //读取图像(支持图像格式:JPEG,PNG,BMP,DIB,JPE,PBM,PGM,PPM,SR)
  5. Mat img = imread("") ; //可处理单通道,多通道,整数值,浮点值
  6. if (img.empty()) return -1 ;
  7. //建立窗口并指定名称 WINDOW_AUTOSIZE/0 设置窗口属性
  8. namedWindow("img",WINDOW_AUTOSIZE) ;
  9. //要求程序停下来等待按键
  10. waitKey(0) ;
  11. //关闭窗口并释放任何相关的内存使用情况
  12. destroyWindow("img") ;
  13. }

DEMO2 - 视频 用于从磁盘中播放视频

  1. #include "opencv2/highgui/highgui.hpp"
  2. #include "opencv2/imgproc/imgproc.hpp"
  3. using namespace cv ;
  4. int main()
  5. {
  6. namedWindow("Video",WINDOW_AUTOSIZE) ;
  7. VideoCapture cap ; //实例化视频捕捉对象
  8. cap.open(string("")) ; //捕获对象被赋予一个字符串,其中包含要打开的视频路径和文件名
  9. Mat frame ; //实例化一个数据对象保存帧
  10. for (;;){ //进入死循环
  11. cap >> frame ; //不断从捕获对象流中逐帧读取视频文件
  12. if (frame.empty()) break ; //检查数据是否实际从视频文件中读取 若没有 则退出视频
  13. imshow("Video",frame) ; //如果是视频帧 成功读入,则显示通过imshow()
  14. if (waitKey(33) >= 0) break ; //如果在此期间按下某个键,退出读取循环。否则继续循环
  15. }
  16. return ;
  17. }

DEMO3 - 将轨迹栏滑块添加到基本查看器窗口,以便在视频文件中移动

  1. #include "opencv4/opencv2/opencv.hpp"
  2. #include "opencv2/highgui/highgui.cpp"
  3. #include "opencv2/imgproc/imgproc.hpp"
  4. #include <iostream>
  5. #include <fstream>
  6. using namespace std ;
  7. using namespace cv ;
  8. int g_slider_position = 0 ; //[1]定义全局变量保持轨迹栏滑块的位置状态
  9. //以单步模式开始
  10. int g_run = 1; //实例化对象,只要它不等于1,就会显示新的帧
  11. int g_dontset = 0 ; //允许在不触发单步模式情况下更新轨迹栏的位置
  12. VideoCapture g_cap ; //[2]回调访问捕获对象,也定义为全局变量
  13. void onTrackbarSlide(int pos, void*) { //传递pos为新的轨迹栏位置
  14. g_cap.set(CAP_PROP_POS_FRAMES,pos) ; //使用新请求的位置来实际将视频回放推进到新位置
  15. if (!g_dontset) g_run = 1 ; //将程序设置为在下一个新帧进入后进入单步模式
  16. g_dontset = 0 ;
  17. }
  18. int main(int argc, char ** argv){
  19. namedWindow("Video",WINDOW_AUTOSIZE) ;
  20. g_cap.open(string(argv[1])) ;
  21. //这些例程允许我们配置VideoCapture对象的各种属性
  22. //用来确定视频中的帧数以及视频图像的宽度和高度
  23. int frames = (int)g_cap.get(CAP_PROP_FRAME_COUNT) ; //传递CAP_PROP_FRAME表明以帧为单位设置读取位置
  24. int tmpw = (int)g_cap.get(CAP_PROP_FRAME_WIDTH) ; //宽度
  25. int tmph = (int)g_cap.get(CAP_PROP_FRAME_HEIGHT) ; //高度
  26. cout << "视频:" << frames << "维度框架:(" << tmpw << "," << tmph << ")" << endl ;
  27. //创建轨迹栏
  28. //指定标签和放置轨迹栏的窗口。将变量绑定到轨迹栏,轨迹蓝的最大值(视频中的帧数),移动滑块时的回调
  29. createTrackbar("Position","Video",&g_slider_position,frames,onTrackbarSlide) ;
  30. Mat frame ; //实例化一个数据对象保存帧
  31. for (;;){
  32. if (g_run!=0){
  33. g_cap >> frame ;
  34. if (frame.empty()) break ;
  35. int current_pos = (int)g_cap.get(CAP_PROP_POS_FRAMES) ;
  36. g_dontset = 1 ; //设置参数以便下一个轨迹栏回调不会进入单步模式
  37. //调用轨迹栏回调来更新显示的滑块轨迹栏的位置
  38. setTrackbarPos("Position","Video",current_pos) ;
  39. imshow("Video",frame) ;
  40. g_run -= 1 ; //保持单步模式或者让视频根据用户按键设置的先前状态运行
  41. }
  42. char c = (char)cv::waitKey(10) ;
  43. if (c = 's') //如果按下S,计入单步模式,允许读取单帧
  44. {g_run = 1; cout << "单步,运行=" << g_run << endl ;}
  45. if (c = 'r') //如果按下R,进入连续视频模式
  46. {g_run = -1; cout << "运行模式,运行=" << g_run << endl ;}
  47. if (c == 27) break ; //如果按下ESC,程序终止
  48. }
  49. return 0 ;
  50. }

DEMO4 - 在图像显示在屏幕上之前加载并平滑图像

  1. #include <opencv2/opencv.hpp>
  2. void Smooth(const Mat&image){
  3. namedWindow("in",WINDOW_AUTOSIZE) ; //创建输入窗口
  4. namedWindow("out",WINDOW_AUTOSIZE) ; //创建输出窗口
  5. imshow("in",image) ; //显示输入图像
  6. Mat out ; //实例化输出图像矩阵
  7. //图像平滑处理
  8. /*GaussianBlur() blur() median() bilateralFilter()*/
  9. GaussianBlur(image,out,Size(5,5),3,3) ; //输入图像被5*5高斯卷积滤波器模糊并写入out
  10. GaussianBlur(out,out,Size(5,5),3,3) ; //out用做输入输出,进行双重模糊
  11. imshow("out",out) ; //显示生成模糊图像
  12. waitKey(0) ; //等待按键
  13. }

DEMO5 - 使用pyrDown()创建一个新的图像,该图像是输入图像宽度和高度的一半

  1. #include <opencv2/opencv.hpp>
  2. int main(int argc, char ** argv)
  3. {
  4. Mat img1, img2 ;
  5. namedWindow("img1",WINDOW_AUTOSIZE) ;
  6. namedWindow("img2",WINDOW_AUTOSIZE) ;
  7. string path = "" ;
  8. img = imread(path) ;
  9. imshow("img1",img1) ;
  10. pyrDown(img1, img2) ; //下采样
  11. imshow("img2",img2) ;
  12. waitKey(0) ;
  13. }

DEMO6 - Canny边缘检测器将其输出写入单通道(灰度)图像

  1. #include <opencv2/opencv.hpp>
  2. int main(int argc, char ** argv)
  3. {
  4. Mat img_rgb, img_gry,img_cny ;
  5. namedWindow("Grey",WINDOW_AUTOSIZE) ;
  6. namedWindow("Canny",WINDOW_AUTOSIZE) ;
  7. string path = "" ;
  8. img_rgb = imread(path) ;
  9. cvtColor(img_rgb,img_gry,COLOR_BGR2GRAY) ; //转换颜色空间到 BGB到灰度
  10. imshow("gray",img_gry) ;
  11. Canny(img_gry,img_cny,10,100,3,true) ; //边缘检测器生成的图像是输入图像的全尺寸
  12. imshow("canny",img_cny) ;
  13. waitKey(0) ;
  14. return 0 ;
  15. }

DEMO7 - 将金字塔向下运算符和canny子程序组合

  1. cvtColor(img_rgb,img_gry,COLOR_BGR2GRAY)
  2. pyrDown(img_gry,img_pyr) ;
  3. pyrDown(img_pyr,img_pyr2) ;
  4. Canny(img_pyr2, img_cny, 10,100,3,true) ;

DEMO8 - 获取和设置像素

  1. int x = 16 , y = 32 ;
  2. Vec3b intensity = img_rgb.at<Vec3b>(y,x) ;
  3. uchar blue = intensity[0] ;
  4. uchar green = intensity[1] ;
  5. uchar red = intensity[2] ;
  6. cout << "At(x,y)=(" << x << "," << y
  7. << "):(blue,green,blue)=("
  8. << (unsigned int)blue << ","
  9. << (unsigned int)green << ","
  10. << (unsigned int)red << ")" << endl ;
  11. cout << "Gray pixel there is:" << (unsigned int)img_gry.at<uchar>(y,x) << endl ;
  12. x /= 4; y /= 4 ;
  13. cout << "Pyramid2 pixel there is:" <<
  14. << (unsigned int)img_pyr2.at<uchar>(y,x) << endl ;
  15. img_cny.at<uchar>(x,y) = 128 ; //将canny像素设置为128

DEMO9 - 相同的对象可以从相机或者文件加载视频

  1. #include <opencv2/opencv.hpp>
  2. #include <iostream>
  3. using namespace std ;
  4. using namespace cv ;
  5. int main(int argc,char ** argv)
  6. {
  7. namedWindow("Video",WINDOW_AUTOSIZE) ;
  8. VideoCapture cap ;
  9. string path = "" ;
  10. if (argc == 1)
  11. {
  12. cap.open(0) ; //打开第一台相机
  13. } else {
  14. cap.open(path) ;
  15. }
  16. if (!cap.isOpened()){ //检查是否成功
  17. cerr << "Coundn't open capture." << endl ;
  18. return -1 ;
  19. }
  20. }

DEMO10 - 用于读取彩色视频并写出对数极化变换后的视频

  1. //从VideoReader对象中逐帧读取视频,转换帧以对象极坐标格式,并将对象坐标帧一次一个写入新的视频文件
  2. #include <opencv2/opencv.hpp>
  3. #include <iostream>
  4. using namespace std ;
  5. using namespace cv ;
  6. int main(int argc,char ** argv){
  7. namedWindow("Video",WINDOW_AUTOSIZE) ;
  8. namedWindow("Log_Polar",WINDOW_AUTOSIZE) ;
  9. VideoCapture capture(argv[]1) ;
  10. //注意:可以通过将摄像头ID作为int来从摄像机捕获
  11. double fps = capture.get(CAP_PROP_FPS) ;
  12. Size size(
  13. (int)capture.get(CAP_PROP_FRAME_WIDTH) ,
  14. (int)capture.get(CAP_PROP_FRAME_HEIGHT)
  15. );
  16. VideoWriter writer ;
  17. /*参数说明 */
  18. //argv[2] 新文件的文件名
  19. //CV_FOURCC('M','J','P','G') 用于压缩视频流的视频编解码器
  20. //fps 重放帧速率
  21. //size 使用图像的大小
  22. writer.open(argv[2],CV_FOURCC('M','J','P','G'),fps, size) ;
  23. Mat logpolar_frame,bgr_frame ;
  24. for (;;){
  25. capture >> bgr_frame ;
  26. if (bgr_frame.empty()) break ;
  27. imshow("bgr_frame",bgr_frame) ;
  28. logPolar(
  29. bgr_frame //输入颜色框
  30. logpolar_frame, //输出对数极坐标框架
  31. Point2f( //对数极坐标变换的中心点
  32. bgr_frame.cols / 2, //x
  33. bgr_frame.rows / 2 //y
  34. ),
  35. 40, //幅度(比例参数)
  36. WARP_FILL_OUTLIERS //用“零”填充异常值
  37. );
  38. imshow("Log_Polar",logpolar_frame) ;
  39. writer << logpolar_frame ;
  40. if (c == 27) break ;
  41. }
  42. capture.release() ;
  43. }

<学习opencv> opencv 概述及初探的更多相关文章

  1. OpenCV学习(22) opencv中使用kmeans算法

    kmeans算法的原理参考:http://www.cnblogs.com/mikewolf2002/p/3368118.html 下面学习一下opencv中kmeans函数的使用.      首先我们 ...

  2. OpenCV学习:OpenCV文件一览

    了解一些OpenCV代码整体的模块结构后,再重点学习自己感兴趣的部分,会有一种一览众山小的感觉~ Come on! C:\OpenCV\opencv\build\include文件夹下包含两个文件夹: ...

  3. OpenCV学习笔记——OpenCV安装

    关于OpenCV安装 1.下载和安装OpenCV SDK 在官网:http://opencv.org/上找到OpenCV windows版下载 . 后得到一个 opencv-2.X.X.exe的文件, ...

  4. OpenCV学习:OpenCV源码编译(vc9)

    安装后的OpenCV程序下的build文件夹中,只找到了vc10.vc11和vc12三种编译版本的dll和lib文件,需要VS2010及以上的IDE版本,而没有我们常用的VS2008版本. 于是,需要 ...

  5. Java虚拟机JVM学习01 流程概述

    Java虚拟机JVM学习01 流程概述 Java虚拟机与程序的生命周期 一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这 ...

  6. TestNG学习-002-annotaton 注解概述及其执行顺序

    此文主要讲述用 TestNG 基础的 annotation (注解)知识,及其执行的顺序,并通过一个 TestNG 简单的实例演示 annotation 的执行顺序. 希望能对初学 TestNG 测试 ...

  7. VC++学习之GDI概述

    VC++学习之GDI概述 图形设备接口(GDI)是一个可执行程序,它接受Windows应用程序的绘图请求(表现为GDI函数调用),并将它们传给相应的设备驱动程序,完成特定于硬件的输出,象打印机输出和屏 ...

  8. WCF从零学习之WCF概述(一)

    WCF从零学习之WCF概述(一) 一.WCF概述 我先了解了分布式应用程序开发,所谓分布式应用程序是指应用程序分布在不同计算机上,通过网络来共同完成一项任务.通常为服务器/客户端模式. 在WCF发布之 ...

  9. vue学习之vue基本功能初探

    vue学习之vue基本功能初探: 采用简洁的模板语法将声明式的将数据渲染进 DOM: <div id="app"> {{ message }} </div> ...

  10. 走近OPENCV // opencv 2.4.9+vs2013配置

    一直很懒去配opencv,这几周忍不了终于抽空来配了一下环境... 用的是旧版opencv2.4系列,最新到3.0了,之后再看看教程不知道有什么特别大的区别. (FF14国服没有4.0 // 8.19 ...

随机推荐

  1. Ubuntu下STL源码文件路径+VS2010下查看STL源码

    Ubuntu版本信息 然后STL源码位置就在 /usr/include/c++/7/bits /usr/include/c++/7.4.9/bits 这两个文件下都有 然后我日常写程序用的Window ...

  2. Output of C++ Program | Set 14

    Predict the output of following C++ program. Difficulty Level: Rookie Question 1 1 #include <iost ...

  3. ython学习笔记(接口自动化框架 V2.0)

    这个是根据上次框架版本进行的优化 用python获取excel文件中测试用例数据 通过requets测试接口.并使用正则表达式验证响应信息内容 生成xml文件测试报告 版本更新内容: 1. 整理了Cr ...

  4. 连接 MySQL 数据库出现问题:The server time zone value ‘�й���׼ʱ��‘ is unrecogni....

    出现问题 The server time zone value '�й���׼ʱ��' is unrecogni.... 解决方案 在 URL 后面加上 ?serverTimezone=UTC 如下: ...

  5. 【Java 8】 Reduce方法

    一:reduce rudece方法:从一个流中生成一个值 三个重载方法: Optional<T> reduce(BinaryOperator<T> accumulator); ...

  6. RPC、HTTP、RESTful

    RESTful RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义.RESTFUL适用于移动互联网厂商作为业务使能接口的场景,实现第三方OTT ...

  7. Reids安全加固

    目录 一.简介 二.加固方案 一.简介 Redis 因配置不当存在未授权访问漏洞,可以被攻击者恶意利用. 在特定条件下,如果Redis以root身份运行,黑客可以给root账号写入SSH公钥文件,直接 ...

  8. 车载以太网第二弹|测试之实锤-TC8 TCP/IP协议一致性测试实践

    前言 车载以太网测试实践系列,我们还分享了PMA测试实践.IOP测试实践 .本期给大家介绍的是TC8中的TCP/IP协议一致性测试(以下简称TCP/IP测试). TCP/IP测试-设备环境组成 TTw ...

  9. Git remote 远程仓库链接管理

    SVN 使用单个集中仓库作为开发人员的通信枢纽,通过在开发人员的工作副本和中央仓库之间传递变更集来进行协作. 这与 Git 的分布式协作模型不同,后者为每个开发人员提供了自己的仓库副本,并具有自己的本 ...

  10. 创建项目文件(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 按照张同学和董同学的说法,创建项目文件首选是利用可以参照的项目计划模板,如果找不到,那就利用现有的项目文件,实在这些都没有 ...