当前位置: 首页 > news >正文

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 特征分类器是一种基于机器学习的方法,用于图像中对象的检测。以下是其主要特点:

  1. 简单矩形特征:Haar 特征由简单的矩形区域组成,这些区域被分成亮和暗部分。通过比较这些区域的亮度差异,可以确定特征的存在。

  2. 积分图像:为了快速计算矩形特征,使用积分图像(Integral Image)来加速特征计算。这使得检测过程非常高效。

  3. 级联分类器:级联分类器将多个弱分类器(简单的矩形特征)串联起来,以形成一个强大的分类器。通过逐级过滤非目标区域,逐步缩小检测范围,提高检测速度。

  • 下载 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中线程池的使用

一、概念 线程池就是将多个线程对象放入一个池子里面&#xff0c;例如一个池塘&#xff0c;线程池就是这个池塘&#xff0c;池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程&#xff0c;在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。 二、创…...

ubuntu20.04 开机自动挂载外加硬盘

文章目录 一、问题描述二、操作1. 查找新添盘符2. 格式化硬盘文件系统3. 挂载硬盘4. 开机自动挂载5. 取消挂载6. 查看挂载的硬盘信息 一、问题描述 因电脑使用一段时间后自身硬盘不足&#xff0c;需外加硬盘使得电脑自动识别加载。 二、操作 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---线程控制

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

低代码开发:拖拽式可视化构建工业物联网系统

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

【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇

1. 前言 线程池这块&#xff0c;作为高频面试题&#xff0c;并且实际使用场景巨多&#xff0c;所以出了这篇文章&#xff0c;一块来研究一下线程池的实现原理&#xff0c;运行机制&#xff0c;从底层深挖&#xff0c;不再局限于面试题。 2. 线程池概览 2.1. 构造器 线程池总…...

webpack 学习之 五大核心

为什么用 webpack webpack 官网传送门 … 官网&#xff1a;webpack 是一个用于现代 JavaScript 应用程序的 静态模块打包工具。将你项目中所需的每一个模块组合成一个或多个 bundles&#xff0c;它们均为静态资源&#xff0c;用于展示你的内容。总结&#xff1a;汇总所有模块…...

Android逆向抓包技巧 - Hook 底层通信

一,请求的本质 平时开发使用的 http 或 https 均属于应用层的协议,其本质都会调用 TCP 发送请求。 例如:你在 Python 中使用 requests 模块发送一个 http 请求,其底层就是使用 socket 模块 + TCP 实现发送的请求。 import requestsres = requests.get("http://wiki…...

深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)

❤️❤️❤️ 欢迎来到我的博客。希望您能在这里找到既有价值又有趣的内容&#xff0c;和我一起探索、学习和成长。欢迎评论区畅所欲言、享受知识的乐趣&#xff01; 推荐&#xff1a;数据分析螺丝钉的首页 格物致知 终身学习 期待您的关注 导航&#xff1a; LeetCode解锁100…...

模板方法及设计模式——Java笔记

模板方法及设计模式 抽象类体现的就是一种模板模式的设计&#xff0c;抽象类作为多个子类的通用模板&#xff0c;子类在抽象类的基础上进行扩展、改造&#xff0c;但子类总体上会保留抽象类的行为方式。 解决的问题&#xff1a; 当功能内部一部分实现是确定的&#xff0c;另一…...

K8S认证|CKA题库+答案| 11. 创建PVC

11、创建PVC 您必须在以下Cluster/Node上完成此考题&#xff1a; Cluster Master node Worker node ok8s master …...

多微信如何高效管理?一台电脑就能搞定!

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

安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error

安装harbor出现问题&#xff1a; [] Running 1/1 ✘ Network harbor_harbor Error 0.2s failed to create network harbor_harbor: Error response from daemon: Fa…...

JVM解释器和即时编译器的工作原理

1、解释器&#xff1a; 当Java程序启动时&#xff0c;JVM的解释器首先读取Java字节码&#xff08;通常存在于.class文件中&#xff09;。 解释器将字节码解析为相应的指令&#xff0c;每条指令对应JVM中的一个操作。 解释器根据指令的类型和操作数&#xff0c;执行相应的计算或…...

【产品经理】输出

引言&#xff1a;        在最近频繁的产品管理职位面试中&#xff0c;我深刻体会到了作为产品经理需要的不仅仅是对市场和技术的敏锐洞察&#xff0c;更多的是在复杂多变的环境中&#xff0c;如何运用沟通、领导力和决策能力来引导产品从概念走向市场。这一系列博客将分享…...

MySQL入门学习.数据库组成.存储引擎

存储引擎是 MySQL 数据库的一个重要组成部分&#xff0c;它决定了数据的存储方式、索引方式、事务支持等特性。MySQL 支持多种存储引擎&#xff0c;常见的有 InnoDB、MyISAM、Memory 等。 存储引擎的特点和使用方法&#xff1a; 1. InnoDB&#xff1a; 是 MySQL 默认的存储引…...

【算法】分治 - 快速排序

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

设计模式13——桥接模式

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

第十六讲:数据在内存中的存储

第十六讲&#xff1a;数据在内存中的存储 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浮点…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

基于Springboot+Vue的办公管理系统

角色&#xff1a; 管理员、员工 技术&#xff1a; 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能&#xff1a; 该办公管理系统是一个综合性的企业内部管理平台&#xff0c;旨在提升企业运营效率和员工管理水…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...

若依登录用户名和密码加密

/*** 获取公钥&#xff1a;前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

AxureRP-Pro-Beta-Setup_114413.exe (6.0.0.2887)

Name&#xff1a;3ddown Serial&#xff1a;FiCGEezgdGoYILo8U/2MFyCWj0jZoJc/sziRRj2/ENvtEq7w1RH97k5MWctqVHA 注册用户名&#xff1a;Axure 序列号&#xff1a;8t3Yk/zu4cX601/seX6wBZgYRVj/lkC2PICCdO4sFKCCLx8mcCnccoylVb40lP...