OpenCV 是一个为计算机视觉项目开发的库。 她已经20岁左右了。 我在大学时使用过它,并且仍在我的 C++ 和 Python 项目中使用它,因为它对这些语言有很好的支持。
但当我开始学习和使用 Go 时,我想知道 OpenCV 是否可以用来处理这种语言。 当时集成的例子和教程已经有了,但在我看来它们太复杂了。 过了一会儿,我发现了 The Hybrid Group 创建的一个包装器。 在本文中,我将向您展示如何通过使用 Haar Cascades 开发一个简单的人脸识别系统来开始使用 GoCV。
技能箱推荐: 实践课程
《从零开始的Python开发》 .我们提醒: 对于“Habr”的所有读者 - 使用“Habr”促销代码注册任何 Skillbox 课程可享受 10 卢布的折扣。
将需要什么:
- 走;
- OpenCV(下面的安装程序链接);
- 网络或普通摄像机。
安装
- Linux的:
gocv.io/入门/linux - 苹果系统:
gocv.io/入门/macos - Windows上:
gocv.io/入门/Windows
例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)
启动应用程序后,将打开一个包含来自相机的视频流的窗口。
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 的更多信息,请点击以下链接。
下载已经训练好的级联
为了做到这一点,您需要创建一个分类器并为其提供一个已经训练过的文件(上面给出了链接)。 我已经将pencv_haarcascade_frontalface_default.xml文件上传到我们程序所在的目录中。
harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()
要检测图像中的人脸,您需要使用以下方法
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 来创造新的很酷的东西。
如果您有兴趣,请评分
感谢您阅读这篇文章!
技能箱推荐:
- 两年实践课程
“我是一名专业网络开发人员” .- 教育在线课程
《职业Java开发人员》 .- 实践年课程
《PHP 开发者从 0 到 PRO》 .
来源: habr.com