OpenCV基础(1)

1.图像读写与窗口显示

1.1.imread读取图像文件

Mat cv::imread(const string &filename,int flags = IMREAD_COLOR);

  • filename:要读取的图像文件名
  • flags:读取模式,可以从枚举cv::ImreadModes中取值,默认取值是IMREAD_COLOR,表示始终将图像转换为三通道RGB彩色图像

如果从指定文件加载图像成功就返回Mat矩阵,否则就返回空矩阵

1.2.imwrite保存图片

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

  • filename:需要写入的文件名,必须加上后缀
  • img:Mat类型数据,要保存到文件当中的源图像数据
  • params:特定格式保存的参数编码,一般不用写

1.3.新建窗口并显示

void nameWindow(const string &winname,int flags);

  • winname:新建的窗口的名称
  • flags:窗口的标识,一般默认为WINDOW_AUTOSIZE
    • WINDOW_AUTOSIZE:窗口自适应图片大小,并且不可手动更改
    • WINDOW_NORMAL:用户可以改变这个窗口的大小
    • WINDOW_OPENGL:窗口创建的时候支持OpenGL

void imshow(const string &winname,InputArray img);

  • winname:显示的窗口名,可以使用nameWindow函数创建窗口,如不创建,imshow将自动创建
  • img:窗口中需要显示的图像

根据图像的深度,imshow会自动对其进行缩放,规则如下:

  • 如果图像数据类型是8U,就直接显示
  • 如果图像数据类型是16U或32S,imshow函数就会自动将每个像素值除以256并显示,即将原图像素值的范围由[0~255*256]映射到[0~255]
  • 如果图像数据类型是32F或64F,imshow函数就会自动将每个像素值除以255并显示,即将原图像素值的范围由[0~1]映射到[0~255](注意:原图像素值必须归一化)

1.4.销毁窗口

//销毁一个指定名称的窗口

void destoryWindow(const string &winnanme);

//销毁全部窗口

void destoryAllWindows();

1.5.调整窗口大小

void resizeWindow(const string &winname,int width,int height);

  • winname:要调整尺寸的窗口名称
  • width:调整后的窗口宽度
  • height:调整后的窗口高度

2.OpenCV中的事件

2.1.鼠标事件

void setMousecallback(const string &winname,MouseCallback onMouse,void *userdata=0);

  • winname:窗口的名字
  • onMouse:鼠标事件响应的回调函数指针
  • userdata:传给回调函数的参数

鼠标事件回调函数类型MouseCallback定义如下:

typedef void(* cv::MouseCallback)(int event,int x,inty,int flags,void *userdata);

event:鼠标事件

enum{EVENT_MOUSEMOVE=0,    //滑动EVENT_LBUTTONDOWN=1,  //左键单击EVENT_RBUTTONDOWN=2,  //右键单击EVENT_MBUTTONDOWN=3,  //中键单击EVENT_LBUTTONUP=4,    //左键放开EVENT_RBUTTONUP=5,    //右键放开EVENT_MBUTTONUP=6,    //中建放开EVENT_LBUTTONDBLCLK=7,//左键双击EVENT_RBUTTONDBLCLK=8,//右键双击EVENT_MBUTTONDBLCLK=9 //中键双击
}

x:鼠标事件的x坐标

y:鼠标事件的y坐标

flags:鼠标事件的标志

enum{EVENT_FLAG_LBUTTON=1,    //左键拖拽EVENT_FLAG_RBUTTON=2,    //右键拖拽EVENT_FLAG_MBUTTON=4,    //中键拖拽EVENT_FLAG_CTRLKEY=8,    //按CTRLEVENT_FLAG_SHIFTKEY=16,  //按SHIFTEVENT_FLAG_ALTKEY=32     //按ALT    
}

userdata:可选的参数

2.2.键盘事件

int waitKey(int delay=0);

delay:延时的时间,单位是毫秒,默认是0,表示永久等待。该函数在至少创建了一个窗口并该窗口处于活动状态才有效;如果有多个窗口,则其中任何一个都可以处于活动状态。在小于等于0时表示等待时间无限长,为正整数n时,至少等待n毫秒才结束。在等待期间,按任意按键函数结束,返回按键的键值(ASCII码),等待时间结束仍未按下按键则返回-1。

2.3.滑动条事件

//创建滑动条
int cv::createTrackbar(const string &trackbarname,const string &winname,int *value,int count,TrackCallback onChange=0,void *userdata=0);//回调函数类型TrackbarCallback的定义
typedef void(* cv::TrackbarCallback)(int pos,void *userdata);//获取滑动块的位置
int cv::getTrackbarpos(const string &trackName,const string &winname);//设置滑动块的位置
void cv::setTrackbarPos(const string &trackName,const string &winname,int pos);

3.矩阵操作

3.1.构造矩阵

Mat::Mat()
Mat::Mat(int rows,int cols,int type)
Mat::Mat(Size size,int type)
Mat::Mat(int rows,int cols,int type,const Scalar &s)
Mat::Mat(Size size,int type,const Scalar &s)
Mat::Mat(const Mat &m)
Mat::Mat(int rows,int cols,int type,void *data,size_t step=AUTO_STEP)
Mat::Mat(Size size,int type,void *data,size_t step=AUTO_STEP)
Mat::Mat(const Mat &m,const Range &rowRange,const Range &colRange)
Mat::Mat(const Mat &m,const Rect &roi)
Mat::Mat(int ndims,const int *sizes,int type,const Scalar &s)
void create(int rows,int cols,int type)

3.2.构造特殊矩阵

//定义全0矩阵
static MatExpr zeros(int rows,int cols,int type)
static MatExpr zeros(Size size,int type)
static MatExpr zeros(int ndims,const int *sz,int type)//定义全1的矩阵
static MatExpr ones(int rows,int cols,int type)
static MatExpr ones(Size size,int type)
static MatExpr ones(int ndims,const int *sz,int type)//定义对角线为1的矩阵
static MatExpr eye(int rows,int cols,int type)
static MatExpr eye(Size size,int type)

3.3.获取矩阵的属性

Mat类提供了如下公有成员变量:

  • rows:矩阵的行数
  • cols:矩阵的列数
  • dims:矩阵的维数
  • uchar *cv::Mat::data:指向Mat数据部分的首地址
//获得矩阵通道数
int channels();//判断矩阵是否为空
bool empty();//获取矩阵的总个数
size_t Mat::total();

3.4.复制矩阵

//深复制
Mat clone();
void copyTo(OutputArray m);
void copyTo(OutputArray m,InputArray mask);//浅复制(赋值运算符和拷贝构造函数)
Mat dst=src;
Mat dst(src);

4.图像处理基础

4.1.颜色变换

void cvtColor(InputArray src,OutputArray dst,int code,int dstCn=0);

  • src:输入图像
  • dst:输出图像
  • code:转换的代码或标识
  • dstCn:目标图像的通道数,默认取值为0,如果取值为0,就由src和dst决定

4.2.画矩形

void cv::rectangle(InputOutputArray img,Point p1,Point p2,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

void cv::rectangle(InputOutputArray img,Rect rec,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:矩形所在的图像
  • p1:矩形的一个顶点
  • p2:矩形对角线上的另一个顶点
  • color:线条的颜色
  • thickness:线条的粗细程度,取负值(如CV_FILLED)函数绘制填充了色彩的矩形
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.3.画圆

void cv::circle(InputOutputArray img,Point center,int radius,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:圆所在的图像
  • center:圆心的坐标
  • radius:圆的半径
  • color:线条的颜色
  • thickness:线条的粗细程度,取负值(如CV_FILLED)函数绘制填充了色彩的圆形
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.4.画椭圆

void cv::ellipse(InputOutputArray img,Point center,Size axes,double angle,double startAngle,double endAngle,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:椭圆所在的图像
  • center:椭圆圆心的坐标
  • axes:轴的长度
  • angle:偏转的角度
  • startAngle:圆弧起始角的角度
  • endAngle:圆弧终结角的角度
  • color:线条的颜色
  • thickness:线条的粗细程度
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.5.画线段

void cv::line(InputOutputArray img,Point p1,Point p2,const SCalar &color,int thickness=1,int lineType=LINE_8,int shift=0);

  • img:线段所在的图像
  • p1:线段起始点
  • p2:线段结束点
  • color:线条的颜色
  • thickness:线条的粗细程度
  • lineType:线条的类型
  • shift:坐标点的小数点位数

4.6.多边形填充

void cv::fillPoly(Mat &img,const Point **pts,const int *npts,int ncountours,const Scalar &color,int lineType=LINE_8,int shift=0,Point offset=Point());

  • img:输入图像
  • pts:多边形点集
  • color:多边形颜色
  • lineType:线条的类型
  • shift:坐标点的小数点位数
  • offset:等高线所有点的偏移

4.7.文字绘制

//绘制文字

void cv::putText(cv::Mat &img,const string &text,cv::Point origin,int fontFace,double fontScale,cv::Scalar color,int thickness=1,int lineType=8,bool bottomLeftOrigin=false);

//获取字符串的长度和宽度

Size cv::getTextSize(const string &text,cv::Point origin,int fontFace,double fontScale,int thickness,int *baseLine);

  • img:待绘制的图片
  • text:待绘制的文字
  • origin:文本框的左下角
  • fontFace:字体
  • fontScale:尺寸因子,值越大,字体越大
  • color:线条颜色
  • thickness:线条宽度
  • lineType:线条类型
  • baseLine:文字最底部的y坐标

4.8.随机数

//使用种子产生一个32位随机整数
RNG();
RNG(uint64 state);
RNG rng;     //创建RNG对象,使用默认种子-1
int N1 = rng;//产生32位整数,其实rng既是一个RNG对象,又是一个随机整数//产生一个均匀分布的随机数(返回一个[a,b)范围的均匀分布的随机数)
int uniform(int a,int b);//产生一个高斯分布的随机数(返回一个均值为0,标准差为sigma的高斯分布1的随机数)
double gaussian(double sigma);//返回下一个随机数
unsigned next();//用随机数填充矩阵
void fill(InputOutputArray mat,int distType,InputArray a,InputArray b,bool saturateRange=false);

4.9.为图像添加边框

void cv::copyMakeBorder(InputArray src,OutputArray ddst,int top,int bottom,int left,int right,int borderType,const Scalar &value=Scalar());

  • src:输入图像
  • dst:输出图像
  • top、bottom、left、right:表示源图像在4个方向上扩充多少像素
  • borderType:边界类型
    • BORDER_REPLICATE:复制法,复制最边缘的像素扩充边界
    • BORDER_REFLECT_101:对称法,以最边缘的像素为轴,对称填充
    • BORDER_CONSTANT:常量法,以一个常量像素值填充扩充的边界
    • BORDER_REFLECT:和对称法原理一致,不过连最边缘的像素也要对称过去
    • BORDER_WRAP:用另一侧的元素来填充这一侧的扩充边界

4.10.在图像当中查找轮廓

//查找轮廓
void cv::findContours(InputArray image,OutPutArrayOfArrays contours,OutPutArray hierarchy,int mode,int method,Point offset=Point());//绘制轮廓
void cv::drawContours(InputOutputArray image,OutPutArrayOfArrays contours,int contourIdx,const Scalar &color,int thickness=1,int lineType=LINE_8,InputArray hierarchy=noArray(),int maxLevel=INT_MAX,Point offset=Point());

5.视频处理

5.1.播放视频文件

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;void processiamge(Mat &frame)
{circle(frame, Point(cvRound(frame.cols / 2), cvRound(frame.rows / 2)), 150, Scalar(0, 0, 255), 2, 8);
}int main()
{string filename = "1.avi";//打开的视频文件VideoCapture capture;capture.open(filename);double rate = capture.get(CV_CAP_PROP_FPS);//获取视频文件的帧率int delay = cvRound(1000.000 / rate);if (!capture.isOpened())//判断是否打开视频文件{return -1;}else{while (true){Mat frame;//capture.read(frame);capture >> frame;//读出每一帧的图像if (frame.empty()) break;imshow("处理前视频", frame);processiamge(frame);imshow("处理后视频", frame);waitKey(delay);}}return 0;
}

5.2.设置和获取视频属性

//获取属性 double get(int propId);

//设置属性 bool set(int propId,double value);

5.3.播放摄像头视频

#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;void processiamge(Mat &frame)
{circle(frame, Point(cvRound(frame.cols / 2), cvRound(frame.rows / 2)), 150, Scalar(0, 0, 255), 2, 8);
}int main()
{VideoCapture capture;capture.open(0);//0表示摄像头的索引号double rate = capture.get(CV_CAP_PROP_FPS);//获取视频文件的帧率int delay = cvRound(1000.000 / rate);if (!capture.isOpened())//判断是否打开视频文件{return -1;}else{while (true){Mat frame;//capture.read(frame);capture >> frame;//读出每一帧的图像if (frame.empty()) break;imshow("处理前视频", frame);processiamge(frame);imshow("处理后视频", frame);waitKey(delay);}}return 0;
}

5.4.录制视频

#include <opencv2/core/core.hpp>  
#include <opencv2/highgui/highgui.hpp>  
using namespace cv;void main()
{VideoCapture capture(0);//如果是笔记本,0打开的是自带的摄像头,1 打开外接的相机double rate = 25.0;//视频的帧率Size videoSize(1280,960);VideoWriter writer("VideoTest.avi", CV_FOURCC('M', 'J', 'P', 'G'), rate, videoSize);Mat frame;while (capture.isOpened()){capture >> frame;writer << frame;imshow("video", frame);if (waitKey(20) == 27)//27是键盘摁下esc时,计算机接收到的ascii码值{break;}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18225.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【优选算法篇】分治乾坤,万物归一:在重组中窥见无声的秩序

文章目录 分治专题&#xff08;二&#xff09;&#xff1a;归并排序的核心思想与进阶应用前言、第二章&#xff1a;归并排序的应用与延展2.1 归并排序&#xff08;medium&#xff09;解法&#xff08;归并排序&#xff09;C 代码实现易错点提示时间复杂度和空间复杂度 2.2 数组…

生产环境centos8 Red Hat8部署ansible and 一键部署mysql两主两从ansible脚本预告

一、各节点服务器创建lvm逻辑卷组 1.初始化磁盘为物理卷&#xff08;PV&#xff09; 命令&#xff1a;sudo pvcreate /dev/vdb 2.创建卷组&#xff08;VG&#xff09; 命令&#xff1a;sudo vgcreate db_vg /dev/vdb 3.创建逻辑卷&#xff08;LV&#xff09; 命令&#xff1a;s…

CNN神经网络

CNN 一 基本概述二 基础知识三 经典案例 今天跟大家聊聊人工智能中的神经网络模型相关内容。神经网络内容庞大,篇幅有限本文主要讲述其中的CNN神经网络模型。 一 基本概述 深度学习(Deep Learning)特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网…

【Ubuntu24.04】VirtualBox安装ubuntu-live-server24.04

目录 0 背景1 下载镜像2 安装虚拟机3 安装UbuntuServer24.044 配置基本环境5 总结0 背景 有了远程连接工具之后,似乎作为服务器的Ubuntu24.04桌面版有点备受冷落了,桌面版的Ubuntu24.04的优势是图形化桌面,是作为一个日常工作的系统来用的,就像Windows,如果要作为服务器来…

【策略模式】最佳实践——Spring IoC实现策略模式全流程深度解析

简介 策略模式是一种行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并将每一个算法封装起来&#xff0c;使它们可以互相替换&#xff0c;并且使算法的变化不会影响使用算法的客户端。策略模式通过将具体的业务逻辑从上下文&#xff08;Context&#xff09;中剥离出…

企业项目级IDEA设置类注释、方法注释模板(仅增加@author和@date)

文章目录 前言一 设置类注释1.1 添加模板1.2 复制配置 二 设置方法注释2.1 添加模版2.2 设置模版2.3 设置参数变量2.4 配置对应快捷键2.5 配置对应作用域2.6 使用方式 说明 前言 公司代码规范中&#xff0c;需要在标准JavaDoc注释的基础上加上作者和日期。网上虽然有很多现成的…

单片机学习笔记 2. LED灯闪烁

目录 0、实现的功能 1、Keil工程 2、代码实现 0、实现的功能 LED灯闪烁 1、Keil工程 闪烁原理&#xff1a;需要进行软件延时达到人眼能分辨出来的效果。常用的延时方法有软件延时和定时器延时。此次先进行软件延时 具体操作步骤和之前的笔记一致。此次主要利用无符号整型的范…

编辑器vim 命令的学习

1.编辑器Vim 1.vim是一个专注的编辑器 2.是一个支持多模式的编辑器 1.1见一见&#xff1a; vim 的本质也是一条命令 退出来&#xff1a;-> Shift:q 先创建一个文件 再打开这个文件 进入后先按 I 然后就可以输入了 输入完后&#xff0c;保存退出 按Esc --> 来到最后一…

调用门提权

在我写的2.保护模式&#xff0b;段探测这篇文章中&#xff0c;我们提到了S位对于段描述符的控制&#xff0c;之前我们已经介绍了代码段和数据段&#xff0c;现在我们来把目光转到系统段 在这么多中结构里面&#xff0c;我们今天要介绍的就是编号为12的&#xff0c;32位调用门 结…

langchain模型及I/O的封装

langchain安装&#xff1a;pip install langchain-openai https://python.langchain.com/v0.2/docs/integrations/platforms/openai/ 注意&#xff1a;安装后&#xff0c;我们需要在环境变量中配置OPENAI_API_KEY&#xff0c;langchain会自动获取 1.模型的封装 指令生成式模…

阿里斑马智行 2025届秋招 NLP算法工程师

文章目录 个人情况一面/技术面 1h二面/技术面 1h三面/HR面 20min 个人情况 先说一下个人情况&#xff1a; 学校情况&#xff1a;211本中9硕&#xff0c;本硕学校都一般&#xff0c;本硕都是计算机科班&#xff0c;但研究方向并不是NLP&#xff0c;而是图表示学习论文情况&…

谈一谈QThread::CurrentThread和this->thread

QThread::CurrentThread是指的当前函数调用者者所在的线程 this->thread是指的当前对象所在的线程&#xff08;对象创建出来的时候所在的线程&#xff09; Qt文档说明 CurrentThread返回一个指向管理当前执行线程的QThread的指针 thread返回对象所在的线程 这两个函数所…

深度学习实验十一 卷积神经网络(2)——基于LeNet实现手写体数字识别实验

目录 一、数据 二、模型构建 三、模型训练及评价 四、打印参数量和计算量 五、模型预测 附&#xff1a;完整可运行代码 实验大致步骤&#xff1a; 一、数据 下载网站&#xff1a;MNIST数据集 之前的官网不能下载数据集了&#xff0c;403了&#xff0c;所以找到一个类似…

Python语法便捷查询

一、Python基础语法&#xff1a; (1)注释&#xff1a; (2)标识符&#xff1a; 简介&#xff1a;标识符的格式限制和C语言一样 (3)字符串定义方法&#xff1a; (4)字符串拼接&#xff1a; (5)字符串的格式化&#xff08;占位拼接&#xff09;&#xff1a; 和C语言的printf类…

Ansys Maxwell - 3PH 感应电机 - 第 2 部分 - 机床工具包 ACT

本篇博文是“Ansys Maxwell&#xff1a;3PH 感应电机 - 力和热耦合”的延续。在本篇博文中&#xff0c;我将展示如何使用 Ansys Machine Toolkit ACT 开发扭矩与速度曲线&#xff08;一系列性能曲线&#xff0c;包括效率图&#xff09;&#xff0c;以评估在 Ansys Maxwell 中建…

【含开题报告+文档+PPT+源码】基于springboot的教师评价系统的设计与实现

开题报告 随着信息技术的迅猛发展&#xff0c;教育信息化已成为现代教育的必然趋势。教研室作为高校教学管理的重要机构&#xff0c;肩负着提升教学质量、推动教学改革的重要使命。然而&#xff0c;传统的教学管理方式往往存在效率低下、数据分散、管理不便等问题&#xff0c;…

用 Python 从零开始创建神经网络(八):梯度、偏导数和链式法则

梯度、偏导数和链式法则 引言1. 偏导数2. 和的偏导数3. 乘法的偏导数4. Max 的偏导数5. 梯度&#xff08;The Gradient&#xff09;6. 链式法则&#xff08;The Chain Rule&#xff09; 引言 在我们继续编写我们的神经网络代码之前&#xff0c;最后两个需要解决的难题是梯度和…

并查集 poj 2524,1611,1703,2236,2492,1988 练习集【蓝桥杯备赛】

目录 前言 并查集优势 Ubiquitous Religions poj 2524 问题描述 问题分析 代码 The Suspects poj 1611 问题描述 问题分析 代码 Wireless Network poj 2236 问题描述 问题分析 代码 分类 带权并查集合 权值树构建步骤 Find them, Catch them poj 1703 问题描述 问题分…

zabbix监控tomcat

1. 准备JDK环境 #vim /etc/profile export JAVA_HOME/usr/local/jdk export TOMCAT_HOME/usr/local/tomcat export PATH$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$TOMCAT_HOMOE/bin [rootCentOS8 ~]# source /etc/profile [rootCentOS8 ~]# java -version openjdk version &q…

Nuget For Unity插件介绍

NuGet for Unity&#xff1a;提升 Unity 开发效率的利器 NuGet 是 .NET 开发生态中不可或缺的包管理工具,你可以将其理解为Unity的Assets Store或者UPM,里面有很多库可以帮助我们提高开发效率。当你想使用一个库,恰好这个库没什么依赖(比如newtonjson),那么下载包并找到Dll直接…