2009年12月28日 星期一

由影像處理到電腦視覺(轉貼)

作者:黃春融 成功大學電機工程學系
詹寶珠 成功大學電機工程學系
張貼日期:2003/1/16
系統圖片
圖說:圖中哪些景物是虛擬的,你分辨的出嗎?

某一展示場正在展出一件價值連城的珠寶,展出單位為預防偷盜或破壞,除僱用警衛保全外,還加裝了種種的防盜措施。試想如能藉由影像處理,建構一個三維的虛擬展出物品,採取虛虛實實的展出安排,是否可以稍減展出單位的心理負擔?

藉由電腦的協助以處理數量龐大的影像資料

人類因為有雙眼,所以可以看見世界,並且把看到的影像傳給大腦處理,而對身體下達反應。這樣的動作,對多數人來說是極為直覺而簡單的事。隨著科技 與工業的發展,許多如醫學上或監控系統上所拍攝的影像,數量極為龐大。這些影像如由人類的眼睛和大腦來判讀,將極為耗時費事,如果藉由電腦幫忙處理,將會 節省許多時間,影像處理技術便應運而生。

數位化影像處理的基本架構

影像處理可以簡單分為影像擷取、影像數位化、影像儲存、電腦處理及影像傳送等步驟。

影像擷取:透過相機擷取影像是最簡單的方法,而相機的功能就是把三維空間的物體投影到二維的底片上。為了能夠利用電腦處理所獲得的影像,須要將影像數位化。

影像數位化:利用掃描器或是直接由數位影像擷取設備,如數位相機,將影像數位化後存放 到電腦裡。數位化的影像在處理時較傳統的攝影暗房技巧,如放大、加減光與調色等,具有更大的便利性與彈性。透過影像處理的技巧,可以使影像更為清晰或是強 化局部影像,甚至可以使電腦具有與人類相同的視覺感官作用。

數位化的影像可以視為一個二維矩陣,在這個矩陣中每個行與列的值就代表影像點的位置,而它對應的數值就是影像點的顏色,這些影像點通常稱為像素(pixel)。一張影像中的顏色可以是灰階的,也可以是彩色的,這與擷取影像的器材有關。

影像儲存:數位化後的影像需要儲存起來以便於後續的處理,以一張 256 色,影像大小為 1024 × 1024 的影像,需要約一百萬位元組的儲存空間,它可以利用硬碟、軟碟或是任何數位儲存設備加以儲存。

電腦處理:通常在電腦上透過軟體進行影像處理的演算,達到影像處理的效果。大部分影像處理的演算法都是由軟體執行,在需要快速且即時處理影像資料時,則會透過硬體提供高速的運算。

影像傳送:影像處理完的結果通常輸出至顯示器提供使用者參考,影像傳送不一定是傳至本機的顯示器,也可透過影像壓縮的技術將資料壓縮後,再將影像傳送至不同的電腦。以上我們對影像處理系統的基本架構做了簡單的介紹,接下來要談談已經發展了數十年的影像處理技術的相關應用。

影像處理的應用

影像處理發展至今,除了開發出許多不同功能的影像處理軟體外,這些技術也應用於各個不同領域中,以幫助人類提高資訊處理的效率。在此舉一些常見的例子說明影像處理的應用。

醫學影像:隨著醫學的發展,逐漸研發出各種診斷疾病的輔助機器,如X光機、超音波機、電腦輔助斷層掃描機、核磁共振掃描機等,這些機器提供了大量的影像供醫師診斷疾病。而影像處理的技術,如增強影像對比度或自動偵測病灶位置,可進一步提供更佳的影像品質,以輔助醫師的診斷。

機器人視覺:為了使機器人能與人類一樣具有視覺判斷環境的能力,通常會在機器人身上裝 置攝影機,透過影像處理的技術,使機器人能自行分析環境。例如,為使機器人能像人類一樣閱讀,除裝置攝影機外,尚須特殊的影像處理技術以擷取並辨識字元。 此外,機器人的視覺系統經由視覺演算法,可計算出適當的反應動作和分析周圍的訊息,並將必要的資料傳給機器人手臂,進而移動手臂抓取目標物。甚至可以透過 環境資料的分析,預先告知機器人前方是否有障礙物,以輔助機器人移動。

天文與地理資料:由太空或地面的望遠鏡觀測宇宙中各種現象所得的影像,資料量極為龐 大,如何有效處理這些龐大的資料,對分析與判讀均極為重要,而在影像處理的方法中,影像對比度的增強、影像分割與影像辨識更是其中重要的技術。舉例來說, 美國哈柏太空望遠鏡拍攝到的天文影像,可以透過強化影像對比度的方式將某些特殊的星系凸顯出來。同樣地,許多遙測所得的地理資料,如土地的利用及水資源的 分布,也可以透過影像分割與影像辨識的方式,將河川、森林、建築物等逐一分割出來提供專家研判。而透過衛星所拍攝的影像,也可利用影像處理技術取得所需的 資訊。

工商業應用:現在有許多利用影像處理的方式檢查產品是否有瑕疵,或分析材料的成分與結 構,例如布匹線上檢測系統、射出成型產品的應力測量、生產工件形狀檢測、沖壓元件的曲面測量、熱軋鋼板尺寸及瑕疵檢測等。產品的檢測若以人工的方式進行, 除了耗費人力資源外,且會降低生產效率。透過影像處理系統則可實施自動化檢測,若與監控系統結合,更可提高生產效率。在日常生活中,像讀取條碼、指紋與瞳 孔的身分辨識系統、郵遞區號讀取系統、數位監視系統等,也都利用到影像處理的技術。

多媒體應用:現在許多影片規格如 MPEG 與影像規格 JPEG 等,都是應用影像處理中的影像壓縮技術降低儲存空間。像視訊會議、影像電話等,為節省網路的頻寬,都採用影像處理中的影像壓縮技術,以減少傳輸的資料量。 另外,現在也有結合影像與聲音搜尋,形成類似文字搜尋引擎的多媒體資料檢索系統,這些也需要影像處理中特徵擷取的技巧,以提高搜尋的效率與準確度。

影像處理過程中運用到的基本技術

我們在前面簡單說明了一些常見的影像處理的應用,接下來探討常見的影像處理技術。其實大多數的影像處理演算法,都是為了要強化影像所提供給人類的資訊,進而處理並分析影像,在此簡單介紹一些基礎的影像處理技術。

影像強化:影像強化主要是使影像中的某些特徵,根據使用者的需要凸顯出來。通常因為攝 影時環境的影響或數位化的關係,所得到的數位影像無法將特定區域凸顯出來。舉例來說,一張未經過處理的電腦斷層掃描影像,其組織與組織間的邊緣十分模糊, 經過影像強化後的圖,不同組織間的邊緣就變得非常明顯,這對使用者來說也較容易判讀。

影像還原:影像還原主要是移除或改善導致影像品質惡化的因素,例如拍攝時相機的震動、環境的影響、拍攝物體的運動等所造成的影響。舉例來說,拍攝時因物體與攝影機間的相對移動會造成影像模糊的現象,若透過對物體相對運動的分析,對影像做還原的動作,便可以獲得清晰的影像。

影像壓縮:影像壓縮主要在減少儲存數位影像所需要的空間,同時減少影像傳輸所需要的時 間。影像壓縮主要分成兩類,一種是非失真壓縮,另一種是失真壓縮,目前最常見的影像壓縮規格就是 JPEG。JPEG 是屬於失真壓縮的一種,以 2160 × 1440 大小的影像(存成 bmp 格式)經過 JPEG 壓縮後,檔案大小約為 429 千位元組,而未經壓縮的影像檔案大小約為 9,113 千位元組,兩者之間相差達 21 倍。

影像分割:影像分割的目的,在於根據影像構成的物件來分割影像,以使電腦像人類一樣具 有分析影像特徵的能力。要達到這樣的目的,必須使電腦具有足夠的知識去認知影像的內容。舉例來說,播報員在攝影棚裡播報新聞,播報員是屬於前景的部分,而 播報員以外的影像就屬於攝影棚背景的部分,若以此原則執行影像分割,可以將播報員從影像中分割出來。

影像特徵擷取:影像特徵擷取是由影像中擷取可以代表這張影像的特徵,例如影像中顏色的 分布、影像的紋路構成、與影像中物體分布的特性等。要取得影像中顏色的分布,最簡單的方法就是透過顏色的直方圖。舉例來說,將一影像中紅色的分布位置與強 弱,轉換成紅色分布的直方圖,比較不同影像顏色的直方圖,就可以約略看出其相似度。影像紋路構成的特徵,可由其紋路的方向性或重複性來探討。舉例來說,有 些木材紋路是水平方向的,而有些木材紋路則是垂直方向的。

由二維影像重構三維的場景

影像處理主要是針對二維的影像加以運算,以達到某些特定的目的,如去除雜訊、強化影像邊緣等。而電腦視覺的主要目的,是透過影像處理的技巧再加上 一些幾何分析,把二維影像的投影還原成三維空間的物體。被重構的場景可以是室外的場景如街道,或是室內的場景如辦公室等。一般來說,要重構物體至少需要兩 張或兩張以上具有不同位移的影像,就好像人類的左眼與右眼分別由環境中取得兩張具有位移差的影像,再把資料傳送到大腦重構一樣,如此人類才能夠判斷出物體 的遠近。簡單地說,物體重構的步驟包括(1)影像的擷取;(2)取得拍攝影像時相機的相關資訊,例如相機的焦距、相機的位置與方向等;(3)分析兩張影像 中對應的物體,並取得它們之間的相對位置,最後才計算出物體的三維位置。

這些步驟看似簡單,其實困難重重!首先,由於物體投影到影像平面是經由透視投影的方式,所以在空間中由相機中心與物體點的連線上的所有空間點,都 會投影到同一個影像點上,所以單靠一張影像無法確定物體的真正位置。若要得到物體的正確位置,就需要額外的資訊,例如,不同位置、角度所攝得的該物體影 像。此外,由於攝影時環境的亮度、物體表面的反射度、物體表面的方向與相機的方向,都會導致同一物體投影到影像點上時,影像上的顏色與亮度有所差別,這些 因素都會增加從不同影像間找尋物體相對位置的困難。甚至場景中物體之間相互遮蔽,以至於無法找到物體的對應位置,這都會影響到物體重構的正確性。

電腦視覺中常用的一些技術

電腦視覺的應用範圍與影像處理類似,但是更強調由影像還原出原始三維物體的外形。舉例來說,在機器人視覺的應用上,電腦視覺的技術可以用來幫助機 器人模擬人類的雙眼,告訴機器人環境中的情況,如前方是否有障礙物需要迴避,或障礙物距離機器人有多遠等。在醫學影像上,更可以由超音波機、電腦輔助斷層 掃描機,核磁共振掃描機所產生的影像,重構出人體的器官與骨骼的三維模型。

立體重構:簡單來說,就是假設被拍攝的物體並沒有任何的移動,由兩張或兩張以上的影 像,透過對應點的關係而得到物體在三維空間裡的外形。例如,由高空攝得的兩張地面影像,經過影像對應就可以獲得圖中各相關對應點的關係,再經過三維重構後 便可以得到各點的地形深度,並建構出地形模型。

動態重構:立體重構須在物體拍攝時沒有任何移動的情況下,才能重新還原三維景象,但是 如果要重構街道上正在移動的汽車時,立體重構就無法達到重構汽車外形的目的。有鑑於此,動態重構的技術便被開發出來,以處理上述的情形。簡單來說,動態重 構就是根據影像中物體的位移計算出物體的輪廓。例如,我們把物體放在一個可轉動的桌子上,固定相機的位置,只轉動物體,透過物體在影像上的位移,就可以得 到重構後的三維景象。

光影重構:在前面我們曾經提過攝影時環境的亮度、物體表面的反射度、物體表面的方向 等,均會影響同一個物體投影在影像上的顏色與亮度,既然有這樣的物理特性,是否可以直接利用不同平面對光源的反射與折射特性,而得到物體的三維模型?這種 利用光學上的差異所還原的三維重構,稱為光影重構。光影重構主要是透過物理學中光學反射與折射的特性,以及物體表面與外形的性質,進而推導出物體對應的三 維模型。

虛擬實境:電腦視覺的技術也可以與傳統虛擬實境的技術結合,使得虛擬世界更加多采多姿,也更接近真實世界。而虛擬世界的物體也可以加入真實世界的場景中,以增加環境中景物的豐富性。

影像處理的應用無可限量

在本文中,我們簡單介紹了影像成像的原理及數位影像的特性,並說明影像處理與電腦視覺相關的技術與應用。所舉的例子在影像處理與電腦視覺的研究中 僅是一小部分,還有更多相關的研究仍在進行中。此外,也希望大家知道影像處理並不只是使用像小畫家之類的軟體處理影像而已,其應用與研究更是永無止境。

2009年12月11日 星期五

ubuntu9.10安装android SDK

Android开发,在 ubuntu 9.10 I386 上安装SDK ,NDK。

目标:ubuntu 9.10 上配置 Eclipse 可以调试 Android SDK , NDK
需要软件:
Linux ubuntu 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686 GNU/Linux
Eclipse 3.5.1
android-ndk-1.6_r1-linux-x86.zip
android-sdk_r04-linux_86.tgz
ADT 0.95
JDK 1.5 (官方建议1.5版本)

1.install JDK 1.5
ubuntu默认安装 OpenJDK ,我们需要安装sun-java5-jdk.
换用ubuntu 9.04 source.list
sudo apt-get install sun-java5-jdk
确认环境java -version
java version "1.5.0_19"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_19-b02)
Java HotSpot(TM) Client VM (build 1.5.0_19-b02, mixed mode, sharing)

2.install Eclipse
使用ubuntu 9.10 source.list
sudo apt-get install eclipse
//eclipse-pde will install eclipse-jdt

3.install ADT
eclipse help > software updates
add avaliable software > add site
http://dl-ssl.google.com/android/eclipse > install

可能会遇到bug ,这个是bug的解决方案。update 后即可解决。
Bug #482244 in eclipse (Ubuntu): “requires 'org.eclipse.gef 0.0.0' but it could not be found
http://download.eclipse.org/releases/galileo to your update sites and try again.
也就是先add http://download.eclipse.org/releases/galileo
再add http://dl-ssl.google.com/android/eclipse
可以顺利完成安装

4. install Android SDK
download : sdk 1.6
解压缩 sdk

eclipse >windows> prefences > Android > SDK Location : set the path of the sdk1.6
sudo chmod a+w android-sdk-linux_86 -R
windows > Android SDK and AVD Manager > installed Package > update All >accept > installed accepted
windows > Android SDK and AVD Manager > Virtual Devices > New > target AVD

此时SDK已经安装完成了。
使用open > project >android project > open exist project ....

5.install NDK
解压缩 NDK
install NDK : cd $NDKROOT ./bulid/host-setup.sh
可能会遇到bug , 1.6NDK 中/host-setup.sh 文件 119 行
if [ "$result" == "Pass" ] ; then
改为 if [ "$result" = "Pass" ] ; then
此时设置好NDK 。

我们可以测试下 NDK 1.6
cd $NDKROOT
make APP=hello-jni
make clean APP=hello-jni
Android NDK: Building for application 'hello-jni'
Clean: hello-jni
asus@ubuntu:/opt/android-ndk-1.6_r1$ make APP=hello-jni
Android NDK: Building for application 'hello-jni'
Compile thumb : hello-jni <= apps/hello-jni/project/jni/hello-jni.c
SharedLibrary : libhello-jni.so
Install : libhello-jni.so => apps/hello-jni/project/libs/armeabi

此时,证明NDK 工作正常。
我们可以使用Eclipse > open > project > android > open exits /android-ndk-1.6_r1/apps/hello-jni
而后 run as > Android Application

在桌面或者gnome菜單中添加eclipse啟動圖標

在桌面或者gnome菜單中添加eclipse啟動圖標

(1)在桌面或者啟動面板上添加圖標:
创建启动器)或面板(右键单击面板->添加到面板->定制应用程序启动器)上创建一个新的启动器,然后添加下列数据:" onmouseover="this.style.backgroundColor='#ebeff9'" onmouseout="this.style.backgroundColor='#fff'">在桌面(右鍵單擊桌面->創建啟動器)或面板(右鍵單擊面板->添加到面板->定制應用程序啟動器)上創建一個新的啟動器,然後添加下列數據:

名稱:Eclipse Platform
命令:eclipse
圖標: /opt/eclipse/icon.xpm

(2)在Applications(應用程序)菜單上添加一個圖標
用文本編輯器在/usr/share/applications目錄里新建一個名為eclipse.desktop的啟動器,如下面的命令:

sudo vi /usr/share/applications/eclipse.desktop
或者
sudo gedit /usr/share/applications/eclipse.desktop

然後在文件中添加下列內容:

[Desktop Entry]
Encoding=UTF-8
Name=Eclipse Platform
Comment=Eclipse IDE
Exec=eclipse
Icon=/opt/eclipse/icon.xpm
Terminal=false
StartupNotify=true
Type=Application
Categories=Application;Development;

保存文件。完成整個安裝過程。可以雙擊桌面eclipse的圖標來運行eclipse。

FAQ How do I increase the heap size available to Eclipse?

eclipse java heap space Error!


2009年12月10日 星期四

Cross Compiling

wiki:Cross compiler

A cross compiler is a compiler capable of creating executable code for a platform other than the one on which the compiler is run. Cross compiler tools are generally found in use to generate compiles for embedded system or multiple platforms. It is a tool that one must use for a platform where it is inconvenient or impossible to compile on that platform, like microcontrollers that run with a minimal amount of memory for their own purpose. It has become more common to use this tool for paravirtualization where a system may have one or more platforms in use.

Building a cross compiler manually

1. Build binary utilities
2. Build bootstrap compiler without glibc
3. Build C library
4. Rebuild compiler with glibc

例如為了讓一般的C/C++的程式可以在不同的機器平台上執行,
所以需要cross compiler將C/C++程式編譯成不同格式的執行檔。

而要如何安裝可以參考

安裝cross compiler (toolchain)

以及

網友maxkerr寫的

Ubuntu - 建立 ARM Toolchain (Cross Compiler)



上課講義摘錄之4:Android與Cross Compiler之關係

轉貼
上課講義摘錄之4:Android與Cross Compiler之關係

ubuntu FTP SERVER 安裝設置( vsftp 版本 )

轉貼:
ubuntu FTP SERVER 安裝設置( vsftp 版本 )

2009年12月8日 星期二

關於編譯時出現錯誤41的解決方法

關於編譯時出現錯誤41的解決方法

http://androidos.cc/dev/read.php?tid-4821.html

Installing OpenCV 2.0 on Ubuntu 9.10 [轉貼]

November 8th, 2009 by alex
OpenCV is a widely used computer vision library for research and development.
I’ve tried using instructions for installing it from the official manual, but it failed miserably.
It seems that 2.0 code is incompatible with the latest incarnation of ffmpeg. Couple minutes in googling and I had it working.Here is what needs to be done:
Get all the prerequisites:
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg62-dev libtiff4-dev build-dep libswscale-dev swig

Get OpenCV 2.0, and unpack it somewhere
Fix ffmpeg links.
Make sure you are root (sudo -s) and do the following:
mkdir /usr/include/ffmpeg
ln -s /usr/include/libavcodec/avcodec.h /usr/include/ffmpeg/avcodec.h
ln -s /usr/include/libavformat/avformat.h /usr/include/ffmpeg/avformat.h
ln -s /usr/include/libavformat/avio.h /usr/include/ffmpeg/avio.h
ln -s /usr/include/libavutil/avutil.h /usr/include/ffmpeg/avutil.h

Configure OpenCV. In the folder you’ve unpacked it to run:
./configure --prefix=/usr/local/opencv --enable-apps --enable-shared --enable-swscale --enable-gpl --with-swig
sudo ln -s /usr/include/libswscale/swscale.h /usr/include/ffmpeg/swscale.h

Make and install itmake
sudo make install
You could also test it by running make test

Configure your system to look for opencv libraries

echo /usr/local/opencv/lib > /etc/ld.so.conf.d/opencv.conf
Reload the libraries and make sure opencv shows up now
ldconfig -v grep opencv
You may get warnings on unaccessible lib paths, that is ok.
You are looking for a line that says
“/usr/local/opencv/lib”

Set-up pkg-config

echo 'export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv/lib/pkgconfig' >> /etc/bash.bashrc
echo 'export PYTHONPATH=/usr/local/opencv/lib/python2.6/site-packages/opencv' >> /etc/bash.bashrc

Restart your terminal to get the new paths
Test by building samplescd

~/Programs/OpenCV-2.0.0/samples/c. build_all.sh

You’re done.

In Ubuntu 9.10, Android Build error: No module defined for the given PRODUCT_POLICY

Build error message:frameworks/policies/base/PolicyConfig.mk:22: *** No module defined for the given PRODUCT_POLICY (android.policy_phone).

Soultion: modify codes at line 89 in build/tools/findleaves.sh

#find "${@:0:$nargs}" $findargs -type f -name "$filename" -print |
find "${@:1:$nargs-1}" $findargs -type f -name "$filename" -print |

轉貼文

在 Ubuntu 9.10下 build android

在 Ubuntu 9.10下 build android原本android預設的編譯環境是在 Ubuntu 8.04中...基本上...用到了Ubuntu 9.04應該都沒啥問題...
但當升級到了9.10之後就會發現...一直build failed...原因是因為裡面的gcc和g++的問題...(9.04是用4.3, 而9.10用的是 4.4)GCC在4.4時把部份string相關的function回傳值的type改變了...char*改成了const char*...也因此讓一堆原本不是針對最新的gcc來寫的code都無法編譯成功
解決方案有兩個...一個是修改source code....但是對於code的來源是google的android可能有困難...
另一個是用舊的gcc....
首先apt-get install gcc-4.3 g++-4.3
然後刪掉原本的連結
sudo rm /usr/bin/gcc
sudo rm /usr/bin/g++
在加到剛剛裝的
sudo ln -s /usr/bin/gcc-4.3 /usr/bin/gcc
sudo ln -s /usr/bin/g++-4.3 /usr/bin/g++
大功告成!
轉貼文章