前言python
啓動速度是一項重要的應用性能指標。以手機輸入法爲例,用戶每次嘗試鍵入時,均會直觀感知到輸入法鍵盤的調起速度,若速度過慢則會頻繁影響用戶體驗。
web
爲了可以更準確地獲取到鍵盤調起速度的具體數據,小編編寫了基於Python視頻及圖像處理模塊的評測腳本,下面以其中部分函數爲例,爲你們介紹一下實現思路和流程。
shell
鍵盤調起自動化
ruby
首先須要確認的是,在手機上執行輸入法切換與鍵盤調起等操做的自動化命令——咱們能夠在找出設備屏幕上的相應座標後,經過如下adb命令進行實現:微信
def turn_up_swtich(self): # 切換到百度輸入法 inputmethod_pkgnames_list = ["com.baidu.input/.ImeService", "com.sohu.inputmethod.sogou/.SogouIME"] command_swtichInput = "adb shell ime set " + inputmethod_pkgnames_list[0] os.system(command_swtichInput) # 點擊輸入框,嘗試調起鍵盤 command_turnUp = "adb shell input swipe 500 500 500 500 50" os.system(command_turnUp) # 關閉百度輸入法鍵盤 command_turnDown = "adb shell input swipe 660 750 660 750 50" os.system(command_turnDown) # 切換到搜狗輸入法 command_swtichInput = "adb shell ime set " + inputmethod_pkgnames_list[1] os.system(command_swtichInput)
其後,咱們經過一個簡單的多進程應用,將鍵盤調起的過程以視頻形式記錄。爲便於後續的視頻處理,須要在錄製前開啓手機「開發者選項」中的「指針位置」與「顯示觸摸操做」。
markdown
# 視頻錄製命令def start_screenrecord(self): command = "adb shell screenrecord /sdcard/Movies/ScreenCaptures/SDvideo_data.mp4 --time-limit 5 --size 720x1280" os.system(command)
# 搜狗輸入法鍵盤調起def click_action(self): time.sleep(0.5) command_turnUp = "adb shell input swipe 500 500 500 500 50" os.system(command_turnUp)
# 多進程使鍵盤調起與視頻錄製同時進行def make_video(self, video_path, runNum): p1 = Process(target=self.start_screenrecord) p2 = Process(target=self.click_action) p1.start() p2.start() p2.join() p1.join() time.sleep(0.5) # 導出並保存視頻 dest_path = video_path + "/" + str(runNum) + ".mp4" self.get_file("adb pull /sdcard/Movies/ScreenCaptures/SDvideo_data.mp4 ", dest_path) return dest_path
這樣,經過一個「切換輸入法」、「鍵盤調起並錄屏」的循環,便可獲得多個視頻素材,以期在後續的視頻處理、結果輸出時,經過多個數據的均值來消弭偏差:
app
def run(self):# 啓動帶有輸入框的測試app command_start = "adb shell am start -n com.sogou.inputtest/.MainActivity" os.system(command_start) for runNum in range(0,50): # 每次循環先切換到其餘輸入法,再進行搜狗輸入法鍵盤調起錄製 self.turn_up_swtich() dest_path = self.make_video(self.video_path, runNum) # 視頻處理解析 self.parse(dest_path ,runNum) # 輸出耗時數據 return self.turnUp_speed
視頻處理解析
編輯器
下面給出完整方法,對其中判斷環節的說明可見註釋及後續內容:
ide
def parse(self, video_file, runNum): output_dict = {"-r": str(60)} evaluation_video = skvideo.io.vreader(video_file, outputdict=output_dict) num = 0 has_keydown = False self.is_turn_up_img = None for frame in evaluation_video: self.img_size_width = int(frame.shape[1]) self.img_size_height = int(frame.shape[0]) target_img = frame[self.target_pos] block_img = frame[self.block_pos] if self.is_key_down(block_img, num): has_keydown = True is_key_down_num = num if has_keydown: cv2.imwrite(".\\key\\cand\\turnup_" + str(runNum) + "\\" + str(num) + ".png", target_img) if self.is_turn_up(target_img, num): has_turn_up_num = num - 1 turnup_time = int(has_turn_up_num - is_key_down_num)*16.6 self.turnUp_speed.append(turnup_time) return num += 1
def is_key_down(self, block_img): # 識別色塊處顏色變化 r, g, b = cv2.split(block_img) red_num = 0 for x in range(0, r.shape[0], 5): for y in range(0, r.shape[1], 5): if r[x, y] > 200 and g[x, y] < 100 and b[x, y] < 100: red_num += 1 total_num = r.shape[0] / 5 * r.shape[1] down_filter_num = total_num / 20 up_filter_num = total_num / 100 # 根據色塊顏色(變紅)判斷髮生按下 if self.key_state['is_key_down']: if red_num < up_filter_num: self.key_state['is_key_down'] = False else: if red_num > down_filter_num: self.key_state['is_key_down'] = True return True return False
同理,以「搜狗輸入法標識徹底上升到相應位置」爲鍵盤調起完成的標誌,在鍵盤調起、標識逐漸上升的過程當中(以下圖),對每幀畫面中相應座標處的顏色變化進行識別,以期獲得此刻幀數:函數
# 搜狗標識顏色變化識別def is_turn_up(self, target_img): b, g, r = cv2.split(target_img) speed_num = 0 for x in range(0, r.shape[0], 5): for y in range(0, r.shape[1], 5): if b[x, y] < 200 and g[x, y] < 200 and r[x, y] < 200: speed_num += 1 if self.is_turn_up_img: if speed_num == self.is_turn_up_img: return True # 以標識圖片顏色變化達到必定程度爲限 if speed_num >= 2: self.is_turn_up_img = speed_num return False
最終,將本輪腳本執行得出的兩個幀數間差值乘以每幀耗時(16.67ms)後寫入結果列表,並在預設的循環次數完成後,取得列表中的數據均值,即是當前輸入法鍵盤調起速度的評測結果了。
結語
搜狗測試微信號:Qa_xiaoming
搜狗測試QQ粉絲羣:459645679
本文分享自微信公衆號 - 搜狗測試(SogouQA)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。