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


OpenCV是一个为计算机视觉项目设计的库。 她已经大约20岁了。 我在大学期间使用过它,但仍将其用于C ++和Python项目中,因为它对这些语言有很好的支持。

但是当我开始学习和使用Go时,我想知道OpenCV是否可以用于这种语言。 那时,已经有关于集成的示例和教程,但是在我看来,它们太复杂了。 不久之后,我遇到了由The Hybrid Group团队创建的包装器。 在本文中,我将向您展示如何通过使用Haar Cascades开发简单的面部识别系统来开始使用GoCV。

Skillbox建议: Python开发人员从头开始 实践课程。

我们提醒您: 对于所有“哈勃”读者来说,使用“哈勃”促销代码注册任何Skillbox课程时均可享受10,000卢布的折扣。

需要什么:
  • 去吧
  • 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毫秒。

window.IMShow(img)
window.WaitKey(50)

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



 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小波技术训练的级联分类器。 他们分析图像中的像素以检测某些信号。 要了解有关Haar级联的更多信息,请点击以下链接。

Viola-jones对象检测框架
级联分类器
类似于哈尔的特征

可以在此处下载经过培训的级联。 在当前示例中,级联将用于识别人脸。

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

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

要检测图像中的面部,您需要使用DetectMultiScale方法。 此函数采用刚从摄像机的视频流中读取的帧(Mat类型),并返回Rectangle类型的数组。 数组的大小表示分类器能够在帧中检测到的面部数量。 然后,为确保我们能看到他的发现,让我们浏览矩形列表,并在控制台上显示Rectangle对象,在检测到的矩形周围创建边框。 这可以使用Rectangle函数来完成。 它将使用相机读取的Mat,由DetectMultiScale方法返回的Rectangle对象,边框的颜色和粗细。

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





 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继续进行这些实验并创建新的有趣的东西。

如果您有兴趣, 请查看我用Python和OpenCV编写的gRPC Web服务器 。 在面部检测时流式传输数据。 这是用不同的编程语言创建不同客户端的基础。 他们将能够连接到服务器并从中读取数据。

感谢您阅读本文!

Skillbox建议:

Source: https://habr.com/ru/post/zh-CN462159/


All Articles