2012年11月15日 星期四

skia 性能優化 - part 2


Android 3.0 版之前, 包括Android 2.2, 原生UI 的效能一直讓使用者有所微詞. 部分的原因在於UI 上的所有圖形, 都使用 CPU rendering. 要提高 UI  rendering 的效能, 除了改以特定硬體加速, 例如 GPU 或是 2D engine, 另外一個方法就是針對程式代碼進行優化, 包括針對效能
瓶頸部分, 改用處理器所提供更有效率的指令完成. 當然, 繪圖的加速只是一部分, 另外像是 


2012年10月23日 星期二

攝像頭校正 camera calibration - part 2 calibration


Lens Distortion

在前一篇文章 攝像頭校正 camera calibration - part 1 camera model提到 使用 lens 的好處是可以增加進光量, 縮短曝光時間. 但是缺點則是會造成非線性的影像形變.

常見的兩種主要形變, 分別是徑向( radial distortion)以及 切向形變 (tangent distortion). 徑向形變是由於 lens 的形狀, 使得距離lens中心越遠的光線在通過 lens時彎折較大越靠近 lens 中心的光線則彎折越小切向形變則是由 camera 模組組裝的誤差造成的. 主要是 lens sensor 並非平行對齊. 圖一是兩種形變的影像.


2012年10月9日 星期二

skia 性能優化


Skia是一個 Android 中的一個 open source 向量圖型庫,

Android 2.2 skia 幾乎無所不在, 提供了 draw text, draw rectangle, draw bitmap 等等的功能. 許多 apk UI, 其具體實現就是用skia, 例如, launcher. skia Android 的原生代碼中, 提供了 skia 以及 skiaGL (OpenGL加速的版本). skia 的版本中,  skia 的運算仰賴 CPU, 雖然有提供了 fixed point 以及 floating point 兩套版本, 但筆者實際上透過 #define 調整時, 編譯上會產生錯誤. 有部分的代碼需要修改調整.(是否有其他同好有調試過這部分的代碼?)


2012年9月14日 星期五

擴增實境 - A simple Augmented Reality demo


A simple Augmented Reality demo

最近研究了一個有趣的主題 : Augmented Reality ; AR, 中文翻譯為 擴增實境. 並且用目前的研究心得寫了一個簡單的 demo program.

這是一個 使用 marker 的 AR demo program. 其原理是使用 webcam 抓取影像, 對影像做 marker detection, 根據四邊形的 marker 在 2D image 上的形變狀況 推導出 marker 所在之 3D 平面的 3D transform. 然後使用此 3D transform, 在抓取的影像中繪制 3D 物件. 如此, 就把真實的影像 和虛擬的物件融合在一起.


2012年9月8日 星期六

攝像頭校正 camera calibration - part 1 camera model

PART 1 Camera Model


所謂 Camera model 是使用幾何(geometry)的方式描述真實世界中的物體在 camera 影像平面上的成像方式. 本文會說明最基本的 camera model, 也就是針孔攝像頭模型(pinhole camera model). 另外, 使用鏡片(lens)可以增加進入成像平面的單位時間光線總量,因此縮短了曝光所需要的時間, 但是使用lens也造成了影像或多或少產生了畸變(distortions), 因此我們還需要了解 lens distortion model.
有了camera 的 geometry model 以及 lens 的 distortion model 就可以建構完整的 camera 的內部參數(intrinsic parameter),   camera calibration 需要使用到 camera 的內部參數.


2012年9月1日 星期六

Android 建立 surface 的過程


Android 的圖形系統是 Client-Server 架構, Server SurfaceFlinger, Client 則是應用程式.
應用程式第一次執行時, Window Management Service (WMS) 會開啟一個 session, openSession()函式會被調用. openSession()函式在BSP的位置和程式代碼如下: