当前位置: 首页 > 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
}

在这里插入图片描述

http://www.lryc.cn/news/352437.html

相关文章:

  • springboot中线程池的使用
  • ubuntu20.04 开机自动挂载外加硬盘
  • 5.18 TCP机械臂模拟
  • linux---线程控制
  • 低代码开发:拖拽式可视化构建工业物联网系统
  • 【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇
  • webpack 学习之 五大核心
  • Android逆向抓包技巧 - Hook 底层通信
  • 深入解析力扣162题:寻找峰值(线性扫描与二分查找详解)
  • 模板方法及设计模式——Java笔记
  • K8S认证|CKA题库+答案| 11. 创建PVC
  • 多微信如何高效管理?一台电脑就能搞定!
  • 安装harbor出现问题: Running 1/1 ✘ Network harbor_harbor Error
  • JVM解释器和即时编译器的工作原理
  • 【产品经理】输出
  • MySQL入门学习.数据库组成.存储引擎
  • 【算法】分治 - 快速排序
  • 设计模式13——桥接模式
  • 第十六讲:数据在内存中的存储
  • 【EXCEL_VBA_基础知识】15 使用ADO操作外部数据
  • 如何在Spring中配置Bean?
  • 深入学习 torch.distributions
  • Java中的判断校验非空问题
  • webman使用summernote富文本编辑器
  • jQuery里添加事件 (代码)
  • Java数组的使用
  • 如何参与github开源项目并提交PR
  • 拼多多携手中国农业大学,投建陕西佛坪山茱萸科技小院
  • 技术前沿 |【自回归视觉模型ImageGPT】
  • Manjaro linux install RedisGUI (RedisInsight)亲测2024-5-25