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建议: