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浮点…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Robots.txt 文件
什么是robots.txt? robots.txt 是一个位于网站根目录下的文本文件(如:https://example.com/robots.txt),它用于指导网络爬虫(如搜索引擎的蜘蛛程序)如何抓取该网站的内容。这个文件遵循 Robots…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
【HTTP三个基础问题】
面试官您好!HTTP是超文本传输协议,是互联网上客户端和服务器之间传输超文本数据(比如文字、图片、音频、视频等)的核心协议,当前互联网应用最广泛的版本是HTTP1.1,它基于经典的C/S模型,也就是客…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
