1. 程式人生 > >Hadoop+OpenCV的叢集化影象處理開發環境建設與測試研究

Hadoop+OpenCV的叢集化影象處理開發環境建設與測試研究

本文轉載自:http://www.xzbu.com/8/view-7240648.htm

隨著科技的發展,各個領域對影象處理要求越來越高,演算法也越來越複雜,處理時間也會延長。在大資料時代,圖片數量不可計數,想在較短時間內處理完相應數量的圖片則需要使用大資料技術。本文則利用Hadoop與OpenCV搭建叢集化的影象處理平臺,使影象的處理速度得到大幅度的提升。 
  1 相關技術 
  本文結合OpenCV與Hadoop在Linux系統下進行叢集化影象處理平臺的建設與測試研究。 
  1.1 OpenCV 
  OpenCV[1]是一種基於BSD許可證授權(開源)發行的跨平臺計算機視覺庫,它由一系列C函式和C++類構成,實現了影象處理和計算機視覺方面的很多通用演算法。 


  作為開源軟體,OpenCV的優勢就在於它有400多個免費的影象處理函式,而且涉及面很廣,覆蓋了機器視覺的大多應用領域。它的許多演算法,也做了很好的優化,對其執行速度帶來了可觀的提升。 
  1.2 Hadoop 
  Hadoop是一個由Apache基金會所開發的分散式系統基礎架構。使用者可以在不瞭解分散式底層細節的情況下,充分利用叢集進行高速運算和儲存,開發分散式程式。 
  Hadoop框架[2]最核心的設計就是:HDFS和MapReduce。HDFS提供儲存,MapReduce提供計算。 
  Hadoop設計之初的目標就定位於高可靠性、高可拓展性和高效性,正是這些設計上的優點,使得Hadoop一出現就受到眾多大公司的青睞,同時也引起了研究界的普遍關注。 

  2 叢集化影象處理的必要性 
  影象處理[3]經過幾十年的發展,雖然有很多研究人員都在不停地提高影象處理演算法的效率,但針對當代影象處理資料量大、複雜度高等特點,傳統的單機處理已達到瓶頸,特別是在Web和搜尋引擎的應用上猶為明顯。那如何在提高效能的同時,減少時間成本和功耗?並行化影象處理[4]則是答案。 
  海量的影象都儲存在分散式檔案系統中,通過分散式的資源進行並行處理[5],同傳統的單機環境下相比,能大大提高處理效率。Hadoop是一個非常流行的儲存、處理海量資料的平臺。將Hadoop與OpenCV結合起來,組成一個叢集化的並行影象處理環境,在時間效能上能夠獲得非常大的提升。 
  3 環境搭建 

  本叢集環境由4個節點組成,其中1個主節點、3個從節點。4個節點均要安裝OpenCV,Hadoop整合環境。 
  3.1 Linux作業系統 
  Linux作業系統為Ubuntu14.04 LTS。 
  3.2 JDK安裝配置 
  JDK為jdk1.8。 
  3.3 OpenCV安裝配置 
  1)準備工作。 
  更新環境:sudo apt-get update 
  sudo apt-get upgrade 
  搭建C/C++編譯環境:sudo apt-get install build-essential   安裝關聯庫:sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev 
  sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev ant 
  2)下載opencv-3.0.0壓縮包。 
  3)解壓到指定路徑,進入opencv3資料夾。 
  4)新建build資料夾,存放opencv的編譯檔案。 
  5)配置opencv檔案。在build目錄下執行以下命令。 
  cmake �CD CMAKE_BUILD_TYPE=Release �CD CMAKE_INSTALL_PREFIX=/usr/local .. 
  6)編譯。 
  make 
  7)安裝opencv庫到系統。 
  sudo make install 
  安裝過程中未出現錯誤,並在/usr/local/share/OpenCV目錄下出現java目錄則表示opencv安裝成功。 
  3.4 Hadoop安裝配置 
  1)準備工作 
  設定網絡卡,修改IP解析檔案,安裝配置ssh服務。 
  2)下載hadoop2.7.1壓縮包。 
  3)解壓到指定路徑。 
  4)配置Hadoop環境變數。 
  5)建立用於存放名稱空間以及資料資訊的資料夾。 
  6)在主節點配置Hadoop。 
  7)將主節點配置完成的hadoop傳送到各從節點。 
  8)在主節點格式化檔案系統。 
  9)啟動hadoop叢集 
  3.5 eclipse安裝配置 
  安裝的eclipse為Mars.1版本。 
  3.6 eclipse配置Hadoop開發環境 
  1)下載外掛。 
  2)將外掛放到eclipse/plugins目錄下。 
  3)重啟eclipse,開啟Windows->Preferences,配置Hadoop安裝路徑。 
  4)配置Map/Reduce Locations 
  開啟Windows->Open Perspective->Other,選擇Map/Reduce->OK。出現Map/Reduce Locations選項卡,點選右邊小象圖示,開啟Hadoop Location配置視窗。其中,Location name為使用者自定義的名字,Map/Reduce Master中的Host和Port對應是master和9000。DFS Master對應是master和9000。點選完成後,若左側的Project Explorer出現如圖1所示內容,表明配置成功。 
 
  圖1 配置成功示例 
  若HDFS中沒有內容,則上圖中hadoop下的資料夾為空。 
  4 叢集化處理與測試 
  4.1 MapReduce與OpenCV的結合 
  OpenCV關注影象處理,MapReduce關注分散式處理,將兩者結合便是分散式影象處理。 
  MapReduce的分散式處理分為map和reduce方法。 
  在map方法中,可以對圖片進行預處理、灰度、邊緣檢測、特徵值提取等一系列操作。每個map可以是一張圖片,在大型的叢集上執行時,可以同時處理多張圖片,從而提高處理速度。 
  在reduce方法中,可以對map的輸出進行處理,例如特徵值彙總、比對、識別,從而實現預處理、特徵值提取、影象識別的並行處理。 
  4.2 測試程式 
  1)建立程式 
  建立一個Map/Reduce Project,名為Test。 
  2)配置OpenCV路徑 
  右鍵單擊專案名稱,選擇Properties->Java Build Path->Add Library。 
  選擇User Library->Next。選擇User Libraries->New,建立一個新的庫,命名為opencv3.0。點選Add External JARs,選擇opencv-300.jar。 
  選擇Native library location,點選Edit進行編輯,選擇本地庫目錄:/usr/local/share/OpenCV/java。最後點選OK,配置完成。 
  3)編寫Map類 
  建立MyMap.java 
  public void map(Text key, BytesWritable value, Context context){ 
  BufferedImage img = ImageIO.read 
  (new ByteArrayInputStream(value.getBytes())); 
  Mat m = img2Mat(img); 
  imgViewer.show(m,"Loaded image"); 
  context.write(key, value); 
  } 
  MyMap類實現讀取已轉換為SequenceFile型別的圖片檔案,呼叫OpenCV類實現影象顯示,其中img2Mat方法實現將BufferedImage型別轉換為Mat矩陣。   4)編寫Reduce類 
  建立MyReduce.java。 
  public void reduce(Text key,Iterable values,Context context){ 
  for(BytesWritable value : values){ 
  FileOutputStream fos = new 
  FileOutputStream("/home/jcxy/2.jpg"); 
  JPEGImageEncoder je = 
  JPEGCodec.createJPEGEncoder(fos); 
  je.encode(img); 
  context.write(key, value); 
  }}} 
  MyReduce類主要實現將資料流轉換成圖片儲存到本地,並輸出。 
  5)編寫主函式類 
  建立MyTest.java。 
  static{System.loadLibrary(Core.NATIVE_LIBRARY_NAME);} 
  public static void main(String[] args) { 
  Job job = new Job(conf," "); 
  job.setMapperClass(MyMap.class); 
  job.setReducerClass(MyReduce.class); 
  job.setInputFormatClass(SequenceFileInputFormat.class); 
  FileInputFormat.addInputPath(job,path); 
  FileOutputFormat.setOutputPath(job, new Path("/result")); 
  System.exit(job.waitForCompletion(true)?0:1); 
  }} 
  主函式實現Map、Reduce程式的呼叫。 
  將Test專案打包成Test.jar(打包時選擇Runnable JAR file,否則執行時會找不到路徑),儲存到主目錄下,並在命令列中執行以下命令執行: 
  hadoop jar Test.jar MyTest 
  執行結果如圖2所示。 
   
  圖2 執行效果圖 
  本示例主要實現對二進位制圖片檔案的讀取,轉換,顯示,儲存。通過這幾個步驟的實現表明,本環境能實現在hadoop平臺上使用opencv進行影象的處理。 
  5 結束語 
  為了提高影象處理的速度,演算法精度的提高是必不可少的,但叢集化處理,對於大量的圖片來說也是必需的。本文介紹了叢集化影象處理平臺環境的搭建,經過編碼測試,在此大資料平臺上可以實現opencv類的呼叫進行影象處理。本文為叢集化影象處理的實現提供了平臺搭建的基礎,具有參考價值。 
  參考文獻: 
  [1] 張林,吳振強.基於OpenCV的影象特徵智慧識別系統設計[J].電子設計工程, 2015, 23(20): 189-192. 
  [2] 霍樹民.基於Hadoop的海量影像資料管理關鍵技術研究[D].長沙: 國防科學技術大學, 2010. 
  [3] 英英.基於MATLAB的圖形影象處理系統的實現[D].呼和浩特: 內蒙古大學, 2013. 
  [4] 寇福東.基於多核DSP的數字影象處理並行化方法研究[D].北京: 北京理工大學, 2015. 
  [5] 張良將,宦飛,王楊德. Hadoop雲平臺下的並行化影象處理實現[J]. 通訊技術, 2012(10): 59-62.