利用golang進行OpenCV學習和開發(fā)的步驟
前言
記得開始使用 OpenCV 的時候是在大學時期,當時用的是 C 語言,OpenCV 版本好像是1.1,隨著時間的推移,后面 C++逐漸代替了 C,iOS 也有整合好的 lib 可以使用 OpenCV,現(xiàn)在Python, go 等語言進行開發(fā),今天主要是說一說如何使用 go 語言配置開發(fā) OpenCV。
OpenCV這一名稱包含了Open和 Computer Vision兩者的意思。實際上,Open指Open Source(開源,即開放源代碼),Computer Vision則指計算機視覺。OpenCV的發(fā)展對軟件的開發(fā)具有重要影響。
OpenCV作為開放的數(shù)字圖像處理和計算機視覺軟件平臺,有以下特點:
① 開放C源碼。
② 基于Intel處理器指令集開發(fā)的優(yōu)化代碼。
③ 統(tǒng)一的結(jié)構(gòu)和功能定義。
④ 強大的圖像和矩陣運算能力。
⑤ 方便靈活的用戶接口。
⑥ 同時支持MSWindows和Linux平臺。
作為一個基本的計算機視覺、圖像處理和模式識別的開源項目,OpenCV可以直接應(yīng)用于很多領(lǐng)域,作為二次開發(fā)的理想工具。
庫的選擇
使用 Opencv 2+的話,可以用這個庫 https://github.com/go-opencv/go-opencv,但這個庫沒有支持 OpenCV 3+, 所以想用 OpenCV 3+ 可以使用https://github.com/hybridgroup/gocv,今天主要就是介紹 gocv 的使用。
環(huán)境配置
如果還沒安裝 OpenCV 的話, Mac OS可以通過 brew install opencv 進行安裝OpenCV 3.4.1。
安裝好 go 之后,直接運行 go get -u -d gocv.io/x/gocv 命令獲取 gocv 庫,進入該庫根目錄 cd $GOPATH/src/gocv.io/x/gocv, 運行 source ./env.sh,然后就可以使用 go run命令運行里面的示例了,剛開始學可以直接在示例里面修改代碼運行。
IDE 的選擇
本來想使用 IDEA + go plugin 的方式來開發(fā),誰知 IDEA 出了 go IDE(需要收費),go plugin 就停止維護了,只能放棄,隨后選擇 vscode+plugin 的方式,方便快捷,感覺也不錯,智能提示和代碼跳轉(zhuǎn)都有了,調(diào)試還沒試,估計調(diào)試和 run 的話都是可以配置的。
示例
配置好之后迫不及待就寫代碼了,由于 gocv 對 OpenCV 進行了封裝,方法名基本都一致,但是使用上還是有些區(qū)別,不過 vscode 代碼跳轉(zhuǎn)很方便,不清楚直接跳到源碼看看就知道了,下面貼一個查找邊框的例子,看看是不是和 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 這個示例改的,處理順序是:
- 灰度化 CvtColor
- 二值化 Threshold
- 縮小圖片 Resize
- 膨脹 Dilate
- 高斯模糊 GaussianBlur
- 查找輪廓 FindContours
- 繪制輪廓 DrawContours
- 繪制輪廓的最小外接矩形 Rectangle
從上面例子可以看到,方法都是在 package gocv下,使用的時候會有代碼提示,包括參數(shù)也有提示,由于 go 沒有類構(gòu)造方法,都是使用 New+類型名稱這樣的函數(shù)還創(chuàng)建類型。
我也是 go 的新手,這里是邊看著文檔邊寫的代碼,還好有智能代碼提示,用起來還算得心應(yīng)手,希望這篇入門文章對想使用 go 來進行 OpenCV 開發(fā)的同學有所幫助。
總結(jié):
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
利用Golang解析json數(shù)據(jù)的方法示例
Go提供了原生的JSON庫,并且與語言本身有效的集成在了一起。下面這篇文章將給大家介紹關(guān)于利用Golang解析json數(shù)據(jù)的方法,文中給出了詳細的示例代碼供大家參考學習,需要的朋友們下面跟著小編來一起學習學習吧。2017-07-07使用dep 配置golang 開發(fā)環(huán)境的操作方法
下面小編就為大家?guī)硪黄褂胐ep 配置golang 開發(fā)環(huán)境的操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09Win7環(huán)境下搭建Go開發(fā)環(huán)境(基于VSCode編輯器)
這篇文章主要介紹了Win7環(huán)境下搭建Go開發(fā)環(huán)境(基于VSCode編輯器),需要的朋友可以參考下2017-02-02golang簡易實現(xiàn)?k8s?的yaml上傳并應(yīng)用示例方案
這篇文章主要為大家介紹了golang簡易實現(xiàn)?k8s?的yaml上傳并應(yīng)用示例方案,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07