Go语言实现人脸检测(Go的OpenCV绑定库)

news2024/12/23 1:53:43

文章目录

  • 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 main

import (
	"fmt"
	"github.com/kbinani/screenshot"
	"gocv.io/x/gocv"
	"image"
)

func main() {
	deviceID := 0
	webcam, _ := gocv.OpenVideoCapture(deviceID)
	window := gocv.NewWindow("Hello")
	defer window.Close()

	// 调整窗口大小
	winWidth, winHeight := 400, 400
	window.ResizeWindow(winWidth, winHeight)
	// 获取屏幕分辨率
	width, height, _ := getScreenResolution()
	winX := (width - winWidth) / 2
	winY := (height - winHeight) / 2
	window.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 main

import (
	"fmt"
	"github.com/kbinani/screenshot"
	"gocv.io/x/gocv"
	"image"
	"image/color"
)

func main() {
	// set to use a video capture device 0
	deviceID := 0

	// open webcam
	webcam, err := gocv.OpenVideoCapture(deviceID)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer webcam.Close()

	// open display window
	window := gocv.NewWindow("Face Detect")
	defer window.Close()

	// 调整窗口大小
	winWidth, winHeight := 400, 400
	window.ResizeWindow(winWidth, winHeight)
	// 获取屏幕分辨率
	width, height, _ := getScreenResolution()
	winX := (width - winWidth) / 2
	winY := (height - winHeight) / 2
	window.MoveWindow(winX, winY-100)

	// prepare image matrix
	img := gocv.NewMat()
	defer img.Close()

	// color for the rect when faces detected
	blue := color.RGBA{0, 0, 255, 0}

	// load classifier to recognize faces
	classifier := 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 faces
		rects := classifier.DetectMultiScale(img)
		fmt.Printf("found %d faces\n", len(rects))

		// draw a rectangle around each face on the original image
		for _, r := range rects {
			gocv.Rectangle(&img, r, blue, 3)
		}

		// show the image in the window, and wait 1 millisecond
		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
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1693705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

读论文 | Small object detection model for UAV aerial image based on YOLOv7

目录 1、前言 2、摘要 3、论文的方法 3.1 方法描述 3.2 方法改进 3.3 本论文的模型图 3.4 本文的数据集&#xff1a; 3.5 论文实验 3.6 解决的问题 3.7 论文总结 &#xff08;1&#xff09;文章优点 &#xff08;2&#xff09;方法创新点 &#xff08;3&#xff0…

IP数据云确认参展2024 ChinaJoy BTOB与诸位共展未来!

作为在全球数字娱乐领域兼具知名度与影响力的年度盛会&#xff0c;2024年第二十一届ChinaJoy BTOB将于7月26日至7月28日在上海新国际博览中心盛大召开&#xff0c;秉承着初心“游”在&#xff0c;精彩无限&#xff01;&#xff08;英译&#xff1a;Stay True, Game On.&#xf…

JVM学习-执行引擎

执行引擎 执行引擎是Java虚拟机核心组成部分之一虚拟机是一个相对于物理机的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的&#xff0c;而虚拟机的执行引擎是由软件自行实现的&#xf…

GitLens或者Git Graph在vscode中对比文件历史变化,并将历史变化同步到当前文件中

有时候我们上周改的代码&#xff0c;现在想反悔把它恢复过来&#xff0c;怎么办&#xff1f;&#xff1f;&#xff1f;很好&#xff0c;你有这个需求&#xff0c;说明你找对人了&#xff0c;那就是我们需要在vscode中安装这个插件&#xff1a;GitLens或者Git Graph&#xff0c;…

Nginx使用补充(一)

说明&#xff1a;之前介绍过Nginx安装和负载均衡的使用&#xff08;参考&#xff1a;Nginx使用&#xff09;&#xff0c;本文补充介绍Nginx的一些用法 隐藏Nginx版本信息 正常情况&#xff0c;可在Nginx代理的请求中查看到当前Nginx的版本信息&#xff0c;如下&#xff1a; 可…

给我瞅瞅呀

专业 流程&#xff08;一条龙服务&#xff09; 需求沟通-需求分析-产品架构-ue原型-ui设计-产品研发-产品测试-产品交付-产品运维 保障 1、按需定制&#xff0c;签订功能清单&#xff0c;根据功能报价 2、价格透明&#xff0c;签订合同保障&#xff0c;保障客户合法权益 3、源…

02:PostgreSQL用户和权限

环境&#xff1a; 操作系统&#xff1a;CentOS 7.9 64bitPostgreSQL 版本&#xff1a;16.x 或 15.x安装用户&#xff1a;postgres软件安装目标路径&#xff1a;/usr/pgsql-<version>数据库数据目录&#xff1a;/pgdata 目录 用户和角色 创建用户或角色 权限管理 查看权…

【CTF Web】CTFShow web6 Writeup(SQL注入+PHP+位运算)

web6 1 阿呆一口老血差点噎死自己&#xff0c;决定杠上了 解法 注意到&#xff1a; <!-- flag in id 1000 -->拦截很多种字符&#xff0c;连 select 也不给用了。 if(preg_match("/\|\"|or|\||\-|\\\|\/|\\*|\<|\>|\^|\!|x|hex|\(|\)|\|select/i"…

【游戏引擎】Unity动画系统详解

持续更新。。。。。。。。。。。。。。。 【游戏引擎】Unity动画系统详解 Unity动画系统详解简介关键帧动画创建关键帧动画的步骤&#xff1a; Mecanim动画系统Mecanim的关键组件&#xff1a;使用Mecanim创建动画的步骤&#xff1a; 动画控制器动画控制器的高级功能&#xff1a…

[算法][前缀和] [leetcode]724. 寻找数组的中心下标

题目地址 https://leetcode.cn/problems/find-pivot-index/description/ 题目描述 代码 class Solution {public int pivotIndex(int[] nums) {int total Arrays.stream(nums).sum();//前缀和int prefixSum 0;int len nums.length;for(int i 0;i<len;i){if (i-1>0){p…

大数据之Hive函数大全

&#x1f527; Hive函数大全 更多大数据学习资料请关注公众号“大数据领航员"免费领取 一、数学函数 1、取整函数: round 1.函数描述 返回值语法结构功能描述doubleround(double a)返回double类型的整数值部分&#xff08;遵循四舍五入&#xff09; 2.例程 hive>…

图_基础算法

图这种数据结构还有一些比较特殊的算法&#xff0c;比如二分图判断&#xff0c;有环图无环图的判断&#xff0c;拓扑排序&#xff0c;以及最经典的最小生成树&#xff0c;单源最短路径问题&#xff0c;更难的就是类似网络流这样的问题。 先看拓扑排序&#xff08;有环无环&…

[DDR5 Jedec 3]DDR5 SDRAM 状态图 和 基本功能

3000字, 依公知及经验整理,原创保护,禁止转载。 专栏 《深入理解DDR》 3.1 简化状态图 来源: Jedec Proposed DDR5 Full spec 缩写功能ACT激活PRE预充电PRE_A全部预充电MRS寄存器集模式REF刷新TEN边界扫描模式ReadRD, RDS4, RDS8Read ARDA, RDS4A, RDS8AwriteWR, WRS4…

配置docker阿里云镜像地址

一、安装docker的步骤&#xff1a; 1.yum install -y yum-utils 2.yum-config-manager --add-repo http://mirrors.aliyun.com/docker- ce/linux/centos/docker-ce.repo --配置阿里云仓库3.yum makecache fast4.yum install docker-ce -y5.docker version …

动态代理,反射,注解的复习笔记

1.动态代理的作用 动态代理最主要的用途就是在各种框架中&#xff0c;很方便的在运行期间生成代理类&#xff0c;通过代理类就可以完成AOP、过滤器、拦截器等操作 &#xff08;注&#xff1a;代理就是被代理者没有能力或者不愿意去完成某件事情&#xff0c;需要找个人代替自己…

IDEA 将多个微服务Springboot项目Application启动类添加到services标签,统一启动、关闭服务

IDEA 将多个微服务Springboot项目Application启动类添加到services标签&#xff0c;统一启动、关闭服务 首先在Views > Tool Windows > Services 添加services窗口 点击services窗口&#xff0c;首次需要添加配置类型&#xff0c;我们选择Springboot 默认按照运行状态分…

Apache Hive 安装与配置的详细教程

1. Hive简介 Hive是基于Hadoop的一个数据仓库工具&#xff0c;用来进行数据提取、转化、加载&#xff0c;这是一种可以存储、查询和分析存储在Hadoop中的大规模数据的机制。hive数据仓库工具能将结构化的数据文件映射为一张数据库表&#xff0c;并提供SQL查询功能&#xff0c;能…

【QGIS入门实战精品教程】5.3:CGCS2000转Lambert投影

参考阅读: 【GlobalMapper精品教程】081:WGS84/CGCS2000转Lambert投影 文章目录 一、加载实验数据二、投影转换三、批量投影转换一、加载实验数据 加载配套实验数据,如下图所示:图层为长沙市范围、长沙市酒店宾馆分布点位、湖南省酒店分布点位矢量数据。 双击图层,打开信…

Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现

目录 一、用Springboot读取本地工作目录的文件和文件结构 1.1、需求介绍 1.2、后端传递数据 1.2.1、语言框架 1.2.2、本地工作目录示范 1.2.3、后端代码 ①controller层 ②service层 ③响应的数据 二、总结 一、用Springboot读取本地工作目录的文件和文件结构 1.1、…

5.23.12 计算机视觉的 Inception 架构

1. 介绍 分类性能的提升往往会转化为各种应用领域中显着的质量提升&#xff0c;深度卷积架构的架构改进可用于提高大多数其他计算机视觉任务的性能&#xff0c;这些任务越来越依赖于高质量的学习视觉特征。在 AlexNet 功能无法与手工设计、制作的解决方案竞争的情况下&#xf…