gpt4 book ai didi

opencv - Python Opencv直播桌面屏幕流程

转载 作者:行者123 更新时间:2023-12-02 16:36:20 26 4
gpt4 key购买 nike

我正在尝试处理实时屏幕。有一个关于捕鱼的游戏。当它在圆圈中时,您必须单击鱼。我想我可以用opencv处理我的屏幕,找到鱼并用pyautogui点击它。

我做到了,但问题是程序不够快,无法点击。顺便说一句,游戏是 Metin 2 mmorpg 中的迷你游戏。这就像一个黑客或机器人,但我只是想知道我是否可以这样做。

这是我的代码:

import numpy as np
import cv2
from PIL import ImageGrab
import pyautogui
import time

while True:

img=ImageGrab.grab(bbox=(341,208,430,290))
img_np=np.array(img)
#gray=cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)

#lower=np.array([57,91,120])
#upper=np.array([65,95,160])

#mask=cv2.inRange(gray,95,130)

#sonuc=cv2.bitwise_and(gray,gray,mask=mask)
#cv2.imshow('frame',mask)


degsk=np.argwhere(img_np==[123,90,57])
if len(degsk)!=0:
#print(degsk)
yerx=341+degsk[int(len(degsk)/2),1]
yery=208+degsk[int(len(degsk)/2),0]
#pyautogui.click(x=yerx, y=yery)
time.sleep(0.8)

if cv2.waitKey(1)&0xFF==ord('q'):
break

cv2.destroyAllWindows()

如您所见,首先我尝试屏蔽屏幕而不是我意识到没有必要所以我找到了鱼的 BGR 值并编程在 numpy 数组中找到它,而不是我在数组中取值,然后我使用鼠标移动功能。正如我所说,这还不足以钓到鱼。

因此,该计划正在运行,但因捕鱼而延迟。我怎样才能使这个程序更快?

Game Screen Here

最佳答案

我找到 IPython最适合计时,所以如果你开始 IPython并粘贴以下代码:

from PIL import ImageGrab

img=ImageGrab.grab(bbox=(341,208,430,290))

然后,您可以使用以下方式为语句计时:
%timeit img=ImageGrab.grab(bbox=(341,208,430,290))

我明白了:
552 ms ± 5.91 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

所以,抓取屏幕需要超过 500 毫秒,所以你只会得到低于 2 帧/秒的速度 - 甚至没有处理它。

如果你想更快地抓屏,我建议 ffmpeg .我将它安装在运行 macOS 的 iMac 上与 自制 使用:
brew install ffmpeg

然后我可以查看可用视频源列表并找到录制屏幕所需的内容:
ffmpeg -f avfoundation -list_devices true -i ""

样本输出
[AVFoundation input device @ 0x7fa7dcf05b40] AVFoundation video devices:
[AVFoundation input device @ 0x7fa7dcf05b40] [0] FaceTime HD Camera
[AVFoundation input device @ 0x7fa7dcf05b40] [1] Capture screen 0 <--- THIS ONE IS THE SCREEN
[AVFoundation input device @ 0x7fa7dcf05b40] AVFoundation audio devices:
[AVFoundation input device @ 0x7fa7dcf05b40] [0] MacBook Pro Microphone
[AVFoundation input device @ 0x7fa7dcf05b40] [1] CalDigit Thunderbolt 3 Audio

所以我知道我需要为屏幕输入 1。

因此,如果我想以 400px 的宽度和 200px 的高度以 20fps 的速度从左上角 (0,0) 记录屏幕 10 秒,并将 RGBA8888 数据传递给我的钓鱼程序,我可以这样做:
ffmpeg -y -pix_fmt bgr0 -f avfoundation -r 20 -t 10 -i 1 -filter:v "crop=400:200:0:0" -f rawvideo - | ./fish.py

我现在可以使用以下作为我的钓鱼程序:
#!/usr/bin/env python3

import numpy as np
import pyautogui
import time
import os, sys

# width, height
w, h = 400, 200

# Bytes per frame - assumes bgr0, i.e. 8-bits of blue, 8-bits red. 8-bits green and 8-bits junk
bytesPerFrame = w * h * 4

while True:
img = sys.stdin.buffer.read(bytesPerFrame)
if len(img) != bytesPerFrame:
break
# Process your video here

关键词 :pyautogui,屏幕抓取,屏幕抓取,屏幕抓取,慢速,Mac,macOS,Python,捕获,屏幕捕获,ffmpeg,PIL,OpenCV

关于opencv - Python Opencv直播桌面屏幕流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59084350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com