python延时函数_Python实现屏幕自动截图
教程目錄
需要實(shí)現(xiàn)的功能:自動(dòng)屏幕截圖
具體需求:
1. 支持設(shè)置截圖頻率和截圖文件存儲(chǔ)路徑
2. 在存儲(chǔ)截圖時(shí)判斷與前一張截圖的相似度,只有屏幕發(fā)生了顯著的變化才存儲(chǔ)截圖
所需技術(shù)(搜索關(guān)鍵詞):
1. 屏幕截圖
推薦教程:https://blog.csdn.net/m0_37868504/article/details/86246810
2. 圖片相似度比較
推薦教程:https://blog.csdn.net/lly1122334/article/details/89431244#_18
說(shuō)明:PIL的抓取效率比文中說(shuō)得要高,平均在50-90毫秒之間(配置:1920*1080 I7-7700 NVIDIA-GTX-1060-6GB)
應(yīng)用場(chǎng)景:
1. 截取視頻中的各個(gè)鏡頭
2. 截取游戲中的各個(gè)場(chǎng)景、地圖
實(shí)現(xiàn)思路
根據(jù)需求,我們可以得出如下流程圖(忽略延時(shí)環(huán)節(jié))如下:
屏幕自動(dòng)截圖流程圖
其中執(zhí)行屏幕截圖,可以使用Pillow(PIL)的ImageGrab函數(shù);比較截圖是否差異明顯可以使用numpy的余弦相似度比較。
實(shí)現(xiàn)代碼
import datetimeimport timeimport numpy as npfrom PIL import ImageGrabfrom scipy.spatial.distance import pdistdef cosine(image1, image2):""" 比較兩幅圖片(兩個(gè)一維數(shù)組)的余弦相似度:param image1: 圖片1的一維數(shù)組:param image2: 圖片2的一維數(shù)組:return: 兩幅圖片(兩個(gè)一維數(shù)組)的余弦相似度 """cosin = np.vstack([image1, image2])return pdist(cosin, 'cosine')[0]def save_image(image, pid: int, path: str):""" 存儲(chǔ)截圖文件:param image: 截圖對(duì)象:param pid: 截圖ID:param path: 截圖文件存儲(chǔ)路徑 """name_time = str(datetime.datetime.now().strftime("%Y%m%d_%H%M%S")) # 生成文件名中的時(shí)間部分image.save(path + name_time + "_" + str(pid).zfill(3) + ".png") # 將截圖文件存儲(chǔ)到本地def auto_screenshot(inc, threshold=0.1, path="E:截圖測(cè)試"):""" 自動(dòng)屏幕截圖函數(shù):param inc: 截圖間隔時(shí)長(zhǎng)(單位:秒):param threshold: 存儲(chǔ)相似度閾值 [適用閾值列表]視頻按鏡頭截圖 = 0.1:param path: 截圖文件存儲(chǔ)路徑:return: """pid = 1 # 截圖IDnp_last = None # 上一個(gè)存儲(chǔ)的截圖while True: start_time = time.time() # 啟動(dòng)時(shí)間img_now = ImageGrab.grab() # 獲取屏幕截圖np_now = np.asarray(img_now).flatten() # 生成一維數(shù)組if np_last is not None: cosin = cosine(np_now, np_last) # 計(jì)算余弦相似度if cosin > threshold: # 如果相似度大于閾值則存儲(chǔ)該圖片save_image(img_now, pid, path) # 存儲(chǔ)屏幕截圖pid += 1np_last = np_nowprint(pid - 2, "→", pid - 1, ";相似度:", round(cosin, 5))else: # 若當(dāng)前是第一幅截圖()則自動(dòng)保存save_image(img_now, pid, path) # 存儲(chǔ)屏幕截圖pid += 1np_last = np_now end_time = time.time() # 運(yùn)行結(jié)束時(shí)間if inc - (end_time - start_time) > 0: time.sleep(inc - (end_time - start_time)) # 執(zhí)行延時(shí)if __name__ == "__main__": auto_screenshot(1)運(yùn)行結(jié)果:
視頻自動(dòng)截圖運(yùn)行測(cè)試
作者:長(zhǎng)行 (Python系列教程:C001)
總結(jié)
以上是生活随笔為你收集整理的python延时函数_Python实现屏幕自动截图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 360借条手动还款在哪里
- 下一篇: python上传图片到服务器_Flask