GoCV

GoCV包为opencv4计算机视觉库提供Go语言绑定。

GoCV包支持Linux、macOS和Windows上的最新版本Go和OpenCV(v4.4.0)。我们打算让Go语言成为一个"first-class“客户机,与OpenCV生态系统的最新发展相兼容。

GoCV还支持Intel OpenVINO。有关如何将GoCV与Intel OpenVINO工具箱一起使用的详细信息,请参阅OpenVINO自述文件。

如何使用

Hello, video

此示例使用设备“0”打开视频捕获设备,读取帧,并在GUI窗口中显示视频:

package main

import (
	"gocv.io/x/gocv"
)

func main() {
	webcam, _ := gocv.OpenVideoCapture(0)
	window := gocv.NewWindow("Hello")
	img := gocv.NewMat()

	for {
		webcam.Read(&img)
		window.IMShow(img)
		window.WaitKey(1)
	}
}

Face detect

这是一个使用设备“0”打开视频捕获设备的更完整的示例。它还使用CascadeClassifier类加载包含分类器数据的外部数据文件。该程序从视频中提取每一帧,然后使用分类器来检测人脸。如果找到任何面,它将围绕每个面绘制一个绿色矩形,然后在输出窗口中显示视频:

package main

import (
	"fmt"
	"image/color"

	"gocv.io/x/gocv"
)

func main() {
    // set to use a video capture device 0
    deviceID := 0

	// open webcam
	webcam, err := gocv.OpenVideoCapture(deviceID)
	if err != nil {
		fmt.Println(err)
		return
	}
	defer webcam.Close()

	// open display window
	window := gocv.NewWindow("Face Detect")
	defer window.Close()

	// prepare image matrix
	img := gocv.NewMat()
	defer img.Close()

	// color for the rect when faces detected
	blue := color.RGBA{0, 0, 255, 0}

	// load classifier to recognize faces
	classifier := gocv.NewCascadeClassifier()
	defer classifier.Close()

	if !classifier.Load("data/haarcascade_frontalface_default.xml") {
		fmt.Println("Error reading cascade file: data/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
		}

		// detect faces
		rects := classifier.DetectMultiScale(img)
		fmt.Printf("found %d faces\n", len(rects))

		// draw a rectangle around each face on the original image
		for _, r := range rects {
			gocv.Rectangle(&img, r, blue, 3)
		}

		// show the image in the window, and wait 1 millisecond
		window.IMShow(img)
		window.WaitKey(1)
	}
}

More examples

在这个repo的cmd目录中有各种有用的命令行实用程序的示例,例如捕获图像文件、流式mjpeg视频、计算跨越直线的对象以及使用OpenCV和Tensorflow进行对象分类。

如何安装

要安装GoCV,请运行以下命令:

go get -u -d gocv.io/x/gocv

要运行使用GoCV包的代码,还必须在系统上安装opencv4.4.0。这里是Ubuntu、Windows和MacRasPian的说明。

Ubuntu/Linux

Installation

makeMakefileMakefile

Quick Install

要在Linux上下载并安装OpenCV 4.4.0,以下命令应该可以完成所有操作:

cd $GOPATH/src/gocv.io/x/gocv
make install

如果需要静态opencv库

make install BUILD_SHARED_LIBS=OFF

如果工作正常,则在整个过程结束时,应显示以下消息:

gocv version: 0.22.0
opencv lib version: 4.4.0

就这样,现在您可以使用GoCV了。

Install Cuda

[cuda directory](./cuda)

Install OpenVINO

[openvino directory](./openvino)

安装OpenVINO和Cuda

The following commands should do everything to download and install OpenCV 4.4.0 with Cuda and OpenVINO on Linux:

cd $GOPATH/src/gocv.io/x/gocv
make install_all

如果需要静态opencv库

make install_all BUILD_SHARED_LIBS=OFF

如果工作正常,则在整个过程结束时,应显示以下消息:

gocv version: 0.22.0
opencv lib version: 4.4.0-openvino
cuda information:
  Device 0:  "GeForce MX150"  2003Mb, sm_61, Driver/Runtime ver.10.0/10.0

Complete Install

make install
安装所需的软件包
Makefile
cd $GOPATH/src/gocv.io/x/gocv

接下来,您需要更新系统,并安装任何必需的软件包:

make deps

Download source

现在,下载OpenCV 4.4.0和OpenCV Contrib源代码:

make download

Build

make build

如果需要静态opencv库

make build BUILD_SHARED_LIBS=OFF

Install

代码生成后,就可以安装:

make sudo_install

验证安装

要验证您的安装,您可以运行其中一个示例。

首先,将当前目录更改为GoCV repo的位置:

cd $GOPATH/src/gocv.io/x/gocv

现在您应该能够构建或运行任何示例:

go run ./cmd/version/main.go

版本程序应输出以下内容:

gocv version: 0.22.0
opencv lib version: 4.4.0

清理额外文件

安装完成后,可以删除多余的文件和文件夹:

make clean

Cache builds

go install gocv.io/x/gocv

Custom Environment

-tags customenv

For example:

export CGO_CPPFLAGS="-I/usr/local/include"
export CGO_LDFLAGS="-L/usr/local/lib -lopencv_core -lopencv_face -lopencv_videoio -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs -lopencv_objdetect -lopencv_features2d -lopencv_video -lopencv_dnn -lopencv_xfeatures2d"

请注意,您需要在当前会话中运行这两行代码,以便构建或运行代码,以便设置所需的ENV变量。完成此操作后,您可以在自定义环境中执行使用GoCV的代码,如下所示:

go run -tags customenv ./cmd/version/main.go

Docker

DockerfileGoCVMakefiledocker
make docker

1.13.5Go
make docker GOVERSION='1.13.5'

在macOS上运行Docker中的GUI程序

GoCVgocv.Window
brew cask install xquartzbrew install socat
xquartz
xquartzxquart
open -a xquartz

单击“首选项”中的“安全”选项卡并选中“允许连接”框:

socatxquart6000
lsof -i TCP:6000

现在,您可以启动一个本地代理,它将把X窗口流量代理到充当本地X服务器的xquartz中:

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
GoCVDISPLAY
docker run -it --rm -e DISPLAY=docker.for.mac.host.internal:0 your-gocv-app

注意,由于Dockerfor MacOS不提供任何视频设备支持,因此您将无法运行需要摄像头的GoCV应用程序。

高山3.7Docker图片

有一个Docker图片,它是由项目贡献者@denismakogon创建的。你可以在https://github.com/denismakogon/gocv-alpine找到它。

Raspbian

Installation

makeMakefileMakefile

Quick Install

在Raspbian上下载并安装OpenCV 4.4.0时,应该使用以下命令:

cd $GOPATH/src/gocv.io/x/gocv
make install_raspi

如果工作正常,则在整个过程结束时,应显示以下消息:

gocv version: 0.22.0
opencv lib version: 4.4.0

就这样,现在您可以使用GoCV了。

macOS

Installation

可以使用自制程序安装OpenCV 4.4.0。

如果您已经安装了OpenCV(3.4.x)的早期版本,您可能应该在安装新版本之前将其删除:

brew uninstall opencv

然后可以安装OpenCV4.4.0:

brew install opencv

pkgconfig Installation

pkg-config用于确定编译和链接OpenCV的正确标志。您可以使用自制软件进行安装:

brew install pkgconfig

验证安装

要验证您的安装,您可以运行其中一个示例。

首先,将当前目录更改为GoCV repo的位置:

cd $GOPATH/src/gocv.io/x/gocv

现在您应该能够构建或运行任何示例:

go run ./cmd/version/main.go

版本程序应输出以下内容:

gocv version: 0.22.0
opencv lib version: 4.4.0

Cache builds

go install gocv.io/x/gocv

Custom Environment

-tags customenv

For example:

export CGO_CXXFLAGS="--std=c++11"
export CGO_CPPFLAGS="-I/usr/local/Cellar/opencv/4.4.0/include"
export CGO_LDFLAGS="-L/usr/local/Cellar/opencv/4.4.0/lib -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_photo -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_optflow -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_dnn -lopencv_plot -lopencv_xfeatures2d -lopencv_shape -lopencv_video -lopencv_ml -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_flann -lopencv_xobjdetect -lopencv_imgcodecs -lopencv_objdetect -lopencv_xphoto -lopencv_imgproc -lopencv_core"

请注意,为了构建或运行代码,您需要在当前会话中运行这3行代码,以便设置所需的ENV变量。完成此操作后,您可以在自定义环境中执行使用GoCV的代码,如下所示:

go run -tags customenv ./cmd/version/main.go

Windows

Installation

下面假设您运行的是64-bit版本的Windows10。

为了在Windows上构建和安装opencv4.4.0,必须首先下载并安装MinGW-W64和CMake,如下所示。

MinGW-W64

从https://sourceforge.net/projects/mingw-w64/files/Toolchains%20targetting%20Win32/Personal%20Builds/mingw-builds/7.3.0/下载并运行MinGW-W64编译器安装程序。

7.3.07.X
c:\Program Files\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev2
C:\Program Files\mingw-w64\x86_64-7.3.0-posix-seh-rt_v5-rev2\mingw64\bin

CMake

下载CMakehttps://cmake.org/download/并将其安装到默认位置。CMake安装程序会将CMake添加到您的系统路径中。

OpenCV 4.4.0和OpenCV Contrib模块

在Windows上下载并安装OpenCV 4.4.0时,以下命令应能完成所有操作:

chdir %GOPATH%\src\gocv.io\x\gocv
win_build_opencv.cmd

可能需要一个小时。

C:\opencv\build\install\x64\mingw\bin

验证安装

将当前目录更改为GoCV repo的位置:

chdir %GOPATH%\src\gocv.io\x\gocv

现在您应该能够构建或运行任何命令示例:

go run cmd\version\main.go

版本程序应输出以下内容:

gocv version: 0.22.0
opencv lib version: 4.4.0

就这样,现在您可以使用GoCV了。

Cache builds

go install gocv.io/x/gocv

Custom Environment

C:\opencv\build\install\include-tags customenv

由于OpenCV生成dll(包括名称中的版本)的方式,如果使用的是不同版本的OpenCV,则需要使用此方法。

For example:

set CGO_CXXFLAGS="--std=c++11"
set CGO_CPPFLAGS=-IC:\opencv\build\install\include
set CGO_LDFLAGS=-LC:\opencv\build\install\x64\mingw\lib -lopencv_core412 -lopencv_face412 -lopencv_videoio412 -lopencv_imgproc412 -lopencv_highgui412 -lopencv_imgcodecs412 -lopencv_objdetect412 -lopencv_features2d412 -lopencv_video412 -lopencv_dnn412 -lopencv_xfeatures2d412 -lopencv_plot412 -lopencv_tracking412 -lopencv_img_hash412

请注意,为了构建或运行代码,您需要在当前会话中运行这3行代码,以便设置所需的ENV变量。完成此操作后,您可以在自定义环境中执行使用GoCV的代码,如下所示:

go run -tags customenv cmd\version\main.go

Android

使用Gomobile在Android上运行GoCV还有一些工作要做。有关如何安装Android的OpenCV/GoCV的信息,请参阅:https://gist.github.com/ogero/c19458cf64bd3e91faae85c3ac887481

请参阅此处的原始讨论:https://github.com/hybridgroup/gocv/issues/235

Profiling

MatMat
MatMatMat
-tags matprofile
go run -tags matprofile cmd/version/main.go

您可以随时使用以下方法获取配置文件的计数:

gocv.MatProfile.Count()

您可以使用以下方式显示当前条目(堆栈跟踪):

var b bytes.Buffer
gocv.MatProfile.WriteTo(&b, 1)
fmt.Print(b.String())

这对追查泄漏很有帮助。例如,假设您有以下无意义程序:

package main

import (
	"bytes"
	"fmt"

	"gocv.io/x/gocv"
)

func leak() {
	gocv.NewMat()
}

func main() {
	fmt.Printf("initial MatProfile count: %v\n", gocv.MatProfile.Count())
	leak()

	fmt.Printf("final MatProfile count: %v\n", gocv.MatProfile.Count())
	var b bytes.Buffer
	gocv.MatProfile.WriteTo(&b, 1)
	fmt.Print(b.String())
}

运行此程序将生成以下输出:

initial MatProfile count: 0
final MatProfile count: 1
gocv.io/x/gocv.Mat profile: total 1
1 @ 0x40b936c 0x40b93b7 0x40b94e2 0x40b95af 0x402cd87 0x40558e1
#	0x40b936b	gocv.io/x/gocv.newMat+0x4b	/go/src/gocv.io/x/gocv/core.go:153
#	0x40b93b6	gocv.io/x/gocv.NewMat+0x26	/go/src/gocv.io/x/gocv/core.go:159
#	0x40b94e1	main.leak+0x21			/go/src/github.com/dougnd/gocvprofexample/main.go:11
#	0x40b95ae	main.main+0xae			/go/src/github.com/dougnd/gocvprofexample/main.go:16
#	0x402cd86	runtime.main+0x206		/usr/local/Cellar/go/1.11.1/libexec/src/runtime/proc.go:201

Matgocv.NewMat()

此外,如果程序是一个长时间运行的进程,或者如果GoCV正在web服务器上使用,那么安装HTTP接口可能会有帮助)。例如:

package main

import (
	"net/http"
	_ "net/http/pprof"
	"time"

	"gocv.io/x/gocv"
)

func leak() {
	gocv.NewMat()
}

func main() {
	go func() {
		ticker := time.NewTicker(time.Second)
		for {
			<-ticker.C
			leak()
		}
	}()

	http.ListenAndServe("localhost:6060", nil)
}
Mat

如何作出贡献

请查看我们的CONTRIBUTING.md文档,以了解我们的贡献指南。

然后查看我们的ROADMAP.md文档,了解下一步要做什么。

为什么这个项目存在

用于Go和OpenCV的https://github.com/go-opencv/go-opencv包不支持opencv2.x以上的任何版本,添加对opencv3的支持的工作已经停滞了一年多,主要是由于SWIG的复杂性。这就是我们开始这个项目的原因。

GOCV包使用OpenCV 4 C++类周围的C-style包装器,以避免必须处理应用SWIG到一个巨大的现有代码库。这些映射的目的是尽可能地与原始的OpenCV项目结构相匹配,以便更容易地查找内容,并能够确定在何处添加对GoCV的其他OpenCV图像过滤器、算法和其他特性的支持。

videoiovideoio.*

这个包的灵感来自于最初的https://github.com/go-opencv/go-opencv项目、博客https://medium.com/@peterleyssens/using-opencv-3-from-golang-5510c312a3c和https://github.com/sensorbee/opencv的回复,谢谢大家!

License

根据Apache2.0许可证授权。版权所有2017-2020混合组。

Logo由GopherizeMe生成https://gopherize.me