Go OpenCV 绑定
用于 OpenCV 的 Golang 绑定。
通过 CGO 进行 OpenCV 1.x C API 绑定,通过 SWIG 进行 OpenCV 2+ C++ API(GoCV)绑定。
免责声明
这是 chai 的 go-opencv 的一个分支,它仅通过 CGO 支持 OpenCV1,并且所有 OpenCV1 包装程序的功劳(gocv/ 文件夹中的文件除外)应主要归于 Chai。 在分叉时(2013年12月9日),原始项目处于非活动状态,并托管在 Google Code 上,这对社区的贡献有点不便。 因此,我决定在 Github 上托管一个分叉,以便人们可以轻松地为该项目做出贡献。 从那时起,社区添加了一些补丁,还添加了一些实验性的 OpenCV 2 包装器。 这意味着与原始项目相比,该分叉的运行方式略有不同。 但是,现在原始项目似乎再次处于活动状态,并从2014年8月25日开始移至 GitHub。非常欢迎将这两个项目合并的工作。
安装
Linux 和 Mac OS X
安装 Go 和 OpenCV,您可能想通过 apt-get 或 homebrew 来安装它们。
您可以参考链接来安装所需的软件包。
go get github.com/go-opencv/go-opencv cd $GOPATH/src/github.com/go-opencv/go-opencv/samples go run hellocv.go
Windows
安装 Go 和 MinGw
安装 OpenCV-2.4.x 到 MinGW 目录
# libopencv*.dll --> ${MinGWRoot}\bin # libopencv*.lib --> ${MinGWRoot}\lib # include\opencv --> ${MinGWRoot}\include\opencv # include\opencv2 --> ${MinGWRoot}\include\opencv2 go get github.com/go-opencv/go-opencv cd ${GoOpenCVRoot}/trunk/samples && go run hellocv.go
[WIP] OpenCV2 (GoCV)
在 OpenCV 2.x+ 之后,核心团队不再开发和维护 C API。 因此,CGO 将不会用于 CV2 绑定。 相反,我们使用 SWIG 进行包装。 目前正在开发对 OpenCV2 的支持,整个代码将放在 gocv 软件包下。
如果要使用 CV2 的 API,请参阅 gocv/ 目录下的代码。 CV2 包装器的文档还不多,但是您仍可以在 *_test.go 中找到示例用法。
另请注意,OpenCV 中的基本数据结构(例如 cv::Mat,cv::Point3f)目前已部分包装。 有关如何使用这些类型的更多详细信息,请参阅 GoCV 的自述文件。
要求:我们将基于 mat64 构建包装器,因为操作底层数据要容易得多。 在大多数情况下,不需要访问原始 CV 数据,例如 cv::Mat 可以与 *mat64.Dense 进行相互转换。
示例
OpenCV2 的 initCameraMatrix2D
package main import . "github.com/go-opencv/go-opencv/gocv" import "github.com/gonum/matrix/mat64" func main() { objPts := mat64.NewDense(4, 3, []float64{ 0, 25, 0, 0, -25, 0, -47, 25, 0, -47, -25, 0}) imgPts := mat64.NewDense(4, 2, []float64{ 1136.4140625, 1041.89208984, 1845.33190918, 671.39581299, 302.73373413, 634.79998779, 1051.46154785, 352.76107788}) camMat := GcvInitCameraMatrix2D(objPts, imgPts) fmt.Println(camMat) }
Resizing(缩放)
package main import opencv "github.com/go-opencv/go-opencv/opencv" func main() { filename := "bert.jpg" srcImg := opencv.LoadImage(filename) if srcImg == nil { panic("Loading Image failed") } defer srcImg.Release() resized1 := opencv.Resize(srcImg, 400, 0, 0) resized2 := opencv.Resize(srcImg, 300, 500, 0) resized3 := opencv.Resize(srcImg, 300, 500, 2) opencv.SaveImage("resized1.jpg", resized1, nil) opencv.SaveImage("resized2.jpg", resized2, nil) opencv.SaveImage("resized3.jpg", resized3, nil) }
Webcam
还有一个很酷的例子是由 @saratovsource 创建的,它演示了如何使用网络摄像头
cd samples go run webcam.go
更多...
你可以在此找到更多的例子:https://github.com/go-opencv/go-opencv/tree/master...
(First edition: vz edited at 2019.09.22)