opencv4应用开发基础

2023-11-17

opencv3.0版本以上都是用C++实现的. 常用的一些函数及类型集中在cv命名空间里.

cv::Mat类型用于表示一个图像.
构造函数除了空的构造函数外,还有很多个:
	Mat(int rows, int cols, int type); //创建指定行,列数的图像对象
	Mat(Size size, int type);
  	type参数用于指定每个像素点的大小,如CV_8UC1.
bool empty() const;//此函数成员用于判断Mat图像数据是否为空.

 Mat imread( const String& filename, int flags = IMREAD_COLOR ); //函数用于加载一个图像文件并生成Mat对象
     filename参数用于指定图像文件的路径及文件名.
     flags加载图像时的处理:  
		IMREAD_COLOR 转成BGR的图像数据
		IMREAD_GRAYSCALE 转成灰度图


void imshow(const String& winname, InputArray mat); //用一个窗口显示Mat图像
     winname参数指定窗口名
     mat参数指定Mat对象,  InputArray类构造函数支持Mat对象


int waitKey(int delay = 0); //暂停执行多久
   delay参数指定等待多少毫秒. 0表示一直等到有任意键按下止.

cv::VideoCapture类型用于表示操作摄像头或读视频文件的一个操作对象
此类的构造函数共有两个:
    VideoCapture(const String& filename, int apiPreference = CAP_ANY); //可用于指定要读取的视频文件
    VideoCapture(int index, int apiPreference = CAP_ANY); //可用于指定要打开第几个摄像头
    
    apiPreference参数用于指定打开方式处理:   CAP_ANY表示自动尝试。即如打开视频文件失败,会尝试打开摄像头
				            CAP_V4L2表示指定使用Linux-V4L2接口打开摄像头
     				            CAP_DSHOW 在windows上使用
                                            CAP_FFMPEG 表示通过调用ffmpeg库来打开视频文件
    bool isOpened() const; //函数成员用于判断是否成功打开.
    bool read(OutputArray image) ; //此函数成员用于从VideoCapture对象读出一个图像数据. OutputArray类构造函数可支持Mat对象.
cv::VideoWriter类型用于保存视频文件的操作.
构造函数:
	VideoWriter(const String& filename, int fourcc, double fps,
                Size frameSize, bool isColor = true);
	filename指定输出的视频文件名
	fourcc指定视频编码格式.  VideoWriter::fourcc('H','2','6','4')
	fps参数指定多少帧图像每秒
	frameSize参数指定图像的分辨率.
	isColor指定要编码的图像是彩色图还是灰度图.

void write(InputArray image); //此函数成员用于往视频文件写入一帧图像.

/
从摄像头获取图像数据显示并录制的例程:

#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/videoio.hpp>

using namespace  cv;
int main(void)
{

    VideoCapture *cap = new VideoCapture(0, CAP_V4L2);
    if (!cap->isOpened())
        return 3;
    Mat m;
    cap->read(m);

    // mpeg  mjpg
    VideoWriter *wt = new VideoWriter("/my.avi", VideoWriter::fourcc('H','2','6','4'), 10,
                                 m.size());
    for (int i = 0; i < 100; i++)
    {
        cap->read(m);
        wt->write(m);
        imshow("pic", m);
        waitKey(100);
    }

    delete wt;
    delete cap;
    return 0;
}

在图像上增加文字的函数:
void cv::putText( InputOutputArray img, const String& text, Point org,
                         int fontFace, double fontScale, Scalar color,
                         int thickness = 1, int lineType = LINE_8,
                         bool bottomLeftOrigin = false );
	img参数指定图像对象,可用Mat对象
	text指定要增加的文字内容.
	org参数指定从图像的像素坐标开始画出字. 如从100,100坐标开始: Point pos(100, 100);
	fontFace参数指定字体的大小及字体, 可用的有:
		enum HersheyFonts {
		    FONT_HERSHEY_SIMPLEX        = 0, //!< normal size sans-serif font
		    FONT_HERSHEY_PLAIN          = 1, //!< small size sans-serif font
		    FONT_HERSHEY_DUPLEX         = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
		    FONT_HERSHEY_COMPLEX        = 3, //!< normal size serif font
		    FONT_HERSHEY_TRIPLEX        = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
		    FONT_HERSHEY_COMPLEX_SMALL  = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
		    FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
		    FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
		    FONT_ITALIC                 = 16 //!< flag for italic font
		};
	fontScale参数指定字体的放大倍数.
	color参数指定字体的颜色. 如指定蓝色: Scalar s(255, 0, 0) //BGR;
	thickness参数指定线条的粗细度.值越大则越粗.
	lineType参数指定线条风格,可选择的有:
		enum LineTypes {
		FILLED  = -1,
			LINE_4  = 4, //!< 4-connected line
			LINE_8  = 8, //!< 8-connected line
			LINE_AA = 16 //!< antialiased line
		};
	bottomLeftOrigin参数, false指定正常画出字,true表示字体是倒着的.

///
在上面例程上加上时间标签:



#include <opencv4/opencv2/opencv.hpp>
#include <opencv4/opencv2/highgui.hpp>
#include <opencv4/opencv2/videoio.hpp>
#include <time.h>

using namespace  cv;
int main(void)
{

    VideoCapture *cap = new VideoCapture(0, CAP_V4L2);
    if (!cap->isOpened())
        return 3;
    Mat m;
    cap->read(m);

    // mpeg  mjpg
    VideoWriter *wt = new VideoWriter("/my.avi", VideoWriter::fourcc('H','2','6','4'), 10,
                                 m.size());

    Point pos(100, 100);
    Scalar s(255, 0, 0);
    char str[20];
    struct tm *tm;
    time_t now;

    for (int i = 0; i < 100; i++)
    {
        cap->read(m);
        now = time(nullptr);
        tm = localtime(&now);
        sprintf(str, "%d-%02d-%02d %02d:%02d:%02d", tm->tm_year+1900,
                tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec);
        putText(m, str, pos, FONT_HERSHEY_DUPLEX, 1.0, s, 1);
        wt->write(m);
        imshow("pic", m);
        waitKey(100);
    }

    delete wt;
    delete cap;
    return 0;
}

两Mat图像比较的方法步骤:

1. 把Mat图像转换成灰度图
 cvtColor(srcMat, dstMat, BGRA2GRAY);

2. 高斯滤波处理灰度图
 GaussianBlur(srcMat, dstMat, new Size(21, 21), 0);
 //new Size(21, 21)指定高斯核大小,值越大则图像越模糊
 //0指定sigmaX – X方向上的高斯核标准偏差
3. 比较已按上面步骤处理的两个Mat图像
 dstMat = Absdiff(srcMat1, srcMat2);
4. 把两个Mat图像比较生成的灰度图转换成黑白图
 dstMat = Threshold(srcMat,80, 255, THRESH_BINARY);
 //指定每个像素的灰度值是在80~255范围则转换成白色,其它值范围的像素则转成黑色
5. 统计黑白图里白色的像素个数
  int ret = CountNonZero(Mat);
  //结果数值越大则表示两个图像的差异就越大
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv4应用开发基础 的相关文章

  • 在 Python 3.5 64 位上通过 pip 安装 OpenCV

    我尝试安装 OpenCV 但找不到任何合适的 pip 软件包 我决定上网查找有关如何安装它的官方文档 并发现this https opencv python tutroals readthedocs io en latest py tuto
  • 为什么这些双精度数的返回值为-1.#IND?

    I have double score cvMatchContourTrees CT1 CT2 CV CONTOUR TREES MATCH I1 0 0 cout lt
  • Google Cloud Platform:将上传的 MP4 文件转换为 HLS 文件

    我正在构建一个平台 允许用户将一些视频文件 20 40 秒 从手机上传到服务器 所有这些上传目前都运行良好 文件通过nodejs云功能存储在谷歌存储桶中 现在我想创建一个 gcp 转码器作业 它将上传的 mp4 视频文件转换为 hls 视频
  • 从编码视频文件中提取运动向量

    我正在尝试从编码的 mp4 文件中提取运动矢量数据 在之前的帖子中我发现 一个答案http www princeton edu jiasic cos435 motion vector c http www princeton edu jia
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 如何使用 ffmpeg 提取时间精确的视频片段?

    这并不是一个特别新的问题领域 但我已经尝试过那里建议的内容 但运气不佳 那么 我的故事 我有一大段 15 秒的直接来自camera mov 视频 我想从中提取特定的块 我可以通过开始时间和停止时间 以秒为单位 来识别该块 我首先尝试执行我称
  • 如何在给定目标大小的情况下在 python 中调整图像大小,同时保留纵横比?

    首先 我觉得这是一个愚蠢的问题 对此感到抱歉 目前 我发现计算最佳缩放因子 目标像素数的最佳宽度和高度 同时保留纵横比 的最准确方法是迭代并选择最佳缩放因子 但是必须有更好的方法来做到这一点 一个例子 import cv2 numpy as
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • VLC 和 ffmpeg 如何协同工作?

    我从源代码编译了VLC 它运行良好 当我执行 Vlc 时 vlc 运行 我还从源代码编译了 ffmpeg 它也运行良好 当我执行 ffmpeg i f toto flv mp3 vn acodec copy new toto mp3 时 会
  • 使用opencv计算深度视差图

    我无法使用 opencv 从视差图计算深度 我知道两个立体图像中的距离是用以下公式计算的z baseline focal disparity p 但我不知道如何使用地图计算视差 我使用的代码如下 为我提供了两个图像的视差图 import n
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • MP4 到 DASH(bash 脚本)

    我有一个网站 用户可以在其中上传视频文件 我想使用 DASH 流式传输所有内容以获得自适应比特率流式传输 因此 我编写了一个 bash 脚本 由 cron 运行 将所有 mp4 文件转换为 DASH 但它无法正常工作 出了什么问题 例如 使
  • 使用 mkfifo 和传输流,这可能吗?

    我想执行一个 bash 脚本来执行以下操作 应用程序 ffmpeg 生成实时传输流 ts 文件 我需要处理这个实时流 执行解复用等 现在我知道这必须通过 FIFO 来完成 但这是我的任务 我需要重定向 ffmpeg 的输出以写入 fifo
  • OpenCV 3 中的 FLANN 错误

    我运行的是 Ubuntu 14 04 我正在尝试使用 openCV 3 运行 FLANN 但出现错误 下面的所有内容都是通过使用 AKAZE 和 ORB 进行尝试的 但代码来自我尝试使用 ORB 的情况 我使用 ORB 来查找描述符和关键点
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • FFmpeg 不适用于 android 10,直接进入 onFailure(String message) 并显示空消息

    我在我的一个项目中使用 FFmpeg 进行视频压缩 在 Android 10 Google Pixel 3a 上 对于发送执行的任何命令 它会直接进入 onFailure String message 并显示空消息 所以我在我的应用程序 g
  • 在 ffmpeg 中,如何使用scale2ref 过滤器缩放 dvdsub 字幕以匹配视频大小?

    我有一个从直播电视录制的 mpeg 文件 其中包含视频以及多个音频和字幕流 我的最终目标是能够创建较小的视频文件 因为 mpeg 文件大小为数 GB 我在这条道路上的第一步只是能够选择视频 音频和字幕流中的每一个并将它们复制到 mkv 文件
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa

随机推荐

  • react route和Switch的区别 +嵌套路由

    Router 指定路由规则 Router默认也是模糊匹配 Router的path可以不写 如果不写 表示该组件一定匹配 Switch 选择 开关 Switch中只有一个组件能匹配 只会显示第一个匹配的组件 exact 表示精确匹配
  • #QGIS源码官方编译指南

    QGIS源码官方编译指南 将QGIS官方的编译指南windows部分翻译一下 供大家参考 这个版本是QGIS源代码工程中2017年4月30日最后修改的版本 对应QGIS 2 99 也就是即将发布为QGIS 3 0的版本 翻译 Jacory
  • 计算机开机时间不对,为什么电脑每次开机时间都不对

    电脑是很智能的 一般情况下一开机电脑上面的时间就会自动校准 可有时候也会出现毛病 比如每次开机时间都不对 那么这是为什么呢 windows电脑 电脑时间不准的原因有 1 主板电池没电 2 有病毒 3 主板出问题 对应的解决方法 1 更换主板
  • 2023华为OD机试真题Java实现【寻找最大价值的矿堆/深度优先搜索】

    前言 本题使用Java实现 如果需要Python代码 请点击以下链接 点我 题目 我们规定 0表示空地 1表示银矿 2表示金矿 矿堆表示由相邻的金矿或银矿连接形成的地图 银矿价值是1 金矿价值是2 你的目标是找出地图中最大价值的矿堆 并且输
  • react页面渲染之前_React 单页面初始化渲染优化

    由于项目使用 React React Router Redux 来开发项目 采取了前端渲染的方式 如果采用 ssr 就不会有这个问题 问题 所以每到一个页面 需要发一个初始化的请求来获取页面数据 然后重新渲染页面 所以之前一个页面从请求到加
  • PP-YOLOE的译读笔记

    PP YOLOE An evolved version of YOLO 摘要 本文介绍了PP YOLOE模型 一种SOTA的产业级目标检测器 具有性能高效和部署友好的特点 本文在之前的PP YOLOv2的基础上进行优化 使用了anchor
  • linux如何脚本监控tps,Linux性能监控分析命令(三)—iostat命令介绍

    性能监控分析的命令包括如下 1 vmstat 2 sar 3 iostat 4 top 5 free 6 uptime 7 netstat 8 ps 9 strace 10 lsof 命令介绍 iostat是对系统的磁盘I O操作进行监控
  • vs中nuget包引用感叹号解决

    移除其中一个包引用 然后重新再nuget中搜索 然后在添加进来 其他的有感叹号的nuget包引用也自动刷新包了 就解决了
  • +-字符串(简单贪心)

    字符串 时间限制 1000 ms 内存限制 65535 KB 难度 1 描述 Shiva得到了两个只有加号和减号的字符串 字串长度相同 Shiva一次可以把一个加号和它相邻的减号交换 他想知道最少需要多少次操作才能把第一个字符串变换成第二个
  • python 安装第三方库imblearn

    首先把自己的numpy scikit learn scipy卸载掉 然后执行 pip install imblearn i http pypi douban com simple trusted host pypi douban com 如
  • MySQL学习笔记

    文章目录 一 数据库概述及数据准备 SQL DB DBMS 表 table SQL语句分类 导入数据 查看表结构 查看表中的数据 二 常用命令 查看MySQL版本 创建数据库 查询当前使用的数据库
  • ChatGPT/InstructGPT详解

    前言 GPT系列是OpenAI的一系列预训练文章 GPT的全称是Generative Pre Trained Transformer 顾名思义 GPT的目的就是通过Transformer为基础模型 使用预训练技术得到通用的文本模型 目前已经
  • sublime主题配色

    ignored packages Vintage theme Default Dark sublime theme dark theme Default sublime theme light theme Adaptive sublime
  • 【华为OD机试】生日礼物【2023 B卷

    华为OD机试 真题 点这里 华为OD机试 真题考点分类 点这里 题目描述 小牛的孩子生日快要到了 他打算给孩子买蛋糕和小礼物 蛋糕和小礼物各买一个 他的预算不超过x元 蛋糕cake和小礼物gift都有多种价位的可供选择 请返回小牛共有多少种
  • 【vue3】watchEffect只监听一次的方法

    import watchEffect from vue let data ref watchEffect gt console log data value 要利用data value执行的操作 而且还必须在watchEffect里面执行
  • 记录错误:con not perform the following tasks

    Ubuntu系统下安装软件出现报错 con not perform the following tasks TOC 检查软件源 实在不行改为国内源 或者等待网络再次下载
  • Bootstarp4 设计网页轮播组件

    很多网站都有广告轮播功能 可使用bootstrap4中的carousel组件非常简单的实现 目录 下载bootstrap4 轮播功能实现 简单实现轮播组件 增加标识图标 增加标题和说明 切换淡入淡出 设置数据间隔 总结 下载bootstra
  • 基于微信云开发实现电影推荐小程序

    一 项目背景 项目名称为柚子电影 此小程序的目的是为了给大家推荐电影 与其他的售票等小程序不同 二 性能需求 我的影单的增加 删除和查询 电影详情页面的完整实现 对小程序的各个方面 电影推荐 电影详情 用户授权 影院查询 影院位置 用户登录
  • Scala(一):概述&变量&流程控制(转载)

    文章目录 一 简介 1 1 scala语言的特点 1 2 第一个scala程序 二 变量 2 1 Scala变量的使用 2 2 Scala数据类型 2 3 值类型转换 三 循环控制 3 1 分支控制if else 3 2 for循环控制 S
  • opencv4应用开发基础

    opencv3 0版本以上都是用C 实现的 常用的一些函数及类型集中在cv命名空间里 cv Mat类型用于表示一个图像 构造函数除了空的构造函数外 还有很多个 Mat int rows int cols int type 创建指定行 列数的