Go语言实现人脸检测(Go的OpenCV绑定库)
文章目录
- OpenCV
- Github
- 官网
- 安装
- 环境变量
- Go的OpenCV绑定库
- Github
- 文档
- 安装
- 搜索视频设备ID
- 显示视频
- 检测人脸
OpenCV
Github
- https://github.com/opencv/opencv/
官网
- https://opencv.org/
安装
brew install opencv
brew upgrade opencv
- 安装目录
cd /usr/local/opt/opencv@4
环境变量
vim ~/.zshrc
export PKG_CONFIG_PATH="/usr/local/opt/opencv@4/lib/pkgconfig:$PKG_CONFIG_PATH"
source ~/.zshrc
- 验证是否安装成功
pkg-config --cflags --libs opencv4
Go的OpenCV绑定库
Github
- https://github.com/hybridgroup/gocv
文档
- https://gocv.io/getting-started/macos/
安装
go get -u -d gocv.io/x/gocv
搜索视频设备ID
brew install ffmpeg
# 列出视频的设备ID
ffmpeg -f avfoundation -list_devices true -i ""
注意: [0] FaceTime HD Camera,deviceID := 0 是电脑摄像头。
显示视频
此示例使用设备“0”打开视频捕获设备,读取帧,并在GUI窗口中显示视频。
# 初始化
go mod init demo
# 安装库
go get -u -d gocv.io/x/gocv
package mainimport ("fmt""github.com/kbinani/screenshot""gocv.io/x/gocv""image"
)func main() {deviceID := 0webcam, _ := gocv.OpenVideoCapture(deviceID)window := gocv.NewWindow("Hello")defer window.Close()// 调整窗口大小winWidth, winHeight := 400, 400window.ResizeWindow(winWidth, winHeight)// 获取屏幕分辨率width, height, _ := getScreenResolution()winX := (width - winWidth) / 2winY := (height - winHeight) / 2window.MoveWindow(winX, winY-100)img := gocv.NewMat()defer img.Close()for {webcam.Read(&img)// 调整图像大小size := image.Point{X: winWidth, Y: winHeight}gocv.Resize(img, &img, size, 0, 0, gocv.InterpolationDefault)window.IMShow(img)window.WaitKey(1)}
}func getScreenResolution() (int, int, error) {// 获取活动显示器的数量numDisplays := screenshot.NumActiveDisplays()if numDisplays <= 0 {panic("no active display found")}// 获取第一个显示器的分辨率bounds := screenshot.GetDisplayBounds(0)width := bounds.Dx()height := bounds.Dy()fmt.Printf("Primary display resolution: %d x %d\n", width, height)return width, height, nil
}
检测人脸
这是一个使用设备“0”打开视频捕获设备的更完整示例。它还使用CascadeClassifier类来加载包含分类器数据的外部数据文件。该程序从视频中获取每一帧,然后使用分类器来检测人脸。如果找到任何人脸,它会在每个人脸周围绘制一个蓝色矩形,然后在输出窗口中显示视频。
haarcascade_frontalface_default.xml 是一个预训练的 Haar 特征分类器,用于人脸检测。它是由 OpenCV 提供的一个经典工具,基于 Viola-Jones 对象检测框架。该文件包含了一系列经过训练的特征,可以快速有效地检测图像中的人脸。
Haar 特征分类器是一种基于机器学习的方法,用于图像中对象的检测。以下是其主要特点:
-
简单矩形特征:Haar 特征由简单的矩形区域组成,这些区域被分成亮和暗部分。通过比较这些区域的亮度差异,可以确定特征的存在。
-
积分图像:为了快速计算矩形特征,使用积分图像(Integral Image)来加速特征计算。这使得检测过程非常高效。
-
级联分类器:级联分类器将多个弱分类器(简单的矩形特征)串联起来,以形成一个强大的分类器。通过逐级过滤非目标区域,逐步缩小检测范围,提高检测速度。
- 下载 haarcascade_frontalface_default.xml 文件
package mainimport ("fmt""github.com/kbinani/screenshot""gocv.io/x/gocv""image""image/color"
)func main() {// set to use a video capture device 0deviceID := 0// open webcamwebcam, err := gocv.OpenVideoCapture(deviceID)if err != nil {fmt.Println(err)return}defer webcam.Close()// open display windowwindow := gocv.NewWindow("Face Detect")defer window.Close()// 调整窗口大小winWidth, winHeight := 400, 400window.ResizeWindow(winWidth, winHeight)// 获取屏幕分辨率width, height, _ := getScreenResolution()winX := (width - winWidth) / 2winY := (height - winHeight) / 2window.MoveWindow(winX, winY-100)// prepare image matriximg := gocv.NewMat()defer img.Close()// color for the rect when faces detectedblue := color.RGBA{0, 0, 255, 0}// load classifier to recognize facesclassifier := gocv.NewCascadeClassifier()defer classifier.Close()if !classifier.Load("./haarcascade_frontalface_default.xml") {fmt.Println("Error reading cascade file: ./haarcascade_frontalface_default.xml")return}fmt.Printf("start reading camera device: %v\n", deviceID)for {if ok := webcam.Read(&img); !ok {fmt.Printf("cannot read device %v\n", deviceID)return}if img.Empty() {continue}// 调整图像大小size := image.Point{X: winWidth, Y: winHeight}gocv.Resize(img, &img, size, 0, 0, gocv.InterpolationDefault)// detect facesrects := classifier.DetectMultiScale(img)fmt.Printf("found %d faces\n", len(rects))// draw a rectangle around each face on the original imagefor _, r := range rects {gocv.Rectangle(&img, r, blue, 3)}// show the image in the window, and wait 1 millisecondwindow.IMShow(img)window.WaitKey(1)}
}func getScreenResolution() (int, int, error) {// 获取活动显示器的数量numDisplays := screenshot.NumActiveDisplays()if numDisplays <= 0 {panic("no active display found")}// 获取第一个显示器的分辨率bounds := screenshot.GetDisplayBounds(0)width := bounds.Dx()height := bounds.Dy()fmt.Printf("Primary display resolution: %d x %d\n", width, height)return width, height, nil
}
相关文章:

Go语言实现人脸检测(Go的OpenCV绑定库)
文章目录 OpenCVGithub官网安装环境变量 Go的OpenCV绑定库Github文档安装搜索视频设备ID显示视频检测人脸 OpenCV Github https://github.com/opencv/opencv/ 官网 https://opencv.org/ 安装 brew install opencv brew upgrade opencv安装目录 cd /usr/local/opt/opencv…...
springboot中线程池的使用
一、概念 线程池就是将多个线程对象放入一个池子里面,例如一个池塘,线程池就是这个池塘,池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程,在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。 二、创…...

ubuntu20.04 开机自动挂载外加硬盘
文章目录 一、问题描述二、操作1. 查找新添盘符2. 格式化硬盘文件系统3. 挂载硬盘4. 开机自动挂载5. 取消挂载6. 查看挂载的硬盘信息 一、问题描述 因电脑使用一段时间后自身硬盘不足,需外加硬盘使得电脑自动识别加载。 二、操作 1. 查找新添盘符 sudo blkid自己…...

5.18 TCP机械臂模拟
#include <netinet/tcp.h>//包含TCP选项的头文件 #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/input.h>//读取输入事件 #include <sys/types.h> #include <sys/stat.h&…...

linux---线程控制
线程和进程 以前我们要同时跑多个程序,可以通过fork()多个子进程,然后通过系统函数进行程序的替换,但是创建进程代价大,不仅要拷贝一份父进程的地址空间,页表,文件表述符表等。但是线程不需要因为是进程的…...

低代码开发:拖拽式可视化构建工业物联网系统
什么是低代码? 低代码(Low Code)是一种可视化的软件开发方法,通过最少的手动编码可以更快地交付应用程序。低代码平台的图形用户界面和拖放功能可自动执行开发过程的各个方面,从而消除对传统计算机编程方法的依赖。 什么是低代码平台&#…...

【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇
1. 前言 线程池这块,作为高频面试题,并且实际使用场景巨多,所以出了这篇文章,一块来研究一下线程池的实现原理,运行机制,从底层深挖,不再局限于面试题。 2. 线程池概览 2.1. 构造器 线程池总…...
webpack 学习之 五大核心
为什么用 webpack webpack 官网传送门 … 官网:webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。将你项目中所需的每一个模块组合成一个或多个 bundles,它们均为静态资源,用于展示你的内容。总结:汇总所有模块…...
Android逆向抓包技巧 - Hook 底层通信
一,请求的本质 平时开发使用的 http 或 https 均属于应用层的协议,其本质都会调用 TCP 发送请求。 例如:你在 Python 中使用 requests 模块发送一个 http 请求,其底层就是使用 socket 模块 + TCP 实现发送的请求。 import requestsres = requests.get("http://wiki…...

深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容,和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣! 推荐:数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航: LeetCode解锁100…...
模板方法及设计模式——Java笔记
模板方法及设计模式 抽象类体现的就是一种模板模式的设计,抽象类作为多个子类的通用模板,子类在抽象类的基础上进行扩展、改造,但子类总体上会保留抽象类的行为方式。 解决的问题: 当功能内部一部分实现是确定的,另一…...

K8S认证|CKA题库+答案| 11. 创建PVC
11、创建PVC 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node ok8s master …...

多微信如何高效管理?一台电脑就能搞定!
对于有多个微信号的人来说,管理这些微信无疑是一道难题。 今天,就给大家分享一个能够让你高效管理多个微信号的神器——个微管理系统,下面,就一起来看看它都有哪些功能吧! 1、多号同时登录在线 系统支持多个微信号同…...

安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error
安装harbor出现问题: [] Running 1/1 ✘ Network harbor_harbor Error 0.2s failed to create network harbor_harbor: Error response from daemon: Fa…...
JVM解释器和即时编译器的工作原理
1、解释器: 当Java程序启动时,JVM的解释器首先读取Java字节码(通常存在于.class文件中)。 解释器将字节码解析为相应的指令,每条指令对应JVM中的一个操作。 解释器根据指令的类型和操作数,执行相应的计算或…...

【产品经理】输出
引言: 在最近频繁的产品管理职位面试中,我深刻体会到了作为产品经理需要的不仅仅是对市场和技术的敏锐洞察,更多的是在复杂多变的环境中,如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享…...
MySQL入门学习.数据库组成.存储引擎
存储引擎是 MySQL 数据库的一个重要组成部分,它决定了数据的存储方式、索引方式、事务支持等特性。MySQL 支持多种存储引擎,常见的有 InnoDB、MyISAM、Memory 等。 存储引擎的特点和使用方法: 1. InnoDB: 是 MySQL 默认的存储引…...

【算法】分治 - 快速排序
快乐的流畅:个人主页 个人专栏:《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、颜色分类二、排序数组三、数组中的第k个数四、最小的k个数总结 引言 本节主要介绍快速排序…...

设计模式13——桥接模式
写文章的初心主要是用来帮助自己快速的回忆这个模式该怎么用,主要是下面的UML图可以起到大作用,在你学习过一遍以后可能会遗忘,忘记了不要紧,只要看一眼UML图就能想起来了。同时也请大家多多指教。 桥接模式(Bridge&a…...

第十六讲:数据在内存中的存储
第十六讲:数据在内存中的存储 1.整数在内存中的存储1.1存储方式1.2大小端字节序1.3大小端字节序排序规则1.4为什么要有大小端1.5练习1.5.1练习11.5.2练习21.5.3练习31.5.4练习41.5.5练习51.5.6练习61.5.7练习7 2.浮点数在内存中的存储2.1练习2.2浮点数的存储2.3浮点…...
为什么 uni-app 开发的 App 没有明显出现屏幕适配问题Flutter 开发的 App 出现了屏幕适配问题
🧩 一、为什么 uni-app 开发的 App 没有明显出现屏幕适配问题? ✅ 1. uni-app 是基于 H5 的运行环境(或类 H5) uni-app 默认使用的是 H5 的渲染引擎(如 WebView 或小程序渲染引擎)。在 H5 中,…...

react public/index.html文件使用env里面的变量
env文件 ENVdevelopment NODE_ENVdevelopment REACT_APP_URL#{REACT_APP_URL}# REACT_APP_CLIENTID#{REACT_APP_CLIENTID}# REACT_APP_TENANTID#{REACT_APP_TENANTID}# REACT_APP_REDIRECTURL#{REACT_APP_REDIRECTURL}# REACT_APP_DOMAIN_SCRIPT#{REACT_APP_DOMAIN_SCRIPT}#pu…...

字符串字典序最大后缀问题详解
字符串字典序最大后缀问题详解 一、问题定义与背景1.1 问题描述1.2 实际应用场景 二、暴力解法及其局限性2.1 暴力解法思路2.2 代码示例2.3 局限性分析 三、双指针算法:高效解决方案3.1 算法核心思想3.2 算法步骤3.3 代码实现3.4 与暴力解法对比 四、复杂度分析4.1 …...
JavaScript 中的单例内置对象:Global 与 Math 的深度解析
JavaScript 中的单例内置对象:Global 与 Math 的深度解析 在 JavaScript 的世界中,单例内置对象是开发者必须了解的核心概念之一。它们是语言规范中预定义的对象,无需显式创建即可直接使用。本文将深入解析 JavaScript 中最重要的两个单例内…...

c++中的输入输出流(标准IO,文件IO,字符串IO)
目录 (1)I/O概述 I/O分类 不同I/O的继承关系 不同I/O对应的头文件 (2)iostream 标准I/O流 iostream头文件中的IO流对象 iostream头文件中重载了<<和>> 缓冲区示意图 标准输入流 cin用法 cin:按空…...
AI问答-vue3+ts+vite:http://www.abc.com:3022/m-abc-pc/#/snow 这样的项目 在服务器怎么部署
为什么记录有子路径项目的部署,因为,通过子路径可以区分项目,那么也就可以实现微前端架构,并且具有独特优势,每个项目都是绝对隔离的。 要将 Vue3 项目(如路径为 http://www.abc.com:3022/m-saas-pc/#/sno…...
python八股文算法:三数之和
双指针解法: 原理见注释 # 2025/6/6 9:40 # -*- coding:UTF-8 -*- nums [-1, 0, 1,1, 2, -1, -4,0,2,1,-3,4,10,-9] def three_sum(nums):nums.sort()n len(nums)result []for i in range(n-2):# n-2,此时i取值到n-2-1,即倒数第3个数&…...
Zookeeper 和 Kafka 版本与 JDK 要求
Apache Zookeeper 和 Apache Kafka 在不同版本中对 JDK 的要求如下表所示(基于官方文档和历史版本记录整理): 1. Zookeeper 版本与 JDK 要求 Zookeeper 版本要求的最低 JDK 版本说明3.4.x 系列JDK 6生产环境建议用 JDK 8(旧版兼容性强)。3.5.x 系列(3.5.5+)JDK 83.5.0 …...

[蓝桥杯]兰顿蚂蚁
兰顿蚂蚁 题目描述 兰顿蚂蚁,是于 1986 年,由克里斯兰顿提出来的,属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只"蚂蚁"。 蚂蚁的头部朝向为:上下左右其中一方。 蚂蚁的移…...

快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令
目录 1. uv 介绍2. uv 安装(Windows版)3. 快速模拟一个要发布到TestPyPI上的依赖包,scoful-test-lib3.1 初始化 uv init3.2 进入scoful-test-lib3.3 修改pyproject.toml3.4 使用命令 uv sync3.5. 使用命令 uv lock3.6 使用命令 uv build3.7 获…...