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