本篇測評由電子工程世界的優(yōu)秀測評者“流行科技”提供。
此次測試的開源項目,是基于QT+OpenCV的人臉識別打卡項目。本次體驗使用的是開源的代碼,此代碼本來是運行在WIN下的,為了測試稍微進行了修改,讓其運行在米爾iMX8M Plus開發(fā)板上。
![poYBAGKEwi6AY9jwAABTf11XXg4829.png](https://file.elecfans.com/web2/M00/44/6C/poYBAGKEwi6AY9jwAABTf11XXg4829.png)
測試項目實際是分了兩個工程,一個工程是作為管理員控制功能使用,添加人臉信息。同時也可以查詢到打卡記錄,對從機進行下發(fā)通知等等。
人臉識別我們主要需要用到opencv的人臉檢測分類器。
![pYYBAGKEwkeAMzq1AACDsGszgqw686.png](https://file.elecfans.com/web2/M00/44/6F/pYYBAGKEwkeAMzq1AACDsGszgqw686.png)
OpenCV編譯完成后已經(jīng)提供好了的。
因為這里還需要涉及到訓練模型,有了模型后才能更好地識別,所以還是簡單介紹下怎么訓練的吧。
CascadeClassifier cascada;
//將opencv官方訓練好的人臉識別分類器拷貝到自己的工程目錄中
cascada.load("F:videoccchaarcascade_frontalface_alt2.xml");
VideoCapture cap(1); //0表示電腦自帶的,如果用一個外接攝像頭,將0變成1
Mat frame, myFace;
int pic_num = 1;
while (1) {
//攝像頭讀圖像
cap >> frame;
vector faces;//vector容器存檢測到的faces
Mat frame_gray;
cvtColor(frame, frame_gray, COLOR_BGR2GRAY);//轉(zhuǎn)灰度化,減少運算
cascada.detectMultiScale(frame_gray, faces, 1.1, 4, CV_HAAR_DO_ROUGH_SEARCH, Size(70, 70), Size(1000, 1000));
printf("檢測到人臉個數(shù):%dn", faces.size());
//識別到的臉用矩形圈出
for (int i = 0; i < faces.size(); i++)
{
rectangle(frame, faces, Scalar(255, 0, 0), 2, 8, 0);
}
//當只有一個人臉時,開始拍照
if (faces.size() == 1)
{
Mat faceROI = frame_gray(faces[0]);//在灰度圖中將圈出的臉所在區(qū)域裁剪出
//cout << faces[0].x << endl;//測試下face[0].x
resize(faceROI, myFace, Size(92, 112));//將興趣域size為92*112
putText(frame, to_string(pic_num), faces[0].tl(), 3, 1.2, (0, 0, 225), 2, 0);//在 faces[0].tl()的左上角上面寫序號
string filename = format("F:video%d.jpg", pic_num); //圖片的存放位置,frmat的用法跟QString差不多
imwrite(filename, myFace);//存在當前目錄下
imshow(filename, myFace);//顯示下size后的臉
waitKey(500);//等待500us
destroyWindow(filename);//:銷毀指定的窗口
pic_num++;//序號加1
if (pic_num == 11)
{
return 0;//當序號為11時退出循環(huán),一共拍10張照片
}
}
int c = waitKey(10);
if ((char)c == 27) { break; } //10us內(nèi)輸入esc則退出循環(huán)
imshow("frame", frame);//顯示視頻流
waitKey(100);//等待100us
}
return 0;
通過上面的代碼,完成圖像采集。
//讀取你的CSV文件路徑.
//string fn_csv = string(argv[1]);
string fn_csv = "F:videocccat.txt";
// 2個容器來存放圖像數(shù)據(jù)和對應的標簽
vector images;
vector labels;
// 讀取數(shù)據(jù). 如果文件不合法就會出錯
// 輸入的文件名已經(jīng)有了.
try
{
read_csv(fn_csv, images, labels); //從csv文件中批量讀取訓練數(shù)據(jù)
}
catch (cv::Exception& e)
{
cerr << "Error opening file "" << fn_csv << "". Reason: " << e.msg << endl;
// 文件有問題,我們啥也做不了了,退出了
exit(1);
}
// 如果沒有讀取到足夠圖片,也退出.
if (images.size() <= 1) {
string error_message = "This demo needs at least 2 images to work. Please add more images to your data set!";
CV_Error(CV_StsError, error_message);
}
for (int i = 0; i < images.size(); i++)
{
//cout<();<>
if (images.size() != Size(92, 112))
{
cout << i << endl;
cout << images.size() << endl;
}
}
// 下面的幾行代碼僅僅是從你的數(shù)據(jù)集中移除最后一張圖片,作為測試圖片
//[gm:自然這里需要根據(jù)自己的需要修改,他這里簡化了很多問題]
Mat testSample = images[images.size() - 1];
int testLabel = labels[labels.size() - 1];
images.pop_back();//刪除最后一張照片,此照片作為測試圖片
labels.pop_back();//刪除最有一張照片的labels
// 下面幾行創(chuàng)建了一個特征臉模型用于人臉識別,
// 通過CSV文件讀取的圖像和標簽訓練它。
// T這里是一個完整的PCA變換
//如果你只想保留10個主成分,使用如下代碼
// cv::createEigenFaceRecognizer(10);
//
// 如果你還希望使用置信度閾值來初始化,使用以下語句:
// cv::createEigenFaceRecognizer(10, 123.0);
//
// 如果你使用所有特征并且使用一個閾值,使用以下語句:
// cv::createEigenFaceRecognizer(0, 123.0);
//創(chuàng)建一個PCA人臉分類器,暫時命名為model吧,創(chuàng)建完成后
//調(diào)用其中的成員函數(shù)train()來完成分類器的訓練
Ptr model = face::EigenFaceRecognizer::create();
model->train(images, labels);
model->save("MyFacePCAModel.xml");//保存路徑可自己設置,但注意用“”
Ptr model1 = face::FisherFaceRecognizer::create();
model1->train(images, labels);
model1->save("MyFaceFisherModel.xml");
Ptr model2 = face::LBPHFaceRecognizer::create();
model2->train(images, labels);
model2->save("MyFaceLBPHModel.xml");
// 下面對測試圖像進行預測,predictedLabel是預測標簽結(jié)果
//注意predict()入口參數(shù)必須為單通道灰度圖像,如果圖像類型不符,需要先進行轉(zhuǎn)換
//predict()函數(shù)返回一個整形變量作為識別標簽
int predictedLabel = model->predict(testSample);//加載分類器
int predictedLabel1 = model1->predict(testSample);
int predictedLabel2 = model2->predict(testSample);
// 還有一種調(diào)用方式,可以獲取結(jié)果同時得到閾值:
// int predictedLabel = -1;
// double confidence = 0.0;
// model->predict(testSample, predictedLabel, confidence);
string result_message = format("Predicted class = %d / Actual class = %d.", predictedLabel, testLabel);
string result_message1 = format("Predicted class = %d / Actual class = %d.", predictedLabel1, testLabel);
string result_message2 = format("Predicted class = %d / Actual class = %d.", predictedLabel2, testLabel);
cout << result_message << endl;
cout << result_message1 << endl;
cout << result_message2 << endl;
getchar();
//waitKey(0);
return 0;
通過上面的代碼進行訓練,訓練使用了python。所以系統(tǒng)環(huán)境需要配置好。
![poYBAGKEwl6AQKHtAAAm8l7Gwow014.png](https://file.elecfans.com/web2/M00/44/6C/poYBAGKEwl6AQKHtAAAm8l7Gwow014.png)
在此文件中,把我們采集到的圖像,放進去,新建一個文件夾。
![poYBAGKEwmyATvSEAABt9rLqLms536.png](https://file.elecfans.com/web2/M00/44/6C/poYBAGKEwmyATvSEAABt9rLqLms536.png)
之后就是把我們的at.txt也加入我們的文件。
![pYYBAGKEwnmAX7M1AAB6AnakQhQ378.png](https://file.elecfans.com/web2/M00/44/6F/pYYBAGKEwnmAX7M1AAB6AnakQhQ378.png)
訓練好后,我們就得到了我們所需要的訓練文件。
![poYBAGKEwoSAEKhsAABN9e09ki0029.png](https://file.elecfans.com/web2/M00/44/6C/poYBAGKEwoSAEKhsAABN9e09ki0029.png)
在我們打卡界面,點擊打卡時就是這樣的。加載訓練好的東西。然后啟動定時器,去獲取攝像頭信號,然后對比,最終和數(shù)據(jù)庫一致就認為打卡成功。
上面訓練部分,其實提供的另一個工程就全部完成了。
![poYBAGKEwpGASG9iAABFuJ2enWs396.png](https://file.elecfans.com/web2/M00/44/6C/poYBAGKEwpGASG9iAABFuJ2enWs396.png)
這是我們win端界面,圓框就是我們攝像頭采集圖像顯示的位置。
![pYYBAGKEwpyAFIqiAABEtCveTHg066.png](https://file.elecfans.com/web2/M00/44/6F/pYYBAGKEwpyAFIqiAABEtCveTHg066.png)
我們需要在Ubuntu下把庫全部替換,這樣就能編譯過了,然后拷貝到開發(fā)板上運行。如下:
![pYYBAGKEwqaAKh6yAAAsOzMnM4Y825.png](https://file.elecfans.com/web2/M00/44/6F/pYYBAGKEwqaAKh6yAAAsOzMnM4Y825.png)
進來就提示數(shù)據(jù)庫打開失敗了,我們這個都是基于數(shù)據(jù)庫,所以還是比較尷尬的,后期的話可以嘗試自己全部編譯下,然后更新吧。目前就測試,看下效果吧。
![pYYBAGKEwriAHmWPAADzCEbAve8180.png](https://file.elecfans.com/web2/M00/44/6F/pYYBAGKEwriAHmWPAADzCEbAve8180.png)
使用的硬件增加了一個攝像頭。
![pYYBAGKEwsOAACWNAADJEkIMIyA546.png](https://file.elecfans.com/web2/M00/44/6F/pYYBAGKEwsOAACWNAADJEkIMIyA546.png)
這是打開攝像頭采集的樣子。
![pYYBAGKDbRWADoP6ABz9qHtm7fY289.gif](https://file.elecfans.com/web2/M00/44/2B/pYYBAGKDbRWADoP6ABz9qHtm7fY289.gif)
這個GIF展示了我們的人臉檢測情況。
![poYBAGKEwtaAEPbSAABSE9pWx4Y131.png](https://file.elecfans.com/web2/M00/44/6C/poYBAGKEwtaAEPbSAABSE9pWx4Y131.png)
由于沒有數(shù)據(jù)庫,只能打印一些信息。當兩個數(shù)據(jù)相等時就進入下一步,判斷打卡了。由于沒有數(shù)據(jù)庫,就展示下電腦端的效果吧。
![pYYBAGKEwuOAdM_0AABKUBgTxkQ268.png](https://file.elecfans.com/web2/M00/44/6F/pYYBAGKEwuOAdM_0AABKUBgTxkQ268.png)
![poYBAGKEwumAIlXbAABbm5btOrU794.png](https://file.elecfans.com/web2/M00/44/6D/poYBAGKEwumAIlXbAABbm5btOrU794.png)
審核編輯:符乾江
-
開發(fā)板
+關注
關注
25文章
5137瀏覽量
98344 -
人臉識別
+關注
關注
76文章
4021瀏覽量
82387
發(fā)布評論請先 登錄
相關推薦
【米爾RK3576開發(fā)板評測】+項目名稱值得購買的米爾RK3576開發(fā)板
FacenetPytorch人臉識別方案--基于米爾全志T527開發(fā)板
FacenetPytorch人臉識別方案--基于米爾全志T527開發(fā)板
![FacenetPytorch<b class='flag-5'>人臉</b><b class='flag-5'>識別</b>方案--基于<b class='flag-5'>米爾</b>全志T527<b class='flag-5'>開發(fā)板</b>](https://file.elecfans.com/web2/M00/02/C4/pYYBAGDSzfeAP86XAAAO5PbqJbI698.png)
追加名額丨米爾瑞芯微RK3576開發(fā)板有獎試用
![追加名額丨<b class='flag-5'>米爾</b>瑞芯微RK3576<b class='flag-5'>開發(fā)板</b>有獎試用](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
如何用OpenCV的相機捕捉視頻進行人臉檢測--基于米爾NXP i.MX93開發(fā)板
基于OPENCV的相機捕捉視頻進行人臉檢測--米爾NXP i.MX93開發(fā)板
![基于<b class='flag-5'>OPENCV</b>的相機捕捉視頻進行<b class='flag-5'>人臉</b>檢測--<b class='flag-5'>米爾</b>NXP i.MX93<b class='flag-5'>開發(fā)板</b>](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
基于OpenCV的人臉識別系統(tǒng)設計
米爾基于NXP iMX.93開發(fā)板的M33處理器應用開發(fā)筆記
![<b class='flag-5'>米爾</b>基于NXP <b class='flag-5'>iMX</b>.93<b class='flag-5'>開發(fā)板</b>的M33處理器應用<b class='flag-5'>開發(fā)</b>筆記](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
米爾NXP i.MX 93開發(fā)板的Qt開發(fā)指南
米爾NXP i.MX 93開發(fā)板的Qt開發(fā)指南
![<b class='flag-5'>米爾</b>NXP i.MX 93<b class='flag-5'>開發(fā)板</b>的<b class='flag-5'>Qt</b><b class='flag-5'>開發(fā)</b>指南](https://file.elecfans.com/web2/M00/08/64/pYYBAGDwFEGADIPWAAFlJOlmLxg664.jpg)
【OpenHarmony鴻蒙實戰(zhàn)】在RK3399開發(fā)板實現(xiàn)智能門禁人臉識別
![【OpenHarmony鴻蒙實戰(zhàn)】在RK3399<b class='flag-5'>開發(fā)板</b>實現(xiàn)智能門禁<b class='flag-5'>人臉</b><b class='flag-5'>識別</b>](https://file1.elecfans.com/web2/M00/C5/25/wKgZomX6oiGAGD-TAACp2nHxw6U669.jpg)
項目分享|基于ELF 1開發(fā)板的遠程監(jiān)測及人臉識別項目
![<b class='flag-5'>項目</b>分享|基于ELF 1<b class='flag-5'>開發(fā)板</b>的遠程監(jiān)測及<b class='flag-5'>人臉</b><b class='flag-5'>識別項目</b>](https://file1.elecfans.com/web2/M00/C5/1A/wKgaomXxZr6AA5bxAAA_GCXOUGQ700.png)
評論