golang 开启opencv图形化编程

yizhihongxing

下面是“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日

相关文章

  • Flask解决跨域的问题示例代码

    首先,Flask解决跨域的问题可以通过Flask-CORS扩展来实现。在使用Flask-CORS前,需要安装Flask-CORS扩展,可以通过pip install flask-cors命令进行安装。 Flask-CORS提供了CORS支持,可以在Flask应用程序中添加跨域资源共享功能,通过设置响应头中的Access-Control-Allow-Origi…

    人工智能概论 2023年5月25日
    00
  • cordon节点drain驱逐节点delete节点详解

    cordon节点drain驱逐节点delete节点详解 Kubernetes是一个开源的容器编排系统,其中包括许多重要的概念和操作命令。 在进行集群维护和调度时,经常会需要暂停或移除某个节点。因此,Kubernetes提供了三种常用的节点管理方法,分别是cordon、drain和delete。 cordon节点 cordon节点的作用是将节点标记为不可调度状…

    人工智能概览 2023年5月25日
    00
  • python批量修改文件名的三种方法实例

    当我们需要批量修改文件名时,手动一个一个修改会浪费大量时间和精力。Python可以帮我们轻松地实现文件名批量修改的功能。本文将介绍三种Python批量修改文件名的方法,并提供代码示例,让大家可以轻松地上手。 方法一:使用os模块的rename()函数 这种方法是最常用的一种方法,只需要使用os模块中的rename()函数即可完成文件名的修改。 代码示例: i…

    人工智能概览 2023年5月25日
    00
  • 详解Go语言微服务开发框架之Go chassis

    介绍 Go语言是一门轻量级、并发性强的编程语言,在大数据、云计算、大并发、分布式系统等领域备受关注。在微服务架构中,GO语言也有着优异的表现,其组合Go语言微服务开发框架之Go chassis更是非常方便快捷,本攻略就是针对该技术的详解。 步骤 Go chassis概述 Go chassis是一款由华为云基于GO语言实现的微服务开发框架,其通过服务端接口、注…

    人工智能概览 2023年5月25日
    00
  • 关于Django外键赋值问题详解

    下面我来为你详细讲解“关于Django外键赋值问题详解”。 1. 外键赋值问题 在Django中,使用外键关系需要赋值,通常情况下可以通过实例化对象、外键属性、id值等属性进行外键赋值,但在实际情况下可能会出现外键赋值失败的情况,这时需要注意以下几点: 确认外键关系是否正确 确认外键赋值数据是否正确 确认外键赋值方法是否正确 2. 关于外键赋值数据格式问题 …

    人工智能概论 2023年5月25日
    00
  • django+echart数据动态显示的例子

    下面我将为您详细讲解“Django+Echart数据动态显示”的完整攻略。 1. 安装 Django 和 echarts 首先需要安装 Django 和 echarts,可以通过以下命令来安装: pip install django pip install echarts 2. 创建 Django 项目和应用 接下来我们需要创建 Django 项目和应用,在…

    人工智能概论 2023年5月25日
    00
  • PyTorch梯度下降反向传播

    PyTorch是一个基于Torch的Python开源深度学习库。它提供了计算图和自动微分等强大的功能,使得我们可以简单、高效地实现神经网络等深度学习模型。而梯度下降反向传播(Gradient Descent Backpropagation)是神经网络训练中最常用的优化算法,用于求解神经网络的参数。 下面,我将详细讲解PyTorch中梯度下降反向传播的完整攻略…

    人工智能概论 2023年5月25日
    00
  • keras topN显示,自编写代码案例

    首先我们先来理解一下问题,keras是深度学习框架,而Top N显示是常见的分类问题的评估指标,指在前N个预测结果中正确的比例。因此在使用keras进行模型训练时,考虑到最终的分类评估,需要能够对模型进行Top N显示的计算。本文将为大家介绍关于keras Top N显示的相关内容,包括计算方法和代码示例。 计算Top N显示的方法 在分类任务中,Top N…

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