一、图片基本操作

1.1 显示图片

#include <opencv2/opencv.hpp>  //头文件
using namespace cv;  //包含cv命名空间

void main( )
{
    // 【1】读入一张图片,载入图像
    Mat srcImage = imread("1.jpg");
    // 【2】显示载入的图片
    imshow("【原始图】",srcImage);
    // 【3】等待任意按键按下,正数为倒数时间,0和负数为无限
    waitKey(0);
}  

1.2 图像腐蚀

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

#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

int main()
{
   //载入原图
   Mat srcImage = imread("C:/Users/Administrator/Desktop/pic.jpg");
   //显示原图
   imshow("【原图】腐蚀操作", srcImage);
   //进行腐蚀操作
   Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));
   Mat dstImage;
   erode(srcImage, dstImage, element);
   //显示效果图
   imshow("【效果图】腐蚀操作", dstImage);
   waitKey(0);

   return 0;
}

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

1.3 图像模糊

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


#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;

int main()
{
   //【1】载入原始图
   Mat srcImage = imread("C:/Users/Administrator/Desktop/pic.jpg");

   //【2】显示原始图
   imshow("均值滤波【原图】", srcImage);

   //【3】进行均值滤波操作
   Mat dstImage;
   blur(srcImage, dstImage, Size(7, 7));

   //【4】显示效果图
   imshow("均值滤波【效果图】", dstImage);

   waitKey(0);
}

1.4 canny边缘检测


#include <opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;

int main()
{
   //【0】载入原始图
   Mat srcImage = imread("C:/Users/Administrator/Desktop/pic.jpg");
   imshow("【原始图】Canny边缘检测", srcImage);  //显示原始图
   Mat dstImage, edge, grayImage;   //参数定义

   //【1】创建与src同类型和大小的矩阵(dst)
   dstImage.create(srcImage.size(), srcImage.type());

   //【2】将原图像转换为灰度图像
   //此句代码的OpenCV2版为:
   //cvtColor( srcImage, grayImage, CV_BGR2GRAY );
   //此句代码的OpenCV3版为:
   cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);

   //【3】先用使用 3x3内核来降噪
   blur(grayImage, edge, Size(3, 3));

   //【4】运行Canny算子
   Canny(edge, edge, 3, 9, 3);

   //【5】显示效果图
   imshow("【效果图】Canny边缘检测", edge);

   waitKey(0);

   return 0;
}

二、读取并播放视频

VedioCapture类。

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
   //【1】读入视频
   VideoCapture capture("C:/Users/Administrator/Desktop/1.avi");

   //【2】循环显示每一帧
   while (1)
   {
      Mat frame;//定义一个Mat变量,用于存储每一帧的图像
      capture >> frame;  //读取当前帧
      imshow("读取视频", frame);  //显示当前帧
      waitKey(30);  //延时30ms
   }
   return 0;
}

三、调用摄像头采集图像

#include <opencv2\opencv.hpp>
using namespace cv;

int main()
{
   //【1】从摄像头读入视频
   VideoCapture capture(0);

   //【2】循环显示每一帧
   while (1)
   {
      Mat frame;  //定义一个Mat变量,用于存储每一帧的图像
      capture >> frame;  //读取当前帧
      imshow("读取视频", frame);  //显示当前帧
      waitKey(30);  //延时30ms
   }
   return 0;
}

四、HighGUI图形界面用户

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

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

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

int main()
{
   Mat girl = imread("C:/Users/Administrator/Desktop/girl.jpg"); //载入图像到Mat
   namedWindow("【1】动漫图"); //创建一个名为 "【1】动漫图"的窗口
   imshow("【1】动漫图", girl);//显示名为 "【1】动漫图"的窗口  

   //-----------------------------------【二、初级图像混合】--------------------------------------
   //   描述:二、初级图像混合
   //--------------------------------------------------------------------------------------------------
   //载入图片
   Mat image = imread("C:/Users/Administrator/Desktop/dota.jpg", 199);
   Mat logo = imread("C:/Users/Administrator/Desktop/dota_logo.jpg");

   //载入后先显示
   namedWindow("【2】原画图");
   imshow("【2】原画图", image);

   namedWindow("【3】logo图");
   imshow("【3】logo图", logo);

   //// 定义一个Mat类型,用于存放,图像的ROI
   //Mat imageROI;
   ////方法一
   ////imageROI = image(Rect(800, 350, logo.cols, logo.rows));
   ////方法二
   //imageROI= image(Range(350,350+logo.rows),Range(800,800+logo.cols));

   //// 将logo加到原图上
   //addWeighted(imageROI, 0.5, logo, 0.3, 0., imageROI);

   ////显示结果
   //namedWindow("【4】原画+logo图");
   //imshow("【4】原画+logo图", image);

   //-----------------------------------【三、图像的输出】--------------------------------------
   //   描述:将一个Mat图像输出到图像文件
   //-----------------------------------------------------------------------------------------------
   //输出一张jpg图片到工程目录下
   imwrite("C:/Users/Administrator/Desktop/由imwrite生成的图片.jpg", image);

   waitKey();

   return 0;
}

4.2 滑动条的创建和使用

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;

#define WINDOW_NAME "【滑动条的创建&线性混合示例】"        //为窗口标题定义的宏 

const int g_nMaxAlphaValue = 100;//Alpha值的最大值
int g_nAlphaValueSlider;//滑动条对应的变量
double g_dAlphaValue;
double g_dBetaValue;

//声明存储图像的变量
Mat g_srcImage1;
Mat g_srcImage2;
Mat g_dstImage;

//-----------------------------------【on_Trackbar( )函数】--------------------------------
//      描述:响应滑动条的回调函数
//------------------------------------------------------------------------------------------
void on_Trackbar(int, void*)
{
   //求出当前alpha值相对于最大值的比例
   g_dAlphaValue = (double)g_nAlphaValueSlider / g_nMaxAlphaValue;
   //则beta值为1减去alpha值
   g_dBetaValue = (1.0 - g_dAlphaValue);

   //根据alpha和beta值进行线性混合
   addWeighted(g_srcImage1, g_dAlphaValue, g_srcImage2, g_dBetaValue, 0.0, g_dstImage);

   //显示效果图
   imshow(WINDOW_NAME, g_dstImage);
}

//-----------------------------【ShowHelpText( )函数】--------------------------------------
//      描述:输出帮助信息
//-------------------------------------------------------------------------------------------------
//-----------------------------------【ShowHelpText( )函数】----------------------------------
//      描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
   //输出欢迎信息和OpenCV版本
   printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
   printf("\n\n\t\t\t此为本书OpenCV3版的第17个配套示例程序\n");
   printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION);
   printf("\n\n  ----------------------------------------------------------------------------\n");
}

//--------------------------------------【main( )函数】-----------------------------------------
//      描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main(int argc, char** argv)
{

   //显示帮助信息
   ShowHelpText();

   //加载图像 (两图像的尺寸需相同)
   g_srcImage1 = imread("C:/Users/Administrator/Desktop/1.jpg");
   g_srcImage2 = imread("C:/Users/Administrator/Desktop/2.jpg");
   if (!g_srcImage1.data) { printf("读取第一幅图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return -1; }
   if (!g_srcImage2.data) { printf("读取第二幅图片错误,请确定目录下是否有imread函数指定图片存在~!\n"); return -1; }

   //设置滑动条初值为70
   g_nAlphaValueSlider = 70;

   //创建窗体
   namedWindow(WINDOW_NAME, 1);

   //在创建的窗体中创建一个滑动条控件
   char TrackbarName[50];
   printf(TrackbarName, "透明值 %d", g_nMaxAlphaValue);

   createTrackbar(TrackbarName, WINDOW_NAME, &g_nAlphaValueSlider, g_nMaxAlphaValue, on_Trackbar);

   //结果在回调函数中显示
   on_Trackbar(g_nAlphaValueSlider, 0);

   //按任意键退出
   waitKey(0);

   return 0;
}

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

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函数,
用于获取当前轨迹条的位置并返回。

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

4.3 鼠标操作


#include <opencv2/opencv.hpp>
using namespace cv;

#define WINDOW_NAME "【程序窗口】"        //为窗口标题定义的宏 

void on_MouseHandle(int event, int x, int y, int flags, void* param);
void DrawRectangle(cv::Mat& img, cv::Rect box);
void ShowHelpText();

//-----------------------------------【全局变量声明部分】-----------------------------------
//      描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
Rect g_rectangle;
bool g_bDrawingBox = false;//是否进行绘制
RNG g_rng(12345);

int main(int argc, char** argv)
{
   //【0】改变console字体颜色
   system("color 9F");

   //【0】显示欢迎和帮助文字
   ShowHelpText();

   //【1】准备参数
   g_rectangle = Rect(-1, -1, 0, 0);
   Mat srcImage(600, 800, CV_8UC3), tempImage;
   srcImage.copyTo(tempImage);
   g_rectangle = Rect(-1, -1, 0, 0);
   srcImage = Scalar::all(0);

   //【2】设置鼠标操作回调函数
   namedWindow(WINDOW_NAME);
   setMouseCallback(WINDOW_NAME, on_MouseHandle, (void*)&srcImage);

   //【3】程序主循环,当进行绘制的标识符为真时,进行绘制
   while (1)
   {
      srcImage.copyTo(tempImage);//拷贝源图到临时变量
      if (g_bDrawingBox) DrawRectangle(tempImage, g_rectangle);//当进行绘制的标识符为真,则进行绘制
      imshow(WINDOW_NAME, tempImage);
      if (waitKey(10) == 27) break;//按下ESC键,程序退出
   }
   return 0;
}

//--------------------------------【on_MouseHandle( )函数】-----------------------------
//      描述:鼠标回调函数,根据不同的鼠标事件进行不同的操作
//-----------------------------------------------------------------------------------------------
void on_MouseHandle(int event, int x, int y, int flags, void* param)
{

   Mat& image = *(cv::Mat*) param;
   switch (event)
   {
      //鼠标移动消息
   case EVENT_MOUSEMOVE:
   {
      if (g_bDrawingBox)//如果是否进行绘制的标识符为真,则记录下长和宽到RECT型变量中
      {
         g_rectangle.width = x - g_rectangle.x;
         g_rectangle.height = y - g_rectangle.y;
      }
   }
   break;

   //左键按下消息
   case EVENT_LBUTTONDOWN:
   {
      g_bDrawingBox = true;
      g_rectangle = Rect(x, y, 0, 0);//记录起始点
   }
   break;

   //左键抬起消息
   case EVENT_LBUTTONUP:
   {
      g_bDrawingBox = false;//置标识符为false
      //对宽和高小于0的处理
      if (g_rectangle.width < 0)
      {
         g_rectangle.x += g_rectangle.width;
         g_rectangle.width *= -1;
      }

      if (g_rectangle.height < 0)
      {
         g_rectangle.y += g_rectangle.height;
         g_rectangle.height *= -1;
      }
      //调用函数进行绘制
      DrawRectangle(image, g_rectangle);
   }
   break;

   }
}

//-----------------------------------【DrawRectangle( )函数】------------------------------
//      描述:自定义的矩形绘制函数
//-----------------------------------------------------------------------------------------------
void DrawRectangle(cv::Mat& img, cv::Rect box)
{
   cv::rectangle(img, box.tl(), box.br(), cv::Scalar(g_rng.uniform(0, 255), g_rng.uniform(0, 255), g_rng.uniform(0, 255)));//随机颜色
}

//-----------------------------------【ShowHelpText( )函数】-----------------------------
//          描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
void ShowHelpText()
{
   //输出欢迎信息和OpenCV版本
   printf("\n\n\t\t\t非常感谢购买《OpenCV3编程入门》一书!\n");
   printf("\n\n\t\t\t此为本书OpenCV3版的第18个配套示例程序\n");
   printf("\n\n\t\t\t   当前使用的OpenCV版本为:" CV_VERSION);
   printf("\n\n  ----------------------------------------------------------------------------\n");
   //输出一些帮助信息
   printf("\n\n\n\t欢迎来到【鼠标交互演示】示例程序\n");
   printf("\n\n\t请在窗口中点击鼠标左键并拖动以绘制矩形\n");

}

参考链接:
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. CGI FastCGI php-FPM 分别是什么

    1.CGI协议用于php解析器跟webserver之间的通信(效率低,浪费资源) 2.FastCGI 可以一次性处理多个进程,是CGI的改良版本 3.php-FPM 是FastCGI 的进程管理器(产 ...

  2. 使用jQuery快速高效制作网页交互特效第一章JavaScript基础

    JavaScript 一.JavaScript概念: JavaScript面向对象事件驱动具有安全性的脚本语言,面向对象 JavaScript特点: 1.解释性语言,边运行边解释 2.和HTML页面实 ...

  3. jquery 使用off移除事件 使用one绑定一次事件,on绑定事件后触发多次相同的事件的异常

    <!-- jquery 移除事件,绑定一次事件,搜狗 one --> <!DOCTYPE html> <html lang="en"> < ...

  4. $("xxx"); 使用jQuery获得对象

    $("xxx"); 使用jQuery获得对象 console.log( $ ( $ ( $ ( '.dropdown' ) ) ) );  与下面返回的结果都是一毛一样的. con ...

  5. MySQL-数据库三范式

    数据库三范式 (1)第一范式(1NF): 定义:每一列都是不可分割的原子数据项(强调的是列的原子性): 例:一个表:[联系人](姓名,性别,电话) 如果在实际场景中,一个联系人有家庭电话和公司电话,那 ...

  6. 爬虫(十二):scrapy中spiders的用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  7. Fidller抓包分析post请求

    目的:抓包是为了最近做接口测试做准备,以前没有用过这个工具,最近来学下,但是网上很多文章了,所以不一一记录,有一部分参考即可 1.如何抓取想要的web端或者手机端包,已经有很多文章谢了,推荐的参考文章 ...

  8. C语言--输入输出格式

    一.PTA实验作业 题目1:7-3 温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1 ...

  9. Python Re 模块超全解读

    re模块下的函数 compile(pattern):创建模式对象 import re pat=re.compile('A') m=pat.search('CBA') #等价于 re.search('A ...

  10. sppNet论文学习

    Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition 深度神经网络中用于视觉识别的空间金字塔池化 ...