基於Android的MJPEG網絡攝像機設計

2020-12-08 電子產品世界

  1 系統硬體組成與網絡架構

本文引用地址:http://www.eepw.com.cn/article/263938.htm

  攝像機硬體核心採用三星公司推出的基於ARM9架構的S3C2440A晶片,該處理器主頻達到400 MHz可以滿足實時壓縮,MJPEG視頻流可以達到320×240解析度25 fps的性能要求。外圍搭配64 MB SDRAM、256 MB NAND Flash,網絡功能由DM9000乙太網MAC控制晶片負責,攝



  圖1 S3C2440A系統硬體框圖

  像頭模塊由USB控制器控制,系統供電由3片LM71117組成,分別輸出3.3 V、1.8 V、1.25 V電壓,輔助外圍接口構成攝像機硬體結構。S3C2440A系統硬體框圖如圖1所示。

  網絡攝像機是網際網路上的TCP/IP設備,系統網絡拓撲圖如圖2所示。其中在家庭區域內根據安防的特點在大門走廊、客廳內、陽臺區域分別布置攝像機,再由網線連接到路由器,配置路由器參數映射每個攝像機獨立埠與IP位址,即完成Internet接入。遠端由固定位置的PC機,移動位置的3G筆記本和隨身攜帶的3G Android手機組成,PC機可以通過WEB瀏覽器訪問與控制網絡攝像機,Android手機通過客戶端實現實時訪問。



  圖2 系統網絡拓撲圖

  2 系統軟體設計

  2.1 網絡攝像機軟體設計

  搭建攝像機需要Linux系統環境,首先移植Bootloader,對Linux 2.6.32內核進行裁剪,加載Linux UVC(USB video device class)驅動及相關驅動,將編譯好的Linux系統鏡像燒寫到ARM板Nand Flash中,對Bootloader設置啟動引導地址,即完成軟體運行環境搭建[2]。

  分析網絡攝像機性能需求與拓展性,須滿足下列條件:

  ◆ 視頻監控實時性;

  ◆ 支持多客戶端同時連接;

  ◆ 圖像識別算法或預留接口;

  ◆ 功能模塊化滿足後期開發可擴展。

  因此,採用多線程架構與互斥鎖機制來保證實時性、模塊化的思想設計代碼結構。軟體程序主流程如圖3所示。



  圖3 軟體程序主流程

  其中主要實現如下功能。

  ① 初始化Linux V4L2接口,必須按照V4L2標準結構初始化結構體,其中包括struct v4l2_capability cap;struct v4l2_format fmt;struct v4l2_buffer buf;struct v4l2_requestbuffers rb; struct v4l2_streamparm setfps。此外將視頻設備名、視頻寬度、視頻高度、幀率、視頻格式和抓取方法傳遞給函數init_videoIn(struct vdIn *vd, char *device, int width, int height, int fps, int format, int grabmethod)實現初始化。值得注意的是眾多USB camera並不支持JPEG格式視頻流直接抓取,針對YUYV格式抓取卻有廣泛支持。後期進行圖像識別算法操作時直接分析YUYV原始圖像數據,將節省JPEG壓縮數據轉換為原始圖像數據的大量運算開銷,因此採用YUYV抓取模式。

  ② 創建核心圖像處理線程。在該線程內實現:抓取功能。

  ◆ UVC設備單幀抓取,uvcGrab(struct vdIn *vd)函數實現單幀YUYV格式的原始圖像拷貝到內存,採用高效的mmap內存映射方法讀取;

  ◆ JPEG核心算法實現,JPEG壓縮算法佔用大量CPU時間,下一小節將詳細討論。

  ③ 創建套接字接口。為實現多用戶同時連接網絡攝像機,必須採用socket服務線程,每當有新用戶連接同時產生一個新線程與之對應,實現多用戶端同步監控。

  ④ 搭建基於Web瀏覽器訪問方式的web主頁。嵌入式設備資源有限,輕量級的Web Server主要有:Boa、Httpd、Thttpd等。本設計選用開源的Boa、交叉編譯Boa源碼配置boa.conf文件,配置系統etc自啟動shell加入Boa程序,將編寫HTML頁面文件放入系統中對應的www目錄後即可正常工作。

  2.2 MJPEG壓縮算法研究與實現

  MJPEG(Motion Joint Photographic Experts Group)視頻編碼格式,把運動的視頻序列作為連續的靜止圖像來處理,這種壓縮方式單獨完整地壓縮每一幀,編輯過程中可隨機存儲每一幀,可進行精確到幀的編輯。

  MJPEG單幀壓縮算法為JPEG(Joint Photographic Experts Group)。

  人眼視覺生理特性決定眼睛對構成圖像的不同頻率成分具有不同的敏感度。JPEG壓縮是有損壓縮[3],但損失的部分是人類視覺不容易察覺到的部分,利用眼睛對色彩域中的高頻信息部分不敏感的特點,節省大量需要處理的數據信息。一幀原始圖像數據對其進行JPEG算法編碼過程分兩大部分:

  ① 空間冗餘度,去除視覺上的多餘信息;

  ② 結構(靜態)冗餘度,去除數據本身的多餘信息。

  JPEG編碼中主要涉及包括:DCT、zigzag編碼、量化、RLE編碼、範式Huffman編碼、DC(直流分量)的編碼。JPEG編碼流程如圖4所示。



  圖4 JPEG編碼流程

  DCT(Discrete Cosine Transform)變換,又稱離散餘弦變換是可逆的、離散的正交變換。它將原始圖像色彩空間域轉換為頻譜域。由於相鄰兩點像素色彩很多是接近的,壓縮這些不需要的數據必須利用圖像信號的頻譜特性。JPEG壓縮原理的理論依據是圖像信號頻譜線大都分布在0~6 MHz範圍內,而且一幅圖像內大多數為低頻頻譜線,而高頻的譜線只佔圖像比例很低的圖像邊緣或者細微紋理細節的信號時才出現。根據這一特性,在做數字圖像處理時對包含信息量大的低頻譜區域分配較多的比特數,相反的對於包含信息量低的高頻譜區域分配較少的比特數,達到圖像壓縮的目的,而圖像質量並沒有肉眼可察覺的降低。除了DCT變換,常用的變化算法還有:WalshHadamard沃爾什哈達瑪變換、哈爾變換、傅氏變換等。

  DCT變換公式為:



  時C(u)=1,C(v)=1。f(i,j)經過DCT變換之後,F(0,0)是直流係數,其他參數時為交流係數。經過DCT變換後一幅圖像的DCT係數塊集中在8×8矩陣的左上方,這裡直流DC係數幅度最大,這一矩陣區域集中了圖像的大部分低頻頻譜分量,離矩陣左上角越遠的高頻頻譜幾乎不含圖像信息。變換過程本身雖然並不產生壓縮作用,但是變換後的頻率係數卻非常有利於碼率壓縮。

  量化是對DCT係數的一個優化過程,利用了肉眼的高頻不敏感特性對數據進行大幅壓縮。整個過程是簡易的把頻率域的每個成份除以對應的常數,並對結果四捨五入取整,整個流程的目的是減少非零的係數以及增加零值係數數目。量化是有損運算,是圖像質量下降的主要因素。對於人眼對亮度與色差的敏感性不一致,分別使用亮度量化表與色度量化表。對量化後的數據採用zigzag蛇形編碼,這是因為交流分量中含有大量的零值,zigzag編碼可以產生更多連續的零值,對下一步使用行程編碼非常有利。

  行程編碼(Run Length Coding)是一種根據相同數據連續重複多次的情況簡化表示的算法。例如,5555333333999按照行程編碼表示為(5,4)(3,6)(9,3)可以對數據,尤其是大量的零值壓縮數據長度。

  編碼後的數據還須通過Huffman編碼來壓縮,Huffman編碼的最大特點是使出現頻率較高的數字小於8位,而出現頻率低的數字大於8位,這使得數據大幅壓縮。

  到此數據的壓縮過程結束,對壓縮後的數據按照JPEG文件格式要求進行保存,加上文件開始標記Start Of Image = FFD8,文件結束標記End Of Image = FFD9,量化表標記Define Quantization Table = FFDB,霍夫曼編碼表標記Ddfine Huffman Table = FFC4,幀開始標記Start Of Frame = FFC0等標記,再加上圖片識別信息字節標記就最終形成完整的可用於傳輸或存儲的JPEG幀圖像,通過套接字接口不間斷地發送JPEG圖像即形成MJPEG視頻流。

  為提高CPU效率,減少進程間切換產生的開銷,將壓縮算法函數集成到單一線程裡。JPEG核心壓縮編碼函數MCUcode實現如下:

  uint8_t *MCUcode(S_JPEG_ENCODER_STRUCTURE * enc,uint32_t image_format, uint8_t * output_ptr) {

  DCT(enc﹥Y1);//DCT離散餘弦變換函數

  quantization(enc,enc﹥Y1, enc﹥ILqt);//量化函數,亮度量化表量化並按照zigzag排列存儲

  output_ptr = huffman(enc, COMPONENT_Y, output_ptr);//霍夫曼編碼函數

  DCT(enc﹥Y2)……

  DCT(enc﹥Y3)……

  DCT(enc﹥Y4)……

  DCT(enc﹥CB);//DCT離散餘弦變換函數

  quantization(enc,enc﹥CB, enc﹥ICqt);//量化函數,色度量化表量化

  output_ptr=huffman(enc, COMPONENT_CB, output_ptr);//色度霍夫曼編碼函數

  DCT(enc﹥CR)……

  return output_ptr;

  }

  其中Y1、Y2、Y3、Y4對應水平排列的4像素亮度值,CB、CR是水平排列以2像素為1單位像素的色度值。

  3 Android客戶端設計

  Android是Google公司推出的針對行動裝置的作業系統,底層採用Linux內核,應用程式採用類Java語言編寫,並運行於類JVM虛擬機的Dalvik虛擬機之上。該系統具有開放源碼免費授權的優勢,功能完善和成熟,已獲得廠商的廣泛支持和大量市場份額。eclipse IDE開發環境友善,因此選用Android系統作為物聯網攝像機客戶端開發平臺。

  Android程序一般由多個Activity、Intent、Content Provider、Service等程序框架組成[4],其中最基礎的是Activity活動類,該類相當於軟體運行時的一個頁面,在頁面之上可添加各種控制項,如button按鍵、ImageView圖片、Text boxes、Lists列表等。除此以外還負責監聽系統事件,負責啟動其他的Activity類。在多個Activity類之間跳轉就需要用到Intent類,Intent類有兩個重要部分:動作和動作對應的數據。常用的動作有MAIN、VIEW、PICK、EDIT等,動作數據則以URI形式表示。通過Intent類還能傳遞參數,作用類似鏈條串起Activity類,Activity類跳轉圖如圖5所示。



  圖5 Activity類跳轉圖

  解析視頻流須先由網絡獲取數據流,實現的方法代碼如下:

  public static VideoInputStream read(String url) {

  HttpResponse res;

  DefaultHttpClient httpclient=new DefaultHttpClient();//http客戶端

  try {

  resource=httpclient.execute(new HttpGet(URI.create(url)));

  return new VideoInputStream(resource.getEntity().getContent());

  ……

  }}//從響應中獲取消息實體內容

  對已獲取的數據流按照JPEG標準文件頭分段,實現的方法代碼如下:

  public Bitmap readFrame() throws IOException {

  mark(FRAME_MAX_LENGTH);//在數據流中設置標記,調用mark方法

  int headerLength=getStart(this, START_MARKER);//計算文件頭長度

  reset();//reset方法重置數據流指向最後一個標誌位置

  byte[] header=new byte[headerLength];

  readFully(header);

  try {

  ContentLength=countContentLength(header);//計算數據內容長度

  }

  catch (NumberFormatException nfe) {

  ContentLength=getEnd(this, END_MARKER);

  }

  byte[] frameData=new byte[ContentLength];//存取幀字節數據

  skipBytes(headerLength);//跳過文件頭字節

  readFully(frameData);

  return BitmapFactory.decodeStream(new ByteArrayInputStream(frameData));

  }

  需要注意的是,在AndroidManifest.xml文件中需加上語句,表示程序擁有網絡的完整訪問權限。獲取每幀數據後繼承Android SDK中提供的view.SurfaceView類與graphics.Canvas類,將收到的完整幀圖像按隊列順序不間斷地顯示在視窗框架類中,對人眼視覺幀率超過5 fps時即有視頻效果,到25 fps即是電影流暢度。對於定點定位監控,經過測試出於節省帶寬費用考慮設定5 fps即能滿足基本需求,10 fps是較為合理參數。將編譯後應用程式安裝到手機中,Android實時監控截圖如圖6所示。



  圖6 Android實時監控截圖

  結語

  本文描述了網絡攝像機的軟體設計與MJPEG算法原理,結合Android移動技術,開發了整套系統;並實際應用於驗證系統,取得了良好結果。期望在後續工作中涉足圖像識別算法、物體追蹤算法、人體行為偵測算法等圖像領域,使網絡攝像機變得更智能。

linux作業系統文章專題:linux作業系統詳解(linux不再難懂)

相關焦點

  • 基於Android的嵌入式Web伺服器設計
    本文主要論述了基於Android系統環境,在家庭網關中實現嵌入式Web伺服器的設計方法,介紹了i-jetty嵌入式Web伺服器,及其Web應用功能的實現。 在三網融合的大背景下,通過家庭網關實現外部網絡即電視網、電信網、網際網路與家庭內部電話、電視、電腦以及家庭電器設備的通訊,是當前家居智能化、現代化的重要發展趨勢。本文的主要內容是研究基於家庭網關的嵌入式系統,實現簡單實用的Web伺服器功能,為外部網絡提供一個方便快捷地訪問和控制家庭內部資源的平臺。
  • 電力線安防網絡攝像機試用
    F.Home系列電力網絡攝像機用220V電線作為傳輸介質,將高質量的數字視頻通過電線傳送;加上獨特的E27燈泡卡口設計,可安裝於現有的燈具、天花板、牆壁甚至直接擺放在桌上,隨處移動。WD-PLC3002電力網絡攝像機  WD-PLC3002、WD-PLC3001室內級電力網絡攝像機把220V電線作為傳輸介質,將高質量的數字影像透過電線傳送;加上獨特的E27燈泡插頭及底座設計,可安裝於現有的燈具、天花板、牆壁甚至直接擺放在桌上,可以隨處移動。
  • 基於RFID與Android平臺的物品清點系統
    智能家居(Smart Home)是以住宅為平臺,兼備建築、網絡通信、信息家電、設備自動化等功能,集系統、結構、服務、管理為一體的,體現高效、舒適、安全、便利、環保的居住環境[2]。智能家居的核心功能是安防報警與智能控制。當前市場上的智能家居系統主要有基於樓宇對講技術的智能家居系統、基於現場總線技術的家庭自動化系統和基於智慧型手機的智能家居系統三大類[3]。
  • Windows10 中跑 Android(基於 Hyper-V)
    普通電腦的 CPU是 X86 架構,手機 CPU 基本都是 ARM 架構的,但是 Android 是基於 Linux 系統的,同樣是開源的,當然也有 Android 的 X86 架構的適配版。當然還有 FydeOS 這種基於 Chromium OS 類似於 Google Chrome OS 的系統。在Windows 10 中運行虛擬機,同樣能安裝 Android-x86 版。
  • 盤點中國市場4大家庭網絡攝像機品牌
    近期,國內幾家知名企業紛紛推出自己的網絡攝像機,讓家庭用網絡攝像機成為中國網絡和電子行業一大熱點,那麼,這幾家企業推出的產品有什麼不同?客官徹杯茶候著,小編為你一一道來。1、 聯想看家寶聯想推出的家用網絡攝像機,主攻市場為家庭監控和安防類。
  • 慧眼視訊監控攝像機網絡攝像頭,遠程網絡攝像機
    銀行業數字高清視頻監控系統分為前端網點信號採集系統、傳輸系統,各級中心系統的組成部分,整個系統基於無壓縮數字高清視頻監控方案進行架構,前端採用兆維安公司生產的高清數字攝像機,依託銀行專網與上級中心進行聯網監控。整個系統嚴格遵循用戶要求和行業規範,滿足用戶功能需求,提高防範管理效率。
  • 網絡監控攝像機爆點:低照度與寬動態
    在過去幾年中,網絡監控攝像機徹底打破了安防市場的寧靜,逐漸被用戶所接受和認可。同時,網絡監控在2014年繼續引領視頻領域成為新的賣點。這一切的成就都可以歸功基於IP攝像機和成熟的網絡環境。由於全球各大安防製造商激烈的競爭,使得網絡監控市場負擔日益加劇。
  • android啟動頁設計專題及常見問題 - CSDN
    這篇文章主要包括以下兩方面內容 集成騰訊廣告聯盟的SDK 啟動頁加載過程中,後臺初始化數據 我們在設計啟動頁時的常規做法是建立一個Activity來加載開屏圖片或者廣告,作為程序的入口,那麼在這個三到五秒時間內如果進行數據下載,當用戶點擊了跳過按鈕或者計時結束了數據還沒初始化完成,已經進入了主頁面,而主界面剛好需要那些基礎數據該如何?
  • 15個優秀的開源項目,讓你輕鬆應對Android開發
    【公眾號回復「1024」,送你一個特別推送】聲明原創|本文為codeGoogler授權發布,未經允許請勿轉載一、huabanDemo-android
  • 最全網絡攝像機常見故障及解決方法
    網絡編碼模塊將模擬攝像機採集到的模擬視頻信號編碼壓縮成數位訊號,從而可以直接接入網絡交換及路由設備。網絡攝像機內置一個嵌入式晶片,採用嵌入式實時作業系統。網絡攝像機是傳統攝像機與網絡視頻技術相結合的新一代產品。攝像機傳送來的視頻信號數位化後由高效壓縮晶片壓縮,通過網絡總線傳送到Web伺服器。
  • 5G時代 索尼AX700攝像機網絡教學直播神器
    國內疫情逐漸好轉,全球疫情大有蔓延趨勢,大中小學教學還未正常開課,即將面臨高考考生而言,不耽誤學習進度,網絡教學直播成為重中之重,雖說現在一臺智慧型手機就能滿足大部分人的需求。隨著無線通信技術的發展,移動網際網路用戶快速增長,校園課堂直播成為了這一時代的熱點。
  • 想安裝網絡攝像機必看!PoE交換機和攝像機如何連接?
    我們說過,支持POE的設備終端包括無線AP,網絡攝像機等等。那麼終端和交換機中間連接是用的網線。我們就從終端盒交換機是否支持POE,來分4種連接方式。第一,交換機和終端同時支持POE第二,交換機支持POE,終端不支持POE第三,交換機不支持POE,終端支持POE第四,交換機和終端都不支持POE第一種同時支持的情況,最好辦了,poe交換機直接網線連接到支持POE供電的無線AP或者網絡攝像機上面。
  • 採用google地圖的Android系統導航應用設計
    獲取用戶當前位置的步驟如下:  1、在AndroidManifeST.xml 中聲明相應的權限:  < android:name="「android.permission.ACCESS_COARSE_LOCATION」" permission>  2、獲取LocationManager 對象:
  • Android位置服務和Google地圖API初解
    位置服務  Android支持GPS和網絡地圖,通常將各種不同的定位技術稱為LBS。LBS是基於位置的服務(Location Based Service)的簡稱,它是通過電信移動運營商的無線電通信網絡(如GSM網、CDMA網)或外部定位方式(如GPS)獲取移動終端用戶的位置信息(地理坐標,或大地坐標),在地理信息系統(Geographic Information System,GIS)平臺的支持下,為用戶提供相應服務的一種增值業務。
  • 淺議:防爆攝像機的設計需求與防爆標準
    1防爆攝像機設計需求  防爆攝像機顧名思義就是可以防止爆炸。在我國國家標準』GB3836.1-2000爆炸性氣體環境用電氣設備』以及其它』GB3836.2-9』標準裡,有明確定義防爆等級。
  • Moxa適用於惡劣環境的網絡攝像機現已獲得Class 1 Division 2認證
    Moxa隆重推出的槍式高清網絡攝像機VPort36-1MP已獲得Class 1 Division 2認證,驗證了VPort 36-1MP在可燃氣體與蒸汽環境(如隧道,礦山,石油、天然氣開採點等化工應用點)下運行的安全性。
  • 星光級低照度攝像機的研究與應用
    由北京中電興發科技有限公司自主研發的ULLSTM(超微光感知TM)採用國際最先進的圖像傳感器設計技術,不僅體積小、速度快、功耗低,並且具有高靈敏度、高信噪比、高動態範圍等特點,加之以獨有的ISP前端圖像處理技術,進行圖像的精確還原和大幅增強,使攝像機在低照度環境下的視覺表現達到全球領先水平。
  • 百度定位SDK:彌補Android手機基站WI-FI定位缺失
    如今,基於位置信息的移動應用越來越多,從餐飲、購物等本地生活服務,到定向廣告的匹配、移動社交網絡的構建,LBS類應用的開發離不開定位功能。國內大多數的地圖SDK工具,都提供了免費、精準的定位功能,方便開發者以定位功能為基礎,延伸出豐富、交互體驗更佳的移動應用。
  • getty 發布,一個完全基於 java 實現的 aio 框架
    正式提供了異步文件I/O操作,同時提供了與UNIX網絡編程事件驅動I/O對應的AIO。AIO的發布使得實現一套網絡通訊框架變得相對簡單。但如果你不努力,可能也無法理解哦。3、本人對netty比較喜歡,無論是其性能還是編程思想(JBOSS提供的一個java開源網絡框架,可以說是java網絡通訊裡的一哥,極其穩定和強大的性能使得被廣泛使用)4、有了netty為何還要自己造輪子?這裡有兩個原因,其一是本人就喜歡造輪子,這是病,改不了。
  • 2014 非常好用的開源 Android 測試工具
    本文提到的開源 Android 軟體測試工具包括:Android Test Kit, AndroidJUnit4, Appium, calabash-android, Monkey, MonkeyTalk, NativeDriver, Robolectric, RoboSpock, Robotium, UIAutomator, Selendroid。