golang 开启opencv图形化编程

下面是“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技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • springcloud干货之服务注册与发现(Eureka)

    Spring Cloud 干货之服务注册与发现(Eureka) 什么是服务注册与发现 服务注册与发现是微服务架构中非常重要的一环,它解决了一个问题:服务实例的动态变更,使得消费者总能找到可用的服务实例。其包括两个步骤:服务注册和服务发现。 服务注册:服务提供者将自己的服务信息注册到注册中心。 服务发现:服务消费者通过查询注册中心获取可用的服务信息,然后调用相…

    人工智能概览 2023年5月25日
    00
  • 在Linux中打开了太多文件(Too many open files)的三种解决方法

    当在Linux中打开太多文件时,会遇到“Too many open files”的错误提示,这是因为操作系统为每个进程分配了打开文件的最大数量限制。 解决这一问题有三种方式: 修改系统全局文件数量限制 通过修改系统全局文件数量限制,可以让整个系统中所有的进程都可以打开更多的文件。这可以通过修改以下文件来实现: /proc/sys/fs/file-max : …

    人工智能概览 2023年5月25日
    00
  • Anaconda下Python中GDAL模块的下载与安装过程

    下面是Anaconda下Python中GDAL模块的下载与安装过程的完整攻略: 1. 安装Anaconda 如果已经安装了Anaconda,可以跳到步骤2。 Anaconda是一个便捷的Python发行版,可以方便地安装和管理Python模块。可以从官方网站https://www.anaconda.com/products/individual下载对应版本的…

    人工智能概览 2023年5月25日
    00
  • 给小白的 Nginx 30分钟入门指南(小结)

    下面我来简要介绍一下“给小白的 Nginx 30分钟入门指南(小结)”的完整攻略。 1. 概述 该指南主要是介绍如何使用Nginx作为一个web服务器,并针对小白用户做了详细的讲解。主要包括Nginx的安装、基本配置以及常用命令的使用等内容。 2. 安装 Nginx的安装非常简单,只需在终端中输入以下命令即可: sudo apt update sudo ap…

    人工智能概览 2023年5月25日
    00
  • .NET/C#实现识别用户访问设备的方法

    .NET/C#实现识别用户访问设备的方法 什么是用户访问设备? 用户访问设备是指从用户的设备,如计算机、手机、平板电脑等上访问网站或应用程序。由于不同设备的屏幕大小、分辨率、操作系统以及浏览器不同,因此需要为不同的设备提供不同的页面和功能以优化用户体验。 如何识别用户访问设备? 方法一:通过User-Agent头信息识别设备 User-Agent头信息是HT…

    人工智能概论 2023年5月25日
    00
  • PHP程序员玩转Linux系列 Linux和Windows安装nginx

    PHP程序员玩转Linux系列:Linux和Windows安装nginx攻略 一、什么是nginx Nginx是一个高性能、高并发的Web服务器,它既可以充当静态Web服务器,也可以作为反向代理服务器、负载均衡服务器、邮件代理服务器或者HTTP缓存服务器。目前,nginx已经成为许多大型网站的主流Web服务器之一。 二、Linux安装nginx 2.1 使用…

    人工智能概览 2023年5月25日
    00
  • redis 限制内存使用大小的实现

    Redis是一个使用内存作为数据存储方式的高性能key-value数据库。由于内存资源的限制,设置使用Redis时需要对其进行一定的内存限制,以避免Redis使用过多内存导致服务器宕机。 下面将详细讲解Redis限制内存使用大小的实现攻略。 使用maxmemory配置项 Redis提供了maxmemory配置项,用于设置Redis所使用的内存上限。该配置项的…

    人工智能概览 2023年5月25日
    00
  • Java TokenProcessor令牌校验工具类

    Java TokenProcessor令牌校验工具类 简介 Java TokenProcessor令牌校验工具类是一种防止重复提交的实现方式。当用户请求一个需要重复提交的页面时,我们需要判断用户是否重复提交或者在多次刷新保存过程中多次提交。这时我们可以使用 TokenProcessor 工具类来生成 token,将其储存到会话中或者隐藏表单中以供验证用户提交…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部