(OpenCV) 基础demo
文章目录
- 前言
- Demo
- 图片
- 录制
- 播放
- 人脸识别
- END
前言
OpenCV - Open Computer Vision Library
OpenCV的名声想必不用多说了。
本文介绍4个基础使用demo。分别为,显示图片,录制视频,播放视频和一个基于开源算法库的人脸识别小demo。
只要环境配好,修改一下目标的资源就可以直接运行。
Demo
图片
#include <iostream>
#include <opencv2/opencv.hpp>void cv_image() {/// 资源路径const char *const resPath = "./myLogo.jpg";/// 打开图片的窗口名称const char *const windowName = "image-test";/// 窗口延时时间 毫秒const int windowDelayTime = 5000;cv::Mat img = cv::imread(resPath);if (img.empty()) {std::cout << "image is empty" << std::endl;return ;}/// 设置窗口名称和自适应cv::namedWindow(windowName, cv::WINDOW_AUTOSIZE);/// 将图片与窗口绑定cv::imshow(windowName, img);/// 等待键盘输入 or 延时cv::waitKey(windowDelayTime);/// 销毁窗口cv::destroyWindow(windowName);
}
录制
注意,这里的有部分参数会根据OpenCV3,4的版本问题而有一定差异。
#include <iostream>
#include <opencv2/opencv.hpp>void cv_recordVideo() {const char *const save_path = "./test.avi";const char *const windowName = "camera-test";const int waitKeyTime = 10;/// 设备的cameraID,一般笔记本自带的就是id=0int camera_id = 0;cv::VideoCapture cap;if (false == cap.open(camera_id)) {std::cout << "camera open failed!" << std::endl;return;}/// 视频的长宽const int width = cap.get(cv::CAP_PROP_FRAME_WIDTH);const int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);/// 1. 路径/// 2. 编码格式/// 3. 帧率/// 4. 尺寸cv::VideoWriter output_video;//! 第二个参数,在opencv3,4不同
#if CV_VERSION_MAJOR >= 4auto fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');
#elseauto fourcc = CV_FOURCC('M', 'J', 'P', 'G'),
#endifoutput_video.open(save_path, fourcc, 30.0, cv::Size(width, height));for (cv::Mat frame;;) {cap >> frame;if (frame.empty()) {break;}cv::imshow(windowName, frame);/// 保存output_video.write(frame);/// 按下esc键退出if (27 == cv::waitKey(waitKeyTime)) {break;}} // while (1)
}
播放
注意,因为音视频各种编解码问题,此函数这样的写法并不能让所有的视频文件都能正常解析。
但至少保证,上面一个demo录制下来的视频可以播放。
#include <iostream>
#include <opencv2/opencv.hpp>void cv_showVideo() {const char *const resPath = "./test.avi";const char *const windowName = "video-test";const int windowDelayTime = 200;cv::VideoCapture cap;/// 根据当前pc对该文件的解码能力而定if (false == cap.open(resPath)) {std::cout << "open failed!" << std::endl;return;}cv::namedWindow(windowName, cv::WINDOW_AUTOSIZE);/// 视频的本质就是一张张的图片for (cv::Mat frame;;) {cap >> frame;/// 播放完毕if (frame.empty()) {break;}cv::imshow(windowName, frame);/// 按下esc键退出if (27 == cv::waitKey(windowDelayTime)) {break;}} // while (1)
}
人脸识别
开源人脸识别算法库:opencv/data/haarcascades/haarcascade_frontalface_alt.xml at master · opencv/opencv · GitHub
opencv/data/haarcascades at master · opencv/opencv · GitHub
#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>void cv_faceRecognition() {const char *const windowName = "camera-test";const int waitKeyTime = 10;/// opencv 的一个开源人脸识别库const char *const face_model_path = "./haarcascade_frontalface_alt.xml";/// 设备的cameraID,一般笔记本自带的就是id=0int camera_id = 0;/// 加载算法文件cv::CascadeClassifier face_model;if (false == face_model.load(face_model_path)) {std::cout << "face_model load failed!\n" << std::endl;return;}cv::VideoCapture cap;if (false == cap.open(camera_id)) {std::cout << "camera open failed!" << std::endl;return;}for (cv::Mat frame;;) {cap >> frame;if (frame.empty()) {break;}std::vector<cv::Rect> faces;face_model.detectMultiScale(frame, faces, 1.1, 2,0 | cv::CASCADE_SCALE_IMAGE,cv::Size(30, 30));/// 绘制人脸for (size_t i = 0; i < faces.size(); i++) {/// 点坐标cv::Point center(faces[i].x + faces[i].width / 2,faces[i].y + faces[i].height / 2);/// 画图ellipse(frame, center,cv::Size(faces[i].width / 2, faces[i].height / 2), 0, 0,360, cv::Scalar(255, 0, 255), 4, 8, 0);}cv::imshow(windowName, frame);/// 按下esc键退出if (27 == cv::waitKey(waitKeyTime)) {break;}} // while (1)
}
END
参考资料:
CMake编译OpenCV: Qt配置OpenCV教程,亲测已试过(详细版)_Wi~的博客-CSDN博客
demo: c++ opencv 显示摄像头-人脸检测_哔哩哔哩_bilibili
相关文章:
(OpenCV) 基础demo
文章目录 前言Demo图片录制播放人脸识别 END 前言 OpenCV - Open Computer Vision Library OpenCV的名声想必不用多说了。 本文介绍4个基础使用demo。分别为,显示图片,录制视频,播放视频和一个基于开源算法库的人脸识别小demo。 只要环境…...
using 的使用
作者: 苏丙榅 链接: https://subingwen.cn/cpp/using/ 在 C 中 using 用于声明命名空间,使用命名空间也可以防止命名冲突。在程序中声明了命名空间之后,就可以直接使用命名空间中的定义的类了。在 C11 中赋予了 using 新的功能,让C变得更年轻…...
Websocket、Socket、HTTP之间的关系
Websocket、Socket、HTTP之间的关系 ★ Websocket是什么?★ Websocket的原理★ websocket具有以下特点:★ webSocket可以用来做什么?★ websocket与socket区别:★ WebSocket与HTTP区别 ★ Websocket是什么? ● Websocket是HTML5下…...
hustoj LiveCD版系统在局域网虚拟机安装和配置
root权限 打开terminal命令行输入sudo su输入初始密码freeproblemsetmysql数据库的密码的位置,如何登陆数据库 数据库账号密码存放在两个配置文件中: /home/judge/etc/judge.conf/home/judge/src/web/include/db_info.inc.php 新版本中,快…...
读书-代码整洁之道10-14
类 类的三大特性:封装、继承、多态;类应该短小;单一权责原则认为,类或模块应有且只有一条加以修改的理由;当类丧失了内聚性,就拆分它;隔离修改 系统 构造和使用是非常不一样的过程。每个应用…...
UDP 广播/组播
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址xxx.xxx.xxx.255,将消息发送到在同一广播网络上的每个主机,广播/组播只能用udp进行实现 函数:int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_topt…...

高效创作助手:ChatGPT最新版实现批量撰写聚合文章的全新水平
随着人工智能技术的不断发展,ChatGPT最新版作为一款智能创作助手,实现了批量撰写聚合文章的全新水平。它能够在短时间内生成高质量的文章,极大地提高了创作效率。本文将从随机8-20个方面对ChatGPT最新版进行详细的阐述,让我们一起…...
Python中的包是什么,如何创建和使用包?
在Python中,包是一种将相关模块分组在一起的方式。它可以让我们更好地组织和重用代码。 一个Python包实际上是一个文件夹,其中包含该包的Python模块和其他资源文件(例如配置文件、数据文件等)。包的根目录通常包含一个名为__init…...

Spring Cloud Alibaba Seata(二)
目录 一、Seata 1、Seata-AT模式 1.1、具体案例 1.2、通过Seata的AT模式解决分布式事务 2、Seata-XA模式 3、Seata-TCC模式 4、Seata-SAGA模式 一、Seata 1、Seata-AT模式 概念:AT模式是一种无侵入的分布式事务解决方案,在 AT 模式下,…...
如何在 MySQL 中使用 COALESCE 函数
1. 简介 在 MySQL 中,COALESCE 函数可以用来返回参数列表中的第一个非空值。如果所有参数都为空,则返回 NULL。本文将介绍 COALESCE 函数的语法和用法,并通过示例演示其效果。 2. 语法 COALESCE 函数的语法如下所示: COALESCE(…...
Python爬虫之Scrapy框架系列(22)——初识分布式爬虫scrapy_redis
目录: 分布式爬虫(Scrapy\_redis):1.简单介绍:2.Scrapy_redis的安装:分布式爬虫(Scrapy_redis): 官方文档:https://scrapy-redis.readthedocs.io/en/stable/1.简单介绍: scrapy_redis是一个基于Redis的Scrapy组件,用于scrapy项目的分布式部署和开发。 特点: 分布…...

ChatGPT的前世今生
原文首发于博客文章ChatGPT发展概览 ChatGPT 是OpenAI开发的人工智能聊天机器人程序,于2022年11月推出。该程序使用基于 GPT-3.5、GPT-4 架构的大语言模型并以强化学习训练。ChatGPT目前仍以文字方式交互,而除了可以用人类自然对话方式来交互,…...

WireShark常用协议抓包与原理分析
1.ARP协议(地址解析协议) nmap 发现网关nmap -sn 192.168.133.2wireshark 抓请求包和响应包 arp请求包内容 arp响应包内容 总结:请求包包含包类型(request),源IP地址,源MAC地址,目标IP地址,目标MAC地址(未知,此处为全0);响应包包含包类型(reply),源IP地址,源…...

Mysql数据库操作总结
文章目录 1. DDL(Data Definition Language - 数据定义语言)1.1 数据库1.2 数据表(创建查询删除)1.3 数据表(修改) 2. 数据类型2.1 数值2.2 字符2.3 日期 3. 字段约束3.1 约束3.2 主键约束修改3.3 主键自增 联合主键 4. DML(Data Manipulation Language - 数据操作语言)4.1 添…...

在 ZBrush、Substance 3D Painter 和 UE5 中创作警探角色(P2)
大家好,下篇分享咱们继续来说警探角色的重新拓扑、UV、材质贴图和渲染处理。 重新拓扑/UV 这是对我来说最不有趣的部分——重新拓扑。它显然是实时角色中非常重要的一部分,不容忽视,因为它会影响大量的 UV、绑定和后期渲染,这里…...

如何在大规模服务中迁移缓存
当您启动初始服务时,通常会过度设计以考虑大量流量。但是,当您的服务达到爆炸式增长阶段,或者如果您的服务请求和处理大量流量时,您将需要重新考虑您的架构以适应它。糟糕的系统设计导致难以扩展或无法满足处理大量流量的需求&…...

【GPT LLM】跟着论文学习gpt
GPT1开山之作:Improving language understanding by generative pre-training 本文提出了gpt1,即使用无标签的数据对模型先进行训练,让模型学习能够适应各个任务的通用表示;后使用小部分 task-aware的数据对模型进行微调ÿ…...

【玩转Docker小鲸鱼叭】Docker容器常用命令大全
在 Docker 核心概念理解 一文中,我们知道 Docker容器 其实就是一个轻量级的沙盒,应用运行在不同的容器中从而实现隔离效果。容器的创建和运行是以镜像为基础的,容器可以被创建、销毁、启动和停止等。本文将介绍下容器的这些常用操作命令。 1、…...
专项练习11
目录 一、选择题 1、执行下列选项的程序,输出结果不是Window对象的是() 2、以下哪些代码执行后 i 的值为10: 二、编程题 1、判断 val1 和 val2 是否完全等同 2、统计字符串中每个字符的出现频率,返回一个 Object&…...
ASP.NET+SQL通用作业批改系统设计(源代码+论文)
随着网络高速地融入当今现代人的生活,学校对网络技术的应用也在不断地提高。学校的教学任务十分复杂,工作也很繁琐,在教学任务中,作业的批改也是一个很重要的环节。为了提高老师工作效率,减轻教师的工作强度,提高作业批改的灵活性,《通用作业批改系统》的诞生可以说是事在…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...