前言
記得開(kāi)始使用 OpenCV 的時(shí)候是在大學(xué)時(shí)期,當(dāng)時(shí)用的是 C 語(yǔ)言,OpenCV 版本好像是1.1,隨著時(shí)間的推移,后面 C++逐漸代替了 C,iOS 也有整合好的 lib 可以使用 OpenCV,現(xiàn)在Python, go 等語(yǔ)言進(jìn)行開(kāi)發(fā),今天主要是說(shuō)一說(shuō)如何使用 go 語(yǔ)言配置開(kāi)發(fā) OpenCV。
OpenCV這一名稱包含了Open和 Computer Vision兩者的意思。實(shí)際上,Open指Open Source(開(kāi)源,即開(kāi)放源代碼),Computer Vision則指計(jì)算機(jī)視覺(jué)。OpenCV的發(fā)展對(duì)軟件的開(kāi)發(fā)具有重要影響。
OpenCV作為開(kāi)放的數(shù)字圖像處理和計(jì)算機(jī)視覺(jué)軟件平臺(tái),有以下特點(diǎn):
① 開(kāi)放C源碼。
② 基于Intel處理器指令集開(kāi)發(fā)的優(yōu)化代碼。
③ 統(tǒng)一的結(jié)構(gòu)和功能定義。
④ 強(qiáng)大的圖像和矩陣運(yùn)算能力。
⑤ 方便靈活的用戶接口。
⑥ 同時(shí)支持MSWindows和Linux平臺(tái)。
作為一個(gè)基本的計(jì)算機(jī)視覺(jué)、圖像處理和模式識(shí)別的開(kāi)源項(xiàng)目,OpenCV可以直接應(yīng)用于很多領(lǐng)域,作為二次開(kāi)發(fā)的理想工具。
庫(kù)的選擇
使用 Opencv 2+的話,可以用這個(gè)庫(kù) https://github.com/go-opencv/go-opencv,但這個(gè)庫(kù)沒(méi)有支持 OpenCV 3+, 所以想用 OpenCV 3+ 可以使用https://github.com/hybridgroup/gocv,今天主要就是介紹 gocv 的使用。
環(huán)境配置
如果還沒(méi)安裝 OpenCV 的話, Mac OS可以通過(guò) brew install opencv 進(jìn)行安裝OpenCV 3.4.1。
安裝好 go 之后,直接運(yùn)行 go get -u -d gocv.io/x/gocv 命令獲取 gocv 庫(kù),進(jìn)入該庫(kù)根目錄 cd $GOPATH/src/gocv.io/x/gocv, 運(yùn)行 source ./env.sh,然后就可以使用 go run命令運(yùn)行里面的示例了,剛開(kāi)始學(xué)可以直接在示例里面修改代碼運(yùn)行。
IDE 的選擇
本來(lái)想使用 IDEA + go plugin 的方式來(lái)開(kāi)發(fā),誰(shuí)知 IDEA 出了 go IDE(需要收費(fèi)),go plugin 就停止維護(hù)了,只能放棄,隨后選擇 vscode+plugin 的方式,方便快捷,感覺(jué)也不錯(cuò),智能提示和代碼跳轉(zhuǎn)都有了,調(diào)試還沒(méi)試,估計(jì)調(diào)試和 run 的話都是可以配置的。
示例
配置好之后迫不及待就寫代碼了,由于 gocv 對(duì) OpenCV 進(jìn)行了封裝,方法名基本都一致,但是使用上還是有些區(qū)別,不過(guò) vscode 代碼跳轉(zhuǎn)很方便,不清楚直接跳到源碼看看就知道了,下面貼一個(gè)查找邊框的例子,看看是不是和 C++的寫法很不一樣。
// What it does:
//
// This example uses the Window class to open an image file, and then display
// the image in a Window class.
//
// How to run:
//
// go run ./cmd/showimage/main.go /home/ron/Pictures/mcp23017.jpg
//
// +build example
package main
import (
"fmt"
"image"
"image/color"
"os"
"gocv.io/x/gocv"
)
func main() {
if len(os.Args) 2 {
fmt.Println("How to run:\n\tshowimage [imgfile]")
return
}
filename := os.Args[1]
window := gocv.NewWindow("Hello")
img := gocv.IMRead(filename, gocv.IMReadColor)
grayImage := gocv.NewMat()
defer grayImage.Close()
gocv.CvtColor(img, grayImage, gocv.ColorBGRToGray)
destImage := gocv.NewMat()
gocv.Threshold(grayImage, destImage, 100, 255, gocv.ThresholdBinaryInv)
resultImage := gocv.NewMatWithSize(500, 400, gocv.MatTypeCV8U)
gocv.Resize(destImage, resultImage, image.Pt(resultImage.Rows(), resultImage.Cols()), 0, 0, gocv.InterpolationCubic)
gocv.Dilate(resultImage, resultImage, gocv.NewMat())
gocv.GaussianBlur(resultImage, resultImage, image.Pt(5, 5), 0, 0, gocv.BorderWrap)
results := gocv.FindContours(resultImage, gocv.RetrievalTree, gocv.ChainApproxSimple)
imageForShowing := gocv.NewMatWithSize(resultImage.Rows(), resultImage.Cols(), gocv.MatChannels4)
for index, element := range results {
fmt.Println(index)
gocv.DrawContours(imageForShowing, results, index, color.RGBA{R: 0, G: 0, B: 255, A: 255}, 1)
gocv.Rectangle(imageForShowing,
gocv.BoundingRect(element),
color.RGBA{R: 0, G: 255, B: 0, A: 100}, 1)
}
if img.Empty() {
fmt.Println("Error reading image from: %v", filename)
return
}
for {
window.IMShow(imageForShowing)
if window.WaitKey(1) >= 0 {
break
}
}
}
我是用 showimage.go 這個(gè)示例改的,處理順序是:
- 灰度化 CvtColor
- 二值化 Threshold
- 縮小圖片 Resize
- 膨脹 Dilate
- 高斯模糊 GaussianBlur
- 查找輪廓 FindContours
- 繪制輪廓 DrawContours
- 繪制輪廓的最小外接矩形 Rectangle
從上面例子可以看到,方法都是在 package gocv下,使用的時(shí)候會(huì)有代碼提示,包括參數(shù)也有提示,由于 go 沒(méi)有類構(gòu)造方法,都是使用 New+類型名稱這樣的函數(shù)還創(chuàng)建類型。
我也是 go 的新手,這里是邊看著文檔邊寫的代碼,還好有智能代碼提示,用起來(lái)還算得心應(yīng)手,希望這篇入門文章對(duì)想使用 go 來(lái)進(jìn)行 OpenCV 開(kāi)發(fā)的同學(xué)有所幫助。
總結(jié):
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- Golang極簡(jiǎn)入門教程(一):基本概念
- Golang極簡(jiǎn)入門教程(四):編寫第一個(gè)項(xiàng)目
- GO語(yǔ)言(golang)基礎(chǔ)知識(shí)
- Ubuntu中Opencv的安裝使用教程