基于Golang和OpenCV搭建人脸识别系统

基于Golang和OpenCV搭建人脸识别系统
OpenCV 是一个为计算机视觉项目开发的库。 她已经20岁左右了。 我在大学时使用过它,并且仍在我的 C++ 和 Python 项目中使用它,因为它对这些语言有很好的支持。

但当我开始学习和使用 Go 时,我想知道 OpenCV 是否可以用来处理这种语言。 当时集成的例子和教程已经有了,但在我看来它们太复杂了。 过了一会儿,我发现了 The Hybrid Group 创建的一个包装器。 在本文中,我将向您展示如何通过使用 Haar Cascades 开发一个简单的人脸识别系统来开始使用 GoCV。

技能箱推荐: 实践课程 《从零开始的Python开发》.

我们提醒: 对于“Habr”的所有读者 - 使用“Habr”促销代码注册任何 Skillbox 课程可享受 10 卢布的折扣。

将需要什么:

  • 走;
  • OpenCV(下面的安装程序链接);
  • 网络或普通摄像机。

安装

例1

在第一个示例中,我们将尝试创建一个应用程序,该应用程序打开一个带有摄像头视频流的窗口。

首先,您需要导入工作所需的库。

进口 (
“日志”
“gocv.io/x/gocv”
)

之后,您需要使用 VideoCaptureDevice 函数创建一个 VideoCapture 对象。 后者使得使用相机捕获视频流成为可能。 该函数采用一个整数作为参数(它代表设备 ID)。

webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {    log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()

现在我们需要创建一个 n 维矩阵。 它将存储从相机读取的图像。

img := gocv.NewMat()
defer img.Close()

要显示视频流,您需要创建一个窗口 - 这可以使用 NewWindow 函数来完成。

window := gocv.NewWindow(“webcamwindow”)
defer window.Close()

现在让我们继续最有趣的部分。

由于视频是连续的图像帧流,因此我们需要创建一个无限循环来无休止地读取相机的视频流。 这需要VideoCapture类型的Read方法。 它将期望一个 Mat 类型(我们上面创建的矩阵),返回一个布尔值,指示 VideoCapture 中的帧是否已成功读取。

for {     
        if ok := webcam.Read(&img); !ok || img.Empty( {
        log.Println(“Unable to read from the webcam”)    continue
     }
.
.
.
}

现在我们需要在创建的窗口中显示框架。 暂停以移至下一帧 - 50 毫秒。

窗口.IMShow(img)
窗口.WaitKey(50)

启动应用程序后,将打开一个包含来自相机的视频流的窗口。

基于Golang和OpenCV搭建人脸识别系统

package main
 
import (
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
    log.Fatalf("error opening device: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam")
continue
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

例2

在这个例子中,我们使用前面的例子,构建一个基于Haar Cascades的人脸识别系统。

Haar 级联是基于 Haar 小波技术训练的级联分类器。 他们分析图像中的像素以寻找特定特征。 要了解有关 Haar Cascades 的更多信息,请点击以下链接。

Viola-Jones 对象检测框架
级联分类器
类 Haar 特征

下载已经训练好的级联 可以在这里。 在当前示例中,级联将用于识别前面的人脸。

为了做到这一点,您需要创建一个分类器并为其提供一个已经训练过的文件(上面给出了链接)。 我已经将pencv_haarcascade_frontalface_default.xml文件上传到我们程序所在的目录中。

harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()

要检测图像中的人脸,您需要使用以下方法 检测多尺度。 该函数获取刚刚从摄像机视频流中读取的帧(Mat 类型),并返回 Rectangle 类型的数组。 数组的大小表示分类器能够在帧中检测到的面部数量。 然后,为了确保我们看到它找到的内容,让我们迭代矩形列表并将 Rectangle 对象打印到控制台,在找到的矩形周围创建边框。 这可以使用矩形函数来完成。 它将获取相机读取的 Mat、DetectMultiScale 方法返回的 Rectangle 对象以及边框的颜色和厚度。

for _, r := range rects {
fmt.Println(“detected”, r)
gocv.Rectangle(&img, r, color, 2)
}

基于Golang和OpenCV搭建人脸识别系统

基于Golang和OpenCV搭建人脸识别系统

package main
 
import (
"fmt"
"image/color"
"log"
 
"gocv.io/x/gocv"
)
 
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()
 
img := gocv.NewMat()
defer img.Close()
 
window := gocv.NewWindow("webcamwindow")
defer window.Close()
 
harrcascade := "opencv_haarcascade_frontalface_default.xml"
classifier := gocv.NewCascadeClassifier()
classifier.Load(harrcascade)
defer classifier.Close()
 
color := color.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the device")
continue
}
 
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 3)
}
 
window.IMShow(img)
window.WaitKey(50)
}
}

而且......是的,一切顺利! 我们现在有了一个用 Go 编写的简单的人脸识别系统。 很快我计划继续这些实验,并通过结合 Go 和 OpenCV 来创造新的很酷的东西。

如果您有兴趣,请评分 gRPC 网络服务器,我用 Python 和 OpenCV 编写的。 一旦检测到人脸,它就会传输数据。 这是用不同编程语言创建不同客户端的基础。 他们将能够连接到服务器并从中读取数据。

感谢您阅读这篇文章!

技能箱推荐:

来源: habr.com

添加评论