摘 要: 通常傳統自動氣象站只能采集常規的氣象數據,如:溫度、濕度、風力等,而無法采集自動氣象站當地的高分辨率圖像信息,通過對奧林巴斯數碼相機進行研究,采用奧林巴斯提供的CAMEDIA SDK 3.3 開發套件,設計了一套基于高分辨數碼相機的自動氣象站圖像采集和傳輸系統。系統通過自動站的高分辨率數碼相機遠程采集圖像,并通過網絡傳輸到數據中心,實現了自動氣象站對當地圖像信息的采集與傳輸。著重介紹分析了數碼相機在系統中的應用,并實現了圖像數據的自動采集功能。關鍵詞:自動氣象站;圖像采集;數碼相機;網絡傳輸
中圖分類號:TN911-33文獻標識碼:A
文章編號:1004-373X(2010)18-0074-03
Application of Digital Camera in Automatic Weather Station
BAO Jun-wei
(Department of Electronics and Information Engineering, Jiangyin Polytechnic College, Jiangyin 214405, China)
Abstract: Since the traditional automatic weather station usually only can acquisite some conventional meteorological data (for example: temperature, humidity, wind-force, etc), but can not capture the high-resolution image information of the automatic weather station, an image acquisition and transmission system based on high-resolution digital camera for automatic weather-station is designed by researching the Olympus digital camera and using CAMEDIA SDK 3.3 developed by Olympus. The acquisition and transmission of the local image information around the automation weather station is achieved by collecting the remote image information through the high-resolution digital camera and transfering it to data center by network. The application of digital camera in the system is analyzed emphatically. The automatic acquisition function of image data was realized. Keywords: automatic weather station; image acquisition; digital camera; network transmission
在氣象觀測中經常需要通過自動氣象站采集當地的天氣、環境等圖像信息供氣象分析使用,而通常傳統自動氣象站只采集溫度、濕度、風速等常規氣象信息,而對于現場空氣質量、能見度等信息的采集卻無能為力。系統設計的自動氣象站除了以上常規氣象數據外,還能夠采集高清晰圖像,并通過網絡傳輸至數據中心,用以分析當地的空氣質量、能見度等氣象情況。
1 自動氣象站圖像采集傳輸系統
自動氣象站圖像采集傳輸系統由戶外自動數據采集站和數據中心構成。自動數據采集站負責多種氣象數據和現場圖像數據的采集,自動站系統采用ARM為核心的主機,通過RS 485總線控制載有高分辨率相機的云臺移動方位[1-2]。高分辨率數碼相機通過USB數據總線與主機相連[3],拍攝的圖像數據可通過TCP/IP網絡或WiFi網絡傳輸至數據中心[4]。數據中心通過網絡通信遠程控制自動站的運行,并定時接收遠程自動站的數據[5-6]。系統總體結構框圖如圖1所示。
圖1 系統總體結構框圖
2 數碼相機在系統中的應用
數碼相機作為一種目前常見的消費類商品,其基本工作原理是利用CCD光耦器件將光信號轉變為電信號,經過A/D轉換、數據壓縮等處理后經串口或USB口在PC端應用程序控制下將圖片(多為JPEG格式)傳送到PC機的硬盤中[7]。目前PC端的應用程序都由相機制造商所提供。很少有人注意到一些數碼相機制造商為開發人員提供相對豐富的SDK(software development kit)資源,便于有關人員利用數碼相機進行圖像采集和監測方面的開發工作。OLYMPUS提供的CAMEDIA SDK 3.3開發套件有兩種,一種是Active-X控件版本;一種是DLL動態鏈接庫文件版本[1]。Active-X控件版本需要系統裝有OLYMPUS提供的RYE控件,該方法在軟件發布時比較麻煩,通常都采用DLL動態鏈接庫文件的方法。本文的例程均采用隱式的加載時鏈接DLL方法實現,因此除了必須的*.dll文件外,還需要DLL的*.h文件和*.lib文件。
2.1 SDK結構圖
CAMEDIA SDK 3.3原理框圖如圖2所示。SDK控制層位于應用程序與指定SDK控制層(對于OLYMPUS-C350相機該層為C350 SDK控制層)之間,它的主要作用是接收應用程序的Connect()指令,同時將指定相機SDK控制層調入內存區;接收DisCon-nect()指令,同時釋放指定相機SDK控制層所占內存區。指定相機SDK層位于SDK控制層下,本層支持所有訪問相機的函數,并將函數執行結果狀態碼(即錯誤代碼)經SDK控制層上傳給應用程序。指定相機控制層的下層為驅動程序層。驅動程序用于與外部設備直接打交道[8]。
2.2 SDK函數分類
SDK內的函數按照作用類型一般可以分為以下幾類:
(1) 相機初始化函數主要包括Connect()和DisConnect()。
(2) 相機控制函數主要包括Capture(),Preview(),SetPropCameraID(),SetCaptureProp(),SetPropOpticalZoom(),SetPropIsoSpeed(),SetPropFocusMode(),SetLcdMode(),SetPropFlash(),SetPropFocusPosition(),SetPropCameraTime()。
(3) 圖片管理函數有SetPropCurrentPicture(),ErasePicture(),EraseLast(),EraseAll()。
(4) 圖片信息獲取函數有GetPropPictCount(),GetPropRemainCount(),GetPictureProp(),GetPicTagProp(),GetPropPicSize ()。
(5) 文件傳遞函數有GetPicture(),UploadPicture()。
(6) 其他類型的函數包括電池電量數據獲取函數、最后一次操作返回碼獲取函數等。
3 SDK用法的一個典型實例
下面舉一個拍攝圖片的簡單實例使讀者大體了解編程的一般模式,其過程如圖3所示。
圖2 CAMEDIA SDK 3.3原理框圖
圖3 拍攝圖形過程
首先是相機初始化即打開相機,然后讀取目前相機中拍攝方面的參數設置,根據需要修改某些參數設置,接著拍攝照片,下載照片,最后關閉相機釋放內存[9]。例程如下:
以下為采用VC++開發的SDK用法的典型例程[1,10]:
(1) 相機初始化
BOOL CVCSampleDlg::OnInit()
{
CStringstrName, strMsg;
long nRes;
m_nCurrentCamera =-1;//當前連接相機序號,-1表示沒有指定當前相機
nRes = m_Rye.InitControl();
m_nNumCameras = m_Rye.GetPropCameraCount(); //連接至系統的所有相機數目系統允許連接多個相機,
//并依次連接。只有一個相機時可以直接連至序號為0的相機
for (c = 0; c < m_nNumCameras; c++) {
strName = m_Rye.GetPropConnectCamera(c);
nRes = m_Rye.Connect(c);
if (nRes != RYE_NO_ERROR) {
strMsg.Format(_T(\"Error 0x%02x connecting to camera no. %d (%s)\"), nRes, c, strName);
AfxMessageBox(strMsg);
return;
}
}
}
(2) 讀取并設定相機的焦距
void CVCSampleDlg::OnSetzoom()
{ //設定相機的焦距
try {// 讀取實際相機焦距
m_nZoom = m_pRye->GetPropOpticalZoom(m_nCurrentCamera);
m_pRye->SetPropOpticalZoom(m_nCurrentCamera, m_nZoom);
m_strZoom.Format(_T(\"Optical Zoom: %d\"), m_nZoom);
}
catch (COleDispatchException *e) {
m_strErr.Format(_T(\"Zoom Error: 0x%02x.\"), e->m_wCode);
AfxMessageBox(m_strErr);
e->Delete();
}
}
(3) 拍攝照片并下載到本地
void CVCSampleDlg::OnCapture()
{
long nFiles[1],nCount;
char strFileName[80]=\"\";//通過當前相機拍攝照片
nRes = pm_Rye->Capture(m_nCurrentCamera);
nRes = pm_Rye->GetPropPicCount(m_nCurrentCamera,nFiles);
nCount = *nFiles;
// 將最后拍攝的照片設成當前照片
nRes = pm_Rye->SetPropCurrentPicture(m_nCurrentCamera,*nFiles);
nRes = pm_Rye->GetPropFileName(m_nCurrentCamera,strFileName);
CStringstrFile;
LPTSTRlpszBuff = strFile.GetBuffer(80);
//獲取文件名
strFile.ReleaseBuffer();
nRes = pm_Rye->GetPropFileName(m_nCurrentCamera,lpszBuff);
m_bCancelXfer[m_nCurrentCamera] = FALSE;
nRes= pm_Rye->SetPropCancel(m_nCurrentCamera, m_bCancelXfer[m_nCurrentCamera]);
//設置照片并下載至本地
LPVOID buff;
CString strRes;
long PicSize[1];
// 獲取照片文件大小,并創建一個數組用來保存照片文件數據
nRes = pm_Rye->GetPropPicSize(m_nCurrentCamera,PicSize);
buff=new char[*PicSize];
nRes = pm_Rye->GetPicture(m_nCurrentCamera,*PicSize,buff);
//創建文件并將照片存為本地文件
CFile file(strFile, CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary);
file.Write(buff, *PicSize);
delete buff;
buff=NULL;
nRes = pm_Rye->ErasePicture(m_nCurrentCamera);
nRes = pm_Rye->GetPropPicCount(m_nCurrentCamera,nFiles);
if (*nFiles != nCount -1)
{
m_strErr.Format(_T(\"Erase Picture Error Faild!\"));
AfxMessageBox(m_strErr);
}
}
(4) 關閉相機
void CVCSampleDlg::OnClose()
{
// 關閉系統連接的所有相機
long c;
for (c = 0; c < m_nNumCameras; c++)
m_Rye.DisConnect(c);
CDialog::OnClose();
}
4 結 語
本文闡述了自動氣象站圖像采集系統的構成和主要功能,著重介紹了奧林巴斯公司的SDK開發工具CAMEDIA SDK 3.3,并對利用它開發相機的應用程序進行了詳細介紹。系統的一些其他功能實現都可以參考現成的資料,因此沒做詳細介紹。奧林巴斯CAMEDIA SDK 3.3中函數及其參數的詳細說明,可以在相機制造商的英文網站上從開發工具一覽中找到。該系統經過運行測試,完全滿足自動氣象站對氣象數據和高分辨率現場圖像數據的要求。
參考文獻
[1]李現勇.Visual C++串口通信技術與工程實踐 [M].2版.北京:人民郵電出版社,2005.
[2]謝瑞.串行技術大全[M].北京:清華大學出版社,2000.
[3]蕭世文.USB2.0硬件設計[M].北京:清華大學出版社,2002.
[4]任泰明.TCP/IP協議與網絡編程[M].西安:西安電子科技大學出版社,2004.
[5]蔣東興.Windows Sockets網絡程序設計大全[M].北京:清華大學出版社,1999.
[6]李昭智.數據通信與計算機網絡[M].3版.北京:電子工業出版社,2002.
[7]張磊.數碼相機[M].上海:上海科學技術出版社,2001.
[8]陳曙,辛陽.利用數碼相機SDK開發圖像采集應用程序[J].電子技術應用,2003(7):21-22.
[9]Olymplls Corporation.Olympus. CAMEDIA SDK 3.3(DLL version)reference manual[M].Japan: Olympus Corporation, 2002.
[10] 郎銳.VISUAL C++網絡通信程序開發指南[M].北京:機械工業出版社,2004.