PageRenderTime 95ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 1ms

/module/FaceDetaction/lib/FaceDetaction_ModuleClass.php

https://github.com/noldmess/EagleEye
PHP | 301 lines | 232 code | 45 blank | 24 comment | 8 complexity | 0f9f8332471f549e774b1fc278188f92 MD5 | raw file
  1. <?php
  2. class FaceDetaction_ModuleClass implements OCA\FaceFinder\ClassInterface{
  3. private $path;
  4. //Programs
  5. private static $facedetect="/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/facedetect/facedetect";
  6. private static $facerec ="/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/facerec/facerec";
  7. private static $facesave="/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/facesave/faceresave";
  8. private static $faceupdate="/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/facerupdate/facerupdate";
  9. //Config data
  10. private static $haarcascade="/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/haarcascade_frontalface_alt.xml";
  11. private static $add_learn_list = "/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/add_learn_list.ext";
  12. private static $learn_list = "/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/learn_list.ext";
  13. private static $startSet="/var/www/html/owncloud/apps/EagleEye/module/FaceDetaction/config/startSet";
  14. private $faces;
  15. private $id;
  16. private $foringkey;
  17. private $size;
  18. private function __construct() {
  19. }
  20. function getJSON(){
  21. return $this->tagArray;
  22. }
  23. public static function getInstanceBySQL($id,$tagarray,$foringkey){
  24. $class=new self();
  25. $class->setTagArray($tagarray);
  26. //OCP\Util::writeLog("facefinder",json_encode($exitheader),OCP\Util::ERROR);
  27. $class->setID($id);
  28. $class->setForingkey($foringkey);
  29. return $class;
  30. }
  31. public static function getInstanceByID($id){
  32. OCP\Util::writeLog("facefinder","FaceDetect ".$id,OCP\Util::ERROR);
  33. $class=new self();
  34. $class->setID($id);
  35. return $class;
  36. }
  37. public static function getInstanceByPath($path,$foringkey){
  38. $class=new self();
  39. $imag=OC_Filesystem::getLocalFile($path);
  40. $class->setForingkey($foringkey);
  41. $class->setPaht($imag);
  42. $class->setSize($imag);
  43. OCP\Util::writeLog("facefinder",$class->getPaht(),OCP\Util::ERROR);
  44. return $class;
  45. }
  46. public function findeFaces($path,$foringkey){
  47. $imag=OC_Filesystem::getLocalFile($path);
  48. $class=new self();
  49. $class->setPaht($imag);
  50. $class->getFaces($imag);
  51. $class->setForingkey($foringkey);
  52. $class->setSize($imag);
  53. return $class;
  54. }
  55. public function getFaces(){
  56. //$-cmd='/var/www/html/facefinder/module/facedetect --cascade="/var/www/html/facefinder/module/haarcascade_frontalface_alt.xml" -nested-cascade=="/var/www/html/facefinder/module/haarcascade_frontalface_alt2.xml" '.$this->path;
  57. $cmd=FaceDetaction_ModuleClass::$facedetect.' --cascade="'.FaceDetaction_ModuleClass::$haarcascade.'" '.$this->path;
  58. OCP\Util::writeLog("test3",$cmd,OCP\Util::ERROR);
  59. $fp = popen($cmd,'r');
  60. $faces=array();
  61. if($fp!==false){
  62. while(!feof($fp))
  63. {
  64. // send the current file part to the browser
  65. $buffer = fgetss($fp, 4096);
  66. OCP\Util::writeLog("faceFinder_proces ",$buffer,OCP\Util::DEBUG);
  67. $face=preg_split( "/ /" , $buffer );
  68. if(sizeof($face)>1){
  69. $face[2] = str_replace(array("\n"), '', $face[2]);
  70. $faces[]=$face;
  71. }
  72. flush();
  73. }
  74. OCP\Util::writeLog("4a",json_encode($faces),OCP\Util::ERROR);
  75. //unset($faces[sizeof($faces)-1]);
  76. pclose($fp);
  77. }else {
  78. }
  79. //OCP\Util::writeLog("4a",json_encode($this->faces),OCP\Util::ERROR);
  80. $this->faces=$faces;
  81. //return $faces;
  82. }
  83. public function makeFaceTagArray(){
  84. $i=0;
  85. $tagarray=array();
  86. OCP\Util::writeLog("4a",json_encode($this->faces),OCP\Util::ERROR);
  87. foreach ($this->faces as $face){
  88. $r =$face[2]*1.5;
  89. $x1=($face[0]-$r)/ $this->size[0];
  90. $x2=($face[0] + $r)/ $this->size[0];
  91. $y1=($face[1]-$r)/$this->size[1];
  92. $y2=($face[1]+$r)/$this->size[1];
  93. $tagarray[]=array("name"=>"KEYWORDS","tag"=>"Faces".$i,"x1"=>$x1,"x2"=>$x2,"y1"=>$y1,"y2"=>$y2);
  94. $i++;
  95. }
  96. return $tagarray;
  97. }
  98. private static function getFaceFinderDir(){
  99. $user=\OCP\USER::getUser();
  100. return \OC_User::getHome($user) . '/facefinder/';
  101. }
  102. /**
  103. * The function create gray face images from the Array
  104. */
  105. function makeFaceImage(){
  106. $facefinderDir =self::getFaceFinderDir();
  107. $image_p = imagecreatetruecolor(100, 100);
  108. $image = imagecreatefromjpeg($this->path);
  109. $i=0;
  110. foreach ($this->faces as $face){
  111. $path_parts =pathinfo($this->path);
  112. $r =$face[2]*0.99;
  113. //cut out the the facts and make a new image
  114. imagecopyresampled($image_p, $image, 0,0,$face[0]-$r, $face[1]-$r, 100, 100, ($r*2), ($r*2));
  115. //make the image gray
  116. imagefilter ($image_p , IMG_FILTER_GRAYSCALE);
  117. $imgToSava=$path_parts['filename'];
  118. imagepng($image_p,$facefinderDir.$imgToSava."-".$i.".png");
  119. $i++;
  120. }
  121. }
  122. public function classFaceRec($num){
  123. $path_parts =pathinfo($this->path);
  124. $imgToSava=$path_parts['filename'];
  125. $facefinderDir =self::getFaceFinderDir();
  126. //$learn_list = "/var/www/html/facefinder/module/test.sdfd";//tedfsf.ext";//$facefinderDir."/learn_list.ext";
  127. $cmd=FaceDetaction_ModuleClass::$facerec.' '.FaceDetaction_ModuleClass::$learn_list ." ".$facefinderDir.$imgToSava."-".$num.".png";
  128. OCP\Util::writeLog("test2",$cmd,OCP\Util::ERROR);
  129. $fp = popen($cmd,'r');
  130. $ret="fehler";
  131. if($fp!==false){
  132. while(!feof($fp))
  133. {
  134. $buffer = fgetss($fp, 4096);
  135. $face=preg_split( "/ /" , $buffer );
  136. //OCP\Util::writeLog("faceRec_prosedds",strlen($buffer),OCP\Util::ERROR);
  137. if(strlen($buffer)>0){
  138. OCP\Util::writeLog("faceRec_prosedds",$buffer,OCP\Util::ERROR);
  139. $number=$face[0];
  140. OCP\Util::writeLog("asdasdasdas",$number,OCP\Util::DEBUG);
  141. if(preg_match('/(\d+)\.(\d+)e\+(\d+)/i', $face[0] )) {
  142. $a = preg_replace('/(\d+)\.(\d+)e\+(\d+)/i', '$1', $face[0] );
  143. $b = preg_replace('/(\d+)\.(\d+)e\+(\d+)/i', '$2', $face[0] );
  144. $number=$b+($a*100000);
  145. $c = preg_replace('/(\d+)\.(\d+)e\+(\d+)/i', '$3', $face[0] );
  146. }
  147. $ret=array('class'=>$face[1],'threshold'=>$number);
  148. }
  149. flush();
  150. }
  151. pclose($fp);
  152. }else{
  153. OCP\Util::writeLog("asdasdasdas","sdfsdfdsf",OCP\Util::ERROR);
  154. }
  155. return $ret;
  156. }
  157. public static function classLearnFaceRec(){
  158. $facefinderDir =self::getFaceFinderDir();
  159. //$learn_list = "/var/www/html/facefinder/module/startSet";//tedfsf.ext";//$facefinderDir."/learn_list.ext";
  160. $cmd=FaceDetaction_ModuleClass::$facesave.' '.FaceDetaction_ModuleClass::$startSet.' '.FaceDetaction_ModuleClass::$learn_list;
  161. OCP\Util::writeLog("test1",$cmd,OCP\Util::ERROR);
  162. $fp = popen($cmd,'r');
  163. if($fp!==false){
  164. while(!feof($fp))
  165. {
  166. $buffer = fgetss($fp, 4096);
  167. $face=preg_split( "/ /" , $buffer );
  168. //OCP\Util::writeLog("faceRec_prosedds","dfsdfd",OCP\Util::ERROR);
  169. flush();
  170. }
  171. pclose($fp);
  172. }else{
  173. OCP\Util::writeLog("asdasdasdas","sdfsdfdsf",OCP\Util::ERROR);
  174. }
  175. }
  176. public static function updateLearnFaceRec(){
  177. $facefinderDir =self::getFaceFinderDir();
  178. $cmd=FaceDetaction_ModuleClass::$faceupdate.' '.FaceDetaction_ModuleClass::$add_learn_list.' '.FaceDetaction_ModuleClass::$learn_list.' '.FaceDetaction_ModuleClass::$learn_list;
  179. OCP\Util::writeLog("test4",$cmd,OCP\Util::ERROR);
  180. $fp = popen($cmd,'r');
  181. if($fp!==false){
  182. while(!feof($fp))
  183. {
  184. $buffer = fgetss($fp, 4096);
  185. $face=preg_split( "/ /" , $buffer );
  186. //OCP\Util::writeLog("faceRec_prosedds","dfsdfd",OCP\Util::ERROR);
  187. flush();
  188. }
  189. pclose($fp);
  190. }else{
  191. OCP\Util::writeLog("facefinder","Error to start Lerning",OCP\Util::ERROR);
  192. }
  193. $fh = fopen(FaceDetaction_ModuleClass::$add_learn_list, 'w+');
  194. fclose($fh);
  195. }
  196. public function addFaceToTrainingsset($faceid,$faceClass,$tagID){
  197. $s=$this->tagArray;
  198. foreach($s as $index=>$face){
  199. if($face['face_id']===$faceid){
  200. $this->tagArray[$index]['faceclass']=$faceClass;
  201. $this->tagArray[$index]['tag_id']=$tagID;
  202. self::addFaceToLearn($face['facePath'],$faceClass);
  203. break;
  204. }
  205. }
  206. }
  207. /**
  208. * Add a image path to the learn file
  209. * !! NOT ABSOLUTE PATH !!
  210. * @param string $image
  211. */
  212. public static function addFaceToLearn($facePath,$faceClass){
  213. //$image=OC_Filesystem::getLocalFile($path);
  214. OCP\Util::writeLog("facefinder","Error to start Lefffffffffffffffrning ".FaceDetaction_ModuleClass::$add_learn_list,OCP\Util::ERROR);
  215. $fh = fopen(FaceDetaction_ModuleClass::$add_learn_list, 'a');
  216. fwrite ($fh,self::getFaceFinderDir().$facePath.";".$faceClass."\n");
  217. fclose($fh);
  218. }
  219. public static function countNewFaces(){
  220. return COUNT(FILE(FaceDetaction_ModuleClass::$add_learn_list));
  221. }
  222. public function getID(){
  223. return $this->id;
  224. }
  225. public function getForingkey(){
  226. return $this->foringkey;
  227. }
  228. public function getFaceArray(){
  229. return $this->faces;
  230. }
  231. public function setPaht($path){
  232. $this->path=$path;
  233. }
  234. public function getPaht(){
  235. return $this->path;
  236. }
  237. public function setTagArray($tagArray){
  238. $this->tagArray=$tagArray;
  239. }
  240. public function getTagArray(){
  241. return $this->tagArray;
  242. }
  243. public function setSize($path){
  244. OCP\Util::writeLog("asdasdasdas",$path,OCP\Util::DEBUG);
  245. $this->size=getimagesize($path);
  246. }
  247. public function setID($id){
  248. $this->id=$id;
  249. }
  250. public function setForingkey($foringkey){
  251. $this->foringkey=$foringkey;
  252. }
  253. public function addTag($key,$tag,$x1=0,$x2=0,$y1=0,$y2=0){
  254. $this->tagArray[]=array("name"=>self::IPTCCodeToString($key),"tag"=>$tag,"x1"=>$x1,"x2"=>$x2,"y1"=>$y1,"y2"=>$y2);
  255. }
  256. }