數據觀世界
人臉識别是計算機視覺領域中的一項核心技術,對于整個人工智能技術的發展也是非常重要,目前已經在多個領域中投入使用,相對較為成熟。很多人認為人臉識别技術高深莫測,難以企及,其實也并非如此神秘,本文将通過opencv和Python/C ,利用簡短的代碼,幫助每一位讀者實現人臉識别。
人臉識别
OpenCV:是一個主要針對實時計算機視覺的編程函數庫。本文旨在使用OpenCV和Python/C 從圖像中檢測面部。
本文基礎:在機器上安裝Python和C ,了解Python和C 的編碼基礎知識,代碼編輯器。有了這些,我們就可以開始進行人臉識别了。
為了通過代碼實現人臉識别,我們将使用OpenCV中基于Haar的cascade分類器,這一種有效的對象檢測方法。它是一種基于機器學習的方法,其中cascade函數是通過許多positive和negative圖像得到訓練,然後用于檢測其他圖像中的對象。 OpenCV已經包含許多面部、眼睛、微笑等預先訓練的分類器。這些XML模型文件存儲在opencv / data / haarcascades /的位置。
讓我們先開始在Python上編寫代碼實現人臉識别然後再展示通過C 實現的教程。
Python首先,導入numpy、OpenCV兩個庫:
import numpy as np
import cv2 as cv
然後,加載OpenCV中自帶的基于Haar的cascade分類器來實現人臉識别。haarcascade_frontalface_default.xml 是OpenCV中已經經過訓練的人臉識别模型文件。
face_cascade = cv.CascadeClassifier('\\cv2\\data\\haarcascade_frontalface_default.xml')
eye_cascade = cv.CascadeClassifier('\\cv2\\data\\haarcascade_eye.xml')
現在,我們需要加載我們想要進行人臉檢測的圖像。對于本文,我們将使用如下OpenCV自帶的'lenna'經典圖像。
lenna
加載我們的圖片,并将其轉化為灰度圖像:
img = cv.imread('lenna.jpg')
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
我們已經做好了人臉檢測的準備工作,現在我們通過我們前面加載的cascade分類器的detectMultiScale函數來進行人臉檢測:
faces = face_cascade.detectMultiScale(gray, 1.3, 5)
這裡的1.3表示scaleFactor,5表示minNeighbours。
scaleFactor:在前後兩次相繼的掃描中,搜索窗口的比例系數。例如1.3指将搜索窗口依次擴大30%。
minNeighbors:構成檢測目标的相鄰矩形的最小個數。如果組成檢測目标的小矩形的個數和小于minNeighbors都會被排除。
代碼運行之後面部檢測就完成了,并且在圖像中找到的所有人臉數據都存儲在faces這個數組中。然後,我們還可以在人臉周圍繪制矩形:
for (x,y,w,h) in faces:
cv.rectangle(img,(x,y),(x w,y h),(255,0,0),2)
roi_gray = gray[y:y h, x:x w]
roi_color = img[y:y h, x:x w]
我們幾乎已經完成了人臉識别,隻需再将得到的帶有人臉标記的圖像顯示出來即可。為此我們使用以下代碼:
cv.imshow('Face_Detect',img)
cv.waitKey(0)
cv.destroyAllWindows()
下圖就是我們得到的最終結果:
Python人臉識别結果
到此,我們已經學會了通過Python實現人臉識别,現在可以嘗試在OpenCV庫中使用不同的分類器來檢測不同的對象。如果你有足夠多的圖片,甚至還可以制作自己的圖片分類器! 接下來我們将展示如何通過C 來實現人臉識别。
C代碼頭文件:
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
using namespace std;
using namespace cv;
objdetect.hpp:OpenCV中的對象檢測模塊。
highgui.hpp提供了簡單的界面操作:
創建和操作可以顯示圖像的窗口
将軌迹欄添加到窗口
從磁盤或内存讀取和寫入映像。
從相機或文件中讀取視頻并将視頻寫入文件。
imgproc.hpp提供了許多處理圖像的功能,如圖像過濾和幾何變換。
現在,我們編寫一個函數,它接受輸入圖像和分類器作為參數,并在應用人臉識别算法後給出輸出圖像。
void detectAndDraw( Mat& img, CascadeClassifier& cascade, double scale)
這是我們的函數定義,我們繼續編寫函數體。首先,我們初始化一個矢量,用于存儲我們的算法将檢測到的所有人臉,并将我們的輸入圖像轉換為灰度圖像。
vector<Rect> faces;
Mat gray;
cvtColor( img, gray, COLOR_BGR2GRAY );
然後在我們的灰度圖像上應用detectMultiScale函數。
cascade.detectMultiScale( gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30) );
這個函數類似于我們在Python中使用的函數。人臉檢測現在已經完成,我們需要在檢測到的人臉周圍繪制矩形。
for ( size_t i = 0; i < faces.size(); i )
{
Rect r = faces[i];
Scalar color = Scalar(255, 0, 0);
rectangle( img, cvPoint(cvRound(r.x*scale), cvRound(r.y*scale)), cvPoint(cvRound((r.x
r.width-1)*scale), cvRound((r.y r.height-1)*scale)), color, 3, 8, 0);
}
現在我們隻需将結果顯示出來。
imshow( "Face Detection", img );
現在我們便可以簡單地調用我們構建的人臉檢測函數來實現人臉檢測。
int main()
{
// Load the cascade classifier
cascade.load( "../../haarcascade_frontalcatface.xml" ) ;
double scale=1;
frame = imread('lenna.jpg', CV_LOAD_IMAGE_COLOR);
detectAndDraw( frame, cascade, scale );
return 0;
}
imread()用于加載輸入圖像。這裡同樣使用'lenna'圖像。我們的C 代碼的結果:
C 人臉識别結果
以上就是我們通過Python/C 幾行簡單的代碼實現人臉識别的所有内容,如果您有更好的建議或有任何問題,歡迎留言評論。
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!