Pages

2010年12月17日 星期五

Minicom 設定

  minicom 這個工具可以將 kernel debug message 輸出至螢幕,而且是有資料就輸出,如此,就無須一直打 dmesg 這個指令,方便許多。

  首先,將 debug board 接到嵌入式裝置,我拿到的是一片裸板,一端外接在機器;另一端為 USB 輸出,就接在 PC。剩餘的步驟就看參考資料吧!我只點出幾個注意事項:
  1. 對 minicom 做完設定,按「Enter」確認、「Esc」跳出。
  2. 節點名稱:ttyUSBx,x為數字,去 /dev 找數字最大的就好。
  3. 有時候,minicom 會當掉,只好把終端機關掉重開。
  4. 如果輸入 minicom 無法進入設定畫面,就改成「minicom -s」

參考資料

2010年10月16日 星期六

昆山出差初體驗

Day1

AM 05:00 起床
AM 06:20 搭小黃
AM 07:00 桃園機場
AM 08:40 登機
AM 10:50 上海浦東
##ReadMore##
搭客運 -> 江蘇昆山 -> 新天地 -> 蘇州觀前街 -> 蘇州INCITY -> 崑山按摩(ㄧ醉酒店斜對面) -> 新天地休息

  觀前街有很多大大小小的店家,像西門町一樣,還有賣名牌贗品,包包、皮夾、名片夾等等,跟他們喊價頂多就是300RMB,如果再高就別買了。INCITY是間百貨公司,價錢普遍低於台灣的百貨公司,還有在這裡看到UNIQLO,但當時沒心理準備,機場換的錢也不多,就買不下去。按摩店的小姐,手指力道太大,按完沒有一點舒服的感覺。


Day2

  昆山南站搭高鐵到上海站(如果沒有delay,20分鐘以內會到) -> 搭地鐵(1線到人民廣場轉2線到南京東路站) -> 外灘

  是逢中國的連續假期,人潮洶湧,我看少說有十萬以上,這一帶的建築物五光十色,非常地漂亮,黃浦江上可以搭船欣賞風景,不過票價要100RMB/人,還挺貴的。


Day3

  工廠的QA review前一個phase,SMT之後測試所產生的issue,每一條都必須有action&root course,否則就會 gating,以至於影響這次SMT的時間。工廠的原則就是,硬體絕對不能有issue,否則料就浪費了,反正還有軟體可以解,真機八!另外,大多SW issue 發生在BSP or camera quality。


Day4

  這一天是SMT的pre-build meeting,客戶也在這一天來跟工廠和咱們PM、EE、SW開會;工廠產線也會自己開會,並邀請PJE、EE、SA開會,說明SMT注意事項,以及某些料該怎麼打、哪些開點膠,我去參加這個會議,原則上都聽不懂,只是來個經驗。

  針對點膠這個問題,由於做手持裝置,外觀上比較輕薄,在加上需要做一定高度的drop實驗,所以ㄧ些元件有點膠的需求,以避免脫落。不過,工廠端依據以前NB的經驗,EE希望點膠的元件工廠端反而有意見。


Day5

  今天工廠開始試打幾片,給EE和SA(TestAPP)開始測試,雖然這次 距離DVT1只差幾天,不過hardware design還是有線路上的改變,所以有些BSP的部分需要修改,不過,這也要等他們bring up結束,整理成表格來統一發郵件。


Day6

  繼續檢測SMT後的板子,會做TPDL,然後看能不能順利開機進去Android,如果不行,就把console改成ttyS0,115200n8,開機才能看到kernel吐的訊息,檔案在hardware/tegra/core/system/fastboot/linux_cmdline.c。

  QAD在DVT階段開始進來測試,蹦出更多的問題,必須要解決或者談掉。晚上進入Run-In測試,結果未知。


Day7

  今天去那邊,還是做自己的事情,SA有去看一下Run-In的結果,應該沒甚麼大問題,有待在產線的剩EE。傍晚待17:25的交通車回新天地,吃宿舍樓下的餐廳,晚上看羅賓漢。


Day8

  有一片SMT的板子,在做TPDL的測試時,會隨機地重開機或卡住。從logcat看不出來任何蛛絲馬跡,因為只會看到正常流程的log與dump記憶體的內容。另外,這次目的是出sample給客戶,所以很多dmsg已經關掉,再加上機器不能帶離工廠,所以根本不可能去重燒kernel、 debug。


Day9

  今天SWDL image因為客戶東改西改,再加上Gerber change沒意識到Gsensor會左右相反,所以只好在工廠stand by,等台北解完寄給我,我再將kernel跟修改init.rc的ramdisk.img做合併,然後測試。

  另外,因為有一片SMT的板子常常重啟,而且是隨機的,這樣用logcat根本看不出蛛絲馬跡,所以就先請EE從uart拉線出來,銲接到debug board上面,然後用公對公usb接到host PC。接著,我這邊需要安裝minicom,並且做設定,將序列埠設定成/dev/ttyUSBx、x是數字,修改後記得按「enter -> esc -> save」,下次連接起來後,只要下minicom,就可以看到debug massage。


補充


  • 在hardware/tegra/core/fastboot/linux_cmdline.c的console不可以設定成none,這還需要測試,也許是設定成("console=/dev/ttyUSB0 B115200 ")。

參考資料

Day10

  今天到組裝產線(Assembly Line)觀摩,整條線從包含從前段的硬體組裝、到後段的軟體測試。因為軟硬體都有測試的動作,所以傳輸帶的移動非常地慢,然後就會看到每個人在哪邊發呆、打瞌睡。

  這個階段稱做「AFT」,我猜全名是「Assembly Function Test」,我覺得產線的軟體測試人員素質低落,而且測試也沒有系統化流程,雖然每個人眼前有SOP說明,但不過是一張A4,上頭幾行字與幾張圖,每個人就是隨便點一點、測一測,問題出來就把機台往後面的鐵架放,問他剛剛怎麼操作也搞不清楚,這對我們是額外的負擔。


Day11

  早上還DVT機台,順便去產線看Run-In的結果,發現連續播放影片會有fail rate(108/120),我能做的,就是把這些會當掉的機台的log取出來,看一看然後描述給廠商處理。這也讓我回想一件事情,就是沒有資源能在工板上面做壓力測試,所以也搞不清楚問題在硬體設計上、亦或根本是軟體BSP的問題。現在問題來了,只能回應給廠商,但案子已經跑超過一半。想要實現理想的藍圖,拜託有點執行力的去完成它吧!如果只會喊話,那誰不會!!

  Run-In後會再做一次AFT(這時稱為PFT),同樣地,出現一些issue。做完PFT就是SWDL,download完會做電量控制(會插上AC),電量控制會設定上界與下界,如果低於下界,就要開始充電;如果高於上界,就不要充電。

   出差的目的,不在於解決問題,而是看到問題,進而分析它,如果不懂,就把log留給相關同仁去處理。由於本身不是做BSP,也沒有用debug board的經驗,所以也不太能和EE合作,這是比較可惜的地方。但此次出差,還是收穫良多。
    
  明天才會進行OBE階段的測試,沒機會親眼看到它了。恩,下次吧!


Day12

AM 05:30 起床
AM 06:30 搭客運
AM 07:10 上海浦東
AM 11:30 登機 (delay將近兩個小時)
AM 14:20 香港機場
AM 15:45 登機
AM 17:30 桃園機場
AM 20:00 到家

  今天真是辛苦的一天,這個上海航空和東方航空似乎蠻容易誤點的,所以還真是折磨人!到了桃園機場,去行李區等待,然後有位機場人員帶了一隻米格魯來查勤,看有沒有人帶了不該帶的東西出來,狗狗還很認真的聞,好可愛喔。拿了行李就去免稅店找瑞士蓮巧克力,哇!價錢不便宜吶!因為沒有帶多少錢在身邊,只好先買兩盒最便宜的($280*2),下次有機會再買。

2010年5月31日 星期一

自動膚色偵測

  之前介紹過幾篇與膚色模型相關的文章,這次,我打算即時地去找符合當下的膚色分佈,為了因應在不同外在環境對膚色造成的影響,例如:白光、黃光等。

  採取的手段是分析手部區域的直方圖分佈,這個想法源自於:背景(人工)的分佈會比較均勻(狹長);而手掌(自然)的分佈會比較廣泛(常態)。例如下圖所示:這是在辦公室、日光燈光線充足的環境下,而手的分佈就落在右半邊。

  
  至於選擇的 color space 是 YCbCr 的 Cr channel,因為膚色比較偏。下圖是整個演算法的流程圖,當中做了以下幾件事情:
  1. Histogram Statistics & Smooth。
  2. Find Global Maximum。
  3. Find Local Maximum。
  4. Find Valley (Local Minimum)。
  5. Set-up Threshold & Create Skin Model。

  以上所提的五個項目,當中參數的設置、做法,已經寫在投影片,在此不一一贅述,不過,由於測試的樣本數太少,會不會白光、黃光的分佈都這麼一致,還是個問號;另外「Set-up Threshold」的公式目前是:
  
  比較合理應該是除以 225 取平均,只是,我為了將指尖(比較亮、比較黃、數量比較少)也拉進來,才除上 1000,這是有待商榷的。最後,補上兩張測試結果:(因為是統計像素,所以最好是框得剛剛好的)

黃光(光線充足)

白光(光線充足)

程式碼與投影片下載

相關閱讀

2010年5月18日 星期二

不同手勢的 Fourier Descriptor

  繼之前觀察矩形在不同維度的傅立葉描述子之變化後,這次拿不同手勢來做實驗,一共有0、1、5三種手勢。從以下的影片可以發現,當手指頭越多,一團一團的包也會越多;另外,當維度越接近起始維度時,這些包就會比較像長條狀。##ReadMore##



  傅立葉描述子在頻率域擷取特徵,以描述物體的形狀。至於後續還可以研究(or改善)的部份有三個:
  1. 利用主成分分析,找出主要維度的特徵,以減少特徵比對所需的時間。
  2. 對特徵的各分量做正規化,例如:全部同除以第一個分量。如此可避免同種手形、不同大小(遠近)所造成的誤判。
  3. 觀察不同手形的傅立描述子的強度(spectrum),看看哪幾個分量比較大。這或許和 PCA 有異曲同工之妙(?)。

程式碼下載

相關連結

2010年5月17日 星期一

Nvidia 3D Vision

Nvidia 的 3D 顯示技術採用「Shutter Class」的方式,透過 IR-Emitter,讓眼鏡與 120Hz LCD,以每 1/120 秒的速度,更新左右眼看到的畫面。

  
至於把影像丟給顯示卡做繪圖的部分,是透過 DirextX 的 Direct3D APIs,所以,有了 Nvidia 的硬體配備,想要寫一個 3D 的應用程式,還得先把 Direct3D 入門一下。我有提供簡單的範例(ex: create image、camera preview)和投影片介紹,有興趣可以參考一下。

回到 Nvidia 3D Vision 的議題,他所提供的 solution 是:不管 3D 的來源為何,網路攝影機、3D video、3D game 等等,只要把左右眼的影像「side by side」放在 Direct3D 所提供的 surface 物件中,並透過指定的介面送給顯示卡,它就會做後續呈現的動作了。我把整個架構圖歸納如下:


另外,為了驗證來源是否合法,需要在 surface 下加入 signature,這也是許多人不知道的事情,若沒有加入此簽章,就會變成同時顯示兩張被延展的影像,也就是沒效果的意思。至於如何設定,看範例吧!


目前 Nvidia 釋出的驅動程式版本,在處理 3D 顯示,有全螢幕播放的限制,或許之後的版本就可以 window mode 播放了,如果真能實現,還可以結合 MSN、Skype 做 3D 視訊的應用。


程式碼與投影片下載


相關連結

2010年4月22日 星期四

利用 OpenCV 做人臉偵測

OpenCV 有提供人臉偵測的範例、以及 training model (.xml)。在稍作修改後,整個人臉偵測的流程如下:##ReadMore##
  1. 載入 model
    (CvHaarClassifierCascade*)cvLoad("haarcascade_frontalface_alt.xml");
  2. 對來源影像作 down-scale
    pyramidImg = cvCreateImage(cvSize(image->width/2,image->height/2), IPL_DEPTH_8U, 3);
    cvPyrDown(image, pyramidImg, CV_GAUSSIAN_5x5);
    scale = 2;
  3. 偵測人臉
    CvMemStorage* storage = cvCreateMemStorage(0);
    CvSeq *faces;
    faces = cvHaarDetectObjects(pyramidImg, cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING);
  4. 將找到的人臉框出來 (or 移除)
    當偵測完畢,faces 會記錄人臉的位置,數量可能不只一個。在原先的範例,會針對每一個人臉的區域,再做偵測眼睛的動作,但我沒有這個需求,所以修改成

    • 找出最大的人臉區域:最大半徑。
    • 將它移除:避免干擾到手。
我是安裝 OpenCV2.0,裡頭的範例會使用 namespace cv,核心程式都是 object-base。執行OpenCV2.0 提供的人臉偵測時發現,CPU 使用率比舊版還高出 50% 左右,所以我就維持舊版的寫法,當然,想在 1.0、1.1 執行都沒問題,只要記得把 link library 改掉,例如:「cv200.lib -> cv.lib」。底下是執行影片:(Resolution 320x240、CPU 使用率 30%、Debug mode)




程式碼下載

參考資料

2010年3月15日 星期一

Arm-removal

  在參考互動雙足式機器人之設計與實現這篇論文後,實作了去手臂的模組,目的是避免含有手臂的手會大大降低辨識率。該方法採用逆時針旋轉來統計每個膚色點與重心的距離,如下圖所示:(引用論文圖片)


  這種直方圖統計的方式在影像處理課本第十章:表示與描述就看的到。所以,有了這個觀念,剩下的我想怎麼做就怎麼做囉!底下是整個去手臂的流程:


整個流程有幾點補充:
  1. Histogram Statistics:水平為角度、垂直為最遠距離。
  2. Low-pass filter:用 7x7 的遮罩,做二值影像的低通濾波。
  3. Post-processing:在統計每個膚色點與重心的角度,會因為計算誤差,使相鄰點得到同樣的角度,導致直方圖某些角度沒有值,所以我做了平滑化。
  4. threshold1、threshold2:前者用來決定是否有手臂存在;後者則是決定去手臂的程度。
  5. Find valley:這部份需配合下圖作說明,當決定要去手勢時,就開始往兩側找山谷,也就是傾斜度逐漸平緩的點。有時候坡度會緩和一下又繼續往下降,加入 threshold2,目的就是希望找到比較正確的山谷。

  另外,我將去手臂的目標鎖定在下半圓(180~359),也就是預設手不會從上面垂下來,這樣可以避免五指併攏被判斷成手臂的問題。

程式碼下載

2010年1月4日 星期一

Motion Detection

  「Motion Detection」是第一次接觸電腦視覺時遇到的問題,這個算法試圖從連續影像中找出「移動物體」,處理上可以從相鄰影像、或者以一張背景影像為基礎,而我是採用前者,過程如下:(門檻值設為 20)


  接著就是如何從這張二值影像找出物體,這部分可以參考「Digital Image Processing 2/e」一書中的第 11 章:表示與描述,當中提到「Chain Code」與「Polygonal Approximation」,至於我實作的方法是「Connected Component」,非上述兩者...XD。

  最後一個要考量的議題是如何取捨這些移動物體,我的作法是傳入一個 function pointer 給 motion detector 物件來使用,這樣一來,就可以自行決定 filter condition,function pointer prototype 如下:
typedef bool (*filter)(int cond1, int cond2, int threshold1, int threshold2);

實作範例
bool MyFilter(int cond1, int cond2, int threshold1, int threshold2)
{
if(cond1 < (threshold1/16) || cond2 < (threshold2/16)) return true;
else return false;
}

程式碼下載

參考資料:


 
Blogger Templates