我們所安裝的攝像頭必須支持`ftp`文件上傳功能。然后將ftp地址指向系統`/cronjob/ftp/`目錄下對應的門店文件夾內。當我們配置服務器地址的時候會自動生成店鋪id多對應的文件夾,然后將生成的圖片處理保存到`/public/upload/avatar`目錄下。如圖所對應的文件名即為所對應的店鋪信息:

下面介紹一下如何針對接入攝像頭進行處理:
>[info]系統通過不斷地訪問cronjob/init.php文件執行以下四個步驟,從而完成攝像頭的捕獲與處理功能
1.通過`step1.php`文件將攝像頭捕捉到的頭像信息上傳到我們的`/ftp/`所對應的目錄下,通過以下代碼進行上傳:
~~~
file_put_contents($lock_f, date('Y-m-d H:i:s'));
$dir = __DIR__.'/ftp';
$list = glob($dir.'/*');
$exp = ['.','..','.git','.svn','.bash_logout'];
foreach($list as $deep){
$v = substr($deep,strrpos($deep,'/')+1);
//set outer_id
set_face_outer_id($v);
if(!is_dir($deep)) continue;
$li = glob($deep.'/*.jpg');
foreach($li as $file_path){
$vo = substr($file_path,strrpos($file_path,'/')+1);
// echo $file_path."\n".$vo;exit;
if(in_array($vo,$exp)) continue;
//讀到對應的文件了。
//必須是圖片,其他的不要。
$ext = strtolower(substr($vo,strrpos($vo,'.')+1));
//這不是靜態圖片的不要
if(!in_array($ext,['jpg','jpeg','png'])) continue;
//找出圖片中的人臉圖
// $file_path = $dir."/".$v."/".$vo;
file_put_contents(__DIR__.'/lock/1_image',$file_path);
face_avatar($file_path , $v);
}
}
unlink($lock_f);
~~~
2.通過`step2.php`文件設置我們的圖片庫:
~~~
if($all){
foreach($all as $v){
$face_token = $v['face_token'];
$id = $v['id'];
$flag = false;
$outer_id = $v['outer_id'];
if($v['closed_token']) {
file_put_contents(__DIR__."/lock/step2",$id);
$db->update('face_avatar',['is_mark'=>1,'status'=>2],['id'=>$id]);
continue;
}
$ret = face_api_search($face_token , $outer_id );
if($ret->error_message){
//沒找到對應的outer_id,說明從來沒有設置過,
//設置一下。同時,這個face_token直接入庫吧
if($ret->error_message == "INVALID_OUTER_ID"){
face_set($face_token,$outer_id);
//狀態修改為正常的,需要發送給其他接口的
$db->update('face_avatar',['is_mark'=>1,'status'=>1],['id'=>$id]);
}elseif($ret->error_message == 'CONCURRENCY_LIMIT_EXCEEDED'){
file_put_contents(__DIR__."/lock/api_error_CONCURRENCY_LIMIT_EXCEEDED",date('Y-m-d H:i:s'));
continue;
}else{
file_put_contents(__DIR__."/lock/api_error_stopall",var_export($ret,true));
}
continue;
}
//如果已經存在outerid那么,查找相似的人臉吧
if($ret->results){
foreach($ret->results as $v){
//排除本人的face_token
//然后比較最有可能是同一個人的情況
//大于80為疑似同一個人
$ft = $v->face_token;
if(
$ft != $face_token &&
$v->confidence > 80
){
$flag = true;
$current = $ft;
break;
}
}
}
//在人臉接口中找到了疑似同一個人的信息
if($flag === true){
//與當前查找的人的識別碼一樣的話,狀態標識為1,其他的為2,2的數據是需要后面刪除的。
if($face_token == $current){
$db->update('face_avatar',['is_mark'=>1,'status'=>1],['id'=>$id]);
}else{
//與數據庫中存在的用戶是同一個人
$db->update('face_avatar',['closed_token'=>$current,'status'=>2],['id'=>$id]);
}
}else{
//找不到,添加 face
//寫入庫
$db->update('face_avatar',['is_mark'=>1,'status'=>1],['id'=>$id]);
face_add($outer_id,$face_token);
}
}
}
~~~
3.圖片庫創建好之后就是對圖片庫進行處理,清楚無用的圖片或者重復的圖片信息:
~~~
foreach($all as $v){
$face_token = $v['face_token'];
$avatar = $v['avatar'];
$id = $v['id'];
$closed_token = $v['closed_token'];
$ltime = $v['ltime'];
$sended = $v['sended'];
//存在相關聯的字段
//查找這個TOKEN對應的ID,
$one = $db->get('face_avatar',"*",['face_token'=> $closed_token,"is_mark"=>1 ]);
if($one){
$new_id = $one['id'];
//在一定時間時間內,不要重復提醒為新客戶
if($one['ltime']+ $check_lastime > time() ){
file_put_contents(__DIR__.'/lock/step3_error2',$tts['ltime']." ".$check_lastime);
}else{
//作為新客戶來操作
if( $one['sended'] != 2){
$fg = true;
$db->update("face_avatar",['sended'=>0,"status"=>1,'ltime'=>time()],['id'=>$new_id]);
file_put_contents(__DIR__."/lock/1_update.log",$new_id."--".$v['id']);
}
}
$db->update('face_avatar',['status'=> 3 ],['id'=>$id]);
//已經存在關聯的,這個是要刪除的。
//@unlink(__DIR__.'/'.$avatar);
}else{
file_put_contents(__DIR__.'/lock/error_step3',1);
}
file_put_contents(__DIR__."/lock/step3_newid.log",$new_id);
//在一定時間內,用戶不要再創建新的token.
if( $face_relative_lt + $ltime > time() ){
echo "<br>too many pics- ".$v['avatar']."<br>";
} else{
$rt1 = $db->select('face_avatar_token',"*",[
'avatar_id'=>$id,
'face_token'=>$closed_token,
]);
if(!$rt1){
$db->insert("face_avatar_token",[
'face_token'=>$closed_token,
'avatar_id'=>$id,
'avatar' => $avatar,
'created' => time(),
]);
}
}
}
~~~
4.然后針對本店員工的進出門店進行判斷處理客戶與服務人員:
~~~
if($all){
foreach ($all as $v) {
$face_token = $v['face_token'];
$id = $v['id'];
$outer_id = set_face_outer_id($v['dir']);
$ret = face_api_search($face_token , $outer_id );
file_put_contents(__DIR__.'/lock/4_ret',var_export($ret,true));
if($ret->error_message){
continue;
}
file_put_contents(__DIR__.'/lock/4_ret_results',var_export($ret->results,true));
if($ret->results){
foreach($ret->results as $v){
//排除本人的face_token
//然后比較最有可能是同一個人的情況
//大于80為疑似同一個人
$ft = $v->face_token;
if(
$ft != $face_token &&
$v->confidence > 80
){
$flag = true;
$current = $ft;
break;
}
}
}
file_put_contents(__DIR__.'/lock/4_ret_current',$current );
if($current){
$db->update('face_exclude',['closed_token'=>$current] , ['id'=>$id] );
}
}
}
~~~
5.有時候我們會針對所捕獲的圖片進行處理或者圖片質量的要求,那么我們可以在`comm.php`文件內設置,具體代碼如下,當我們注釋的時候代表不進行該處理操作:
~~~
//不清晰的照片不要了。是否模糊
/*if($v->attributes->blur->blurness->value > 2){
echo 'not good qulity<br>';
file_put_contents(__DIR__.'/lock/step1_no_qulity',$v->attributes->blur->blurness->value);
continue;
}
//人臉質量
if($v->attributes->facequality->value < 20){
echo 'not good qulity 2<br>';
file_put_contents(__DIR__.'/lock/step1_no_good',$v->attributes->facequality->value);
continue;
} */
~~~