2016年11月27日 星期日

用Python動態擷取特定程式畫面並用opencv輸出

想用Python抓取特定軟體視窗的畫面,並用opencv處理後輸出,google完發現了這幾篇:
1.使用win32gui抓取特定視窗的邊界
2. 用PIL+opencv抓取並顯示特定範圍的顯示畫面
3. python win32的文件

以下是抓取小算盤轉灰階後輸出的範例(window 10/python3.5):
from PIL import ImageGrab
import numpy as np
import cv2
import win32gui

hwnd = win32gui.FindWindow(None, '小算盤')

while True:
    try :
        left, top, right, bot = win32gui.GetWindowRect(hwnd)
    except :
        print("找不到視窗")
        break
    img = ImageGrab.grab(bbox = (left, top, right, bot))
    img_np = np.array(img)
    frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)
    cv2.imshow("screen box", frame)
    k = cv2.waitKey(30)&0xFF #64bits! need a mask
    if k ==27:
        cv2.destroyAllWindows()
        break

目前有幾個問題:
1. 視窗的名稱該如何擷取?
2. 目前是抓取該程式的畫面相對位置,如果該程式縮到最小或被其他程式蓋過,還是會持續抓取該位置的畫面。 如果希望持續擷取該程式的畫面該怎麼作?
 3. 有時候抓到的相對位置和實際位置會有一點點落差。

2016年11月11日 星期五

Arduino Leonardo版上傳錯誤的解決方式

好久以前買的Leonardo版,今天想來嚐嚐鮮就遇到了編譯完無法上傳的問題:

爬了不少文後終於在官方網站找到解法:
在上傳前先按住arduino上的實體reset鍵,按下上傳後,直到狀態列出現uploading時放開reset鍵就可以了。

2016年11月5日 星期六

GH60 hhkb like 刷機流程筆記

久聞HHKB大名,但因為目前還是習慣win系統,想入手卻又因為價格和奇異的配置卻步。


,於是興起了用GH60配上HHKB keymap的念頭,如果不順手,再刷別的keymap即可。

參考了:
HHKB布局的GH60

後發現中間的6x space bar實在不好搞,現成的PCB也不好找,折衷下用了這個配置:


組裝的過程就不多說了,只想說led完全是多餘的,當初還買了熱插拔套件來增加組裝難度,變得超爆麻煩,組起來還歪歪的 囧,結果燈光功能用沒兩天就關掉了...


刷機流程是參考PTT上:GH60刷機筆記 2015/10/06版
非常詳細,只有一點要特別注意:放在front legend的鍵無法用fn觸發,因為我先去找了網路上現成的HHKB配置來改



以為他會直接把側鍵位當成layer1來觸發,結果發現是想太多,一按fn鍵盤就起肖。

只好手工修整成這樣,連結:我的配置

我的.eep,如果也是Satan (RevCHN)版本的可以直接用。


但還是喜歡Minila的雙Fn設計和手感,而且組這把的錢都可以再買一把Minila air拉!

至於可以自訂keymap,老實說光是layer1就記不太起來,更別說layer2以上了。在沒有鍵帽可以偷看下,個人覺得實用性有限。

2016年7月7日 星期四

Pygame 101

安裝pygame:https://pygame.hackersir.org/Lessons/01/Pygame_install.html

值得一提的是,直接到官方網站只有提供32bit的windows msi安裝檔,如果用32bits的python運行在64bits的電腦上會有抓不到dll的問題。
後來的解決方式就是用這邊提供的64bits whl檔搭配pip安裝在64bits的python上,至少目前沒有遇到錯誤。


入門網站:Program Arcade Games With Python And Pygame

查色碼用的網路調色盤


同場加映:
Python上的Shiny:spyre
  直接pip install spyre即可,運行在64bit python3.5上目前正常
  不用自己刻介面,直接提供簡單的網頁架構,拿來展示圖表滿方便的。
 
範例之一,直接抓取歷史股價並繪成圖表

Python上的leaflet:folium
拿來繪製地圖的工具

2016年7月1日 星期五

ADB sideload 流程

為了不破保又想嘗棉花糖,學著用adb直接從電腦刷ROM,發現好像比以前從recovery刷方便阿! 在這邊紀錄一下流程:

前置項目:

  1.  要刷的ROM,目前用的子龍機可以在這邊的韌體找到。
  2. 手機的電腦驅動,可以在USB分類找到
  3. ADB程式,我是用XDA上的安裝包,會幫你把adb加到環境變數下,方便。
流程:

  1. 打開手機的usb debug mode(在開發人員選項中)並接上電腦。
    1. 此時可以用cmd下:adb devices ,檢查有沒有抓到裝置或驅動有無正常安裝。
    2. 如果沒有,就到裝置管理員裡找驚嘆號裝置,用前置項目2更新之。
  2. 進入recovery mode,
    1. 依據手機有無開機:
      1. 開機:開cmd下: adb reboot recovery
      2. 關機 :按住音量up後按電源鍵直到震一下放開電源鍵後進入fastboot mode
        1. 用音源鍵選取recovery mode後按電源鍵進入。
    2. 出現跌倒小綠人,電源鍵+音量up後進入recovery
  3. 雙wipe
  4. update from adb
  5. 在放rom的路徑下打開cmd 下adb sideload [update rom file name],假如rom檔名為update.zip,即為:adb sideload update.zip
結果升上棉花糖以後超級耗電,想降刷回5.1就有問題啦,應該是recovery的問題。

Ref:

2016年5月22日 星期日

用變數名判斷變數是否存在

想確定特定的變數是否已經被建立起來,可以用dir()取得當下local scope中所有變數名以判斷之。 Untitled
In [3]:
print('x' in dir())
x = 5
print('x' in dir())
False
True