陳鋼 嚴金華

摘要:為了提高課堂教學的質量、激發學生學習的熱情和動力,在光電技術類課程教學中引入智能手機。通過展示、開發一些手機探測器的簡單應用,使學生能更加直觀地感受到光電技術的實用性和重要性。利用手機攝像頭,給出了基于攝像頭的一個簡單計數器,實現光電計數功能。將最新的科技產品引入到教學中,激發學生的學習興趣和動力,促進教師的進步,實現教學相長。
關鍵詞:android智能手機;光電探測器;光電技術;課堂教學
中圖分類號:G642.0 文獻標志碼:A 文章編號:1674-9324(2015)09-0166-02
一、引言
光電技術類課程是光電類專業的必修課,課程的內容涉及面廣,需要光學、半導體物理、電路原理、電磁場理論、電子線路、量子物理等課程為基礎,是一類綜合性強的課程。光電技術中的各種探測器在手機里大都可以找到,這些傳感器在智能手機中發揮著巨大的作用,為我們的生活增添了不少色彩。如果能結合智能手機的功能來介紹探測器的工作原理及應用,將使學生直觀地感受到各種光電探測器。課堂教學中可以直接利用這些探測器開發一些簡單的手機應用,不但有助于理解器件的工作原理,還可以激發學生學習的熱情[1-3]。本文從手機攝像頭出發,分析其基本構造和工作原理,給出了基于攝像頭的一個簡單應用,實現光電計數功能。
二、系統設計
(一)攝像頭的工作原理
在較新的光電技術教材中,都會介紹像探測器,主要是CCD和CMOS,單獨開設這樣的實驗教學比較困難,然而這些探測器在我們身邊隨處可見,如數碼相機、電腦攝像頭、手機攝像頭等時刻伴隨著我們。而手機上的攝像頭還提供了直接開發的可能,可以幫助我們深刻認識CCD、CMOS等像探測器的工作原理及數據處理方式。攝像頭的基本工作原理是景物通過鏡頭(LENS)生成的光學圖像投射到圖像傳感器表面上,然后轉為電信號,經過A/D(模數轉換)轉換后變為數字圖像信號,再送到數字信號處理芯片(DSP)中加工處理,最后通過CPU進行處理后,通過顯示屏(LCD)就可以看到圖像了[4]。
(二)軟件實現
1.開發平臺。智能手機中Android系統的開發最為方便,本文介紹的是Google公司推出的開源平臺Android Studio開發環境,安裝過程可參考官方網站說明或網絡論壇里的安裝教程[5,6]。
2.計數器工作原理。利用手機攝像頭制作光電計數器的基本原理如下,首先通過攝像頭拍攝一副背景圖片,作為光電計數時對比的依據,即測量背景噪音。然后攝像頭開始每秒拍攝多張照片,分析每張照片的總體亮度,并與背景圖片的亮度進行對比。當攝像頭前面沒有遮擋物體時,所拍攝的照片亮度和背景照片亮度相差不大,計數器不計數。當有物體從攝像頭前面運動過時,所拍攝的照片亮度與背景照片亮度相差較大,計數器開始計數。為避免遮擋物體長時間在攝像頭前造成一個物體的重復計數,可以設定一個臨時的背景亮度作為對比的依據。
3.代碼實現。Android應用設計主要分界面設計和后臺處理程序,本應用中的頁面只有一個,處理程序也只有一個,下面簡單介紹一下具體流程。第一步,界面設計。Android Studio中界面的設計采用所見即所得的形式,只需將所要的控件拖到頁面上,然后調整大小和位置即可。在新建的頁面文件里添加一個TextView文本視圖,用來顯示計數,初始值為0。再添加一個SurfaceView用來顯示照片。最后添加三個按鈕,一個測試背景亮度,一個開始計數,一個停止。設計好的頁面如圖1所示。
第二步,后臺程序處理。后臺程序雖然只有一個,但是要處理頁面上多個控件的響應,就要為每一個控件設計一個函數,本應用中設計三個Button函數、TextView函數及SurfaceView函數共四個。
Button1用來測量背景亮度,一般選擇比較亮的背景,處理函數就一句話,camera.setOneShotPreviewCallback(myPreviewCallback),其中camera.setOneShotPreviewCallback()是系統自帶的函數,myPreviewCallback是自定義的處理圖像的方法,其功能是計算預覽圖像中亮度總和,返回數值g1。
public Camera.PreviewCallback myPreviewCallback=new Camera.PreviewCallback(){
@TargetApi(Build.VERSION_CODES.FROYO)
@Override
public void onPreviewFrame(byte[] data,Camera camera) {
mCamera.stopPreview();
int gray=0;
for (int j = 0;j < 相機預覽圖片寬度;j=j++) {
for (int i = 0;i <相機預覽圖片高度;i=i++) {
gray=gray+data[i];
}
}
mCamera.startPreview();
};
Button2啟動計數器工作,代碼為timer.schedule(task,0,1000),這里用定時器timer不斷進行循環,循環時間設定為1000毫秒,可自由設定。task為定時器工作的變量,主要處理定時器時間到了后要處理的事情,這里主要就是計算預覽圖像的總體亮度,其核心代碼和Button1的代碼一樣,返回數值g2。
Button3停止定時器、攝像頭的工作,釋放攝像頭資源。
文本視圖用來顯示計數,通過一定的邏輯判斷是否計數,如g2>2*g1。
SurfaceView的處理函數分兩部分,首先要設定攝像頭參數,然后實現拍照存儲并計算照片總亮度。相機參數的設定主要是像素大小、每秒拍攝數量[7]。界面中SurfaceView控件顯示照相機中的預覽圖片,一般像素大小取相機支持的最小值,這樣數據處理就比較快速,每秒數量可以從1-10根據需要設定。相機初始化函數主要設置預覽圖片顯示到頁面中定義的SurfaceView中。
4.圖像處理。像探測器的工作原理上面已經提到,光學圖像投射到CCD或CMOS圖像傳感器上轉為電信號,經過模數轉換后變為數字圖像信號。在計算圖像亮度時可以有兩種選擇,一種是計算拍攝到的圖片的RGB值,換算為相應的灰度(GRAY)值,這種方法簡單直觀,缺點是運算速度慢。對要實時計數功能來說,要快速響應攝像頭前的運動物體,因此可以采用第二種方法。第二種方法是直接讀取攝像頭經模數轉換后存儲的原始數據,即像素數據存儲的YUV格式,YUV格式經過一定運算可以得到RGB格式,大部分CCD、CMOS的數據處理都采用此類方法。相比RGB格式,YUV格式數據存儲空間要減少一半左右,這樣就可以快速處理。為了適應快速的光電計數功能,我們直接從攝像頭預覽過程截取預覽圖像的YUV數據,然后計算圖像亮度,省去了拍照、存儲、讀取過程,極大的提高了計數響應,普通的智能手機響應速度都可以達到1/15秒。圖2是程序運行后的界面,使用時先測量一個比較亮的背景,然后當攝像頭被擋住時,就開始計數。程序中為了防止攝像頭一直被擋住而不斷計數,可以在邏輯處理上進行一些設計,設置背景亮度為當前亮度,從而有效避免重復計數。
三、結語
針對光電探測器的學習,介紹了一種利用手機探測器來開展理論、實驗教學的新方法,對像探測器CCD、CMOS的工作原理和實際中的數據處理進行了深入的分析,實現了利用手機攝像頭完成光電計數的功能。在當前科技、資訊發達的背景下開展高等教育工作,教師要及時了解科技動態,了解學生的興趣所在,然后適當地將最新科技資訊引入課堂教學。
參考文獻:
[1]王鷹.基于Android應用的移動學習資源設計與開發研究——以“中南大學視頻公開課”為例[J].現代教育技術:2014,(3).
[2]王強,鄭世玨,宋志明.基于Android的交互式學習微閱覽器設計與實現[J].現代教育技術,2012,(9).