GO语言使用OpenCV,图找图

2023-12-14 10:34:42

GO语言使用OpenCV,图找图

OpenCV可以用于处理数字图像和视频数据,其功能包括图像和视频的读取、写入、显示、变换、滤波、特征提取、目标检测、人脸识别、物体跟踪、相机标定、三维重建、机器学习等。

当今,计算机视觉在各种应用领域中都扮演着重要的角色,如自动驾驶、智能家居、医学影像、机器人视觉等,而OpenCV则作为计算机视觉领域的重要工具之一,为这些应用领域提供了丰富的功能和算法支持。

OpenCV最初由Intel开发,现在已经成为了一个开源项目,其源代码可以免费获取和使用。OpenCV提供了许多计算机视觉中常用的算法和工具,例如:

  1. 读取和保存图像和视频数据
  2. 图像和视频的显示、缩放、剪切和旋转等操作
  3. 直方图均衡化、图像滤波和形态学操作等图像处理技术
  4. 特征提取和描述符匹配算法,如SIFT和SURF等
  5. 目标检测和跟踪算法,如Haar Cascade和MeanShift等
  6. 人脸检测和识别算法,如LBPH和FisherFace等
  7. 相机标定和三维重建算法,如SfM和PnP等
  8. 机器学习算法,如SVM、KNN和随机森林等

package main

import (
	"fmt"
	"github.com/kbinani/screenshot"
	"gocv.io/x/gocv"
	"image"
	"image/color"
	"image/jpeg"
	"log"
	"os"
	"time"
)

func saveImage(img *image.RGBA, fileName string) error {
	f, err := os.Create(fileName)
	if err != nil {
		return err
	}
	defer f.Close()

	jpeg.Encode(f, img, nil)

	return nil
}

func processScreenshot(tpl gocv.Mat) {
	for {
		img1, err := screenshot.Capture(0, 0, 800, 600)
		if err != nil {
			log.Fatal(err)
		}

		fileName := fmt.Sprintf("D:\\gin_demo\\photo\\demo1\\2.jpg")
		err = saveImage(img1, fileName)
		if err != nil {
			log.Fatal(err)
		}

		time.Sleep(time.Second)

		// 读取源图片和模板图片
		img := gocv.IMRead(fileName, gocv.IMReadColor)
		if img.Empty() || tpl.Empty() {
			panic("无法加载图片")
		}
		defer img.Close()

		// 创建输出结果矩阵
		result := gocv.NewMat()
		defer result.Close()

		// 进行模板匹配
		gocv.MatchTemplate(img, tpl, &result, gocv.TmCcoeffNormed, gocv.NewMat())

		// 获取匹配结果
		_, maxVal, _, maxLoc := gocv.MinMaxLoc(result)
		fmt.Println("max correlation value:", maxVal)

		// 设定一个阈值,判断是否匹配成功
		threshold := float32(0.8)
		if maxVal >= threshold {
			fmt.Printf("Found template at: %+v\n", maxLoc)
		} else {
			fmt.Println("Template not found.")
		}

		// 可以在源图片上标记出模板匹配的位置,这一步,可以删除
		if maxVal >= threshold {

			rect := image.Rect(maxLoc.X, maxLoc.Y, maxLoc.X+tpl.Cols(), maxLoc.Y+tpl.Rows())
			color := color.RGBA{R: 0, G: 0, B: 255, A: 0}
			gocv.Rectangle(&img, rect, color, 2)

			window := gocv.NewWindow("Template Match")
			window.IMShow(img)

			// 窗口等待时间
			window.WaitKey(1000)
			window.Close()
			break
		}

	}
}

func main() {
	// 读取模板图片
	tpl := gocv.IMRead("D:\\gin_demo\\photo\\demo1\\1.jpg", gocv.IMReadColor)
	if tpl.Empty() {
		panic("无法加载模板图片")
	}
	defer tpl.Close()

	processScreenshot(tpl)
}

文章来源:https://blog.csdn.net/qq_35583325/article/details/134910968
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。