一、图片基本操作

1.1 显示图片

  1. #include <opencv2/opencv.hpp> //头文件
  2. using namespace cv; //包含cv命名空间
  3. void main( )
  4. {
  5. // 【1】读入一张图片,载入图像
  6. Mat srcImage = imread("1.jpg");
  7. // 【2】显示载入的图片
  8. imshow("【原始图】",srcImage);
  9. // 【3】等待任意按键按下,正数为倒数时间,0和负数为无限
  10. waitKey(0);
  11. }

1.2 图像腐蚀

腐蚀,即用图像中的暗色部分“腐蚀”掉图像中的亮色部分。

  1. #include <opencv2/highgui/highgui.hpp>
  2. #include <opencv2/imgproc/imgproc.hpp>
  3. using namespace cv;
  4. int main()
  5. {
  6. //载入原图
  7. Mat srcImage = imread("C:/Users/Administrator/Desktop/pic.jpg");
  8. //显示原图
  9. imshow("【原图】腐蚀操作", srcImage);
  10. //进行腐蚀操作
  11. Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
  12. Mat dstImage;
  13. erode(srcImage, dstImage, element);
  14. //显示效果图
  15. imshow("【效果图】腐蚀操作", dstImage);
  16. waitKey(0);
  17. return 0;
  18. }

其中, getStructuringElement()函数值为指定形状和尺寸的结构元素(内核矩阵)。

1.3 图像模糊

主要使用进行均值滤波操作的blur函数。

  1. #include "opencv2/highgui/highgui.hpp"
  2. #include "opencv2/imgproc/imgproc.hpp"
  3. using namespace cv;
  4. int main()
  5. {
  6. //【1】载入原始图
  7. Mat srcImage = imread("C:/Users/Administrator/Desktop/pic.jpg");
  8. //【2】显示原始图
  9. imshow("均值滤波【原图】", srcImage);
  10. //【3】进行均值滤波操作
  11. Mat dstImage;
  12. blur(srcImage, dstImage, Size(7, 7));
  13. //【4】显示效果图
  14. imshow("均值滤波【效果图】", dstImage);
  15. waitKey(0);
  16. }

1.4 canny边缘检测

  1. #include <opencv2/opencv.hpp>
  2. #include<opencv2/imgproc/imgproc.hpp>
  3. using namespace cv;
  4. int main()
  5. {
  6. //【0】载入原始图
  7. Mat srcImage = imread("C:/Users/Administrator/Desktop/pic.jpg");
  8. imshow("【原始图】Canny边缘检测", srcImage); //显示原始图
  9. Mat dstImage, edge, grayImage; //参数定义
  10. //【1】创建与src同类型和大小的矩阵(dst)
  11. dstImage.create(srcImage.size(), srcImage.type());
  12. //【2】将原图像转换为灰度图像
  13. //此句代码的OpenCV2版为:
  14. //cvtColor( srcImage, grayImage, CV_BGR2GRAY );
  15. //此句代码的OpenCV3版为:
  16. cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
  17. //【3】先用使用 3x3内核来降噪
  18. blur(grayImage, edge, Size(3, 3));
  19. //【4】运行Canny算子
  20. Canny(edge, edge, 3, 9, 3);
  21. //【5】显示效果图
  22. imshow("【效果图】Canny边缘检测", edge);
  23. waitKey(0);
  24. return 0;
  25. }

二、读取并播放视频

VedioCapture类。

  1. #include <opencv2\opencv.hpp>
  2. using namespace cv;
  3. int main()
  4. {
  5. //【1】读入视频
  6. VideoCapture capture("C:/Users/Administrator/Desktop/1.avi");
  7. //【2】循环显示每一帧
  8. while (1)
  9. {
  10. Mat frame;//定义一个Mat变量,用于存储每一帧的图像
  11. capture >> frame; //读取当前帧
  12. imshow("读取视频", frame); //显示当前帧
  13. waitKey(30); //延时30ms
  14. }
  15. return 0;
  16. }

三、调用摄像头采集图像

  1. #include <opencv2\opencv.hpp>
  2. using namespace cv;
  3. int main()
  4. {
  5. //【1】从摄像头读入视频
  6. VideoCapture capture(0);
  7. //【2】循环显示每一帧
  8. while (1)
  9. {
  10. Mat frame; //定义一个Mat变量,用于存储每一帧的图像
  11. capture >> frame; //读取当前帧
  12. imshow("读取视频", frame); //显示当前帧
  13. waitKey(30); //延时30ms
  14. }
  15. return 0;
  16. }

四、HighGUI图形界面用户

4.1 图像的载入、显示与输出

Mat 类:图像类型,是用于保存图像以及其他矩阵数据的数据结构;
imread():读取图像,返回Mat类,第一个参数为图像名,第二个参数为色彩类型(默认为彩色);
imshow():用于在指定窗口显示一幅图像,第一个参数是窗口名,第二个参数是要显示的图像(类型为Mat );
namedWindow():给窗口命名;
imwrite():输出(保存)图片,第一个参数为要命名的图片名称,第二个参数为图片名(InputArray类),第三个参数为要保存的格式(一般不写)。

  1. #include <opencv2/core/core.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. using namespace cv;
  4. int main()
  5. {
  6. Mat girl = imread("C:/Users/Administrator/Desktop/girl.jpg"); //载入图像到Mat
  7. namedWindow("【1】动漫图"); //创建一个名为 "【1】动漫图"的窗口
  8. imshow("【1】动漫图", girl);//显示名为 "【1】动漫图"的窗口
  9. //-----------------------------------【二、初级图像混合】--------------------------------------
  10. // 描述:二、初级图像混合
  11. //--------------------------------------------------------------------------------------------------
  12. //载入图片
  13. Mat image = imread("C:/Users/Administrator/Desktop/dota.jpg", 199);
  14. Mat logo = imread("C:/Users/Administrator/Desktop/dota_logo.jpg");
  15. //载入后先显示
  16. namedWindow("【2】原画图");
  17. imshow("【2】原画图", image);
  18. namedWindow("【3】logo图");
  19. imshow("【3】logo图", logo);
  20. //// 定义一个Mat类型,用于存放,图像的ROI
  21. //Mat imageROI;
  22. ////方法一
  23. ////imageROI = image(Rect(800, 350, logo.cols, logo.rows));
  24. ////方法二
  25. //imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));
  26. //// 将logo加到原图上
  27. //addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);
  28. ////显示结果
  29. //namedWindow("【4】原画+logo图");
  30. //imshow("【4】原画+logo图", image);
  31. //-----------------------------------【三、图像的输出】--------------------------------------
  32. // 描述:将一个Mat图像输出到图像文件
  33. //-----------------------------------------------------------------------------------------------
  34. //输出一张jpg图片到工程目录下
  35. imwrite("C:/Users/Administrator/Desktop/由imwrite生成的图片.jpg", image);
  36. waitKey();
  37. return 0;
  38. }

4.2 滑动条的创建和使用

  1. #include <opencv2/opencv.hpp>
  2. #include <opencv2/highgui/highgui.hpp>
  3. using namespace cv;
  4. #define WINDOW_NAME "【滑动条的创建&线性混合示例】" //为窗口标题定义的宏
  5. const int g_nMaxAlphaValue = 100;//Alpha值的最大值
  6. int g_nAlphaValueSlider;//滑动条对应的变量
  7. double g_dAlphaValue;
  8. double g_dBetaValue;
  9. //声明存储图像的变量
  10. Mat g_srcImage1;
  11. Mat g_srcImage2;
  12. Mat g_dstImage;
  13. //-----------------------------------【on_Trackbar( )函数】--------------------------------
  14. // 描述:响应滑动条的回调函数
  15. //------------------------------------------------------------------------------------------
  16. void on_Trackbar(int, void*)
  17. {
  18. //求出当前alpha值相对于最大值的比例
  19. g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
  20. //则beta值为1减去alpha值
  21. g_dBetaValue = (1.0 - g_dAlphaValue);
  22. //根据alpha和beta值进行线性混合
  23. addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);
  24. //显示效果图
  25. imshow(WINDOW_NAME, g_dstImage);
  26. }
  27. //-----------------------------【ShowHelpText( )函数】--------------------------------------
  28. // 描述:输出帮助信息
  29. //-------------------------------------------------------------------------------------------------
  30. //-----------------------------------【ShowHelpText( )函数】----------------------------------
  31. // 描述:输出一些帮助信息
  32. //----------------------------------------------------------------------------------------------
  33. void ShowHelpText()
  34. {
  35. //输出欢迎信息和OpenCV版本
  36. printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
  37. printf("\n\n\t\t\t此为本书OpenCV3版的第17个配套示例程序\n");
  38. printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
  39. printf("\n\n ----------------------------------------------------------------------------\n");
  40. }
  41. //--------------------------------------【main( )函数】-----------------------------------------
  42. // 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
  43. //-----------------------------------------------------------------------------------------------
  44. int main(int argc, char** argv)
  45. {
  46. //显示帮助信息
  47. ShowHelpText();
  48. //加载图像 (两图像的尺寸需相同)
  49. g_srcImage1 = imread("C:/Users/Administrator/Desktop/1.jpg");
  50. g_srcImage2 = imread("C:/Users/Administrator/Desktop/2.jpg");
  51. if (!g_srcImage1.data) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
  52. if (!g_srcImage2.data) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n"); return -1; }
  53. //设置滑动条初值为70
  54. g_nAlphaValueSlider = 70;
  55. //创建窗体
  56. namedWindow(WINDOW_NAME, 1);
  57. //在创建的窗体中创建一个滑动条控件
  58. char TrackbarName[50];
  59. printf(TrackbarName, "透明值 %d", g_nMaxAlphaValue);
  60. createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);
  61. //结果在回调函数中显示
  62. on_Trackbar(g_nAlphaValueSlider, 0);
  63. //按任意键退出
  64. waitKey(0);
  65. return 0;
  66. }

createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便。首先大家要记住,它往往会和一个回调函数配合起来使用。先看下他的函数原型:

  1. C++: int createTrackbar(conststring& trackbarname, conststring& winname, int* value, int count, TrackbarCallback onChange=0,void* userdata=0);

第一个参数,const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条。
第二个参数,const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。
第三个参数,int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是该变量当前的值。
第四个参数,int类型的count,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。
第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void);其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。
第六个参数,void
类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。

getTrackbarPos函数,
用于获取当前轨迹条的位置并返回。

  1. C++: int getTrackbarPos(conststring& trackbarname, conststring& winname);

4.3 鼠标操作

  1. #include <opencv2/opencv.hpp>
  2. using namespace cv;
  3. #define WINDOW_NAME "【程序窗口】" //为窗口标题定义的宏
  4. void on_MouseHandle(int event, int x, int y, int flags, void* param);
  5. void DrawRectangle(cv::Mat& img, cv::Rect box);
  6. void ShowHelpText();
  7. //-----------------------------------【全局变量声明部分】-----------------------------------
  8. // 描述:全局变量的声明
  9. //-----------------------------------------------------------------------------------------------
  10. Rect g_rectangle;
  11. bool g_bDrawingBox = false;//是否进行绘制
  12. RNG g_rng(12345);
  13. int main(int argc, char** argv)
  14. {
  15. //【0】改变console字体颜色
  16. system("color 9F");
  17. //【0】显示欢迎和帮助文字
  18. ShowHelpText();
  19. //【1】准备参数
  20. g_rectangle = Rect(-1, -1, 0, 0);
  21. Mat srcImage(600, 800, CV_8UC3), tempImage;
  22. srcImage.copyTo(tempImage);
  23. g_rectangle = Rect(-1, -1, 0, 0);
  24. srcImage = Scalar::all(0);
  25. //【2】设置鼠标操作回调函数
  26. namedWindow(WINDOW_NAME);
  27. setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);
  28. //【3】程序主循环,当进行绘制的标识符为真时,进行绘制
  29. while (1)
  30. {
  31. srcImage.copyTo(tempImage);//拷贝源图到临时变量
  32. if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);//当进行绘制的标识符为真,则进行绘制
  33. imshow(WINDOW_NAME, tempImage);
  34. if (waitKey(10) == 27) break;//按下ESC键,程序退出
  35. }
  36. return 0;
  37. }
  38. //--------------------------------【on_MouseHandle( )函数】-----------------------------
  39. // 描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
  40. //-----------------------------------------------------------------------------------------------
  41. void on_MouseHandle(int event, int x, int y, int flags, void* param)
  42. {
  43. Mat& image = *(cv::Mat*) param;
  44. switch (event)
  45. {
  46. //鼠标移动消息
  47. case EVENT_MOUSEMOVE:
  48. {
  49. if (g_bDrawingBox)//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中
  50. {
  51. g_rectangle.width = x - g_rectangle.x;
  52. g_rectangle.height = y - g_rectangle.y;
  53. }
  54. }
  55. break;
  56. //左键按下消息
  57. case EVENT_LBUTTONDOWN:
  58. {
  59. g_bDrawingBox = true;
  60. g_rectangle = Rect(x, y, 0, 0);//记录起始点
  61. }
  62. break;
  63. //左键抬起消息
  64. case EVENT_LBUTTONUP:
  65. {
  66. g_bDrawingBox = false;//置标识符为false
  67. //对宽和高小于0的处理
  68. if (g_rectangle.width < 0)
  69. {
  70. g_rectangle.x += g_rectangle.width;
  71. g_rectangle.width *= -1;
  72. }
  73. if (g_rectangle.height < 0)
  74. {
  75. g_rectangle.y += g_rectangle.height;
  76. g_rectangle.height *= -1;
  77. }
  78. //调用函数进行绘制
  79. DrawRectangle(image, g_rectangle);
  80. }
  81. break;
  82. }
  83. }
  84. //-----------------------------------【DrawRectangle( )函数】------------------------------
  85. // 描述:自定义的矩形绘制函数
  86. //-----------------------------------------------------------------------------------------------
  87. void DrawRectangle(cv::Mat& img, cv::Rect box)
  88. {
  89. cv::rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色
  90. }
  91. //-----------------------------------【ShowHelpText( )函数】-----------------------------
  92. // 描述:输出一些帮助信息
  93. //----------------------------------------------------------------------------------------------
  94. void ShowHelpText()
  95. {
  96. //输出欢迎信息和OpenCV版本
  97. printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
  98. printf("\n\n\t\t\t此为本书OpenCV3版的第18个配套示例程序\n");
  99. printf("\n\n\t\t\t 当前使用的OpenCV版本为:" CV_VERSION);
  100. printf("\n\n ----------------------------------------------------------------------------\n");
  101. //输出一些帮助信息
  102. printf("\n\n\n\t欢迎来到【鼠标交互演示】示例程序\n");
  103. printf("\n\n\t请在窗口中点击鼠标左键并拖动以绘制矩形\n");
  104. }

参考链接:
https://blog.csdn.net/zhmxy555/article/category/9262318

opencv入门笔记的更多相关文章

  1. OpenCV入门笔记(二) 图片的文件操作

    以下介绍一下重要的几个,设计基本 图片处理 的函数,依次来了解OpenCV的入门知识.具体的具体使用方法还是以官方的API[Official Tutorials][Python-OpenCV]为准. ...

  2. OpenCV入门笔记(七) 文字区域的提取

    https://blog.csdn.net/huobanjishijian/article/details/63685503 前面我们已经学了一些OpenCV中基本的图片处理的知识,可以拿来做一些小应 ...

  3. OpenCV入门笔记(三) 图片处理

    OpenCV中提供了非常多处理图片的强大函数,能够对非常多格式的图片 加特效.有点实现Photoshop里的工具的感觉. 以下先介绍一些简单和常见的特效. 二值化(Image Threshold) 參 ...

  4. OpenCV入门笔记(一) Linux下的安装

    关于OpenCV,有中文的官方站点.里面翻译了官网的教程和API等.中文官方Tutorials见这里:[Tutorials] 一.Ubuntu下的安装 能够选择直接从库里安装,或者手动编译安装,请參考 ...

  5. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  6. paper 93:OpenCV学习笔记大集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

  7. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  8. 【opencv入门篇】 10个程序快速上手opencv【上】

    导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...

  9. opencv 学习笔记集锦

    整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的.如果有好的资源,也欢迎介绍和分享. 1:OpenCV学习笔记 作者:CSDN数量:55篇博文网址: ...

随机推荐

  1. 脚本put数据到hdfs

    1.vim putdata.sh 脚本功能: 每小时的第15分钟把上一小时的数据put到hdfs相应目录 为了避免大量的小文件,我们把文件夹下的文件cat到一个临时文件里,put成功后删除这个临时文件 ...

  2. bat批处理运用

    一.简单批处理内部命令简介 1.Echo 命令 –显示 打开回显或关闭请求回显功能,或显示消息.如果没有任何参数,echo 命令将显示当前回显设置. 语法: echo [{on│off}] [mess ...

  3. jQuery相关方法8-----解绑事件

    一.解绑事件方法unbind() 用什么方式绑定的事件,最好用对应的方式解绑事件 unbind("事件名字")括号里写上事件名字,就会解除这个事件 unbind()括号里没有参数就 ...

  4. DEA使用git提交代码时,点了commit之后卡死在performing code analysis部分,或者performing code analysis结束后没有进入下一步操作。

    把"Perform code analysis" 和 "Check TODO" 复选框前面的勾去掉就好了. 这个可能是因为所分析的目标文件太大了,造成一直分析不 ...

  5. 使用Spring Ehcache二级缓存优化查询性能

    最近在对系统进行优化的时候,发现有些查询查询效率比较慢,耗时比较长, 通过压测发现,主要耗费的性能 消耗在 查询数据库,查询redis 数据库:连接池有限,且单个查询不能消耗大量的连接池,占用大量IO ...

  6. Linux下java环境变量配置

    安装步骤 1.查看当前Linux系统是否安装java rpm -qa | grep java 2.卸载系统中已经存在的openJDK rpm -e --nodeps java--openjdk-1.7 ...

  7. Python3 输入和输出(二)

    接上一节 1.读写文件的模式图 将字符串写入到文件 foo.txt 中: #!/usr/bin/python3 # 打开一个文件f = open("/tmp/foo.txt", & ...

  8. [WEB安全]Weblogic漏洞总结

    0x01 Weblogic简介 1.1 叙述 Weblogic是美国Oracle公司出品的一个应用服务器(application server),确切的说是一个基于Java EE架构的中间件,是用于开 ...

  9. enablePullDownRefresh的使用

    1.首先要在app.json里面去将enablePullDownRefresh设置为true. 2.js 3.现象

  10. netcore 发布到IIS上常见错误

    1 出现AspNetCoreModuleV2错误 报错原因: 你的IIS服务器上的.net core 运行时不是最新的,导致AspNetCoreModuleV2模块缺失或者报错,意思需要你更新了! 2 ...