2019年10月18日 星期五

小米電視定時開關


早前公司為了前台的小米電視買了一台 Raspberry Pi 4,用它來收集不同的數據,如:最新天氣、即時新聞、巴士到站資料、新同事宣佈、歡迎訪客參觀、手工藝工作坊資料⋯⋯等。我們叫它電子報告板。它是在星期一至五的上班時間才會開著,需要不同的同事每天開啟及關閉,遇上忘記關機又在星期五的話,電視長開兩天實在是一種浪費。要解決這個問題,得找出讓小米電視開機關機的方法。

小米電視遙控是以藍牙方式溝通,找過這邊的方法,能成功連接,可是溝通的指令卻無從得知。由於它是 Android 系統,所以只要它有連到內聯網或互聯網,就能透過 http 地址控制:
http://{ip-address}:6095/controller?action={action}

它不是所有指令都有,但我們可以模擬遙控按鍵來達到想要的效果。以下是一些指令:
指令動作
controller?action=keyevent&keycode=power按下電源鍵
controller?action=keyevent&keycode=menu按下選單鍵
controller?action=keyevent&keycode=enter按下確定鍵
controller?action=keyevent&keycode=left按下左鍵
controller?action=keyevent&keycode=right按下右鍵
controller?action=keyevent&keycode=volumeup調大聲
controller?action=keyevent&keycode=bolumedown調細聲
controller?action=changesource&source=hdmi1轉換成 HDMI 1 頻道
controller?action=changesource&source=hdmi2轉換成 HDMI 2 頻道

2019年10月16日 星期三

換臉程式



一直以來對 DeepFake 都感到興趣,如果技術成熟,分分鐘可以讓 Sita 在數碼世界重生。這幾天的起心肝埋首研究,總算有一點成績。我的換臉程式先從相片中尋找出 68 個座標點的面孔,然後把座標點以 Delaunay triangulation 方式連成一起,把兩張相片的相同位置三角形抽出來變形,再組合成新的面孔;這裡很容易導致臉孔出現白邊三角形,只要用 cv2.max() 取代 cv2.add() 就能解決。之後把輸出相片的原有面孔刪去變成黑色。最後以 OpenCV 的 Seamless Clone 放入新面孔。

2019年10月14日 星期一

在 iPhone XR 上讀取八達通餘額


最近有個 App 能透過在 iPhone 上的 NFC 模組讀取八達通餘額。感到很神奇,也想動手做做看。

事緣是 iOS 13 鬆綁了對 NFC 的限制,開發人員能讀取更多不同款式的 NFC 卡。按照蘋果的範例去做,只需要幾個步驟便能完成程式。可是,當在 iPhone XR 上執行程式,放上八達通,一點反應也沒有。以為是數據格式問題,加入 Breakpoint 同樣也沒有反應。是連檢測也沒有發生。

經過多翻研究及嘗試,知道八達通是使用 Felica 系統 Type-F 制式,需要用上 NFCTagReaderSession 而非 NFCNDEFReaderSession。同時在 Info.plist 內要加入:
<key>com.apple.developer.nfc.readersession.felica.systemcodes</key>
<array>
 <string>0003</string>
 <string>8008</string>
</array>
在 NFCTagReader.entitlements 中也要加入:
<key>com.apple.developer.nfc.readersession.formats</key>
<array>
 <string>NDEF</string>
 <string>TAG</string>
</array>
八達通的系統代號為 8008。服務代碼為 0x0117。有了這些準確的設定才能成功讀取數據。數據頭 4 字元是沒有加密的八達通餘額。由於港幣餘額會有毫子出現,為了簡單快捷起見,八達通餘額會乘大 10 倍,即是數值 789 其實是 HK$78.9 餘額。還有是這個餘額包含了按金,所以實際餘額會是 HK$78.9 - HK$50 = $23.9。

2019年10月13日 星期日

大眾臉


在網上看到有人把不同臉孔圖片加疊在一起,造出一張大眾臉;這張臉不存在於世界上,至少在樣本收集的範圍內是沒有,感覺很神奇。教學道出了方法及流程,可是代碼卻沒有完整地公開,得自行處理遺漏缺失的地方。花了一段時間,我終於完整地編寫出一個「大眾臉」的 Python 程式。分別把公司 70 位男同事及 156 位女同事的樣貌合拼起來,就得出這張大眾臉。這兩張臉沒有在公司內出現過,是虛擬而像真的臉。很多同事問我:「當中有那一塊像我?」。說實在是有的,不過也溝淡了吧。說起來,這兩張臉挺有夫妻相 ^_^。

2019年10月12日 星期六

Instagram 貼文抓取程式


最近有一個念頭;希望抓取 Instagram 內的貼文數據,除了可以利用相片去訓練關於圖像的模型外,還可以訓練關於文字的模型。PIP 提供了一個很有用的「instagram-scraper」應用程式,可以抓取貼文相片,非常方便;只要稍為修改一下,便可以把貼文的文字數據也一併保存下來。安裝方法如下:
pip install instagram-scraper
安裝後,打開 /usr/local/lib/python3.7/site-packages/instagram-scraper/app.py 檔案;如上圖所示,加修第 975-978 行,儲存後就可以把貼文數據保存在 JSON 檔內。

2019年10月10日 星期四

製作 WiFi 二維碼


朋友到家作客,有可能會要求使用 WiFi 網絡,每每要自己幫忙輸入連線設定,確實有點麻煩;又或者你是小店東主,想讓客人使用店內 WiFi,把密碼標明出來好像不太安全,要是客人不懂設定,又會麻煩到店員。原來我們可以把 WiFi 設定變成一個 QR Code,顧客只需掃瞄一下便能連線上網,十分方便快捷。

要準備這樣的一個 QR Code,我們可以使用 https://qifi.org 這個工具。它會按你輸入的設定變成 QR Code 圖案。在 SSID 欄輸入你的 WiFi 名稱;然後選擇加密的方法,通常都是「WPA / WPA2」;再在密碼欄輸入你的 WiFi 密碼。按「Generate」便能產生 QR Code。它是一個單機的程式,載入後斷網仍然能夠使用。要是你仍然擔心它會在背後上傳登入資訊的話,只要利用其他的 QR Code 生成器,輸入以下格式:
WIFI:S:<SSID>;T:<WPA|WEP|>;P:<password>;;
也能生產出相同的二維碼。把二維碼裝飾一下再打印出來,貼在當眼處;朋友或顧客便能輕易地加入你的 WiFi 連線設定。