当前位置: 首页 > article >正文

win11 python opencv作图像匹配小结

最近做了一个用到python opencv的项目,安装编码都是非常可快速的,使用中遇到一些奇怪问题。

1、安装

w11下,cmd直接

pip install opencv-python

检验是否安装成功:

import cv2
print(cv2.__version__)

2、截屏功能

两种写法都可以:

from PIL import ImageGrab
 
bbox = [10,120,350,450]
im = ImageGrab.grab(bbox = bbox)
import pyautogui

screenshot = pyautogui.screenshot(region=(x1, y1, x2 - x1, y2 - y1))

截屏完,要转换为np.array,如:

import numpy as np

np.array(screenshot)

3、图像识别接口

cv2.matchTemplate函数的语法如下:

result = cv2.matchTemplate(image, templ, method[, mask])
  • image‌:待匹配的大图像。
  • templ‌:用于匹配的模板图像。不得超过image,否则会报错。
  • method‌:匹配方法,常见的有:cv2.TM_CCOEFF、cv2.TM_CCOEFF_NORMED、cv2.TM_CCORR、cv2.TM_CCORR_NORMED、cv2.TM_SQDIFF、cv2.TM_SQDIFF_NORMED。
  • mask‌(可选):用于指定在源图像和模板图像上进行匹配的区域。

常见的匹配方法包括:

  • cv2.TM_CCOEFF‌:计算相关系数。
  • cv2.TM_CCOEFF_NORMED‌:归一化相关系数。
  • cv2.TM_CCORR‌:计算相关和。
  • cv2.TM_CCORR_NORMED‌:归一化相关和。
  • cv2.TM_SQDIFF‌:计算平方差。
  • cv2.TM_SQDIFF_NORMED‌:归一化平方差。

4、封装函数

我自己封装了一个函数:

def grab_and_match(template_image_file, bbox):
    im = ImageGrab.grab(bbox = bbox)
    im.save(r"temp.jpeg")

    image = cv2.imread('temp.jpeg', cv2.IMREAD_GRAYSCALE)
    item_get_template = cv2.imread(template_image_file, cv2.IMREAD_GRAYSCALE)

    res = cv2.matchTemplate(image, item_get_template, cv2.TM_CCOEFF_NORMED)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
    # print(f'min_val {min_val}, max_val {max_val}, min_loc {min_loc}, max_loc {max_loc}')
    return max_val >= 0.9

写的有点挫,截屏后,先save了下,然后用cv2读出,保证与template一样得读取操作。如果直接使用截屏得image,调用matchTemplate会出错。

后来看到别人封装的接口,感觉更通用些:

def find_image_in_area(image_path, x1, y1, x2, y2, threshold=0.8):
    try:
        screenshot = pyautogui.screenshot(region=(x1, y1, x2 - x1, y2 - y1))
        screenshot = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
        screenshot_inverted = cv2.bitwise_not(screenshot)
        inverted_template = invert_image_colors(image_path)
        res = cv2.matchTemplate(screenshot_inverted, inverted_template, cv2.TM_CCOEFF_NORMED)
        _, max_val, _, max_loc = cv2.minMaxLoc(res)
        if max_val >= threshold:
            h, w, _ = inverted_template.shape
            center_x = max_loc[0] + w // 2 + x1
            center_y = max_loc[1] + h // 2 + y1
            return center_x, center_y
        else:
            print(f'max_val {max_val}, max_loc {max_loc}')
            return None
    except Exception as e:
        print(f"Error: {e}")
        return None

除了进行图像匹配,还返回了匹配到的图像的中心,便于后面业务使用。


http://www.kler.cn/a/542272.html

相关文章:

  • 国产编辑器EverEdit - 编辑辅助功能介绍
  • Visual Studio 中的键盘快捷方式
  • Mybatis源码02 - 初始化基本过程(引导层部分)
  • 深度学习之神经网络框架搭建及模型优化
  • Python----PyQt开发(PyQt基础,环境搭建,Pycharm中PyQttools工具配置,第一个PyQt程序)
  • GitHub分支与标签完全指南:从入门到高效管理
  • idea插件开发,如何获取idea设置的系统语言
  • Render上后端部署Springboot + 前端Vue 问题及解决方案汇总
  • vscode关闭后如何恢复在远程服务器的终端程序运行界面
  • 无人机图像拼接数据的可视化与制图技术:以植被监测为例
  • MATLAB联动本地部署的DeepSeek模型
  • 关于FANUC机器人示教器型号的说明
  • 在Vue项目中Vuex和松花的作用和区别
  • JUnit断言方法详解与实战
  • Svelte前端框架
  • 活动预告 |【Part1】 Azure 在线技术公开课:迁移和保护 Windows Server 和 SQL Server 工作负载
  • 机器视觉3D的测量痛点
  • java基础6(黑马)
  • 使用itextpdf动态生成PDF
  • OpenCV 相机标定流程指南
  • 前端技术学习——ES6核心基础
  • 01.Docker 概述
  • vue3-01-初识vue3相对于vue2的提升与比较,使用vue-cli创建项目,使用vite构建工具创建项目
  • C++ -- vector的模拟实现
  • hive spark读取hive hbase外表报错分析和解决
  • vue2 导出Excel文件