下面是“golang 开启opencv图形化编程”的完整攻略,共分为以下几个步骤:
1. 安装OpenCV
首先需要安装OpenCV,可以通过以下命令完成安装:
sudo apt-get install libopencv-dev python3-opencv
2. 安装gocv
安装完OpenCV之后,需要安装gocv库,可以使用以下命令完成安装:
go get -u -d gocv.io/x/gocv
3. 设置环境变量
接下来需要设置环境变量,将gocv的库路径添加到环境变量中,可以通过以下命令完成:
export CGO_CPPFLAGS="-I/usr/local/include"
export CGO_LDFLAGS="-L/usr/local/lib -lgocv"
4. 编写golang代码
成功完成前三个步骤之后,就可以开始写golang代码了,以下是一个简单的示例:
package main
import (
"fmt"
"image/color"
"gocv.io/x/gocv"
)
func main() {
// 打开摄像头
webcam, _ := gocv.VideoCaptureDevice(0)
defer webcam.Close()
// 创建一个窗口
window := gocv.NewWindow("Face Detection")
defer window.Close()
// 加载Haar级联文件
classifier := gocv.NewCascadeClassifier()
classifier.Load("haarcascade_frontalface_default.xml")
defer classifier.Close()
// 循环检测人脸
for {
// 读取摄像头的一帧
img := gocv.NewMat()
webcam.Read(&img)
// 创建灰度图
gray := gocv.NewMat()
gocv.CvtColor(img, &gray, gocv.ColorBGRToGray)
// 检测人脸
faces := classifier.DetectMultiScale(gray)
fmt.Printf("Found %d faces\n", len(faces))
// 绘制矩形框
for _, r := range faces {
gocv.Rectangle(&img, r, color.RGBA{0, 0, 255, 0}, 3)
}
// 显示结果
window.IMShow(img)
if window.WaitKey(1) >= 0 {
break
}
// 释放变量
img.Close()
gray.Close()
}
}
5. 运行golang代码
完成代码编写之后,就可以通过以下命令运行代码了:
go run main.go
示例1:检测并识别人脸并识别
package main
import (
"fmt"
"image/color"
"gocv.io/x/gocv"
"strings"
)
func main() {
filename := "classifiers/haarcascade_frontalface_default.xml"
window := gocv.NewWindow("Face Detection")
defer window.Close()
img := gocv.IMRead("images/test.jpg", gocv.IMReadAnyColor)
if img.Empty() {
fmt.Println("加载图片失败")
return
}
defer img.Close()
gocv.CvtColor(img, &img, gocv.ColorBGRToGray)
classifer := gocv.NewCascadeClassifier()
classifer.Load(filename)
defer classifer.Close()
faces := classifer.DetectMultiScale(img, 1.3, 5)
fmt.Printf("在该图片中检测到%d个人脸.\n", len(faces))
tokenizer := gocv.NewLBPHFaceRecognizer()
tokenizer.Train([]gocv.Mat{}, []int32{})
defer tokenizer.Close()
// 遍历检测到的每一个人脸区域
for i, r := range faces {
// 绘制人脸框
gocv.Rectangle(&img, r, color.RGBA{0, 255, 0, 0}, 3)
// 在框下方标注人脸编号
position := gocv.Point{r.Max.X, r.Min.Y + 20}
text := fmt.Sprintf("Face %d", i+1)
gocv.PutText(&img, text, position, gocv.FontHersheyPlain, 1, color.RGBA{0, 0, 255, 0}, 1)
// 截取人脸图片
faceROI := img.Region(r)
defer faceROI.Close()
// 将人脸图片转换为可识别的数据格式
// 设置训练所需的样本和身份标签
label := int32(i)
tokenizer.AddSamples([]gocv.Mat{faceROI}, []int32{label})
// 输出训练样本数量
fmt.Printf("[Face %d] Added sample (label %d) total samples = %d\n", i+1, label, tokenizer.GetNumSamples())
// 显示并等待关闭
window.IMShow(img)
gocv.WaitKey(100)
}
// 开始识别
fmt.Println("开始识别")
img = gocv.IMRead("images/test1.jpg", gocv.IMReadAnyColor)
defer img.Close()
gocv.CvtColor(img, &img, gocv.ColorBGRToGray)
detectResult := classifer.DetectMultiScale(img, 1.3, 5)
if len(detectResult) != 1 {
fmt.Println("无法检测到人脸或检测到多个人脸,识别失败")
return
}
faceROI := img.Region(detectResult[0])
defer faceROI.Close()
id := tokenizer.Predict(faceROI)
fmt.Printf("检测到编号为%d的人脸\n", id+1)
window.IMShow(img)
gocv.WaitKey(0)
}
示例2:捕获摄像头视频流并检测人脸区域
package main
import (
"fmt"
"image/color"
"gocv.io/x/gocv"
)
func main() {
capture, err := gocv.OpenVideoCapture(0)
if err != nil {
fmt.Printf("Error opening video capture device: %v\n", 0)
return
}
defer capture.Close()
window := gocv.NewWindow("Face Detection")
defer window.Close()
img := gocv.NewMat()
defer img.Close()
classifier := gocv.NewCascadeClassifier()
defer classifier.Close()
filename := "haarcascade_frontalface_default.xml"
classifier.Load(filename)
for {
// 从摄像头获取一帧图片
if ok := capture.Read(&img); !ok {
fmt.Println("不能从摄像头获取数据")
return
}
if img.Empty() {
continue
}
// 检测人脸
rects := classifier.DetectMultiScale(img)
for _, r := range rects {
size := gocv.GetTextSize("Human", gocv.FontHersheyPlain, 1.2, 2)
pt := image.Pt(r.Min.X+(r.Min.X/2)-(size.X/2), r.Min.Y-2)
gocv.Rectangle(&img, r, color.RGBA{0, 255, 0, 0}, 2)
gocv.PutText(&img, "Human", pt, gocv.FontHersheyPlain, 1.2, color.RGBA{0, 0, 255, 0}, 2)
}
window.IMShow(img)
if window.WaitKey(1) == 27 {
break
}
}
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:golang 开启opencv图形化编程 - Python技术站