OpenCV は、コンピューター ビジョン プロジェクト用に設計されたライブラリです。 彼女はもう20歳くらいです。 私は大学でこれを使用しており、C++ と Python のプロジェクトでこれらの言語を十分にサポートしているため、今でも使用しています。
しかし、Go を学習して使用し始めたとき、OpenCV を使用してこの言語を操作できるかどうかに興味を持ちました。 当時、統合に関する例やチュートリアルはすでにありましたが、私にはそれらが複雑すぎるように思えました。 少し後、The Hybrid Group チームが作成したラッパーを見つけました。 この記事では、Haar Cascades を使用して簡単な顔認識システムを開発することで、GoCV を始める方法を説明します。
スキルボックスは次のことを推奨します。 実践コース
「ゼロからのPython開発者」 .リマインダー: 「Habr」のすべての読者が対象 - 「Habr」プロモーション コードを使用してスキルボックス コースに登録すると 10 ルーブルの割引。
必要なもの:
- 行け;
- OpenCV (以下のインストーラーリンク);
- ウェブカメラまたは通常のビデオカメラ。
インストール
- Linux:
gocv.io/getting-started/linux - MacOSの:
gocv.io/getting-started/macos - Windows:
gocv.io/getting-started/windows
例1
最初の例では、カメラ ビデオ ストリームを表示するウィンドウを開くアプリケーションを作成してみます。
まず、作業に必要なライブラリをインポートする必要があります。
インポート(
"ログ"
「gocv.io/x/gocv」
)
この後、VideoCaptureDevice 関数を使用して VideoCapture オブジェクトを作成する必要があります。 後者により、カメラを使用してビデオ ストリームをキャプチャできるようになります。 この関数はパラメータとして整数を使用します (デバイス ID を表します)。
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil { log.Fatalf(“error opening web cam: %v”, err)
}
defer webcam.Close()
ここで、n 次元行列を作成する必要があります。 カメラから読み取った画像を保存します。
img := gocv.NewMat()
defer img.Close()
ビデオ ストリームを表示するには、ウィンドウを作成する必要があります。これは NewWindow 関数を使用して実行できます。
window := gocv.NewWindow(“webcamwindow”)
defer window.Close()
それでは、最も興味深い部分に移りましょう。
ビデオは画像フレームの連続ストリームであるため、カメラのビデオ ストリームを無限に読み取る無限ループを作成する必要があります。 これを行うには、VideoCapture タイプの Read メソッドが必要です。 Mat タイプ (上で作成した行列) を期待し、VideoCapture からのフレームが正常に読み取られたかどうかを示すブール値を返します。
for {
if ok := webcam.Read(&img); !ok || img.Empty( {
log.Println(“Unable to read from the webcam”) continue
}
.
.
.
}
次に、作成したウィンドウにフレームを表示する必要があります。 次のフレームに移動するための一時停止は 50 ミリ秒です。
window.IMShow(img)
window.WaitKey(50)
アプリケーションを起動すると、カメラからのビデオ ストリームを含むウィンドウが開きます。
package main
import (
"log"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening device: %v", err)
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
window := gocv.NewWindow("webcamwindow")
defer window.Close()
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the webcam")
continue
}
window.IMShow(img)
window.WaitKey(50)
}
}
例2
この例では、前の例を使用して、Haar Cascades に基づいた顔認識システムを構築しましょう。
Haar カスケードは、Haar ウェーブレット手法を使用してトレーニングされたカスケード分類器です。 画像内のピクセルを分析して特定の特徴を検出します。 ハール カスケードについて詳しくは、以下のリンクをご覧ください。
すでにトレーニングされたカスケードをダウンロードする
これを行うには、分類子を作成し、すでにトレーニング済みのファイルをそれにフィードする必要があります (リンクは上にあります)。 プログラムが配置されているディレクトリに、pencv_haarcascade_frontalface_default.xml ファイルをすでにアップロードしました。
harrcascade := “opencv_haarcascade_frontalface_default.xml”classifier := gocv.NewCascadeClassifier()classifier.Load(harrcascade)
defer classifier.Close()
画像内の顔を検出するには、次のメソッドを使用する必要があります。
for _, r := range rects {
fmt.Println(“detected”, r)
gocv.Rectangle(&img, r, color, 2)
}
package main
import (
"fmt"
"image/color"
"log"
"gocv.io/x/gocv"
)
func main() {
webcam, err := gocv.VideoCaptureDevice(0)
if err != nil {
log.Fatalf("error opening web cam: %v", err)
}
defer webcam.Close()
img := gocv.NewMat()
defer img.Close()
window := gocv.NewWindow("webcamwindow")
defer window.Close()
harrcascade := "opencv_haarcascade_frontalface_default.xml"
classifier := gocv.NewCascadeClassifier()
classifier.Load(harrcascade)
defer classifier.Close()
color := color.RGBA{0, 255, 0, 0}
for {
if ok := webcam.Read(&img); !ok || img.Empty() {
log.Println("Unable to read from the device")
continue
}
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
fmt.Println("detected", r)
gocv.Rectangle(&img, r, color, 3)
}
window.IMShow(img)
window.WaitKey(50)
}
}
そして…はい、すべてうまくいきました! これで、Go で書かれた簡単な顔認識システムが完成しました。 近いうちに、これらの実験を続けて、Go と OpenCV を組み合わせて新しい素晴らしいものを作成する予定です。
興味があれば評価してください
記事をお読みいただきありがとうございます!
スキルボックスは次のことを推奨します。
- XNUMX年間の実践コース
「私はプロのウェブ開発者です」 .- 教育オンラインコース
「職業 Java 開発者」 .- 実践一年コース
「0からPROまでのPHP開発者」 .
出所: habr.com