在前面的安装教程中,我们提到本系列教程的目标是创建一个TensorFlow对象检测模型,该模型可以检测CS:GO玩家。在这个简短的教程中,我们将更多地关注抓取我们的监视器屏幕,在那里我们可以检测到对象。™将更多地关注抓取我们的监视器屏幕。我必须指出的是,我们需要找到最快的方式来抓取屏幕,因为稍后当我们处理图像并尝试检测对象时,我们的FPS会下降,如果抓屏FPS很慢,这将影响我们每秒的最终帧数。
首先,我们需要安装所有需要的库,所以您可以开始安装OpenCV,方法是这样写一行:pip install openCV-python,然后您可以安装MSS库:python-m pip install–upgrade–user mss。如果您还没有安装NumPy:pip install numpy,请安装NumPy:pip install numpy。最后,您可能需要pywin32包,下载它并从轮子文件安装它。可以从我的GitHub页面下载的grabcreen.py文件。现在您应该已经准备好测试Grab Screen代码了。因此,从导入库并设置我们将使用的变量开始您的代码:download GitHub
import time
import cv2
import mss
import numpy
from PIL import ImageGrab
from grabscreen import grab_screen
# title of our window
title = "FPS benchmark"
# set start time to current time
start_time = time.time()
# displays the frame rate every 2 second
display_time = 2
# Set primarry FPS to 0
fps = 0
# Load mss library as sct
sct = mss.mss()
# Set monitor size to capture to MSS
monitor = {"top": 40, "left": 0, "width": 800, "height": 640}
# Set monitor size to capture
mon = (0, 40, 800, 640)
我们将从最基本和最慢的PIL方法开始。在这第一段代码中,我注释了所有行,以及每行中执行的操作。在其他示例中,我复制了PIL代码并更改了几行代码,这与您在YouTube教程中看到的完全相同。
def screen_recordPIL():
# set variables as global, that we could change them
global fps, start_time
# begin our loop
while True:
# Get raw pixels from the screen, save it to a Numpy array
img = numpy.asarray(ImageGrab.grab(bbox=mon))
# Display the picture
cv2.imshow(title, cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
# add one to fps
fps+=1
# calculate time difference
TIME = time.time() - start_time
# check if our 2 seconds passed
if (TIME) >= display_time :
print("FPS: ", fps / (TIME))
# set fps again to zero
fps = 0
# set start time to current time again
start_time = time.time()
# Press "q" to quit
if cv2.waitKey(25) & 0xFF == ord("q"):
cv2.destroyAllWindows()
break
这里我用的是Sentdex方法来获取计算机屏幕,它的速度比™快得多。但是我们必须在本地文件中有一个grabcreen.py文件才能使用它,所以我们转到最后一个示例。
def screen_grab():
global fps, start_time
while True:
# Get raw pixels from the screen
img = grab_screen(region=mon)
# Display the picture
cv2.imshow(title, cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
fps+=1
TIME = time.time() - start_time
if (TIME) >= display_time :
print("FPS: ", fps / (TIME))
fps = 0
start_time = time.time()
# Press "q" to quit
if cv2.waitKey(25) & 0xFF == ord("q"):
cv2.destroyAllWindows()
break
这是最后一个拿电脑屏幕的例子,我最喜欢它。因为这个方法,我们不需要本地文件™,最重要的是,这个方法有更多的功能。在他们的网站上,你可以发现™可以使用这种方法从不同的计算机屏幕上抓取屏幕,这是以前的方法不可能做到的。而且,这种方法和第二个例子一样快。
def screen_recordMSS():
global fps, start_time
while True:
# Get raw pixels from the screen, save it to a Numpy array
img = numpy.array(sct.grab(monitor))
# to ger real color we do this:
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow(title, cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
fps+=1
TIME = time.time() - start_time
if (TIME) >= display_time :
print("FPS: ", fps / (TIME))
fps = 0
start_time = time.time()
# Press "q" to quit
if cv2.waitKey(25) & 0xFF == ord("q"):
cv2.destroyAllWindows()
break
此处取消您要测试的函数行的注释。
screen_recordMSS()
#screen_recordPIL()
#screen_grab()
在这个简短的教程中,我们学习了三种不同的抓取计算机屏幕的方法。遗憾的是,我们可以获得20 FPS左右的最高性能,但这是我目前发现的最好的性能。如果有人知道如何获得更多FPS的更好方法,请让我知道。现在,我们可以转到其他TensorFlow教程。
最初发表于https://pylessons.com/Tensorflow-object-detection-grab-screenhttps://pylessons.com/Tensorflow-object-detection-grab-screen
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2021/07/07/%e5%af%b9%e8%b1%a1%e6%a3%80%e6%b5%8b%e6%8a%93%e5%8f%96%e5%b1%8f%e5%b9%95%e6%95%99%e7%a8%8b/