Issues (49)

src/core.php (30 issues)

1
<?php
2
3
namespace darknet;
4
5
use FFI;
6
use darknet\Exception\coreException;
7
8
/**
9
 * Description of core
10
 * @package php-darknet (yolo v2,v3,v4)
11
 * @author Shubham Chaudhary <[email protected]>
12
 * @copyright (c) 2019,2020, Shubham Chaudhary
13
 */
14
class core {
15
16
    protected const LIBDIR = '/home/ghost/bin/c-lib/darknet/';
17
    protected const CFG_FASTEST_YOLO = __DIR__.'/cfg/yolo-fastest.cfg';
18
    protected const WEIGHT_FASTEST_YOLO = __DIR__.'/weight/yolo-fastest.weights';
19
    protected const CFG_FASTEST_YOLO_XL = __DIR__.'/cfg/yolo-fastest-xl.cfg';
20
    protected const WEIGHT_FASTEST_YOLO_XL = __DIR__.'/weight/yolo-fastest-xl.weights';
21
    protected const CFG_MOBILENET_V2_LITE = self::LIBDIR.'cfg/MobileNetV2-YOLOv3-Lite-coco.cfg';
22
    protected const WEIGHT_MOBILENET_V2_LITE = self::LIBDIR.'backup/MobileNetV2-YOLOv3-Lite-coco.weights';
23
    protected const CFG_MOBILENET_V2_VOC = self::LIBDIR.'cfg/MobileNetV2-yolo-Fastest-voc-v2.cfg';
24
    protected const WEIGHT_MOBILENET_V2_VOC = self::LIBDIR.'backup/MobileNetV2-YOLO-Fastest-voc-v2.weights';
25
    protected const CFG_VOC_TINY_2 = self::LIBDIR.'cfg/yolov2-tiny-voc.cfg';
26
    protected const WEIGHT_VOC_TINY_2 = self::LIBDIR.'backup/yolov2-tiny-voc.weights';
27
    protected const CFG_TINY_2 = self::LIBDIR.'cfg/yolov2-tiny.cfg';
28
    protected const WEIGHT_TINY_2 = self::LIBDIR . 'backup/yolov2-tiny.weights';
29
    protected const CFG_TINY_3 = self::LIBDIR . 'cfg/yolov3-tiny.cfg';
30
    protected const WEIGHT_TINY_3 = self::LIBDIR . 'backup/yolov3-tiny.weights';
31
    protected const CFG_TINY_4 = self::LIBDIR . 'cfg/yolov4-tiny.cfg';
32
    protected const WEIGHT_TINY_4 = self::LIBDIR . 'backup/yolov4-tiny.weights';
33
    protected const CFG_MAIN = self::LIBDIR . 'cfg/yolov3.cfg';
34
    protected const WEIGHT_MAIN = self::LIBDIR . 'backup/yolov3.weights';
35
    public const DATA_COCO = self::LIBDIR . 'cfg/coco.data';
36
    public const DATA_IMGNET1k = self::LIBDIR . 'cfg/imagenet1k.data';
37
    public const DATA_OPNIMG = self::LIBDIR . 'cfg/openimages.data';
38
    public const DATA_COBIN9k = self::LIBDIR . 'cfg/combine9k.data';
39
    public const DATA_VOC = self::LIBDIR . 'cfg/voc.data';
40
    protected const OUTFILE_DIR = __DIR__ . '/../temp/out/';
41
    public const YOLO4TINY = 4;
42
    public const YOLO3TINY = 3;
43
    public const YOLO3MAIN = 2;
44
    public const YOLO2TINY = 1;
45
    public const YOLOFASTEST = 7;
46
    public const YOLOFASTEST_XL = 8;
47
    public const YOLO_VOC_TINY = 5;
48
    public const MOBILE_NET_V2_LITE_YOLO = 6;
49
    public const MOBILE_NET_V2_VOC = 9;
50
51
    protected $image, $itme, $net, $outPut, $pathInfo, $rawImage, $temp_name, $dets, $imgInfo;
52
    public $darknetFFI, $meta, $classes, $numBox;
53
54
    public function __construct($netType = self::YOLO4TINY, $metaData = self::DATA_COCO) {
55
        $this->numBox = FFI::new('int32_t');
56
        $this->darknetFFI = FFI::load(__DIR__ . '/dn_api_4.h');
57
        $this->getMeta($metaData);
58
        $this->classes();
59
        $this->loadNetwork($netType);
60
    }
61
62
    public function classify($img) {
63
        $this->loadImage($img);
64
        $out = $this->predictImg();
65
        $res = [];
66
        for ($i = 0; $i < $this->meta->classes; ++$i) {
67
            $res[$i] = (FFI::string($this->meta->names[$i], $out[$i]));
68
        }
69
        return $res;
70
    }
71
72
    public function detect($img, $remote = false, $thresh = .25, $hier_thresh = .5, $nms = .45) {
73
        $time = microtime(true);
74
        if ($remote) {
75
            $img = $this->img4base64($img);
76
            $this->loadImage($img);
77
        } else {
78
            $this->loadImage($img);
79
        }
80
81
        $this->imgInfo($img);
82
        $this->predictImg();
83
        $this->getNetworkBoxes($this->net, $this->image->w, $this->image->h, $thresh, $hier_thresh, null, 0, $this->numBox);
84
        $this->doNmsSort($this->dets, $this->numBox, $this->meta, $nms);
85
86
        for ($obj = 0; $obj < $this->numBox->cdata; ++$obj) {
0 ignored issues
show
The property cdata does not seem to exist on FFI\CData.
Loading history...
87
            foreach ($this->classes as $key => $val) {
88
                if ($this->dets[$obj]->prob[$key]) {
89
                    $res[] = $this->detectObject($this->dets[$obj], $key, $val);
90
                }
91
            }
92
        }
93
        if ($remote) {
94
            $msg = $this->drawBbox($res);
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $res does not seem to be defined for all execution paths leading up to this point.
Loading history...
95
            echo PHP_EOL;
96
            echo "FPS:{$this->fps($time)}".PHP_EOL;
97
            echo "Execution time:" . $this->consumedTime($time) . PHP_EOL;
98
            unlink($img);
99
            $this->freeImage($this->image);
100
            $this->freeDetections($this->dets, $this->numBox);
101
            unset($res);
102
            return $msg;
103
        } else {
104
            $this->drawBbox($res, self::OUTFILE_DIR . $this->imgInfo->name);
105
            unset($res);
106
        }
107
        echo PHP_EOL;
108
        echo "FPS:{$this->fps($time)}".PHP_EOL;
109
        echo "Execution time:" . $this->consumedTime($time) . PHP_EOL;
110
        $this->freeImage($this->image);
111
        $this->freeDetections($this->dets, $this->numBox);
112
        unset($time);
113
    }
114
115
    public function remotePR($client, $frame, $server = '') {
116
        if ($server !== '') {
117
            $msg = $this->detect($frame->data, true);
118
            $data = ['id' => $frame->fd, 'msg' => $msg];
119
            $server->push($client, json_encode($data));
120
        } else {
121
            $msg = $this->detect($frame, true);
122
            $data = ['id' => $client->resourceId, 'msg' => $msg];
123
            $client->send(json_encode($data));
124
        }
125
        unset($msg);
126
        unset($data);
127
    }
128
129
    protected function loadNetwork($yolov) {
130
        switch ($yolov) {
131
            case self::YOLO4TINY:
132
                $this->net = $this->darknetFFI->load_network(self::CFG_TINY_4, self::WEIGHT_TINY_4, 0);
0 ignored issues
show
The method load_network() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

132
                /** @scrutinizer ignore-call */ 
133
                $this->net = $this->darknetFFI->load_network(self::CFG_TINY_4, self::WEIGHT_TINY_4, 0);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
133
                break;
134
            case self::YOLO3TINY:
135
                $this->net = $this->darknetFFI->load_network(self::CFG_TINY_3, self::WEIGHT_TINY_3, 0);
136
                break;
137
            case self::YOLO2TINY;
138
                $this->net = $this->darknetFFI->load_network(self::CFG_TINY_2, self::WEIGHT_TINY_2, 0);
139
                break;
140
            case self::YOLO_VOC_TINY;
141
                $this->net = $this->darknetFFI->load_network(self::CFG_VOC_TINY_2, self::WEIGHT_VOC_TINY_2, 0);
142
                break;
143
            case self::MOBILE_NET_V2_LITE_YOLO;
144
                $this->net = $this->darknetFFI->load_network(self::CFG_MOBILENET_V2_LITE, self::WEIGHT_MOBILENET_V2_LITE, 0);
145
                break;
146
            case self::MOBILE_NET_V2_VOC;
147
                $this->net = $this->darknetFFI->load_network(self::CFG_MOBILENET_V2_VOC, self::WEIGHT_MOBILENET_V2_VOC, 0);
148
                break;
149
            case self::YOLOFASTEST;
150
                $this->net = $this->darknetFFI->load_network(self::CFG_FASTEST_YOLO, self::WEIGHT_FASTEST_YOLO, 0);
151
                break;
152
            case self::YOLOFASTEST_XL;
153
                $this->net = $this->darknetFFI->load_network(self::CFG_FASTEST_YOLO_XL, self::WEIGHT_FASTEST_YOLO_XL, 0);
154
                break;
155
            case self::YOLO3MAIN;
156
                $this->net = $this->darknetFFI->load_network(self::CFG_MAIN, self::WEIGHT_MAIN, 0);
157
                break;
158
            default:
159
                throw new coreException("Not a valid version of yolo!\n");
160
                break;
161
        }
162
    }
163
164
    protected function loadImage($imgfile) {
165
        return $this->image = $this->darknetFFI->load_image_color($imgfile, 0, 0);
0 ignored issues
show
The method load_image_color() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

165
        return $this->image = $this->darknetFFI->/** @scrutinizer ignore-call */ load_image_color($imgfile, 0, 0);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
166
    }
167
168
    /**
169
     * [make_image description]
170
     * @param  int    $w [description]
171
     * @param  int    $h [description]
172
     * @param  int    $c [description]
173
     * @return [type]    [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
174
     */
175
    public function makeImg(int $w, int $h, int $c) {
176
        return $this->darknetFFI->make_image($w, $h, $c);
0 ignored issues
show
The method make_image() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

176
        return $this->darknetFFI->/** @scrutinizer ignore-call */ make_image($w, $h, $c);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
177
    }
178
179
    /**
180
     * [resize_image description]
181
     * @param  FFI\CData $im [image]
182
     * @return [type]        [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
183
     */
184
    public function resizeImg(FFI\CData $im) {
185
        return $this->darknetFFI->resize_image($im, $this->net->w, $this->net->h);
0 ignored issues
show
The method resize_image() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

185
        return $this->darknetFFI->/** @scrutinizer ignore-call */ resize_image($im, $this->net->w, $this->net->h);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
186
    }
187
188
    /**
189
     * [letterbox_image description]
190
     * @param  FFI\CData $im [description]
191
     * @param  int       $w  [description]
192
     * @param  int       $h  [description]
193
     * @return [type]        [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
194
     */
195
    protected function letterBoxImg(FFI\CData $im, int $w, int $h) {
196
        return $this->darknetFFI->letterbox_image($im, $w, $h);
0 ignored issues
show
The method letterbox_image() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

196
        return $this->darknetFFI->/** @scrutinizer ignore-call */ letterbox_image($im, $w, $h);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
197
    }
198
199
    protected function predictImg() {
200
        return $this->darknetFFI->network_predict_image($this->net, $this->image);
0 ignored issues
show
The method network_predict_image() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

200
        return $this->darknetFFI->/** @scrutinizer ignore-call */ network_predict_image($this->net, $this->image);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
201
    }
202
203
    protected function getMeta($data) {
204
        return $this->meta = $this->darknetFFI->get_metadata($data);
0 ignored issues
show
The method get_metadata() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

204
        return $this->meta = $this->darknetFFI->/** @scrutinizer ignore-call */ get_metadata($data);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
205
    }
206
207
    protected function classes() {
208
        for ($i = 0; $i < $this->meta->classes; ++$i) {
209
            $this->classes[$i] = \FFI::string($this->meta->names[$i]);
210
        }
211
        return $this->classes;
212
    }
213
214
    protected function getNetworkBoxes(FFI\CData $net, int $w, int $h, float $thresh, float $hier, $map, int $relative, $num) {
215
        return $this->dets = $this->darknetFFI->get_network_boxes($net, $w, $h, $thresh, $hier, $map, $relative, FFI::addr($num), 0);
0 ignored issues
show
The method get_network_boxes() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

215
        return $this->dets = $this->darknetFFI->/** @scrutinizer ignore-call */ get_network_boxes($net, $w, $h, $thresh, $hier, $map, $relative, FFI::addr($num), 0);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
216
    }
217
218
    protected function doNmsSort(FFI\CData $dects, FFI\CData $nmBox, FFI\CData $meta, float $nms) {
219
        return $this->darknetFFI->do_nms_sort($dects, $nmBox->cdata, $meta->classes, $nms);
0 ignored issues
show
The property classes does not seem to exist on FFI\CData.
Loading history...
The property cdata does not seem to exist on FFI\CData.
Loading history...
The method do_nms_sort() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

219
        return $this->darknetFFI->/** @scrutinizer ignore-call */ do_nms_sort($dects, $nmBox->cdata, $meta->classes, $nms);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
220
    }
221
222
    protected function freeImage(FFI\CData $im) {
223
        return $this->darknetFFI->free_image($im);
0 ignored issues
show
The method free_image() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

223
        return $this->darknetFFI->/** @scrutinizer ignore-call */ free_image($im);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
224
    }
225
226
    protected function freeDetections(FFI\CData $dets, $num) {
227
        return $this->darknetFFI->free_detections($dets, $num->cdata);
0 ignored issues
show
The method free_detections() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

227
        return $this->darknetFFI->/** @scrutinizer ignore-call */ free_detections($dets, $num->cdata);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
228
    }
229
230
    /**
231
     * [free_network description]
232
     * @return [type]                  [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
233
     */
234
    protected function freeNetwork() {
235
        return $this->darknetFFI->free_network($this->net);
0 ignored issues
show
The method free_network() does not exist on FFI. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

235
        return $this->darknetFFI->/** @scrutinizer ignore-call */ free_network($this->net);

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
236
    }
237
238
    protected function detectObject(FFI\CData $det, $key, $val) {
239
        return (object) ['label' => $val, 'confidence' => $det->prob[$key], 'box' => $this->bbox2obj($det->bbox)];
0 ignored issues
show
The property bbox does not seem to exist on FFI\CData.
Loading history...
The property prob does not seem to exist on FFI\CData.
Loading history...
240
    }
241
242
    protected function bbox2Obj(FFI\CData $t) {
243
        return (object) ['x' => $t->x, 'y' => $t->y, 'w' => $t->w, 'h' => $t->h];
0 ignored issues
show
The property w does not seem to exist on FFI\CData.
Loading history...
The property y does not seem to exist on FFI\CData.
Loading history...
The property h does not seem to exist on FFI\CData.
Loading history...
The property x does not seem to exist on FFI\CData.
Loading history...
244
    }
245
246
    protected function gbBox(object $b) {
247
        $h = $b->h / 2;
248
        $w = $b->w / 2;
249
        $x = $b->x;
250
        $y = $b->y;
251
        return (object) ['x1' => $x - $w, 'y1' => $y - $h, 'x2' => $x + $w, 'y2' => $y + $h];
252
    }
253
254
    protected function drawBbox($inp, $outFile = null) {
255
        $this->rawImage = $this->createImg();
256
        imagesetthickness($this->rawImage, 2);
257
        if ($inp !== null) {
258
            foreach ($inp as $i) {
259
                $box = $this->gbBox($i->box);
260
                $label = $i->label . '-' . round($i->confidence, 2) . '%';
261
                switch ($i->label) {
262
                    case 'bear':
263
                    case 'cat':
264
                    case 'cow':
265
                    case 'dog':
266
                    case 'elephant':
267
                    case 'giraffe':
268
                    case 'horse':
269
                    case 'sheep':
270
                    case 'zebra':
271
                        $this->truthLabel($box, $label, 'yellow', 'black');
272
                        break;
273
274
                    case 'bird':
275
                        $this->truthLabel($box, $label, 'teal', 'white');
276
                        break;
277
278
                    case 'cake':
279
                    case 'donut':
280
                    case 'pizza':
281
                    case 'hot dog':
282
                    case 'carrot':
283
                    case 'broccoli':
284
                    case 'orange':
285
                    case 'sandwich':
286
                    case 'apple':
287
                    case 'banana':
288
                        $this->truthLabel($box, $label, 'magenta', 'white');
289
                        break;
290
291
                    case 'toaster':
292
                    case 'oven':
293
                    case 'microwave':
294
                    case 'cell phone':
295
                    case 'keyboard':
296
                    case 'remote':
297
                    case 'mouse':
298
                    case 'laptop':
299
                    case 'tvmonitor':
300
                    case 'refrigerator':
301
                        $this->truthLabel($box, $label, 'blue', 'white');
302
                        break;
303
304
                    case 'toothbrush':
305
                    case 'hair drier':
306
                    case 'vase':
307
                    case 'clock':
308
                    case 'bottle':
309
                    case 'spoon':
310
                    case 'cup':
311
                    case 'suitcase':
312
                    case 'tie':
313
                    case 'handbag':
314
                    case 'umbrella':
315
                    case 'book':
316
                    case 'backpack':
317
                    case 'wine glass':
318
                    case 'fork':
319
                    case 'bowl':
320
                    case 'knife':
321
                        $this->truthLabel($box, $label, 'purple', 'white');
322
                        break;
323
324
                    case 'diningtable':
325
                    case 'bed':
326
                    case 'bench':
327
                    case 'sofa':
328
                    case 'chair':
329
                    case 'sink':
330
                    case 'scissors':
331
                        $this->truthLabel($box, $label, 'cyan', 'black');
332
                        break;
333
334
                    case 'car':
335
                    case 'bus':
336
                    case 'boat':
337
                    case 'truck':
338
                    case 'bicycle':
339
                    case 'motorbike':
340
                    case 'aeroplane':
341
                        $this->truthLabel($box, $label, 'red', 'white');
342
                        break;
343
                    case 'person':
344
                        $this->truthLabel($box, $label, 'green', 'black');
345
                        break;
346
347
                    case 'skis':
348
                    case 'snowboard':
349
                    case 'sports ball':
350
                    case 'kite':
351
                    case 'baseball bat':
352
                    case 'baseball glove':
353
                    case 'skateboard':
354
                    case 'surfboard':
355
                    case 'tennis racket':
356
                    case 'teddy bear':
357
                        $this->truthLabel($box, $label, 'purple', 'white');
358
                        break;
359
                    
360
                    case 'traffic light':
361
                    case 'fire hydrant':
362
                    case 'stop sign':
363
                    case 'parking meter':
364
                        $this->truthLabel($box, $label, 'blueViolet', 'white');
365
                        break;
366
                    
367
                    default :
368
                        $this->truthLabel($box, $label, 'black', 'white');
369
                        break;
370
                }
371
            }
372
        } else {
373
            imagestring($this->rawImage, 5, 0, 20, "NULL [ Accuracy:- 00.00% ]", $this->color('black'));
374
        }
375
        if (is_null($outFile)) {
376
            return $this->img64Encode();
377
        } else {
378
            imagejpeg($this->rawImage, $outFile);
379
        }
380
        imagedestroy($this->rawImage);
381
    }
382
383
    /**
384
     * [color description]
385
     * @param  string $Colorname [description]
386
     * @return [type]            [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
387
     */
388
    protected function color($Colorname = 'yellow') {
389
390
        switch ($Colorname) {
391
            case 'red':
392
                $color = imagecolorallocate($this->rawImage, 255, 0, 0);
393
                break;
394
            case 'green':
395
                $color = imagecolorallocate($this->rawImage, 0, 255, 0);
396
                break;
397
            case 'blue':
398
                $color = imagecolorallocate($this->rawImage, 0, 0, 255);
399
                break;
400
            case 'yellow':
401
                $color = imagecolorallocate($this->rawImage, 255, 255, 0);
402
                break;
403
            case 'magenta':
404
                $color = imagecolorallocate($this->rawImage, 255, 0, 255);
405
                break;
406
            case 'cyan':
407
                $color = imagecolorallocate($this->rawImage, 0, 255, 255);
408
                break;
409
            case 'purple':
410
                $color = imagecolorallocate($this->rawImage, 160, 32, 240);
411
                break;
412
            case 'teal':
413
                $color = imagecolorallocate($this->rawImage, 0, 128, 128);
414
                break;
415
            case 'blueViolet':
416
                $color = imagecolorallocate($this->rawImage, 138, 43, 226);
417
                break;
418
            case 'pink':
419
                $color = imagecolorallocate($this->rawImage, 255, 192, 203);
420
                break;
421
            case 'chocolate':
422
                $color = imagecolorallocate($this->rawImage, 210, 105, 30);
423
                break;
424
            case 'white':
425
                $color = imagecolorallocate($this->rawImage, 255, 255, 255);
426
                break;
427
            case 'aquamarine1':
428
                $color = imagecolorallocate($this->rawImage, 127, 255, 212);
429
                break;
430
            case 'azurel':
431
                $color = imagecolorallocate($this->rawImage, 240, 255, 255);
432
                break;
433
            case 'maroon':
434
                $color = imagecolorallocate($this->rawImage, 176, 48, 96);
435
                break;
436
            case 'orchid':
437
                $color = imagecolorallocate($this->rawImage, 218, 112, 214);
438
                break;
439
            case 'plum':
440
                $color = imagecolorallocate($this->rawImage, 221, 160, 221);
441
                break;
442
            case 'voilet':
443
                $color = imagecolorallocate($this->rawImage, 238, 130, 238);
444
                break;
445
            case 'salmon':
446
                $color = imagecolorallocate($this->rawImage, 250, 128, 114);
447
                break;
448
            case 'brown':
449
                $color = imagecolorallocate($this->rawImage, 165, 42, 42);
450
                break;
451
            case 'orange':
452
                $color = imagecolorallocate($this->rawImage, 255, 165, 0);
453
                break;
454
            case 'darkgreen':
455
                $color = imagecolorallocate($this->rawImage, 0, 100, 0);
456
                break;
457
            case 'navy':
458
                $color = imagecolorallocate($this->rawImage, 0, 0, 128);
459
                break;
460
            case 'slateblue':
461
                $color = imagecolorallocate($this->rawImage, 106, 90, 205);
462
                break;
463
            default :
464
                $color = imagecolorallocate($this->rawImage, 0, 0, 0);
465
                break;
466
        }
467
        return $color;
468
    }
469
470
    /**
471
     * [load_file description]
472
     * @param  [type] $filename [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
473
     * @return [type]           [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
474
     */
475
    protected function createImg() {
476
        switch ($this->imgInfo->type) {
477
            case 'png':
478
                $image = imagecreatefrompng($this->imgInfo->dir . DIRECTORY_SEPARATOR . $this->imgInfo->name);
479
                break;
480
            case 'jpg':
481
                $image = imagecreatefromjpeg($this->imgInfo->dir . DIRECTORY_SEPARATOR . $this->imgInfo->name);
482
                break;
483
            case 'bmp':
484
                $image = imagecreatefrombmp($this->imgInfo->dir . DIRECTORY_SEPARATOR . $this->imgInfo->name);
485
                break;
486
            case 'webp':
487
                $image = imagecreatefromwebp($this->imgInfo->dir . DIRECTORY_SEPARATOR . $this->imgInfo->name);
488
                break;
489
490
            default :
491
                throw new Exception('The image is not a resource or valid image file' . PHP_EOL);
492
                break;
493
        }
494
        return $image;
495
    }
496
497
    public function img4base64($url) {
498
        $url64 = $this->base64ImgDecode($url);
499
        if (!empty($url64)) {
500
            $im = imagecreatefromstring($url64);
501
            imagejpeg($im, __DIR__ . '/../temp/in/' . $this->tempImgName() . '.jpg', 100);
502
            imagedestroy($im);
503
            return __DIR__ . '/../temp/in/' . $this->temp_name . '.jpg';
504
        } else {
505
            return false;
506
        }
507
    }
508
509
    public function base64ImgDecode($url) {
510
        if ($url == 'data:,') {
511
            return null;
512
        } else {
513
            $data = str_replace("data:image/webp;base64", "", $url);
514
            return base64_decode($data);
515
        }
516
    }
517
518
    protected function img64Encode() {
519
        ob_start();
520
        imagewebp($this->rawImage, null, 100);
521
        $res = ob_get_contents();
522
        imagedestroy($this->rawImage);
523
        ob_end_clean();
524
        return "data:image/webp;base64," . base64_encode($res);
525
    }
526
527
    /**
528
     * [temp_imgName description]
529
     * @return [type] [description]
0 ignored issues
show
Documentation Bug introduced by
The doc comment [type] at position 0 could not be parsed: Unknown type name '[' at position 0 in [type].
Loading history...
530
     */
531
    protected function tempImgName() {
532
        return $this->temp_name = ++$this->temp_name;
533
    }
534
535
    protected function consumedTime($startTime) {
536
        return microtime(true) - $startTime;
537
    }
538
    
539
    protected function fps($startTime) {
540
        return (1.0/(microtime(true) - $startTime));
541
    }
542
543
    protected function imgInfo($img) {
544
        list($w, $h) = getimagesize($img);
545
        $info = pathinfo($img);
546
        return $this->imgInfo = (object) ['w' => $w, 'h' => $h, 'name' => $info['basename'], 'type' => $info['extension'], 'dir' => $info['dirname']];
547
    }
548
549
    protected function imgResizeGD($img, $w = 416, $h = 416) {
550
        $ratio_orig = $this->image->w / $this->image->h;
551
        if ($w / $h > $ratio_orig) {
552
            $w = $h * $ratio_orig;
553
        } else {
554
            $h = $w / $ratio_orig;
555
        }
556
557
        $image_p = imagecreatetruecolor($w, $h);
558
        $image = imagecreatefromjpeg($img);
559
        imagecopyresampled($image_p, $image, 0, 0, 0, 0, $w, $h, imagesx($img), imagesy($img));
560
        imagejpeg($image, __DIR__ . '/../temp/in/' . $this->tempImgName() . '.jpg', 100);
561
        imagedestroy($image_p);
562
        imagedestroy($image);
563
    }
564
565
    protected function truthLabel($box, $label, $bbcolor, $fncolor) {
566
        $strlen = strlen($label);
567
        $fw = $strlen * imagefontwidth(4);
568
        $fh = imagefontheight(4);
569
        imagefilledrectangle($this->rawImage, $box->x1 - 1, $box->y1 - $fh, $box->x1 + $fw, $box->y1, $this->color($bbcolor));
570
        imagerectangle($this->rawImage, $box->x1, $box->y1, $box->x2, $box->y2, $this->color($bbcolor));
571
        imagestring($this->rawImage, 4, $box->x1, $box->y1 - 16, $label, $this->color($fncolor));
572
        ;
573
    }
574
575
}
576