最近无聊玩游戏自己写了个脚本,顺便简单研究了一下opencv的视觉处理,简单的灰度图二值化和模板匹配。有点小问题,如果有干扰的话定位框会飘。
目前想到的办法是用yolov8的分割模型去学习地图边界分割,但是暂时还没去做标注和训练。
[Python] 纯文本查看 复制代码 import time
import cv2
import dxcam
import numpy as np
# 定义一个函数,用于显示帧数据
def main():
last_center = (0, 0)
cam = dxcam.create(output_idx=0, output_color="BGR")
cam.start(region=(1625, 36, 1894, 267), target_fps=60, video_mode=True)
while True:
#读取big2图片
big = cv2.imread('big2.jpg',0)
big2 = big.copy()
#
#读取cam.get_latest_frame()获得的帧数据,并numpy化
img = np.array(cam.get_latest_frame())
#获得灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#将灰度图二值化
threshold_value, template = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
#获得模版的宽高
w, h = template.shape[::-1]
#执行模版匹配,使用cv.TM_SQDIFF方法
res = cv2.matchTemplate(big2,template,cv2.TM_SQDIFF)
#获得匹配结果中的最小值、最大值、最小值坐标、最大值坐标
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
#获得最小值坐标
top_left = min_loc
#获得最小值的右下角坐标
bottom_right = (top_left[0] + w, top_left[1] + h)
#获得矩形框中心点坐标
center = (top_left[0] + w/2, top_left[1] + h/2)
#随着移动,打印矩形框中心点坐标,如果中心坐标未改变数值,则不打印
if center != last_center:
print(center)
last_center = center
#在原图上画矩形
cv2.rectangle(big,top_left, bottom_right, 255, 2)
#调整窗口大小
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
#调整窗口大小
cv2.resizeWindow('image', 480, 584)
#显示图像
cv2.imshow('image',template)
#按下q键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
#打印每帧的时间
cam.stop()
cv2.destroyAllWindows()
# 释放资源
cam.release()
# 创建一个 dxcam 实例,用于录屏
if __name__ == '__main__':
main()
|