Apple iPhoneX FaceID 光學原理

A structured light pattern designed for surface inspection https://en.wikipedia.org/wiki/Structured_light

從被動的 Image based stereo matching,進化到今日的 structured light,雖然在 Microsoft Kinect 早已實現多年,但真正將其發揚光大的恐怕還是 Apple 的 iPhoneX,本文就一個半吊子副職業光電工程師 Lv.1 來用猴子聽得懂的方式概述

基本上就是主動打光在物體上,這個光的圖形是經過設計的,有利於辨識比對。所以有一台投影機( 可以想做是相機 )的影像是已知的,在另外一台相機找到相同的 pattern 就可以知道深度,所以我們又回到了 stereo matching和 Epipolar geometry

等等...猴子聽得懂的概述呢?

好回過頭來,看過水滴在平靜的水面嗎,或是當我們丟一顆石頭到湖水中,可以看到一圈漣漪。

遠場繞射的神奇之處,舉個例來說,我抓了一把石頭,往湖中一撒,然後湖之女神 看似雨滴散亂的漣漪卻漸漸相消與結合,成形一個愛心圖案。Wow!

(實際上是需要坐飛機在高空,底下是平靜無浪的大海,同時撒下巨大質量的鐵球...這我們就不探討真實性了)

 

Continue reading "Apple iPhoneX FaceID 光學原理"

Pipe Zlib example

 

Fast deep clone in javascript

Reference

ffmpeg pipe example

這邊從 stdout stderr 流輸入給 ffmpeg 做壓縮,主要就是利用 pipe IPC

寫個小程式順便比較 javascript (nodejs) 和 C 語言的速度差異,最佳化的結果是 javascript 輸出到 stderr 幾乎等速於 C 語言,令人有點意外XD;反而直出到 stdout 的速度比 C 語言慢了 30%,這不太科學 。

題外話是 stderr 通常不會有 buffer 的問題,大多數時候都不用擔心沒有 flush 乾淨

Github code

 

Continue reading "ffmpeg pipe example"

Difference between CRF and QP in x264

壓縮時該選哪個? 看目的是要做什麼,基本上一句話: 開發用 QP ,觀賞用CRF

  • CRF: 根據場景移動的速度動態選擇 QP (畫質) ,傾向在快速變化場景提高壓縮率 ( B frames ),目的是只要維持視覺上的 QP 就可以,快速變化的地方可以模糊一點沒關係。(實驗中在同樣的 QP 設定下,CRF在 I 和 P frame 的 QP 值反而比較高!@@ )
  • QP: 均化所有 frame 的QP,不論場景內容

CRF 或 QP=0 都是 loseless 這邊就不討論了,也沒有什麼實用價值。基本上在相同的設定值下,CRF 的檔案大小會比較小,但這是在於 CRF > 25 (平均畫質) 以上才比較有價值,否則差異不大。

就 MEMC (Frame Rate Conversion) 演算法開發我還是習慣用QP=18,因為同樣用 CRF=18,可能在快速移動物體邊緣出現些許 blocky ,但這是 CRF 壓縮造成的,不是演算法瑕疵,尤其我們在斤斤計較的就是這些快速移動的區域。

using libpng write file

libpng mingw-w64 build static library

C/C++ stdout without CRLF

 

example use in ffmpeg pipe encoding mode

 

GitHub Codes

x264 c++ encode example

有了 libx264 當然要試編一下影片,encode 出的檔案只是為 h264 的 bitstream ,並不是直接封裝成可直接撥放的檔案,還需要一些 wrapper 程序封裝成常見的影片格式如 ( mp4, mkv ...)

不過也可以懶人用 ffmpeg 封裝 XD

 

這基本上就是一連串的繼承寄生關係,階層越高越笨重,也越複雜,這邊就第一步 codec 層來做個小實驗。

  1. codec library: e.g. x264
    • only encoder & decoder for data stream  (h264)
  2. video file container: e.g. libav
    • pack/unpack video file (mp4, avi, mkv)
  3. multi container & codec: e.g. ffmpeg
    • All file formats & all codecs (avi:h264, avi:h265, mkv:h264...)

 

Reference: h264/h265 bit stream 分析工具,可以幫助理解檔案格式

後面附上程式碼

Continue reading "x264 c++ encode example"

Compile x264 library with mingw-w64

完全是參考,注意 YASM 可能要另外下載丟到 mingw/bin/

  1. Download the x264 source code
  2. run ./configure
  3. run make

但是如果這麼簡單就不用寫一篇文章了

MSYS 死活找不到 Mingw-w64,一直顯示找不到 gcc

直到我下載了 MSYS2 ,對,就是多個 2 而已。然後乖乖把mingw32和64放到 C:\msys64底下,執行對應的 msys 環境 (如 mingw64.exe ),就可以正常編譯了!

附上編譯好的懶人包 for mingw-w64