一.項目框架
基于OpenCV和百度云人臉識別的項目可以使用以下的框架來實現(xiàn):
-
數(shù)據(jù)采集和預(yù)處理:使用OpenCV來采集攝像頭或讀取圖像文件,并對圖像進行預(yù)處理操作,例如裁剪、調(diào)整大小、灰度化等。
-
人臉檢測:使用OpenCV的人臉檢測功能來檢測圖像中的人臉??梢允褂妙A(yù)訓(xùn)練的人臉檢測器,如Haar Cascade或基于深度學(xué)習(xí)的人臉檢測器。
-
百度云人臉識別API調(diào)用:將圖像中檢測到的人臉傳遞給百度云人臉識別API,進行人臉識別或分析。調(diào)用API需要使用密鑰,包括API Key和Secret Key。
-
人臉比對和識別:使用百度云人臉識別API進行人臉比對,將待識別人臉與已知人臉進行對比,以確定是否匹配。您可以保存一些已知人臉的特征向量,將待識別的人臉與這些特征進行比較。
-
結(jié)果展示和應(yīng)用:根據(jù)項目需求,將識別結(jié)果展示在界面上或進行相應(yīng)的處理,例如門禁系統(tǒng)的控制、人臉識別支付等。
在這個框架中,OpenCV用于圖像處理和人臉檢測,百度云人臉識別API提供了人臉識別和分析的功能。根據(jù)項目的實際需求,您可以在這個基本框架上進行適當(dāng)?shù)臄U展和優(yōu)化。
二.下載Opencv庫以及API
- 在線安裝:sudo apt-get install libopencv-dev
- 在線文檔:https://opencv.org/
1.VideoCapture 類
VideoCapture
是OpenCV中的一個類,用于讀取圖像或視頻數(shù)據(jù)流。它可以讀取來自攝像頭、視頻文件以及其他設(shè)備的輸入流。
通過創(chuàng)建一個VideoCapture
對象,并傳入特定的參數(shù)(例如攝像頭設(shè)備或視頻文件路徑),可以打開并讀取相應(yīng)的圖像或視頻流。例如:
VideoCapture cap(0); // 打開默認(rèn)的攝像頭設(shè)備
if (!cap.isOpened()) {
// 處理無法打開攝像頭的情況
}
Mat frame;
cap.read(frame); // 讀取一幀視頻數(shù)據(jù)
在上面的代碼中,我們首先創(chuàng)建了一個VideoCapture
對象,并傳入?yún)?shù)0
表示打開默認(rèn)的攝像頭。然后,我們使用cap.isOpened()
方法來檢查攝像頭是否被成功打開,如果不成功,則需要進行相應(yīng)的錯誤處理。最后,我們使用cap.read(frame)
來讀取攝像頭的一幀數(shù)據(jù),并將其存儲在Mat
對象frame
中,以便進行后續(xù)的圖像處理和人臉識別等操作。
VideoCapture
類還提供了其他一些方法和屬性,例如set()
和get()
方法用于設(shè)置和獲取視頻流中的參數(shù),如分辨率、幀率等等。您可以根據(jù)自己的需求進行進一步的探索和學(xué)習(xí)。
2.cvtColor函數(shù)
cvtColor
是OpenCV中的一個重要函數(shù),用于在不同的色彩空間之間進行顏色轉(zhuǎn)換。例如,您可以使用cvtColor
將一張RGB圖像轉(zhuǎn)換為灰度圖像,在HSV、Lab等色彩空間中進行顏色分析等等。
cvtColor
函數(shù)的通用語法為:
void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0);
其中,參數(shù)src
和dst
分別表示輸入和輸出的圖像,類型為InputArray
和OutputArray
,它們可以是Mat
對象、圖像數(shù)據(jù)的指針等。code
參數(shù)表示顏色轉(zhuǎn)換的類型,通常是使用預(yù)定義的常量來表示轉(zhuǎn)換方式,例如將RGB圖像轉(zhuǎn)換為灰度圖像時,可以使用常量COLOR_RGB2GRAY
。dstCn
參數(shù)表示輸出圖像的通道數(shù),當(dāng)輸出圖像和輸入圖像通道數(shù)不一致時,需要進行通道數(shù)的補充或減少。
以下是一些常用的code
常量和對應(yīng)的顏色轉(zhuǎn)換類型:
- COLOR_BGR2GRAY:將BGR顏色圖像轉(zhuǎn)換為灰度圖像
- COLOR_RGB2GRAY:將RGB顏色圖像轉(zhuǎn)換為灰度圖像
- COLOR_GRAY2BGR:將灰度圖像轉(zhuǎn)換為BGR顏色圖像
- COLOR_BGR2HSV:將BGR圖像轉(zhuǎn)換為HSV顏色空間中的圖像
- COLOR_HSV2BGR:將HSV圖像轉(zhuǎn)換為BGR顏色空間中的圖像
- COLOR_BGR2Lab:將BGR圖像轉(zhuǎn)換為Lab顏色空間中的圖像
- COLOR_Lab2BGR:將Lab圖像轉(zhuǎn)換為BGR顏色空間中的圖像
對于轉(zhuǎn)換的輸出圖像,可以直接創(chuàng)建一個Mat
對象,然后將其傳遞給cvtColor
函數(shù)。例如,將一張BGR圖像轉(zhuǎn)換為灰度圖像可以使用以下代碼:
Mat input_image = imread("input.jpg");
Mat gray_image;
cvtColor(input_image, gray_image, COLOR_BGR2GRAY);
在上面的代碼中,我們首先使用imread
函數(shù)讀取一張BGR圖像,并將其存儲在input_image
對象中。然后,我們創(chuàng)建一個名為gray_image
的Mat
對象用于存儲轉(zhuǎn)換后的灰度圖像。最后,我們使用cvtColor
函數(shù)將輸入圖像轉(zhuǎn)換為灰度圖像,并將結(jié)果存儲在gray_image
對象中。
3.equalizeHist函數(shù)
equalizeHist
是OpenCV庫中的一個直方圖均衡化函數(shù),用于提高圖像的對比度和亮度分布。該函數(shù)可以應(yīng)用于灰度圖像或彩色圖像的每個通道。
直方圖均衡化可以通過拉伸圖像灰度級的像素值來增強圖像的對比度。它會盡量使得圖像的像素值均勻分布在整個灰度范圍內(nèi),從而提高圖像細(xì)節(jié)的可見性。
函數(shù)的通用語法如下:
void equalizeHist(InputArray src, OutputArray dst);
其中,src
是輸入圖像,可以是灰度圖像或彩色圖像,dst
是輸出圖像,經(jīng)過直方圖均衡化后的結(jié)果。
以下是一個使用equalizeHist
函數(shù)的示例:
Mat inputImage = imread("input.jpg", 0); // 讀取灰度圖像
Mat equalizedImage;
equalizeHist(inputImage, equalizedImage);
在示例中,我們首先使用imread
函數(shù)讀取了一張灰度圖像,并將其存儲在inputImage
對象中。然后,我們創(chuàng)建一個名為equalizedImage
的Mat
對象用于存儲直方圖均衡化后的結(jié)果。最后,我們使用equalizeHist
函數(shù)將輸入圖像進行直方圖均衡化,并將結(jié)果存儲在equalizedImage
對象中。
需要注意的是,equalizeHist
函數(shù)只適用于灰度圖像的直方圖均衡化。如果要對彩色圖像進行直方圖均衡化,需要將彩色圖像轉(zhuǎn)換為HSV或Lab等顏色空間,然后對亮度通道進行直方圖均衡化,最后再將圖像轉(zhuǎn)換回原始顏色空間。
更多函數(shù)接口請查詢官方API文檔。
3.百度云配置及SDK的下載
領(lǐng)取免費權(quán)益
領(lǐng)取成功后返回上一個界面
填寫完各種信息后創(chuàng)建
創(chuàng)建人臉庫
為了節(jié)約時間,小編已經(jīng)將SDK包下載好打包,放在這里了。SDK的使用方法請到官網(wǎng)自行查詢。
四·opencv程序編寫
#include <iostream>
#include "opencv2/opencv.hpp"
#include <vector>
#include "face.h"
#include <thread> // std::thread
#include <unistd.h>
using namespace std;
using namespace cv;
using namespace aip;
Mat ColorImage, GrayImage;
//g++ face_check.cpp -o face_check -lopencv_highgui -lopencv_core -lopencv_imgproc -lopencv_objdetect -std=c++11 -lcurl -lcrypto -ljsoncpp
int main(int, char **)
{
https://opencv.org/ //0代表打開編號0的攝像頭
if (!cap.isOpe
{
cout << "Camera open failed" << endl;
return -1;
}
cout << "Caeera open success" << endl;
CascadeClassifier Classifier("/usr/share/opencv/haarcascades/haarcascade_frontalface_alt2.xml"); //實例化(尋找多個人臉)
aip::Face client("40842479", "A71uFjITCpky0GKp4BUBwBXF", "VkovTGi97Rh6xSMcd8gjHWYXENRY6vdA"); //也可以這樣寫,用于與百度云建立連接
vector<Rect> AllFace; //成放圖片的容器實例化
Mat MatFace; //成放人臉的容器
vector<uchar> JpgFace;
string Base64Face; // 存儲 BASE64格式的照片
Json::Value result; // 百度返回的數(shù)據(jù) 存到了 result
Json::Value options;
time_t sec; //類似的定義了一個時間
int len = 0;
while (1)
{
cap >> ColorImage; //從攝像頭獲得一個圖片
cvtColor(ColorImage, GrayImage, COLOR_BGRA2GRAY); //轉(zhuǎn)換成灰度圖
equalizeHist(GrayImage, GrayImage); //均衡化處理
Classifier.detectMultiScale(GrayImage, AllFace); //檢測圖片人臉,保存到容器中(坐標(biāo))
cout << AllFace.size() << endl;
if (AllFace.size())
{
MatFace = GrayImage(AllFace[0]); //將識別的人臉插入到數(shù)組中
imencode(".jpg", GrayImage, JpgFace); //將圖片轉(zhuǎn)換成jpg格式
Base64Face = base64_encode((char *)JpgFace.data(), JpgFace.size()); //將圖片轉(zhuǎn)換成Base64格式
result = client.search(Base64Face, "BASE64", "gongren", aip::null); //將Base64格式的人臉發(fā)送過去
if (!result["result"].isNull())
{
if (result["result"]["user_list"][0]["score"].asInt() > 80)
{
cout << result["result"]["user_list"][0]["user_id"] << endl;
sec = time(NULL);
cout << ctime(&sec) << endl;
putText(ColorImage, result["result"]["user_list"][0]["user_id"].asString(), Point(0, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(255, 255, 0));
rectangle(ColorImage, AllFace[0], Scalar(255, 255, 0)); //畫長方體
}
}
}
imshow("video", ColorImage); //顯示照片
waitKey(40);
}
return 0;
}
改文件調(diào)用了SDK中的函數(shù),請注意頭文件要加上SDK,我這里將改文件移動到了SDK文件中。文章來源:http://www.zghlxwxcb.cn/news/detail-792858.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-792858.html
到了這里,關(guān)于項目:基于OpenCV+百度云人臉識別項目的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!