金笑雪 張琳琳 高丹 張黎
摘 要: 近年來,圖像識別技術正在向更加直觀、可靠的方向發展,其中人臉識別技術具有極高的研究價值,應用得也最為廣泛。通過對Linux系統下OpenCV的研究,利用OpenCv Python3.4設計出一個圖像識別系統,實現了圖像處理,人臉檢測的功能。該系統可以作為后續對人像分析、人像理解和人臉特征識別研究的基礎。
關鍵詞: 計算機視覺; Linux; 圖像識別; OpenCV; 人臉識別算法; 研究價值
中圖分類號:TP391.4 文獻標志碼:A 文章編號:1006-8228(2018)07-64-03
Abstract: In recent years, image recognition technologies are developing to a more intuitive and reliable direction, among them the face recognition technology has a high research value and is used most widely. Through the research on Linux OpenCV, an image recognition system is designed by using OpenCv Python3.4, and the functions of image processing and face detection are realized. The system can be used as the basis for subsequent research on portrait analysis, portrait understanding and face feature recognition.
Key words: computer vision; Linux; image recognition; OpenCV; face recognition algorithm; research value
0 引言
計算機視覺技術日臻成熟,現已成為教育、醫療、軍事等人工智能領域中不可或缺的一部分,其與圖像處理、模式識別等多種學科的研究有十分緊密的聯系。計算機視覺技術是一種可實現人機交互的智能化工具,包括了圖像采集技術、識別技術、處理技術、恢復技術等[2]。通過這些技術實現對目標進行提取、分類、識別、追蹤、統計決策的功能[3]。它還能夠描述多種空間形式、建立幾何模型、實現圖像理解[4]。圖像是一種可視化的信息,圖像信號是圖像信息的理論描述方法[5],在這個信息需求日益增長的時代,通過識別圖像的方式可以更加直觀、高效的解決問題。本文提到的人臉識別過程是利用代碼調用攝像頭進行拍照,即人臉圖像采集,而后進行圖像預處理、圖像特征提取以及匹配與識別,從而達到人臉識別的目的,在圖像識別方面具有重要的實用價值與研究意義。
1 認識Linux系統
Linux操作系統誕生于1991年,是一種由類UNIX操作系統逐步發展而來的一種克隆系統,Linux提供了一個完整的操作系統當中最底層的硬件控制與資源管理的完整架構[6],這種架構使它的性能更穩定。它能運行主要的UNIX工具軟件、應用程序和網絡協議。Linux是Open Source的操作系統,所以它的程序代碼可以被修改后移植到各種機器上運行,因此,Linux以它的高效性和靈活性而被廣大用戶所喜愛,可滿足多位用戶完成多種任務的需求。
2 走進OpenCV
2.1 OpenCV簡介
OpenCV是一個基于開源發行的跨平臺計算機視覺庫,可以在多種常見的操作系統上運行[7],該庫包含大量的C/C++、Python、Ruby、Java和MATLAB/OCTAVE接口[8],靈活且高效。OpenCV的結構包含以下幾個模塊:
它的應用領域也十分廣泛,包括產品檢測,醫學成像,圖像分區,軌跡跟蹤,機器人等等,而本文所應用的就是它的圖像識別功能,OpenCv擁有大量的函數可以應用在圖像識別功能方面。
2.2 基于OpenCV人臉識別的三種算法
2.2.1 Eigenfaces createEigenFaceRecognizer()
特征臉(Eigenfaces)算法指視覺中進行人臉識別時使用的特征向量,它是基于PCA用于一般性剛體識別以及人臉識別的描述技術[9],其識別的過程就是將人臉圖像進行編碼,把人臉從像素空間映射到低維子空間上,在另一個空間中計算兩幅人臉圖像之間的距離,從而成功實現人臉識別。
2.2.2 Fisherfaces createFisherFaceRecognizer()
Fisherface基于線性判別分析[10],它與上文所說的PCA類似,這兩種方法都是將數據降至低維度空間處理的方法,具體操作是在Fisher判別準則函數取得極值的條件下,求得一個最佳判別方向,然后再將模式高維特征向量投影到該最佳判別方向上,構成一個一維的判別特征空間,人臉識別就可以在這個一維的空間中進行。
2.2.3 Local Binary Patterns Histograms createLBPHFaceRecognizer()
LBP(local binary pattern)是局部二值模式,它是一種具有灰度不變性和旋轉不變性并且用來描述圖像局部特征的算子。該算子將人臉分成幾個子圖像然后進行LBP變換,求出每個區域的LBP直方圖,并將這N個直方圖拼接成一個新的直方圖來表示人臉的特征[11]。但是,這種方法易受到噪聲的影響,如果用局部3×3的矩形進行變換,點噪聲的問題就變得不明顯,不會影響檢測的性能。最后求取每個矩形內的圖像像素和作為矩形的特征值,將每個矩形的特征值與中心矩形的特征值進行比較,重新進行LBP編碼,并將LBP編碼作為該局部區域的特征值,再利用分類器便可以進行人臉檢測。
3 Linux下OpenCV的識別應用
3.1 在Linux系統下搭建OpenCv環境
⑴ 使用apt-get更新樹莓派系統及軟件包
sudo apt-get update
sudo apt-get upgrade
⑵ 利用apt-get獲取安裝OpenCv的工具——CMake
sudo apt-get install build-essential cmake pkg-config
使用apt-get獲取OpenCv需要的庫文件和依賴關系。
sudo apt-get install libjpeg-dev libtiff5-dev
libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev
libswcale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libgtk2.0-dev
sudo apt-get install libatlas-base-dev gfortran
下載OpenCv源代碼并且使用CMake編譯,使用wget在opencv官網下載源碼。創建Python虛擬環境,命名為cv,在cv下使用cmake編譯opencv并安裝,然后將安裝好的opencv庫聯接到cv虛擬環境中。具體流程如下:
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D OPENCV_EXTRA_MODULES_PATH=~/opencv_
contrib/modules \
-D BUILD_EXAMPLES=ON ..
make j4
sudo make install
sudo ldconfig
3.2 通過Python利用OpenCv實現人臉識別
人臉識別首先通過攝像頭拍攝捕獲圖片,并存儲圖片、定義路徑,然后對圖像進行灰度處理從而提高運算速率,程序框圖如圖2所示。
參考代碼:
from picamera import PiCamera
import cv2
from time import sleep
# 在python庫中導入所需的模塊
camera=PiCamera()
# 獲取PiCamera對象camera
while(1):
sleep(1)
# 程序暫停1秒,即每隔一秒獲取一次人數
camera.capture('cam.jpg')
# 攝像頭捕獲當前圖像,存為cam.jpg
imagepath='/home/pi/cam.jpg'
# 定義圖片路徑為imagepath
face_cascade=cv2.CascadeClassifier(r'/home/pi/Downloads/opencv-master/data/haarcascades/haarcascade_frontalface_default.xml')
# 定義人臉識別Haar特征分類器所在路徑
image=cv2.imread(imagepath,)
# 根據路徑讀取該圖片為image
gray=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
# 將圖片進行灰度轉換
faces=face_cascade.detectMultiScale(gray,1.15,5)
# 檢測識別圖中人臉
for(x,y,w,h) in faces:
cv2.circle(image,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('Find Faces!',image)
cv2.waitKey(0)
# 上述注釋為實現人臉的代碼
4 結束語
本文基于Linux下OpenCV的人臉識別模塊,運用了許多加載顯示及處理識別等多種函數,實現了圖像處理和人臉檢測的功能。OpenCV注重速度和商業化,代碼優化,精度高,具有實時性等諸多優點,可以解決多種領域問題。
用計算機模擬人的視覺功能,從圖像中提取信息,對圖像的處理更加直觀化。它的發展前景十分廣闊,可以作為后續對人像分析、人像理解和人臉特征識別研究的基礎。這項技術不僅促進了視覺研究的發展,更使計算機視覺技術開創了全新的紀元。
參考文獻(References):
[1] 趙榮剛,賀慶民.計算機人臉識別技術的應用[J].電子技術與軟件工程,2018.4:137
[2] 朱興統,習洋洋.基于C++和OpenCV的人臉識別系統的設計與實現[J].自動化與儀器儀表,2014.8:127-128,131
[3] 謝飛.基于計算機視覺的自動光學檢測關鍵技術與應用研究[D].南京大學碩士學位,2013.
[4] 王泉枝.基于計算機視覺技術的圖像識別與復原[D].天津大學碩士學位論文,2011.
[5] 賈小軍,喻擎蒼.基于開源計算機視覺庫OpenCV的圖像處理[J].計算機應用與軟件,2008.4:276-278
[6] 高瑩,孫雋嬋,焦傳陽,任利峰.Linux操作系統的開發和應用探索[J].產業與科技論壇,2018.17(1):48-89
[7] 秋月.基于OpenCV的人臉識別系統的設計與實現[D].吉林大學碩士學位論文,2015.
[8] 王慧琴.基于OpenCV的人臉識別的研究[J].長治學院報,2016,33(05):42-44.
[9] 趙力莊,高文,陳熙霖.Eigenface的變維分類方法及其在表情識別中的應用[J].計算機學報,1999.6:627-632
[10] 陳高曙,曾慶寧.Eigenface和Fisherface用于人臉識別的性能比較[J].中國科技信息,2006.9:199-201
[11] 何云,吳懷宇,鐘銳.基于多種LBP特征集成學習的人臉識別[J].計算機應用研究,2018.35(1):292-295