李瑤++羅福強(qiáng)++范展源
摘要:隨著大數(shù)據(jù)時(shí)代的來(lái)臨,傳統(tǒng)的單機(jī)圖像處理遭遇瓶頸。為了適應(yīng)圖像處理數(shù)據(jù)量大、復(fù)雜度高等特點(diǎn),集群化處理是一個(gè)較好的解決方案。該文主要介紹基于Hadoop+OpenCV的集群化圖像處理平臺(tái)的搭建,描述如何將Hadoop與OpenCV結(jié)合進(jìn)行圖像處理,編寫測(cè)試程序驗(yàn)證平臺(tái)的可用性。實(shí)驗(yàn)結(jié)果表明此平臺(tái)能實(shí)現(xiàn)集群化的圖像處理。
關(guān)鍵詞:Hadoop;OpenCV;集群化;圖像處理;環(huán)境搭建
中圖分類號(hào):TP18 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1009-3044(2016)01-0203-03
Research on the Construction and Testing of the Cluster Image Processing Development Environment for Hadoop+OpenCV
LI Yao, LUO Fu-qiang, FAN Zhan-yuan
(Jincheng College of Sichuan University, Chengdu 611731, China)
Abstract: With the advent of the era of big data, the traditional stand-alone image processing encountered bottlenecks. To accommodate the image processing of a large amount of data , high complexity and other characteristics, the clustering process is a better solution. This paper mainly introduces the construction of the cluster image processing platform based on Hadoop+OpenCV, describes how to combine Hadoop and OpenCV to image processing, and writes test program to verify the usability of the platform. The experimental results show that this platform can realize clustering image processing.
Key words: Hadoop; OpenCV; clustering; image processing; environment construction
隨著科技的發(fā)展,各個(gè)領(lǐng)域?qū)D像處理要求越來(lái)越高,算法也越來(lái)越復(fù)雜,處理時(shí)間也會(huì)延長(zhǎng)。在大數(shù)據(jù)時(shí)代,圖片數(shù)量不可計(jì)數(shù),想在較短時(shí)間內(nèi)處理完相應(yīng)數(shù)量的圖片則需要使用大數(shù)據(jù)技術(shù)。本文則利用Hadoop與OpenCV搭建集群化的圖像處理平臺(tái),使圖像的處理速度得到大幅度的提升。
1 相關(guān)技術(shù)
本文結(jié)合OpenCV與Hadoop在Linux系統(tǒng)下進(jìn)行集群化圖像處理平臺(tái)的建設(shè)與測(cè)試研究。
1.1 OpenCV
OpenCV[1]是一種基于BSD許可證授權(quán)(開源)發(fā)行的跨平臺(tái)計(jì)算機(jī)視覺庫(kù),它由一系列C函數(shù)和C++類構(gòu)成,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺方面的很多通用算法。
作為開源軟件,OpenCV的優(yōu)勢(shì)就在于它有400多個(gè)免費(fèi)的圖像處理函數(shù),而且涉及面很廣,覆蓋了機(jī)器視覺的大多應(yīng)用領(lǐng)域。它的許多算法,也做了很好的優(yōu)化,對(duì)其執(zhí)行速度帶來(lái)了可觀的提升。
1.2 Hadoop
Hadoop是一個(gè)由Apache基金會(huì)所開發(fā)的分布式系統(tǒng)基礎(chǔ)架構(gòu)。用戶可以在不了解分布式底層細(xì)節(jié)的情況下,充分利用集群進(jìn)行高速運(yùn)算和存儲(chǔ),開發(fā)分布式程序。
Hadoop框架[2]最核心的設(shè)計(jì)就是:HDFS和MapReduce。HDFS提供存儲(chǔ),MapReduce提供計(jì)算。
Hadoop設(shè)計(jì)之初的目標(biāo)就定位于高可靠性、高可拓展性和高效性,正是這些設(shè)計(jì)上的優(yōu)點(diǎn),使得Hadoop一出現(xiàn)就受到眾多大公司的青睞,同時(shí)也引起了研究界的普遍關(guān)注。
2 集群化圖像處理的必要性
圖像處理[3]經(jīng)過(guò)幾十年的發(fā)展,雖然有很多研究人員都在不停地提高圖像處理算法的效率,但針對(duì)當(dāng)代圖像處理數(shù)據(jù)量大、復(fù)雜度高等特點(diǎn),傳統(tǒng)的單機(jī)處理已達(dá)到瓶頸,特別是在Web和搜索引擎的應(yīng)用上猶為明顯。那如何在提高性能的同時(shí),減少時(shí)間成本和功耗?并行化圖像處理[4]則是答案。
海量的圖像都存儲(chǔ)在分布式文件系統(tǒng)中,通過(guò)分布式的資源進(jìn)行并行處理[5],同傳統(tǒng)的單機(jī)環(huán)境下相比,能大大提高處理效率。Hadoop是一個(gè)非常流行的存儲(chǔ)、處理海量數(shù)據(jù)的平臺(tái)。將Hadoop與OpenCV結(jié)合起來(lái),組成一個(gè)集群化的并行圖像處理環(huán)境,在時(shí)間性能上能夠獲得非常大的提升。
3 環(huán)境搭建
本集群環(huán)境由4個(gè)節(jié)點(diǎn)組成,其中1個(gè)主節(jié)點(diǎn)、3個(gè)從節(jié)點(diǎn)。4個(gè)節(jié)點(diǎn)均要安裝OpenCV,Hadoop集成環(huán)境。
3.1 Linux操作系統(tǒng)
Linux操作系統(tǒng)為Ubuntu14.04 LTS。
3.2 JDK安裝配置
JDK為jdk1.8。
3.3 OpenCV安裝配置
1)準(zhǔn)備工作。
更新環(huán)境:sudo apt-get update
sudo apt-get upgrade
搭建C/C++編譯環(huán)境:sudo apt-get install build-essential
安裝關(guān)聯(lián)庫(kù):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)解壓到指定路徑,進(jìn)入opencv3文件夾。
4)新建build文件夾,存放opencv的編譯文件。
5)配置opencv文件。在build目錄下執(zhí)行以下命令。
cmake –D CMAKE_BUILD_TYPE=Release –D CMAKE_INSTALL_PREFIX=/usr/local ..
6)編譯。
make
7)安裝opencv庫(kù)到系統(tǒng)。
sudo make install
安裝過(guò)程中未出現(xiàn)錯(cuò)誤,并在/usr/local/share/OpenCV目錄下出現(xiàn)java目錄則表示opencv安裝成功。
3.4 Hadoop安裝配置
1)準(zhǔn)備工作
設(shè)置網(wǎng)卡,修改IP解析文件,安裝配置ssh服務(wù)。
2)下載hadoop2.7.1壓縮包。
3)解壓到指定路徑。
4)配置Hadoop環(huán)境變量。
5)創(chuàng)建用于存放命名空間以及數(shù)據(jù)信息的文件夾。
6)在主節(jié)點(diǎn)配置Hadoop。
7)將主節(jié)點(diǎn)配置完成的hadoop傳送到各從節(jié)點(diǎn)。
8)在主節(jié)點(diǎn)格式化文件系統(tǒng)。
9)啟動(dòng)hadoop集群
3.5 eclipse安裝配置
安裝的eclipse為Mars.1版本。
3.6 eclipse配置Hadoop開發(fā)環(huán)境
1)下載插件。
2)將插件放到eclipse/plugins目錄下。
3)重啟eclipse,打開Windows->Preferences,配置Hadoop安裝路徑。
4)配置Map/Reduce Locations
打開Windows->Open Perspective->Other,選擇Map/Reduce->OK。出現(xiàn)Map/Reduce Locations選項(xiàng)卡,點(diǎn)擊右邊小象圖標(biāo),打開Hadoop Location配置窗口。其中,Location name為用戶自定義的名字,Map/Reduce Master中的Host和Port對(duì)應(yīng)是master和9000。DFS Master對(duì)應(yīng)是master和9000。點(diǎn)擊完成后,若左側(cè)的Project Explorer出現(xiàn)如圖1所示內(nèi)容,表明配置成功。
圖1 配置成功示例
若HDFS中沒有內(nèi)容,則上圖中hadoop下的文件夾為空。
4 集群化處理與測(cè)試
4.1 MapReduce與OpenCV的結(jié)合
OpenCV關(guān)注圖像處理,MapReduce關(guān)注分布式處理,將兩者結(jié)合便是分布式圖像處理。
MapReduce的分布式處理分為map和reduce方法。
在map方法中,可以對(duì)圖片進(jìn)行預(yù)處理、灰度、邊緣檢測(cè)、特征值提取等一系列操作。每個(gè)map可以是一張圖片,在大型的集群上運(yùn)行時(shí),可以同時(shí)處理多張圖片,從而提高處理速度。
在reduce方法中,可以對(duì)map的輸出進(jìn)行處理,例如特征值匯總、比對(duì)、識(shí)別,從而實(shí)現(xiàn)預(yù)處理、特征值提取、圖像識(shí)別的并行處理。
4.2 測(cè)試程序
1)創(chuàng)建程序
創(chuàng)建一個(gè)Map/Reduce Project,名為Test。
2)配置OpenCV路徑
右鍵單擊項(xiàng)目名稱,選擇Properties->Java Build Path->Add Library。
選擇User Library->Next。選擇User Libraries->New,創(chuàng)建一個(gè)新的庫(kù),命名為opencv3.0。點(diǎn)擊Add External JARs,選擇opencv-300.jar。
選擇Native library location,點(diǎn)擊Edit進(jìn)行編輯,選擇本地庫(kù)目錄:/usr/local/share/OpenCV/java。最后點(diǎn)擊OK,配置完成。
3)編寫Map類
創(chuàng)建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類實(shí)現(xiàn)讀取已轉(zhuǎn)換為SequenceFile類型的圖片文件,調(diào)用OpenCV類實(shí)現(xiàn)圖像顯示,其中img2Mat方法實(shí)現(xiàn)將BufferedImage類型轉(zhuǎn)換為Mat矩陣。
4)編寫Reduce類
創(chuàng)建MyReduce.java。
public void reduce(Text key,Iterable
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類主要實(shí)現(xiàn)將數(shù)據(jù)流轉(zhuǎn)換成圖片保存到本地,并輸出。
5)編寫主函數(shù)類
創(chuàng)建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);
}}
主函數(shù)實(shí)現(xiàn)Map、Reduce程序的調(diào)用。
將Test項(xiàng)目打包成Test.jar(打包時(shí)選擇Runnable JAR file,否則運(yùn)行時(shí)會(huì)找不到路徑),保存到主目錄下,并在命令行中執(zhí)行以下命令運(yùn)行:
hadoop jar Test.jar MyTest
運(yùn)行結(jié)果如圖2所示。
圖2 運(yùn)行效果圖
本示例主要實(shí)現(xiàn)對(duì)二進(jìn)制圖片文件的讀取,轉(zhuǎn)換,顯示,存儲(chǔ)。通過(guò)這幾個(gè)步驟的實(shí)現(xiàn)表明,本環(huán)境能實(shí)現(xiàn)在hadoop平臺(tái)上使用opencv進(jìn)行圖像的處理。
5 結(jié)束語(yǔ)
為了提高圖像處理的速度,算法精度的提高是必不可少的,但集群化處理,對(duì)于大量的圖片來(lái)說(shuō)也是必需的。本文介紹了集群化圖像處理平臺(tái)環(huán)境的搭建,經(jīng)過(guò)編碼測(cè)試,在此大數(shù)據(jù)平臺(tái)上可以實(shí)現(xiàn)opencv類的調(diào)用進(jìn)行圖像處理。本文為集群化圖像處理的實(shí)現(xiàn)提供了平臺(tái)搭建的基礎(chǔ),具有參考價(jià)值。
參考文獻(xiàn):
[1] 張林,吳振強(qiáng).基于OpenCV的圖像特征智能識(shí)別系統(tǒng)設(shè)計(jì)[J].電子設(shè)計(jì)工程, 2015, 23(20): 189-192.
[2] 霍樹民.基于Hadoop的海量影像數(shù)據(jù)管理關(guān)鍵技術(shù)研究[D].長(zhǎng)沙: 國(guó)防科學(xué)技術(shù)大學(xué), 2010.
[3] 英英.基于MATLAB的圖形圖像處理系統(tǒng)的實(shí)現(xiàn)[D].呼和浩特: 內(nèi)蒙古大學(xué), 2013.
[4] 寇福東.基于多核DSP的數(shù)字圖像處理并行化方法研究[D].北京: 北京理工大學(xué), 2015.
[5] 張良將,宦飛,王楊德. Hadoop云平臺(tái)下的并行化圖像處理實(shí)現(xiàn)[J]. 通信技術(shù), 2012(10): 59-62.