├── README.md ├── __pycache__ └── hand_tracker.cpython-36.pyc ├── data ├── anchors.csv └── test_img.jpg ├── detect_on_camera.py ├── gasture_utils ├── Finger.py ├── FingerCurled.py ├── FingerDataFormation.py ├── FingerPoseEstimate.py ├── FingerPosition.py ├── __pycache__ │ ├── Finger.cpython-36.pyc │ ├── FingerCurled.cpython-36.pyc │ ├── FingerDataFormation.cpython-36.pyc │ ├── FingerPoseEstimate.cpython-36.pyc │ ├── FingerPosition.cpython-36.pyc │ └── determine_gasture.cpython-36.pyc └── determine_gasture.py ├── hand_tracker.py ├── images └── show.png ├── models ├── mediapipe_hand_landmark.tflite └── palm_detection_without_custom_op.tflite └── requirements.txt /README.md: -------------------------------------------------------------------------------- 1 | # hand-keypoint-detect 2 | 3 | 直接在python中使用谷歌mediapipe的手关键点检测 4 | 5 | 直接调用电脑摄像头检测命令 6 | 7 | python detect_on_camera.py 8 | 9 | 10 | models文件夹中是检测用模型 11 | 12 | data文件夹中存放的是anchors配置文件 13 | 14 | gasture_utils是根据关键点设置一些规则进行手势分类,该方法不适用深度学习方式,可以在gasture_utils/determine_gastures.py自定义五根手指的指向弯曲程度设置新的手势 15 | 16 | 在电脑上检测效果没有mediapipe给的安卓apk效果好,应该是谷歌还用了一些别的方法进行优化,后面会持续优化更新,最终目标是做一个可靠的远距离手势检测来控制其他设备。 17 | 18 | 19 | 20 | 检测图像 21 | ![show detect image](https://github.com/ndkjing/hand-keypoint-detect/blob/master/images/show.png) 22 | 23 | 24 | 25 | ## 参考: 26 | 27 | [检测模型](https://github.com/google/mediapipe) 28 | -------------------------------------------------------------------------------- /__pycache__/hand_tracker.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/__pycache__/hand_tracker.cpython-36.pyc -------------------------------------------------------------------------------- /data/anchors.csv: -------------------------------------------------------------------------------- 1 | 0.015625,0.015625,1,1 2 | 0.015625,0.015625,1,1 3 | 0.046875,0.015625,1,1 4 | 0.046875,0.015625,1,1 5 | 0.078125,0.015625,1,1 6 | 0.078125,0.015625,1,1 7 | 0.109375,0.015625,1,1 8 | 0.109375,0.015625,1,1 9 | 0.140625,0.015625,1,1 10 | 0.140625,0.015625,1,1 11 | 0.171875,0.015625,1,1 12 | 0.171875,0.015625,1,1 13 | 0.203125,0.015625,1,1 14 | 0.203125,0.015625,1,1 15 | 0.234375,0.015625,1,1 16 | 0.234375,0.015625,1,1 17 | 0.265625,0.015625,1,1 18 | 0.265625,0.015625,1,1 19 | 0.296875,0.015625,1,1 20 | 0.296875,0.015625,1,1 21 | 0.328125,0.015625,1,1 22 | 0.328125,0.015625,1,1 23 | 0.359375,0.015625,1,1 24 | 0.359375,0.015625,1,1 25 | 0.390625,0.015625,1,1 26 | 0.390625,0.015625,1,1 27 | 0.421875,0.015625,1,1 28 | 0.421875,0.015625,1,1 29 | 0.453125,0.015625,1,1 30 | 0.453125,0.015625,1,1 31 | 0.484375,0.015625,1,1 32 | 0.484375,0.015625,1,1 33 | 0.515625,0.015625,1,1 34 | 0.515625,0.015625,1,1 35 | 0.546875,0.015625,1,1 36 | 0.546875,0.015625,1,1 37 | 0.578125,0.015625,1,1 38 | 0.578125,0.015625,1,1 39 | 0.609375,0.015625,1,1 40 | 0.609375,0.015625,1,1 41 | 0.640625,0.015625,1,1 42 | 0.640625,0.015625,1,1 43 | 0.671875,0.015625,1,1 44 | 0.671875,0.015625,1,1 45 | 0.703125,0.015625,1,1 46 | 0.703125,0.015625,1,1 47 | 0.734375,0.015625,1,1 48 | 0.734375,0.015625,1,1 49 | 0.765625,0.015625,1,1 50 | 0.765625,0.015625,1,1 51 | 0.796875,0.015625,1,1 52 | 0.796875,0.015625,1,1 53 | 0.828125,0.015625,1,1 54 | 0.828125,0.015625,1,1 55 | 0.859375,0.015625,1,1 56 | 0.859375,0.015625,1,1 57 | 0.890625,0.015625,1,1 58 | 0.890625,0.015625,1,1 59 | 0.921875,0.015625,1,1 60 | 0.921875,0.015625,1,1 61 | 0.953125,0.015625,1,1 62 | 0.953125,0.015625,1,1 63 | 0.984375,0.015625,1,1 64 | 0.984375,0.015625,1,1 65 | 0.015625,0.046875,1,1 66 | 0.015625,0.046875,1,1 67 | 0.046875,0.046875,1,1 68 | 0.046875,0.046875,1,1 69 | 0.078125,0.046875,1,1 70 | 0.078125,0.046875,1,1 71 | 0.109375,0.046875,1,1 72 | 0.109375,0.046875,1,1 73 | 0.140625,0.046875,1,1 74 | 0.140625,0.046875,1,1 75 | 0.171875,0.046875,1,1 76 | 0.171875,0.046875,1,1 77 | 0.203125,0.046875,1,1 78 | 0.203125,0.046875,1,1 79 | 0.234375,0.046875,1,1 80 | 0.234375,0.046875,1,1 81 | 0.265625,0.046875,1,1 82 | 0.265625,0.046875,1,1 83 | 0.296875,0.046875,1,1 84 | 0.296875,0.046875,1,1 85 | 0.328125,0.046875,1,1 86 | 0.328125,0.046875,1,1 87 | 0.359375,0.046875,1,1 88 | 0.359375,0.046875,1,1 89 | 0.390625,0.046875,1,1 90 | 0.390625,0.046875,1,1 91 | 0.421875,0.046875,1,1 92 | 0.421875,0.046875,1,1 93 | 0.453125,0.046875,1,1 94 | 0.453125,0.046875,1,1 95 | 0.484375,0.046875,1,1 96 | 0.484375,0.046875,1,1 97 | 0.515625,0.046875,1,1 98 | 0.515625,0.046875,1,1 99 | 0.546875,0.046875,1,1 100 | 0.546875,0.046875,1,1 101 | 0.578125,0.046875,1,1 102 | 0.578125,0.046875,1,1 103 | 0.609375,0.046875,1,1 104 | 0.609375,0.046875,1,1 105 | 0.640625,0.046875,1,1 106 | 0.640625,0.046875,1,1 107 | 0.671875,0.046875,1,1 108 | 0.671875,0.046875,1,1 109 | 0.703125,0.046875,1,1 110 | 0.703125,0.046875,1,1 111 | 0.734375,0.046875,1,1 112 | 0.734375,0.046875,1,1 113 | 0.765625,0.046875,1,1 114 | 0.765625,0.046875,1,1 115 | 0.796875,0.046875,1,1 116 | 0.796875,0.046875,1,1 117 | 0.828125,0.046875,1,1 118 | 0.828125,0.046875,1,1 119 | 0.859375,0.046875,1,1 120 | 0.859375,0.046875,1,1 121 | 0.890625,0.046875,1,1 122 | 0.890625,0.046875,1,1 123 | 0.921875,0.046875,1,1 124 | 0.921875,0.046875,1,1 125 | 0.953125,0.046875,1,1 126 | 0.953125,0.046875,1,1 127 | 0.984375,0.046875,1,1 128 | 0.984375,0.046875,1,1 129 | 0.015625,0.078125,1,1 130 | 0.015625,0.078125,1,1 131 | 0.046875,0.078125,1,1 132 | 0.046875,0.078125,1,1 133 | 0.078125,0.078125,1,1 134 | 0.078125,0.078125,1,1 135 | 0.109375,0.078125,1,1 136 | 0.109375,0.078125,1,1 137 | 0.140625,0.078125,1,1 138 | 0.140625,0.078125,1,1 139 | 0.171875,0.078125,1,1 140 | 0.171875,0.078125,1,1 141 | 0.203125,0.078125,1,1 142 | 0.203125,0.078125,1,1 143 | 0.234375,0.078125,1,1 144 | 0.234375,0.078125,1,1 145 | 0.265625,0.078125,1,1 146 | 0.265625,0.078125,1,1 147 | 0.296875,0.078125,1,1 148 | 0.296875,0.078125,1,1 149 | 0.328125,0.078125,1,1 150 | 0.328125,0.078125,1,1 151 | 0.359375,0.078125,1,1 152 | 0.359375,0.078125,1,1 153 | 0.390625,0.078125,1,1 154 | 0.390625,0.078125,1,1 155 | 0.421875,0.078125,1,1 156 | 0.421875,0.078125,1,1 157 | 0.453125,0.078125,1,1 158 | 0.453125,0.078125,1,1 159 | 0.484375,0.078125,1,1 160 | 0.484375,0.078125,1,1 161 | 0.515625,0.078125,1,1 162 | 0.515625,0.078125,1,1 163 | 0.546875,0.078125,1,1 164 | 0.546875,0.078125,1,1 165 | 0.578125,0.078125,1,1 166 | 0.578125,0.078125,1,1 167 | 0.609375,0.078125,1,1 168 | 0.609375,0.078125,1,1 169 | 0.640625,0.078125,1,1 170 | 0.640625,0.078125,1,1 171 | 0.671875,0.078125,1,1 172 | 0.671875,0.078125,1,1 173 | 0.703125,0.078125,1,1 174 | 0.703125,0.078125,1,1 175 | 0.734375,0.078125,1,1 176 | 0.734375,0.078125,1,1 177 | 0.765625,0.078125,1,1 178 | 0.765625,0.078125,1,1 179 | 0.796875,0.078125,1,1 180 | 0.796875,0.078125,1,1 181 | 0.828125,0.078125,1,1 182 | 0.828125,0.078125,1,1 183 | 0.859375,0.078125,1,1 184 | 0.859375,0.078125,1,1 185 | 0.890625,0.078125,1,1 186 | 0.890625,0.078125,1,1 187 | 0.921875,0.078125,1,1 188 | 0.921875,0.078125,1,1 189 | 0.953125,0.078125,1,1 190 | 0.953125,0.078125,1,1 191 | 0.984375,0.078125,1,1 192 | 0.984375,0.078125,1,1 193 | 0.015625,0.109375,1,1 194 | 0.015625,0.109375,1,1 195 | 0.046875,0.109375,1,1 196 | 0.046875,0.109375,1,1 197 | 0.078125,0.109375,1,1 198 | 0.078125,0.109375,1,1 199 | 0.109375,0.109375,1,1 200 | 0.109375,0.109375,1,1 201 | 0.140625,0.109375,1,1 202 | 0.140625,0.109375,1,1 203 | 0.171875,0.109375,1,1 204 | 0.171875,0.109375,1,1 205 | 0.203125,0.109375,1,1 206 | 0.203125,0.109375,1,1 207 | 0.234375,0.109375,1,1 208 | 0.234375,0.109375,1,1 209 | 0.265625,0.109375,1,1 210 | 0.265625,0.109375,1,1 211 | 0.296875,0.109375,1,1 212 | 0.296875,0.109375,1,1 213 | 0.328125,0.109375,1,1 214 | 0.328125,0.109375,1,1 215 | 0.359375,0.109375,1,1 216 | 0.359375,0.109375,1,1 217 | 0.390625,0.109375,1,1 218 | 0.390625,0.109375,1,1 219 | 0.421875,0.109375,1,1 220 | 0.421875,0.109375,1,1 221 | 0.453125,0.109375,1,1 222 | 0.453125,0.109375,1,1 223 | 0.484375,0.109375,1,1 224 | 0.484375,0.109375,1,1 225 | 0.515625,0.109375,1,1 226 | 0.515625,0.109375,1,1 227 | 0.546875,0.109375,1,1 228 | 0.546875,0.109375,1,1 229 | 0.578125,0.109375,1,1 230 | 0.578125,0.109375,1,1 231 | 0.609375,0.109375,1,1 232 | 0.609375,0.109375,1,1 233 | 0.640625,0.109375,1,1 234 | 0.640625,0.109375,1,1 235 | 0.671875,0.109375,1,1 236 | 0.671875,0.109375,1,1 237 | 0.703125,0.109375,1,1 238 | 0.703125,0.109375,1,1 239 | 0.734375,0.109375,1,1 240 | 0.734375,0.109375,1,1 241 | 0.765625,0.109375,1,1 242 | 0.765625,0.109375,1,1 243 | 0.796875,0.109375,1,1 244 | 0.796875,0.109375,1,1 245 | 0.828125,0.109375,1,1 246 | 0.828125,0.109375,1,1 247 | 0.859375,0.109375,1,1 248 | 0.859375,0.109375,1,1 249 | 0.890625,0.109375,1,1 250 | 0.890625,0.109375,1,1 251 | 0.921875,0.109375,1,1 252 | 0.921875,0.109375,1,1 253 | 0.953125,0.109375,1,1 254 | 0.953125,0.109375,1,1 255 | 0.984375,0.109375,1,1 256 | 0.984375,0.109375,1,1 257 | 0.015625,0.140625,1,1 258 | 0.015625,0.140625,1,1 259 | 0.046875,0.140625,1,1 260 | 0.046875,0.140625,1,1 261 | 0.078125,0.140625,1,1 262 | 0.078125,0.140625,1,1 263 | 0.109375,0.140625,1,1 264 | 0.109375,0.140625,1,1 265 | 0.140625,0.140625,1,1 266 | 0.140625,0.140625,1,1 267 | 0.171875,0.140625,1,1 268 | 0.171875,0.140625,1,1 269 | 0.203125,0.140625,1,1 270 | 0.203125,0.140625,1,1 271 | 0.234375,0.140625,1,1 272 | 0.234375,0.140625,1,1 273 | 0.265625,0.140625,1,1 274 | 0.265625,0.140625,1,1 275 | 0.296875,0.140625,1,1 276 | 0.296875,0.140625,1,1 277 | 0.328125,0.140625,1,1 278 | 0.328125,0.140625,1,1 279 | 0.359375,0.140625,1,1 280 | 0.359375,0.140625,1,1 281 | 0.390625,0.140625,1,1 282 | 0.390625,0.140625,1,1 283 | 0.421875,0.140625,1,1 284 | 0.421875,0.140625,1,1 285 | 0.453125,0.140625,1,1 286 | 0.453125,0.140625,1,1 287 | 0.484375,0.140625,1,1 288 | 0.484375,0.140625,1,1 289 | 0.515625,0.140625,1,1 290 | 0.515625,0.140625,1,1 291 | 0.546875,0.140625,1,1 292 | 0.546875,0.140625,1,1 293 | 0.578125,0.140625,1,1 294 | 0.578125,0.140625,1,1 295 | 0.609375,0.140625,1,1 296 | 0.609375,0.140625,1,1 297 | 0.640625,0.140625,1,1 298 | 0.640625,0.140625,1,1 299 | 0.671875,0.140625,1,1 300 | 0.671875,0.140625,1,1 301 | 0.703125,0.140625,1,1 302 | 0.703125,0.140625,1,1 303 | 0.734375,0.140625,1,1 304 | 0.734375,0.140625,1,1 305 | 0.765625,0.140625,1,1 306 | 0.765625,0.140625,1,1 307 | 0.796875,0.140625,1,1 308 | 0.796875,0.140625,1,1 309 | 0.828125,0.140625,1,1 310 | 0.828125,0.140625,1,1 311 | 0.859375,0.140625,1,1 312 | 0.859375,0.140625,1,1 313 | 0.890625,0.140625,1,1 314 | 0.890625,0.140625,1,1 315 | 0.921875,0.140625,1,1 316 | 0.921875,0.140625,1,1 317 | 0.953125,0.140625,1,1 318 | 0.953125,0.140625,1,1 319 | 0.984375,0.140625,1,1 320 | 0.984375,0.140625,1,1 321 | 0.015625,0.171875,1,1 322 | 0.015625,0.171875,1,1 323 | 0.046875,0.171875,1,1 324 | 0.046875,0.171875,1,1 325 | 0.078125,0.171875,1,1 326 | 0.078125,0.171875,1,1 327 | 0.109375,0.171875,1,1 328 | 0.109375,0.171875,1,1 329 | 0.140625,0.171875,1,1 330 | 0.140625,0.171875,1,1 331 | 0.171875,0.171875,1,1 332 | 0.171875,0.171875,1,1 333 | 0.203125,0.171875,1,1 334 | 0.203125,0.171875,1,1 335 | 0.234375,0.171875,1,1 336 | 0.234375,0.171875,1,1 337 | 0.265625,0.171875,1,1 338 | 0.265625,0.171875,1,1 339 | 0.296875,0.171875,1,1 340 | 0.296875,0.171875,1,1 341 | 0.328125,0.171875,1,1 342 | 0.328125,0.171875,1,1 343 | 0.359375,0.171875,1,1 344 | 0.359375,0.171875,1,1 345 | 0.390625,0.171875,1,1 346 | 0.390625,0.171875,1,1 347 | 0.421875,0.171875,1,1 348 | 0.421875,0.171875,1,1 349 | 0.453125,0.171875,1,1 350 | 0.453125,0.171875,1,1 351 | 0.484375,0.171875,1,1 352 | 0.484375,0.171875,1,1 353 | 0.515625,0.171875,1,1 354 | 0.515625,0.171875,1,1 355 | 0.546875,0.171875,1,1 356 | 0.546875,0.171875,1,1 357 | 0.578125,0.171875,1,1 358 | 0.578125,0.171875,1,1 359 | 0.609375,0.171875,1,1 360 | 0.609375,0.171875,1,1 361 | 0.640625,0.171875,1,1 362 | 0.640625,0.171875,1,1 363 | 0.671875,0.171875,1,1 364 | 0.671875,0.171875,1,1 365 | 0.703125,0.171875,1,1 366 | 0.703125,0.171875,1,1 367 | 0.734375,0.171875,1,1 368 | 0.734375,0.171875,1,1 369 | 0.765625,0.171875,1,1 370 | 0.765625,0.171875,1,1 371 | 0.796875,0.171875,1,1 372 | 0.796875,0.171875,1,1 373 | 0.828125,0.171875,1,1 374 | 0.828125,0.171875,1,1 375 | 0.859375,0.171875,1,1 376 | 0.859375,0.171875,1,1 377 | 0.890625,0.171875,1,1 378 | 0.890625,0.171875,1,1 379 | 0.921875,0.171875,1,1 380 | 0.921875,0.171875,1,1 381 | 0.953125,0.171875,1,1 382 | 0.953125,0.171875,1,1 383 | 0.984375,0.171875,1,1 384 | 0.984375,0.171875,1,1 385 | 0.015625,0.203125,1,1 386 | 0.015625,0.203125,1,1 387 | 0.046875,0.203125,1,1 388 | 0.046875,0.203125,1,1 389 | 0.078125,0.203125,1,1 390 | 0.078125,0.203125,1,1 391 | 0.109375,0.203125,1,1 392 | 0.109375,0.203125,1,1 393 | 0.140625,0.203125,1,1 394 | 0.140625,0.203125,1,1 395 | 0.171875,0.203125,1,1 396 | 0.171875,0.203125,1,1 397 | 0.203125,0.203125,1,1 398 | 0.203125,0.203125,1,1 399 | 0.234375,0.203125,1,1 400 | 0.234375,0.203125,1,1 401 | 0.265625,0.203125,1,1 402 | 0.265625,0.203125,1,1 403 | 0.296875,0.203125,1,1 404 | 0.296875,0.203125,1,1 405 | 0.328125,0.203125,1,1 406 | 0.328125,0.203125,1,1 407 | 0.359375,0.203125,1,1 408 | 0.359375,0.203125,1,1 409 | 0.390625,0.203125,1,1 410 | 0.390625,0.203125,1,1 411 | 0.421875,0.203125,1,1 412 | 0.421875,0.203125,1,1 413 | 0.453125,0.203125,1,1 414 | 0.453125,0.203125,1,1 415 | 0.484375,0.203125,1,1 416 | 0.484375,0.203125,1,1 417 | 0.515625,0.203125,1,1 418 | 0.515625,0.203125,1,1 419 | 0.546875,0.203125,1,1 420 | 0.546875,0.203125,1,1 421 | 0.578125,0.203125,1,1 422 | 0.578125,0.203125,1,1 423 | 0.609375,0.203125,1,1 424 | 0.609375,0.203125,1,1 425 | 0.640625,0.203125,1,1 426 | 0.640625,0.203125,1,1 427 | 0.671875,0.203125,1,1 428 | 0.671875,0.203125,1,1 429 | 0.703125,0.203125,1,1 430 | 0.703125,0.203125,1,1 431 | 0.734375,0.203125,1,1 432 | 0.734375,0.203125,1,1 433 | 0.765625,0.203125,1,1 434 | 0.765625,0.203125,1,1 435 | 0.796875,0.203125,1,1 436 | 0.796875,0.203125,1,1 437 | 0.828125,0.203125,1,1 438 | 0.828125,0.203125,1,1 439 | 0.859375,0.203125,1,1 440 | 0.859375,0.203125,1,1 441 | 0.890625,0.203125,1,1 442 | 0.890625,0.203125,1,1 443 | 0.921875,0.203125,1,1 444 | 0.921875,0.203125,1,1 445 | 0.953125,0.203125,1,1 446 | 0.953125,0.203125,1,1 447 | 0.984375,0.203125,1,1 448 | 0.984375,0.203125,1,1 449 | 0.015625,0.234375,1,1 450 | 0.015625,0.234375,1,1 451 | 0.046875,0.234375,1,1 452 | 0.046875,0.234375,1,1 453 | 0.078125,0.234375,1,1 454 | 0.078125,0.234375,1,1 455 | 0.109375,0.234375,1,1 456 | 0.109375,0.234375,1,1 457 | 0.140625,0.234375,1,1 458 | 0.140625,0.234375,1,1 459 | 0.171875,0.234375,1,1 460 | 0.171875,0.234375,1,1 461 | 0.203125,0.234375,1,1 462 | 0.203125,0.234375,1,1 463 | 0.234375,0.234375,1,1 464 | 0.234375,0.234375,1,1 465 | 0.265625,0.234375,1,1 466 | 0.265625,0.234375,1,1 467 | 0.296875,0.234375,1,1 468 | 0.296875,0.234375,1,1 469 | 0.328125,0.234375,1,1 470 | 0.328125,0.234375,1,1 471 | 0.359375,0.234375,1,1 472 | 0.359375,0.234375,1,1 473 | 0.390625,0.234375,1,1 474 | 0.390625,0.234375,1,1 475 | 0.421875,0.234375,1,1 476 | 0.421875,0.234375,1,1 477 | 0.453125,0.234375,1,1 478 | 0.453125,0.234375,1,1 479 | 0.484375,0.234375,1,1 480 | 0.484375,0.234375,1,1 481 | 0.515625,0.234375,1,1 482 | 0.515625,0.234375,1,1 483 | 0.546875,0.234375,1,1 484 | 0.546875,0.234375,1,1 485 | 0.578125,0.234375,1,1 486 | 0.578125,0.234375,1,1 487 | 0.609375,0.234375,1,1 488 | 0.609375,0.234375,1,1 489 | 0.640625,0.234375,1,1 490 | 0.640625,0.234375,1,1 491 | 0.671875,0.234375,1,1 492 | 0.671875,0.234375,1,1 493 | 0.703125,0.234375,1,1 494 | 0.703125,0.234375,1,1 495 | 0.734375,0.234375,1,1 496 | 0.734375,0.234375,1,1 497 | 0.765625,0.234375,1,1 498 | 0.765625,0.234375,1,1 499 | 0.796875,0.234375,1,1 500 | 0.796875,0.234375,1,1 501 | 0.828125,0.234375,1,1 502 | 0.828125,0.234375,1,1 503 | 0.859375,0.234375,1,1 504 | 0.859375,0.234375,1,1 505 | 0.890625,0.234375,1,1 506 | 0.890625,0.234375,1,1 507 | 0.921875,0.234375,1,1 508 | 0.921875,0.234375,1,1 509 | 0.953125,0.234375,1,1 510 | 0.953125,0.234375,1,1 511 | 0.984375,0.234375,1,1 512 | 0.984375,0.234375,1,1 513 | 0.015625,0.265625,1,1 514 | 0.015625,0.265625,1,1 515 | 0.046875,0.265625,1,1 516 | 0.046875,0.265625,1,1 517 | 0.078125,0.265625,1,1 518 | 0.078125,0.265625,1,1 519 | 0.109375,0.265625,1,1 520 | 0.109375,0.265625,1,1 521 | 0.140625,0.265625,1,1 522 | 0.140625,0.265625,1,1 523 | 0.171875,0.265625,1,1 524 | 0.171875,0.265625,1,1 525 | 0.203125,0.265625,1,1 526 | 0.203125,0.265625,1,1 527 | 0.234375,0.265625,1,1 528 | 0.234375,0.265625,1,1 529 | 0.265625,0.265625,1,1 530 | 0.265625,0.265625,1,1 531 | 0.296875,0.265625,1,1 532 | 0.296875,0.265625,1,1 533 | 0.328125,0.265625,1,1 534 | 0.328125,0.265625,1,1 535 | 0.359375,0.265625,1,1 536 | 0.359375,0.265625,1,1 537 | 0.390625,0.265625,1,1 538 | 0.390625,0.265625,1,1 539 | 0.421875,0.265625,1,1 540 | 0.421875,0.265625,1,1 541 | 0.453125,0.265625,1,1 542 | 0.453125,0.265625,1,1 543 | 0.484375,0.265625,1,1 544 | 0.484375,0.265625,1,1 545 | 0.515625,0.265625,1,1 546 | 0.515625,0.265625,1,1 547 | 0.546875,0.265625,1,1 548 | 0.546875,0.265625,1,1 549 | 0.578125,0.265625,1,1 550 | 0.578125,0.265625,1,1 551 | 0.609375,0.265625,1,1 552 | 0.609375,0.265625,1,1 553 | 0.640625,0.265625,1,1 554 | 0.640625,0.265625,1,1 555 | 0.671875,0.265625,1,1 556 | 0.671875,0.265625,1,1 557 | 0.703125,0.265625,1,1 558 | 0.703125,0.265625,1,1 559 | 0.734375,0.265625,1,1 560 | 0.734375,0.265625,1,1 561 | 0.765625,0.265625,1,1 562 | 0.765625,0.265625,1,1 563 | 0.796875,0.265625,1,1 564 | 0.796875,0.265625,1,1 565 | 0.828125,0.265625,1,1 566 | 0.828125,0.265625,1,1 567 | 0.859375,0.265625,1,1 568 | 0.859375,0.265625,1,1 569 | 0.890625,0.265625,1,1 570 | 0.890625,0.265625,1,1 571 | 0.921875,0.265625,1,1 572 | 0.921875,0.265625,1,1 573 | 0.953125,0.265625,1,1 574 | 0.953125,0.265625,1,1 575 | 0.984375,0.265625,1,1 576 | 0.984375,0.265625,1,1 577 | 0.015625,0.296875,1,1 578 | 0.015625,0.296875,1,1 579 | 0.046875,0.296875,1,1 580 | 0.046875,0.296875,1,1 581 | 0.078125,0.296875,1,1 582 | 0.078125,0.296875,1,1 583 | 0.109375,0.296875,1,1 584 | 0.109375,0.296875,1,1 585 | 0.140625,0.296875,1,1 586 | 0.140625,0.296875,1,1 587 | 0.171875,0.296875,1,1 588 | 0.171875,0.296875,1,1 589 | 0.203125,0.296875,1,1 590 | 0.203125,0.296875,1,1 591 | 0.234375,0.296875,1,1 592 | 0.234375,0.296875,1,1 593 | 0.265625,0.296875,1,1 594 | 0.265625,0.296875,1,1 595 | 0.296875,0.296875,1,1 596 | 0.296875,0.296875,1,1 597 | 0.328125,0.296875,1,1 598 | 0.328125,0.296875,1,1 599 | 0.359375,0.296875,1,1 600 | 0.359375,0.296875,1,1 601 | 0.390625,0.296875,1,1 602 | 0.390625,0.296875,1,1 603 | 0.421875,0.296875,1,1 604 | 0.421875,0.296875,1,1 605 | 0.453125,0.296875,1,1 606 | 0.453125,0.296875,1,1 607 | 0.484375,0.296875,1,1 608 | 0.484375,0.296875,1,1 609 | 0.515625,0.296875,1,1 610 | 0.515625,0.296875,1,1 611 | 0.546875,0.296875,1,1 612 | 0.546875,0.296875,1,1 613 | 0.578125,0.296875,1,1 614 | 0.578125,0.296875,1,1 615 | 0.609375,0.296875,1,1 616 | 0.609375,0.296875,1,1 617 | 0.640625,0.296875,1,1 618 | 0.640625,0.296875,1,1 619 | 0.671875,0.296875,1,1 620 | 0.671875,0.296875,1,1 621 | 0.703125,0.296875,1,1 622 | 0.703125,0.296875,1,1 623 | 0.734375,0.296875,1,1 624 | 0.734375,0.296875,1,1 625 | 0.765625,0.296875,1,1 626 | 0.765625,0.296875,1,1 627 | 0.796875,0.296875,1,1 628 | 0.796875,0.296875,1,1 629 | 0.828125,0.296875,1,1 630 | 0.828125,0.296875,1,1 631 | 0.859375,0.296875,1,1 632 | 0.859375,0.296875,1,1 633 | 0.890625,0.296875,1,1 634 | 0.890625,0.296875,1,1 635 | 0.921875,0.296875,1,1 636 | 0.921875,0.296875,1,1 637 | 0.953125,0.296875,1,1 638 | 0.953125,0.296875,1,1 639 | 0.984375,0.296875,1,1 640 | 0.984375,0.296875,1,1 641 | 0.015625,0.328125,1,1 642 | 0.015625,0.328125,1,1 643 | 0.046875,0.328125,1,1 644 | 0.046875,0.328125,1,1 645 | 0.078125,0.328125,1,1 646 | 0.078125,0.328125,1,1 647 | 0.109375,0.328125,1,1 648 | 0.109375,0.328125,1,1 649 | 0.140625,0.328125,1,1 650 | 0.140625,0.328125,1,1 651 | 0.171875,0.328125,1,1 652 | 0.171875,0.328125,1,1 653 | 0.203125,0.328125,1,1 654 | 0.203125,0.328125,1,1 655 | 0.234375,0.328125,1,1 656 | 0.234375,0.328125,1,1 657 | 0.265625,0.328125,1,1 658 | 0.265625,0.328125,1,1 659 | 0.296875,0.328125,1,1 660 | 0.296875,0.328125,1,1 661 | 0.328125,0.328125,1,1 662 | 0.328125,0.328125,1,1 663 | 0.359375,0.328125,1,1 664 | 0.359375,0.328125,1,1 665 | 0.390625,0.328125,1,1 666 | 0.390625,0.328125,1,1 667 | 0.421875,0.328125,1,1 668 | 0.421875,0.328125,1,1 669 | 0.453125,0.328125,1,1 670 | 0.453125,0.328125,1,1 671 | 0.484375,0.328125,1,1 672 | 0.484375,0.328125,1,1 673 | 0.515625,0.328125,1,1 674 | 0.515625,0.328125,1,1 675 | 0.546875,0.328125,1,1 676 | 0.546875,0.328125,1,1 677 | 0.578125,0.328125,1,1 678 | 0.578125,0.328125,1,1 679 | 0.609375,0.328125,1,1 680 | 0.609375,0.328125,1,1 681 | 0.640625,0.328125,1,1 682 | 0.640625,0.328125,1,1 683 | 0.671875,0.328125,1,1 684 | 0.671875,0.328125,1,1 685 | 0.703125,0.328125,1,1 686 | 0.703125,0.328125,1,1 687 | 0.734375,0.328125,1,1 688 | 0.734375,0.328125,1,1 689 | 0.765625,0.328125,1,1 690 | 0.765625,0.328125,1,1 691 | 0.796875,0.328125,1,1 692 | 0.796875,0.328125,1,1 693 | 0.828125,0.328125,1,1 694 | 0.828125,0.328125,1,1 695 | 0.859375,0.328125,1,1 696 | 0.859375,0.328125,1,1 697 | 0.890625,0.328125,1,1 698 | 0.890625,0.328125,1,1 699 | 0.921875,0.328125,1,1 700 | 0.921875,0.328125,1,1 701 | 0.953125,0.328125,1,1 702 | 0.953125,0.328125,1,1 703 | 0.984375,0.328125,1,1 704 | 0.984375,0.328125,1,1 705 | 0.015625,0.359375,1,1 706 | 0.015625,0.359375,1,1 707 | 0.046875,0.359375,1,1 708 | 0.046875,0.359375,1,1 709 | 0.078125,0.359375,1,1 710 | 0.078125,0.359375,1,1 711 | 0.109375,0.359375,1,1 712 | 0.109375,0.359375,1,1 713 | 0.140625,0.359375,1,1 714 | 0.140625,0.359375,1,1 715 | 0.171875,0.359375,1,1 716 | 0.171875,0.359375,1,1 717 | 0.203125,0.359375,1,1 718 | 0.203125,0.359375,1,1 719 | 0.234375,0.359375,1,1 720 | 0.234375,0.359375,1,1 721 | 0.265625,0.359375,1,1 722 | 0.265625,0.359375,1,1 723 | 0.296875,0.359375,1,1 724 | 0.296875,0.359375,1,1 725 | 0.328125,0.359375,1,1 726 | 0.328125,0.359375,1,1 727 | 0.359375,0.359375,1,1 728 | 0.359375,0.359375,1,1 729 | 0.390625,0.359375,1,1 730 | 0.390625,0.359375,1,1 731 | 0.421875,0.359375,1,1 732 | 0.421875,0.359375,1,1 733 | 0.453125,0.359375,1,1 734 | 0.453125,0.359375,1,1 735 | 0.484375,0.359375,1,1 736 | 0.484375,0.359375,1,1 737 | 0.515625,0.359375,1,1 738 | 0.515625,0.359375,1,1 739 | 0.546875,0.359375,1,1 740 | 0.546875,0.359375,1,1 741 | 0.578125,0.359375,1,1 742 | 0.578125,0.359375,1,1 743 | 0.609375,0.359375,1,1 744 | 0.609375,0.359375,1,1 745 | 0.640625,0.359375,1,1 746 | 0.640625,0.359375,1,1 747 | 0.671875,0.359375,1,1 748 | 0.671875,0.359375,1,1 749 | 0.703125,0.359375,1,1 750 | 0.703125,0.359375,1,1 751 | 0.734375,0.359375,1,1 752 | 0.734375,0.359375,1,1 753 | 0.765625,0.359375,1,1 754 | 0.765625,0.359375,1,1 755 | 0.796875,0.359375,1,1 756 | 0.796875,0.359375,1,1 757 | 0.828125,0.359375,1,1 758 | 0.828125,0.359375,1,1 759 | 0.859375,0.359375,1,1 760 | 0.859375,0.359375,1,1 761 | 0.890625,0.359375,1,1 762 | 0.890625,0.359375,1,1 763 | 0.921875,0.359375,1,1 764 | 0.921875,0.359375,1,1 765 | 0.953125,0.359375,1,1 766 | 0.953125,0.359375,1,1 767 | 0.984375,0.359375,1,1 768 | 0.984375,0.359375,1,1 769 | 0.015625,0.390625,1,1 770 | 0.015625,0.390625,1,1 771 | 0.046875,0.390625,1,1 772 | 0.046875,0.390625,1,1 773 | 0.078125,0.390625,1,1 774 | 0.078125,0.390625,1,1 775 | 0.109375,0.390625,1,1 776 | 0.109375,0.390625,1,1 777 | 0.140625,0.390625,1,1 778 | 0.140625,0.390625,1,1 779 | 0.171875,0.390625,1,1 780 | 0.171875,0.390625,1,1 781 | 0.203125,0.390625,1,1 782 | 0.203125,0.390625,1,1 783 | 0.234375,0.390625,1,1 784 | 0.234375,0.390625,1,1 785 | 0.265625,0.390625,1,1 786 | 0.265625,0.390625,1,1 787 | 0.296875,0.390625,1,1 788 | 0.296875,0.390625,1,1 789 | 0.328125,0.390625,1,1 790 | 0.328125,0.390625,1,1 791 | 0.359375,0.390625,1,1 792 | 0.359375,0.390625,1,1 793 | 0.390625,0.390625,1,1 794 | 0.390625,0.390625,1,1 795 | 0.421875,0.390625,1,1 796 | 0.421875,0.390625,1,1 797 | 0.453125,0.390625,1,1 798 | 0.453125,0.390625,1,1 799 | 0.484375,0.390625,1,1 800 | 0.484375,0.390625,1,1 801 | 0.515625,0.390625,1,1 802 | 0.515625,0.390625,1,1 803 | 0.546875,0.390625,1,1 804 | 0.546875,0.390625,1,1 805 | 0.578125,0.390625,1,1 806 | 0.578125,0.390625,1,1 807 | 0.609375,0.390625,1,1 808 | 0.609375,0.390625,1,1 809 | 0.640625,0.390625,1,1 810 | 0.640625,0.390625,1,1 811 | 0.671875,0.390625,1,1 812 | 0.671875,0.390625,1,1 813 | 0.703125,0.390625,1,1 814 | 0.703125,0.390625,1,1 815 | 0.734375,0.390625,1,1 816 | 0.734375,0.390625,1,1 817 | 0.765625,0.390625,1,1 818 | 0.765625,0.390625,1,1 819 | 0.796875,0.390625,1,1 820 | 0.796875,0.390625,1,1 821 | 0.828125,0.390625,1,1 822 | 0.828125,0.390625,1,1 823 | 0.859375,0.390625,1,1 824 | 0.859375,0.390625,1,1 825 | 0.890625,0.390625,1,1 826 | 0.890625,0.390625,1,1 827 | 0.921875,0.390625,1,1 828 | 0.921875,0.390625,1,1 829 | 0.953125,0.390625,1,1 830 | 0.953125,0.390625,1,1 831 | 0.984375,0.390625,1,1 832 | 0.984375,0.390625,1,1 833 | 0.015625,0.421875,1,1 834 | 0.015625,0.421875,1,1 835 | 0.046875,0.421875,1,1 836 | 0.046875,0.421875,1,1 837 | 0.078125,0.421875,1,1 838 | 0.078125,0.421875,1,1 839 | 0.109375,0.421875,1,1 840 | 0.109375,0.421875,1,1 841 | 0.140625,0.421875,1,1 842 | 0.140625,0.421875,1,1 843 | 0.171875,0.421875,1,1 844 | 0.171875,0.421875,1,1 845 | 0.203125,0.421875,1,1 846 | 0.203125,0.421875,1,1 847 | 0.234375,0.421875,1,1 848 | 0.234375,0.421875,1,1 849 | 0.265625,0.421875,1,1 850 | 0.265625,0.421875,1,1 851 | 0.296875,0.421875,1,1 852 | 0.296875,0.421875,1,1 853 | 0.328125,0.421875,1,1 854 | 0.328125,0.421875,1,1 855 | 0.359375,0.421875,1,1 856 | 0.359375,0.421875,1,1 857 | 0.390625,0.421875,1,1 858 | 0.390625,0.421875,1,1 859 | 0.421875,0.421875,1,1 860 | 0.421875,0.421875,1,1 861 | 0.453125,0.421875,1,1 862 | 0.453125,0.421875,1,1 863 | 0.484375,0.421875,1,1 864 | 0.484375,0.421875,1,1 865 | 0.515625,0.421875,1,1 866 | 0.515625,0.421875,1,1 867 | 0.546875,0.421875,1,1 868 | 0.546875,0.421875,1,1 869 | 0.578125,0.421875,1,1 870 | 0.578125,0.421875,1,1 871 | 0.609375,0.421875,1,1 872 | 0.609375,0.421875,1,1 873 | 0.640625,0.421875,1,1 874 | 0.640625,0.421875,1,1 875 | 0.671875,0.421875,1,1 876 | 0.671875,0.421875,1,1 877 | 0.703125,0.421875,1,1 878 | 0.703125,0.421875,1,1 879 | 0.734375,0.421875,1,1 880 | 0.734375,0.421875,1,1 881 | 0.765625,0.421875,1,1 882 | 0.765625,0.421875,1,1 883 | 0.796875,0.421875,1,1 884 | 0.796875,0.421875,1,1 885 | 0.828125,0.421875,1,1 886 | 0.828125,0.421875,1,1 887 | 0.859375,0.421875,1,1 888 | 0.859375,0.421875,1,1 889 | 0.890625,0.421875,1,1 890 | 0.890625,0.421875,1,1 891 | 0.921875,0.421875,1,1 892 | 0.921875,0.421875,1,1 893 | 0.953125,0.421875,1,1 894 | 0.953125,0.421875,1,1 895 | 0.984375,0.421875,1,1 896 | 0.984375,0.421875,1,1 897 | 0.015625,0.453125,1,1 898 | 0.015625,0.453125,1,1 899 | 0.046875,0.453125,1,1 900 | 0.046875,0.453125,1,1 901 | 0.078125,0.453125,1,1 902 | 0.078125,0.453125,1,1 903 | 0.109375,0.453125,1,1 904 | 0.109375,0.453125,1,1 905 | 0.140625,0.453125,1,1 906 | 0.140625,0.453125,1,1 907 | 0.171875,0.453125,1,1 908 | 0.171875,0.453125,1,1 909 | 0.203125,0.453125,1,1 910 | 0.203125,0.453125,1,1 911 | 0.234375,0.453125,1,1 912 | 0.234375,0.453125,1,1 913 | 0.265625,0.453125,1,1 914 | 0.265625,0.453125,1,1 915 | 0.296875,0.453125,1,1 916 | 0.296875,0.453125,1,1 917 | 0.328125,0.453125,1,1 918 | 0.328125,0.453125,1,1 919 | 0.359375,0.453125,1,1 920 | 0.359375,0.453125,1,1 921 | 0.390625,0.453125,1,1 922 | 0.390625,0.453125,1,1 923 | 0.421875,0.453125,1,1 924 | 0.421875,0.453125,1,1 925 | 0.453125,0.453125,1,1 926 | 0.453125,0.453125,1,1 927 | 0.484375,0.453125,1,1 928 | 0.484375,0.453125,1,1 929 | 0.515625,0.453125,1,1 930 | 0.515625,0.453125,1,1 931 | 0.546875,0.453125,1,1 932 | 0.546875,0.453125,1,1 933 | 0.578125,0.453125,1,1 934 | 0.578125,0.453125,1,1 935 | 0.609375,0.453125,1,1 936 | 0.609375,0.453125,1,1 937 | 0.640625,0.453125,1,1 938 | 0.640625,0.453125,1,1 939 | 0.671875,0.453125,1,1 940 | 0.671875,0.453125,1,1 941 | 0.703125,0.453125,1,1 942 | 0.703125,0.453125,1,1 943 | 0.734375,0.453125,1,1 944 | 0.734375,0.453125,1,1 945 | 0.765625,0.453125,1,1 946 | 0.765625,0.453125,1,1 947 | 0.796875,0.453125,1,1 948 | 0.796875,0.453125,1,1 949 | 0.828125,0.453125,1,1 950 | 0.828125,0.453125,1,1 951 | 0.859375,0.453125,1,1 952 | 0.859375,0.453125,1,1 953 | 0.890625,0.453125,1,1 954 | 0.890625,0.453125,1,1 955 | 0.921875,0.453125,1,1 956 | 0.921875,0.453125,1,1 957 | 0.953125,0.453125,1,1 958 | 0.953125,0.453125,1,1 959 | 0.984375,0.453125,1,1 960 | 0.984375,0.453125,1,1 961 | 0.015625,0.484375,1,1 962 | 0.015625,0.484375,1,1 963 | 0.046875,0.484375,1,1 964 | 0.046875,0.484375,1,1 965 | 0.078125,0.484375,1,1 966 | 0.078125,0.484375,1,1 967 | 0.109375,0.484375,1,1 968 | 0.109375,0.484375,1,1 969 | 0.140625,0.484375,1,1 970 | 0.140625,0.484375,1,1 971 | 0.171875,0.484375,1,1 972 | 0.171875,0.484375,1,1 973 | 0.203125,0.484375,1,1 974 | 0.203125,0.484375,1,1 975 | 0.234375,0.484375,1,1 976 | 0.234375,0.484375,1,1 977 | 0.265625,0.484375,1,1 978 | 0.265625,0.484375,1,1 979 | 0.296875,0.484375,1,1 980 | 0.296875,0.484375,1,1 981 | 0.328125,0.484375,1,1 982 | 0.328125,0.484375,1,1 983 | 0.359375,0.484375,1,1 984 | 0.359375,0.484375,1,1 985 | 0.390625,0.484375,1,1 986 | 0.390625,0.484375,1,1 987 | 0.421875,0.484375,1,1 988 | 0.421875,0.484375,1,1 989 | 0.453125,0.484375,1,1 990 | 0.453125,0.484375,1,1 991 | 0.484375,0.484375,1,1 992 | 0.484375,0.484375,1,1 993 | 0.515625,0.484375,1,1 994 | 0.515625,0.484375,1,1 995 | 0.546875,0.484375,1,1 996 | 0.546875,0.484375,1,1 997 | 0.578125,0.484375,1,1 998 | 0.578125,0.484375,1,1 999 | 0.609375,0.484375,1,1 1000 | 0.609375,0.484375,1,1 1001 | 0.640625,0.484375,1,1 1002 | 0.640625,0.484375,1,1 1003 | 0.671875,0.484375,1,1 1004 | 0.671875,0.484375,1,1 1005 | 0.703125,0.484375,1,1 1006 | 0.703125,0.484375,1,1 1007 | 0.734375,0.484375,1,1 1008 | 0.734375,0.484375,1,1 1009 | 0.765625,0.484375,1,1 1010 | 0.765625,0.484375,1,1 1011 | 0.796875,0.484375,1,1 1012 | 0.796875,0.484375,1,1 1013 | 0.828125,0.484375,1,1 1014 | 0.828125,0.484375,1,1 1015 | 0.859375,0.484375,1,1 1016 | 0.859375,0.484375,1,1 1017 | 0.890625,0.484375,1,1 1018 | 0.890625,0.484375,1,1 1019 | 0.921875,0.484375,1,1 1020 | 0.921875,0.484375,1,1 1021 | 0.953125,0.484375,1,1 1022 | 0.953125,0.484375,1,1 1023 | 0.984375,0.484375,1,1 1024 | 0.984375,0.484375,1,1 1025 | 0.015625,0.515625,1,1 1026 | 0.015625,0.515625,1,1 1027 | 0.046875,0.515625,1,1 1028 | 0.046875,0.515625,1,1 1029 | 0.078125,0.515625,1,1 1030 | 0.078125,0.515625,1,1 1031 | 0.109375,0.515625,1,1 1032 | 0.109375,0.515625,1,1 1033 | 0.140625,0.515625,1,1 1034 | 0.140625,0.515625,1,1 1035 | 0.171875,0.515625,1,1 1036 | 0.171875,0.515625,1,1 1037 | 0.203125,0.515625,1,1 1038 | 0.203125,0.515625,1,1 1039 | 0.234375,0.515625,1,1 1040 | 0.234375,0.515625,1,1 1041 | 0.265625,0.515625,1,1 1042 | 0.265625,0.515625,1,1 1043 | 0.296875,0.515625,1,1 1044 | 0.296875,0.515625,1,1 1045 | 0.328125,0.515625,1,1 1046 | 0.328125,0.515625,1,1 1047 | 0.359375,0.515625,1,1 1048 | 0.359375,0.515625,1,1 1049 | 0.390625,0.515625,1,1 1050 | 0.390625,0.515625,1,1 1051 | 0.421875,0.515625,1,1 1052 | 0.421875,0.515625,1,1 1053 | 0.453125,0.515625,1,1 1054 | 0.453125,0.515625,1,1 1055 | 0.484375,0.515625,1,1 1056 | 0.484375,0.515625,1,1 1057 | 0.515625,0.515625,1,1 1058 | 0.515625,0.515625,1,1 1059 | 0.546875,0.515625,1,1 1060 | 0.546875,0.515625,1,1 1061 | 0.578125,0.515625,1,1 1062 | 0.578125,0.515625,1,1 1063 | 0.609375,0.515625,1,1 1064 | 0.609375,0.515625,1,1 1065 | 0.640625,0.515625,1,1 1066 | 0.640625,0.515625,1,1 1067 | 0.671875,0.515625,1,1 1068 | 0.671875,0.515625,1,1 1069 | 0.703125,0.515625,1,1 1070 | 0.703125,0.515625,1,1 1071 | 0.734375,0.515625,1,1 1072 | 0.734375,0.515625,1,1 1073 | 0.765625,0.515625,1,1 1074 | 0.765625,0.515625,1,1 1075 | 0.796875,0.515625,1,1 1076 | 0.796875,0.515625,1,1 1077 | 0.828125,0.515625,1,1 1078 | 0.828125,0.515625,1,1 1079 | 0.859375,0.515625,1,1 1080 | 0.859375,0.515625,1,1 1081 | 0.890625,0.515625,1,1 1082 | 0.890625,0.515625,1,1 1083 | 0.921875,0.515625,1,1 1084 | 0.921875,0.515625,1,1 1085 | 0.953125,0.515625,1,1 1086 | 0.953125,0.515625,1,1 1087 | 0.984375,0.515625,1,1 1088 | 0.984375,0.515625,1,1 1089 | 0.015625,0.546875,1,1 1090 | 0.015625,0.546875,1,1 1091 | 0.046875,0.546875,1,1 1092 | 0.046875,0.546875,1,1 1093 | 0.078125,0.546875,1,1 1094 | 0.078125,0.546875,1,1 1095 | 0.109375,0.546875,1,1 1096 | 0.109375,0.546875,1,1 1097 | 0.140625,0.546875,1,1 1098 | 0.140625,0.546875,1,1 1099 | 0.171875,0.546875,1,1 1100 | 0.171875,0.546875,1,1 1101 | 0.203125,0.546875,1,1 1102 | 0.203125,0.546875,1,1 1103 | 0.234375,0.546875,1,1 1104 | 0.234375,0.546875,1,1 1105 | 0.265625,0.546875,1,1 1106 | 0.265625,0.546875,1,1 1107 | 0.296875,0.546875,1,1 1108 | 0.296875,0.546875,1,1 1109 | 0.328125,0.546875,1,1 1110 | 0.328125,0.546875,1,1 1111 | 0.359375,0.546875,1,1 1112 | 0.359375,0.546875,1,1 1113 | 0.390625,0.546875,1,1 1114 | 0.390625,0.546875,1,1 1115 | 0.421875,0.546875,1,1 1116 | 0.421875,0.546875,1,1 1117 | 0.453125,0.546875,1,1 1118 | 0.453125,0.546875,1,1 1119 | 0.484375,0.546875,1,1 1120 | 0.484375,0.546875,1,1 1121 | 0.515625,0.546875,1,1 1122 | 0.515625,0.546875,1,1 1123 | 0.546875,0.546875,1,1 1124 | 0.546875,0.546875,1,1 1125 | 0.578125,0.546875,1,1 1126 | 0.578125,0.546875,1,1 1127 | 0.609375,0.546875,1,1 1128 | 0.609375,0.546875,1,1 1129 | 0.640625,0.546875,1,1 1130 | 0.640625,0.546875,1,1 1131 | 0.671875,0.546875,1,1 1132 | 0.671875,0.546875,1,1 1133 | 0.703125,0.546875,1,1 1134 | 0.703125,0.546875,1,1 1135 | 0.734375,0.546875,1,1 1136 | 0.734375,0.546875,1,1 1137 | 0.765625,0.546875,1,1 1138 | 0.765625,0.546875,1,1 1139 | 0.796875,0.546875,1,1 1140 | 0.796875,0.546875,1,1 1141 | 0.828125,0.546875,1,1 1142 | 0.828125,0.546875,1,1 1143 | 0.859375,0.546875,1,1 1144 | 0.859375,0.546875,1,1 1145 | 0.890625,0.546875,1,1 1146 | 0.890625,0.546875,1,1 1147 | 0.921875,0.546875,1,1 1148 | 0.921875,0.546875,1,1 1149 | 0.953125,0.546875,1,1 1150 | 0.953125,0.546875,1,1 1151 | 0.984375,0.546875,1,1 1152 | 0.984375,0.546875,1,1 1153 | 0.015625,0.578125,1,1 1154 | 0.015625,0.578125,1,1 1155 | 0.046875,0.578125,1,1 1156 | 0.046875,0.578125,1,1 1157 | 0.078125,0.578125,1,1 1158 | 0.078125,0.578125,1,1 1159 | 0.109375,0.578125,1,1 1160 | 0.109375,0.578125,1,1 1161 | 0.140625,0.578125,1,1 1162 | 0.140625,0.578125,1,1 1163 | 0.171875,0.578125,1,1 1164 | 0.171875,0.578125,1,1 1165 | 0.203125,0.578125,1,1 1166 | 0.203125,0.578125,1,1 1167 | 0.234375,0.578125,1,1 1168 | 0.234375,0.578125,1,1 1169 | 0.265625,0.578125,1,1 1170 | 0.265625,0.578125,1,1 1171 | 0.296875,0.578125,1,1 1172 | 0.296875,0.578125,1,1 1173 | 0.328125,0.578125,1,1 1174 | 0.328125,0.578125,1,1 1175 | 0.359375,0.578125,1,1 1176 | 0.359375,0.578125,1,1 1177 | 0.390625,0.578125,1,1 1178 | 0.390625,0.578125,1,1 1179 | 0.421875,0.578125,1,1 1180 | 0.421875,0.578125,1,1 1181 | 0.453125,0.578125,1,1 1182 | 0.453125,0.578125,1,1 1183 | 0.484375,0.578125,1,1 1184 | 0.484375,0.578125,1,1 1185 | 0.515625,0.578125,1,1 1186 | 0.515625,0.578125,1,1 1187 | 0.546875,0.578125,1,1 1188 | 0.546875,0.578125,1,1 1189 | 0.578125,0.578125,1,1 1190 | 0.578125,0.578125,1,1 1191 | 0.609375,0.578125,1,1 1192 | 0.609375,0.578125,1,1 1193 | 0.640625,0.578125,1,1 1194 | 0.640625,0.578125,1,1 1195 | 0.671875,0.578125,1,1 1196 | 0.671875,0.578125,1,1 1197 | 0.703125,0.578125,1,1 1198 | 0.703125,0.578125,1,1 1199 | 0.734375,0.578125,1,1 1200 | 0.734375,0.578125,1,1 1201 | 0.765625,0.578125,1,1 1202 | 0.765625,0.578125,1,1 1203 | 0.796875,0.578125,1,1 1204 | 0.796875,0.578125,1,1 1205 | 0.828125,0.578125,1,1 1206 | 0.828125,0.578125,1,1 1207 | 0.859375,0.578125,1,1 1208 | 0.859375,0.578125,1,1 1209 | 0.890625,0.578125,1,1 1210 | 0.890625,0.578125,1,1 1211 | 0.921875,0.578125,1,1 1212 | 0.921875,0.578125,1,1 1213 | 0.953125,0.578125,1,1 1214 | 0.953125,0.578125,1,1 1215 | 0.984375,0.578125,1,1 1216 | 0.984375,0.578125,1,1 1217 | 0.015625,0.609375,1,1 1218 | 0.015625,0.609375,1,1 1219 | 0.046875,0.609375,1,1 1220 | 0.046875,0.609375,1,1 1221 | 0.078125,0.609375,1,1 1222 | 0.078125,0.609375,1,1 1223 | 0.109375,0.609375,1,1 1224 | 0.109375,0.609375,1,1 1225 | 0.140625,0.609375,1,1 1226 | 0.140625,0.609375,1,1 1227 | 0.171875,0.609375,1,1 1228 | 0.171875,0.609375,1,1 1229 | 0.203125,0.609375,1,1 1230 | 0.203125,0.609375,1,1 1231 | 0.234375,0.609375,1,1 1232 | 0.234375,0.609375,1,1 1233 | 0.265625,0.609375,1,1 1234 | 0.265625,0.609375,1,1 1235 | 0.296875,0.609375,1,1 1236 | 0.296875,0.609375,1,1 1237 | 0.328125,0.609375,1,1 1238 | 0.328125,0.609375,1,1 1239 | 0.359375,0.609375,1,1 1240 | 0.359375,0.609375,1,1 1241 | 0.390625,0.609375,1,1 1242 | 0.390625,0.609375,1,1 1243 | 0.421875,0.609375,1,1 1244 | 0.421875,0.609375,1,1 1245 | 0.453125,0.609375,1,1 1246 | 0.453125,0.609375,1,1 1247 | 0.484375,0.609375,1,1 1248 | 0.484375,0.609375,1,1 1249 | 0.515625,0.609375,1,1 1250 | 0.515625,0.609375,1,1 1251 | 0.546875,0.609375,1,1 1252 | 0.546875,0.609375,1,1 1253 | 0.578125,0.609375,1,1 1254 | 0.578125,0.609375,1,1 1255 | 0.609375,0.609375,1,1 1256 | 0.609375,0.609375,1,1 1257 | 0.640625,0.609375,1,1 1258 | 0.640625,0.609375,1,1 1259 | 0.671875,0.609375,1,1 1260 | 0.671875,0.609375,1,1 1261 | 0.703125,0.609375,1,1 1262 | 0.703125,0.609375,1,1 1263 | 0.734375,0.609375,1,1 1264 | 0.734375,0.609375,1,1 1265 | 0.765625,0.609375,1,1 1266 | 0.765625,0.609375,1,1 1267 | 0.796875,0.609375,1,1 1268 | 0.796875,0.609375,1,1 1269 | 0.828125,0.609375,1,1 1270 | 0.828125,0.609375,1,1 1271 | 0.859375,0.609375,1,1 1272 | 0.859375,0.609375,1,1 1273 | 0.890625,0.609375,1,1 1274 | 0.890625,0.609375,1,1 1275 | 0.921875,0.609375,1,1 1276 | 0.921875,0.609375,1,1 1277 | 0.953125,0.609375,1,1 1278 | 0.953125,0.609375,1,1 1279 | 0.984375,0.609375,1,1 1280 | 0.984375,0.609375,1,1 1281 | 0.015625,0.640625,1,1 1282 | 0.015625,0.640625,1,1 1283 | 0.046875,0.640625,1,1 1284 | 0.046875,0.640625,1,1 1285 | 0.078125,0.640625,1,1 1286 | 0.078125,0.640625,1,1 1287 | 0.109375,0.640625,1,1 1288 | 0.109375,0.640625,1,1 1289 | 0.140625,0.640625,1,1 1290 | 0.140625,0.640625,1,1 1291 | 0.171875,0.640625,1,1 1292 | 0.171875,0.640625,1,1 1293 | 0.203125,0.640625,1,1 1294 | 0.203125,0.640625,1,1 1295 | 0.234375,0.640625,1,1 1296 | 0.234375,0.640625,1,1 1297 | 0.265625,0.640625,1,1 1298 | 0.265625,0.640625,1,1 1299 | 0.296875,0.640625,1,1 1300 | 0.296875,0.640625,1,1 1301 | 0.328125,0.640625,1,1 1302 | 0.328125,0.640625,1,1 1303 | 0.359375,0.640625,1,1 1304 | 0.359375,0.640625,1,1 1305 | 0.390625,0.640625,1,1 1306 | 0.390625,0.640625,1,1 1307 | 0.421875,0.640625,1,1 1308 | 0.421875,0.640625,1,1 1309 | 0.453125,0.640625,1,1 1310 | 0.453125,0.640625,1,1 1311 | 0.484375,0.640625,1,1 1312 | 0.484375,0.640625,1,1 1313 | 0.515625,0.640625,1,1 1314 | 0.515625,0.640625,1,1 1315 | 0.546875,0.640625,1,1 1316 | 0.546875,0.640625,1,1 1317 | 0.578125,0.640625,1,1 1318 | 0.578125,0.640625,1,1 1319 | 0.609375,0.640625,1,1 1320 | 0.609375,0.640625,1,1 1321 | 0.640625,0.640625,1,1 1322 | 0.640625,0.640625,1,1 1323 | 0.671875,0.640625,1,1 1324 | 0.671875,0.640625,1,1 1325 | 0.703125,0.640625,1,1 1326 | 0.703125,0.640625,1,1 1327 | 0.734375,0.640625,1,1 1328 | 0.734375,0.640625,1,1 1329 | 0.765625,0.640625,1,1 1330 | 0.765625,0.640625,1,1 1331 | 0.796875,0.640625,1,1 1332 | 0.796875,0.640625,1,1 1333 | 0.828125,0.640625,1,1 1334 | 0.828125,0.640625,1,1 1335 | 0.859375,0.640625,1,1 1336 | 0.859375,0.640625,1,1 1337 | 0.890625,0.640625,1,1 1338 | 0.890625,0.640625,1,1 1339 | 0.921875,0.640625,1,1 1340 | 0.921875,0.640625,1,1 1341 | 0.953125,0.640625,1,1 1342 | 0.953125,0.640625,1,1 1343 | 0.984375,0.640625,1,1 1344 | 0.984375,0.640625,1,1 1345 | 0.015625,0.671875,1,1 1346 | 0.015625,0.671875,1,1 1347 | 0.046875,0.671875,1,1 1348 | 0.046875,0.671875,1,1 1349 | 0.078125,0.671875,1,1 1350 | 0.078125,0.671875,1,1 1351 | 0.109375,0.671875,1,1 1352 | 0.109375,0.671875,1,1 1353 | 0.140625,0.671875,1,1 1354 | 0.140625,0.671875,1,1 1355 | 0.171875,0.671875,1,1 1356 | 0.171875,0.671875,1,1 1357 | 0.203125,0.671875,1,1 1358 | 0.203125,0.671875,1,1 1359 | 0.234375,0.671875,1,1 1360 | 0.234375,0.671875,1,1 1361 | 0.265625,0.671875,1,1 1362 | 0.265625,0.671875,1,1 1363 | 0.296875,0.671875,1,1 1364 | 0.296875,0.671875,1,1 1365 | 0.328125,0.671875,1,1 1366 | 0.328125,0.671875,1,1 1367 | 0.359375,0.671875,1,1 1368 | 0.359375,0.671875,1,1 1369 | 0.390625,0.671875,1,1 1370 | 0.390625,0.671875,1,1 1371 | 0.421875,0.671875,1,1 1372 | 0.421875,0.671875,1,1 1373 | 0.453125,0.671875,1,1 1374 | 0.453125,0.671875,1,1 1375 | 0.484375,0.671875,1,1 1376 | 0.484375,0.671875,1,1 1377 | 0.515625,0.671875,1,1 1378 | 0.515625,0.671875,1,1 1379 | 0.546875,0.671875,1,1 1380 | 0.546875,0.671875,1,1 1381 | 0.578125,0.671875,1,1 1382 | 0.578125,0.671875,1,1 1383 | 0.609375,0.671875,1,1 1384 | 0.609375,0.671875,1,1 1385 | 0.640625,0.671875,1,1 1386 | 0.640625,0.671875,1,1 1387 | 0.671875,0.671875,1,1 1388 | 0.671875,0.671875,1,1 1389 | 0.703125,0.671875,1,1 1390 | 0.703125,0.671875,1,1 1391 | 0.734375,0.671875,1,1 1392 | 0.734375,0.671875,1,1 1393 | 0.765625,0.671875,1,1 1394 | 0.765625,0.671875,1,1 1395 | 0.796875,0.671875,1,1 1396 | 0.796875,0.671875,1,1 1397 | 0.828125,0.671875,1,1 1398 | 0.828125,0.671875,1,1 1399 | 0.859375,0.671875,1,1 1400 | 0.859375,0.671875,1,1 1401 | 0.890625,0.671875,1,1 1402 | 0.890625,0.671875,1,1 1403 | 0.921875,0.671875,1,1 1404 | 0.921875,0.671875,1,1 1405 | 0.953125,0.671875,1,1 1406 | 0.953125,0.671875,1,1 1407 | 0.984375,0.671875,1,1 1408 | 0.984375,0.671875,1,1 1409 | 0.015625,0.703125,1,1 1410 | 0.015625,0.703125,1,1 1411 | 0.046875,0.703125,1,1 1412 | 0.046875,0.703125,1,1 1413 | 0.078125,0.703125,1,1 1414 | 0.078125,0.703125,1,1 1415 | 0.109375,0.703125,1,1 1416 | 0.109375,0.703125,1,1 1417 | 0.140625,0.703125,1,1 1418 | 0.140625,0.703125,1,1 1419 | 0.171875,0.703125,1,1 1420 | 0.171875,0.703125,1,1 1421 | 0.203125,0.703125,1,1 1422 | 0.203125,0.703125,1,1 1423 | 0.234375,0.703125,1,1 1424 | 0.234375,0.703125,1,1 1425 | 0.265625,0.703125,1,1 1426 | 0.265625,0.703125,1,1 1427 | 0.296875,0.703125,1,1 1428 | 0.296875,0.703125,1,1 1429 | 0.328125,0.703125,1,1 1430 | 0.328125,0.703125,1,1 1431 | 0.359375,0.703125,1,1 1432 | 0.359375,0.703125,1,1 1433 | 0.390625,0.703125,1,1 1434 | 0.390625,0.703125,1,1 1435 | 0.421875,0.703125,1,1 1436 | 0.421875,0.703125,1,1 1437 | 0.453125,0.703125,1,1 1438 | 0.453125,0.703125,1,1 1439 | 0.484375,0.703125,1,1 1440 | 0.484375,0.703125,1,1 1441 | 0.515625,0.703125,1,1 1442 | 0.515625,0.703125,1,1 1443 | 0.546875,0.703125,1,1 1444 | 0.546875,0.703125,1,1 1445 | 0.578125,0.703125,1,1 1446 | 0.578125,0.703125,1,1 1447 | 0.609375,0.703125,1,1 1448 | 0.609375,0.703125,1,1 1449 | 0.640625,0.703125,1,1 1450 | 0.640625,0.703125,1,1 1451 | 0.671875,0.703125,1,1 1452 | 0.671875,0.703125,1,1 1453 | 0.703125,0.703125,1,1 1454 | 0.703125,0.703125,1,1 1455 | 0.734375,0.703125,1,1 1456 | 0.734375,0.703125,1,1 1457 | 0.765625,0.703125,1,1 1458 | 0.765625,0.703125,1,1 1459 | 0.796875,0.703125,1,1 1460 | 0.796875,0.703125,1,1 1461 | 0.828125,0.703125,1,1 1462 | 0.828125,0.703125,1,1 1463 | 0.859375,0.703125,1,1 1464 | 0.859375,0.703125,1,1 1465 | 0.890625,0.703125,1,1 1466 | 0.890625,0.703125,1,1 1467 | 0.921875,0.703125,1,1 1468 | 0.921875,0.703125,1,1 1469 | 0.953125,0.703125,1,1 1470 | 0.953125,0.703125,1,1 1471 | 0.984375,0.703125,1,1 1472 | 0.984375,0.703125,1,1 1473 | 0.015625,0.734375,1,1 1474 | 0.015625,0.734375,1,1 1475 | 0.046875,0.734375,1,1 1476 | 0.046875,0.734375,1,1 1477 | 0.078125,0.734375,1,1 1478 | 0.078125,0.734375,1,1 1479 | 0.109375,0.734375,1,1 1480 | 0.109375,0.734375,1,1 1481 | 0.140625,0.734375,1,1 1482 | 0.140625,0.734375,1,1 1483 | 0.171875,0.734375,1,1 1484 | 0.171875,0.734375,1,1 1485 | 0.203125,0.734375,1,1 1486 | 0.203125,0.734375,1,1 1487 | 0.234375,0.734375,1,1 1488 | 0.234375,0.734375,1,1 1489 | 0.265625,0.734375,1,1 1490 | 0.265625,0.734375,1,1 1491 | 0.296875,0.734375,1,1 1492 | 0.296875,0.734375,1,1 1493 | 0.328125,0.734375,1,1 1494 | 0.328125,0.734375,1,1 1495 | 0.359375,0.734375,1,1 1496 | 0.359375,0.734375,1,1 1497 | 0.390625,0.734375,1,1 1498 | 0.390625,0.734375,1,1 1499 | 0.421875,0.734375,1,1 1500 | 0.421875,0.734375,1,1 1501 | 0.453125,0.734375,1,1 1502 | 0.453125,0.734375,1,1 1503 | 0.484375,0.734375,1,1 1504 | 0.484375,0.734375,1,1 1505 | 0.515625,0.734375,1,1 1506 | 0.515625,0.734375,1,1 1507 | 0.546875,0.734375,1,1 1508 | 0.546875,0.734375,1,1 1509 | 0.578125,0.734375,1,1 1510 | 0.578125,0.734375,1,1 1511 | 0.609375,0.734375,1,1 1512 | 0.609375,0.734375,1,1 1513 | 0.640625,0.734375,1,1 1514 | 0.640625,0.734375,1,1 1515 | 0.671875,0.734375,1,1 1516 | 0.671875,0.734375,1,1 1517 | 0.703125,0.734375,1,1 1518 | 0.703125,0.734375,1,1 1519 | 0.734375,0.734375,1,1 1520 | 0.734375,0.734375,1,1 1521 | 0.765625,0.734375,1,1 1522 | 0.765625,0.734375,1,1 1523 | 0.796875,0.734375,1,1 1524 | 0.796875,0.734375,1,1 1525 | 0.828125,0.734375,1,1 1526 | 0.828125,0.734375,1,1 1527 | 0.859375,0.734375,1,1 1528 | 0.859375,0.734375,1,1 1529 | 0.890625,0.734375,1,1 1530 | 0.890625,0.734375,1,1 1531 | 0.921875,0.734375,1,1 1532 | 0.921875,0.734375,1,1 1533 | 0.953125,0.734375,1,1 1534 | 0.953125,0.734375,1,1 1535 | 0.984375,0.734375,1,1 1536 | 0.984375,0.734375,1,1 1537 | 0.015625,0.765625,1,1 1538 | 0.015625,0.765625,1,1 1539 | 0.046875,0.765625,1,1 1540 | 0.046875,0.765625,1,1 1541 | 0.078125,0.765625,1,1 1542 | 0.078125,0.765625,1,1 1543 | 0.109375,0.765625,1,1 1544 | 0.109375,0.765625,1,1 1545 | 0.140625,0.765625,1,1 1546 | 0.140625,0.765625,1,1 1547 | 0.171875,0.765625,1,1 1548 | 0.171875,0.765625,1,1 1549 | 0.203125,0.765625,1,1 1550 | 0.203125,0.765625,1,1 1551 | 0.234375,0.765625,1,1 1552 | 0.234375,0.765625,1,1 1553 | 0.265625,0.765625,1,1 1554 | 0.265625,0.765625,1,1 1555 | 0.296875,0.765625,1,1 1556 | 0.296875,0.765625,1,1 1557 | 0.328125,0.765625,1,1 1558 | 0.328125,0.765625,1,1 1559 | 0.359375,0.765625,1,1 1560 | 0.359375,0.765625,1,1 1561 | 0.390625,0.765625,1,1 1562 | 0.390625,0.765625,1,1 1563 | 0.421875,0.765625,1,1 1564 | 0.421875,0.765625,1,1 1565 | 0.453125,0.765625,1,1 1566 | 0.453125,0.765625,1,1 1567 | 0.484375,0.765625,1,1 1568 | 0.484375,0.765625,1,1 1569 | 0.515625,0.765625,1,1 1570 | 0.515625,0.765625,1,1 1571 | 0.546875,0.765625,1,1 1572 | 0.546875,0.765625,1,1 1573 | 0.578125,0.765625,1,1 1574 | 0.578125,0.765625,1,1 1575 | 0.609375,0.765625,1,1 1576 | 0.609375,0.765625,1,1 1577 | 0.640625,0.765625,1,1 1578 | 0.640625,0.765625,1,1 1579 | 0.671875,0.765625,1,1 1580 | 0.671875,0.765625,1,1 1581 | 0.703125,0.765625,1,1 1582 | 0.703125,0.765625,1,1 1583 | 0.734375,0.765625,1,1 1584 | 0.734375,0.765625,1,1 1585 | 0.765625,0.765625,1,1 1586 | 0.765625,0.765625,1,1 1587 | 0.796875,0.765625,1,1 1588 | 0.796875,0.765625,1,1 1589 | 0.828125,0.765625,1,1 1590 | 0.828125,0.765625,1,1 1591 | 0.859375,0.765625,1,1 1592 | 0.859375,0.765625,1,1 1593 | 0.890625,0.765625,1,1 1594 | 0.890625,0.765625,1,1 1595 | 0.921875,0.765625,1,1 1596 | 0.921875,0.765625,1,1 1597 | 0.953125,0.765625,1,1 1598 | 0.953125,0.765625,1,1 1599 | 0.984375,0.765625,1,1 1600 | 0.984375,0.765625,1,1 1601 | 0.015625,0.796875,1,1 1602 | 0.015625,0.796875,1,1 1603 | 0.046875,0.796875,1,1 1604 | 0.046875,0.796875,1,1 1605 | 0.078125,0.796875,1,1 1606 | 0.078125,0.796875,1,1 1607 | 0.109375,0.796875,1,1 1608 | 0.109375,0.796875,1,1 1609 | 0.140625,0.796875,1,1 1610 | 0.140625,0.796875,1,1 1611 | 0.171875,0.796875,1,1 1612 | 0.171875,0.796875,1,1 1613 | 0.203125,0.796875,1,1 1614 | 0.203125,0.796875,1,1 1615 | 0.234375,0.796875,1,1 1616 | 0.234375,0.796875,1,1 1617 | 0.265625,0.796875,1,1 1618 | 0.265625,0.796875,1,1 1619 | 0.296875,0.796875,1,1 1620 | 0.296875,0.796875,1,1 1621 | 0.328125,0.796875,1,1 1622 | 0.328125,0.796875,1,1 1623 | 0.359375,0.796875,1,1 1624 | 0.359375,0.796875,1,1 1625 | 0.390625,0.796875,1,1 1626 | 0.390625,0.796875,1,1 1627 | 0.421875,0.796875,1,1 1628 | 0.421875,0.796875,1,1 1629 | 0.453125,0.796875,1,1 1630 | 0.453125,0.796875,1,1 1631 | 0.484375,0.796875,1,1 1632 | 0.484375,0.796875,1,1 1633 | 0.515625,0.796875,1,1 1634 | 0.515625,0.796875,1,1 1635 | 0.546875,0.796875,1,1 1636 | 0.546875,0.796875,1,1 1637 | 0.578125,0.796875,1,1 1638 | 0.578125,0.796875,1,1 1639 | 0.609375,0.796875,1,1 1640 | 0.609375,0.796875,1,1 1641 | 0.640625,0.796875,1,1 1642 | 0.640625,0.796875,1,1 1643 | 0.671875,0.796875,1,1 1644 | 0.671875,0.796875,1,1 1645 | 0.703125,0.796875,1,1 1646 | 0.703125,0.796875,1,1 1647 | 0.734375,0.796875,1,1 1648 | 0.734375,0.796875,1,1 1649 | 0.765625,0.796875,1,1 1650 | 0.765625,0.796875,1,1 1651 | 0.796875,0.796875,1,1 1652 | 0.796875,0.796875,1,1 1653 | 0.828125,0.796875,1,1 1654 | 0.828125,0.796875,1,1 1655 | 0.859375,0.796875,1,1 1656 | 0.859375,0.796875,1,1 1657 | 0.890625,0.796875,1,1 1658 | 0.890625,0.796875,1,1 1659 | 0.921875,0.796875,1,1 1660 | 0.921875,0.796875,1,1 1661 | 0.953125,0.796875,1,1 1662 | 0.953125,0.796875,1,1 1663 | 0.984375,0.796875,1,1 1664 | 0.984375,0.796875,1,1 1665 | 0.015625,0.828125,1,1 1666 | 0.015625,0.828125,1,1 1667 | 0.046875,0.828125,1,1 1668 | 0.046875,0.828125,1,1 1669 | 0.078125,0.828125,1,1 1670 | 0.078125,0.828125,1,1 1671 | 0.109375,0.828125,1,1 1672 | 0.109375,0.828125,1,1 1673 | 0.140625,0.828125,1,1 1674 | 0.140625,0.828125,1,1 1675 | 0.171875,0.828125,1,1 1676 | 0.171875,0.828125,1,1 1677 | 0.203125,0.828125,1,1 1678 | 0.203125,0.828125,1,1 1679 | 0.234375,0.828125,1,1 1680 | 0.234375,0.828125,1,1 1681 | 0.265625,0.828125,1,1 1682 | 0.265625,0.828125,1,1 1683 | 0.296875,0.828125,1,1 1684 | 0.296875,0.828125,1,1 1685 | 0.328125,0.828125,1,1 1686 | 0.328125,0.828125,1,1 1687 | 0.359375,0.828125,1,1 1688 | 0.359375,0.828125,1,1 1689 | 0.390625,0.828125,1,1 1690 | 0.390625,0.828125,1,1 1691 | 0.421875,0.828125,1,1 1692 | 0.421875,0.828125,1,1 1693 | 0.453125,0.828125,1,1 1694 | 0.453125,0.828125,1,1 1695 | 0.484375,0.828125,1,1 1696 | 0.484375,0.828125,1,1 1697 | 0.515625,0.828125,1,1 1698 | 0.515625,0.828125,1,1 1699 | 0.546875,0.828125,1,1 1700 | 0.546875,0.828125,1,1 1701 | 0.578125,0.828125,1,1 1702 | 0.578125,0.828125,1,1 1703 | 0.609375,0.828125,1,1 1704 | 0.609375,0.828125,1,1 1705 | 0.640625,0.828125,1,1 1706 | 0.640625,0.828125,1,1 1707 | 0.671875,0.828125,1,1 1708 | 0.671875,0.828125,1,1 1709 | 0.703125,0.828125,1,1 1710 | 0.703125,0.828125,1,1 1711 | 0.734375,0.828125,1,1 1712 | 0.734375,0.828125,1,1 1713 | 0.765625,0.828125,1,1 1714 | 0.765625,0.828125,1,1 1715 | 0.796875,0.828125,1,1 1716 | 0.796875,0.828125,1,1 1717 | 0.828125,0.828125,1,1 1718 | 0.828125,0.828125,1,1 1719 | 0.859375,0.828125,1,1 1720 | 0.859375,0.828125,1,1 1721 | 0.890625,0.828125,1,1 1722 | 0.890625,0.828125,1,1 1723 | 0.921875,0.828125,1,1 1724 | 0.921875,0.828125,1,1 1725 | 0.953125,0.828125,1,1 1726 | 0.953125,0.828125,1,1 1727 | 0.984375,0.828125,1,1 1728 | 0.984375,0.828125,1,1 1729 | 0.015625,0.859375,1,1 1730 | 0.015625,0.859375,1,1 1731 | 0.046875,0.859375,1,1 1732 | 0.046875,0.859375,1,1 1733 | 0.078125,0.859375,1,1 1734 | 0.078125,0.859375,1,1 1735 | 0.109375,0.859375,1,1 1736 | 0.109375,0.859375,1,1 1737 | 0.140625,0.859375,1,1 1738 | 0.140625,0.859375,1,1 1739 | 0.171875,0.859375,1,1 1740 | 0.171875,0.859375,1,1 1741 | 0.203125,0.859375,1,1 1742 | 0.203125,0.859375,1,1 1743 | 0.234375,0.859375,1,1 1744 | 0.234375,0.859375,1,1 1745 | 0.265625,0.859375,1,1 1746 | 0.265625,0.859375,1,1 1747 | 0.296875,0.859375,1,1 1748 | 0.296875,0.859375,1,1 1749 | 0.328125,0.859375,1,1 1750 | 0.328125,0.859375,1,1 1751 | 0.359375,0.859375,1,1 1752 | 0.359375,0.859375,1,1 1753 | 0.390625,0.859375,1,1 1754 | 0.390625,0.859375,1,1 1755 | 0.421875,0.859375,1,1 1756 | 0.421875,0.859375,1,1 1757 | 0.453125,0.859375,1,1 1758 | 0.453125,0.859375,1,1 1759 | 0.484375,0.859375,1,1 1760 | 0.484375,0.859375,1,1 1761 | 0.515625,0.859375,1,1 1762 | 0.515625,0.859375,1,1 1763 | 0.546875,0.859375,1,1 1764 | 0.546875,0.859375,1,1 1765 | 0.578125,0.859375,1,1 1766 | 0.578125,0.859375,1,1 1767 | 0.609375,0.859375,1,1 1768 | 0.609375,0.859375,1,1 1769 | 0.640625,0.859375,1,1 1770 | 0.640625,0.859375,1,1 1771 | 0.671875,0.859375,1,1 1772 | 0.671875,0.859375,1,1 1773 | 0.703125,0.859375,1,1 1774 | 0.703125,0.859375,1,1 1775 | 0.734375,0.859375,1,1 1776 | 0.734375,0.859375,1,1 1777 | 0.765625,0.859375,1,1 1778 | 0.765625,0.859375,1,1 1779 | 0.796875,0.859375,1,1 1780 | 0.796875,0.859375,1,1 1781 | 0.828125,0.859375,1,1 1782 | 0.828125,0.859375,1,1 1783 | 0.859375,0.859375,1,1 1784 | 0.859375,0.859375,1,1 1785 | 0.890625,0.859375,1,1 1786 | 0.890625,0.859375,1,1 1787 | 0.921875,0.859375,1,1 1788 | 0.921875,0.859375,1,1 1789 | 0.953125,0.859375,1,1 1790 | 0.953125,0.859375,1,1 1791 | 0.984375,0.859375,1,1 1792 | 0.984375,0.859375,1,1 1793 | 0.015625,0.890625,1,1 1794 | 0.015625,0.890625,1,1 1795 | 0.046875,0.890625,1,1 1796 | 0.046875,0.890625,1,1 1797 | 0.078125,0.890625,1,1 1798 | 0.078125,0.890625,1,1 1799 | 0.109375,0.890625,1,1 1800 | 0.109375,0.890625,1,1 1801 | 0.140625,0.890625,1,1 1802 | 0.140625,0.890625,1,1 1803 | 0.171875,0.890625,1,1 1804 | 0.171875,0.890625,1,1 1805 | 0.203125,0.890625,1,1 1806 | 0.203125,0.890625,1,1 1807 | 0.234375,0.890625,1,1 1808 | 0.234375,0.890625,1,1 1809 | 0.265625,0.890625,1,1 1810 | 0.265625,0.890625,1,1 1811 | 0.296875,0.890625,1,1 1812 | 0.296875,0.890625,1,1 1813 | 0.328125,0.890625,1,1 1814 | 0.328125,0.890625,1,1 1815 | 0.359375,0.890625,1,1 1816 | 0.359375,0.890625,1,1 1817 | 0.390625,0.890625,1,1 1818 | 0.390625,0.890625,1,1 1819 | 0.421875,0.890625,1,1 1820 | 0.421875,0.890625,1,1 1821 | 0.453125,0.890625,1,1 1822 | 0.453125,0.890625,1,1 1823 | 0.484375,0.890625,1,1 1824 | 0.484375,0.890625,1,1 1825 | 0.515625,0.890625,1,1 1826 | 0.515625,0.890625,1,1 1827 | 0.546875,0.890625,1,1 1828 | 0.546875,0.890625,1,1 1829 | 0.578125,0.890625,1,1 1830 | 0.578125,0.890625,1,1 1831 | 0.609375,0.890625,1,1 1832 | 0.609375,0.890625,1,1 1833 | 0.640625,0.890625,1,1 1834 | 0.640625,0.890625,1,1 1835 | 0.671875,0.890625,1,1 1836 | 0.671875,0.890625,1,1 1837 | 0.703125,0.890625,1,1 1838 | 0.703125,0.890625,1,1 1839 | 0.734375,0.890625,1,1 1840 | 0.734375,0.890625,1,1 1841 | 0.765625,0.890625,1,1 1842 | 0.765625,0.890625,1,1 1843 | 0.796875,0.890625,1,1 1844 | 0.796875,0.890625,1,1 1845 | 0.828125,0.890625,1,1 1846 | 0.828125,0.890625,1,1 1847 | 0.859375,0.890625,1,1 1848 | 0.859375,0.890625,1,1 1849 | 0.890625,0.890625,1,1 1850 | 0.890625,0.890625,1,1 1851 | 0.921875,0.890625,1,1 1852 | 0.921875,0.890625,1,1 1853 | 0.953125,0.890625,1,1 1854 | 0.953125,0.890625,1,1 1855 | 0.984375,0.890625,1,1 1856 | 0.984375,0.890625,1,1 1857 | 0.015625,0.921875,1,1 1858 | 0.015625,0.921875,1,1 1859 | 0.046875,0.921875,1,1 1860 | 0.046875,0.921875,1,1 1861 | 0.078125,0.921875,1,1 1862 | 0.078125,0.921875,1,1 1863 | 0.109375,0.921875,1,1 1864 | 0.109375,0.921875,1,1 1865 | 0.140625,0.921875,1,1 1866 | 0.140625,0.921875,1,1 1867 | 0.171875,0.921875,1,1 1868 | 0.171875,0.921875,1,1 1869 | 0.203125,0.921875,1,1 1870 | 0.203125,0.921875,1,1 1871 | 0.234375,0.921875,1,1 1872 | 0.234375,0.921875,1,1 1873 | 0.265625,0.921875,1,1 1874 | 0.265625,0.921875,1,1 1875 | 0.296875,0.921875,1,1 1876 | 0.296875,0.921875,1,1 1877 | 0.328125,0.921875,1,1 1878 | 0.328125,0.921875,1,1 1879 | 0.359375,0.921875,1,1 1880 | 0.359375,0.921875,1,1 1881 | 0.390625,0.921875,1,1 1882 | 0.390625,0.921875,1,1 1883 | 0.421875,0.921875,1,1 1884 | 0.421875,0.921875,1,1 1885 | 0.453125,0.921875,1,1 1886 | 0.453125,0.921875,1,1 1887 | 0.484375,0.921875,1,1 1888 | 0.484375,0.921875,1,1 1889 | 0.515625,0.921875,1,1 1890 | 0.515625,0.921875,1,1 1891 | 0.546875,0.921875,1,1 1892 | 0.546875,0.921875,1,1 1893 | 0.578125,0.921875,1,1 1894 | 0.578125,0.921875,1,1 1895 | 0.609375,0.921875,1,1 1896 | 0.609375,0.921875,1,1 1897 | 0.640625,0.921875,1,1 1898 | 0.640625,0.921875,1,1 1899 | 0.671875,0.921875,1,1 1900 | 0.671875,0.921875,1,1 1901 | 0.703125,0.921875,1,1 1902 | 0.703125,0.921875,1,1 1903 | 0.734375,0.921875,1,1 1904 | 0.734375,0.921875,1,1 1905 | 0.765625,0.921875,1,1 1906 | 0.765625,0.921875,1,1 1907 | 0.796875,0.921875,1,1 1908 | 0.796875,0.921875,1,1 1909 | 0.828125,0.921875,1,1 1910 | 0.828125,0.921875,1,1 1911 | 0.859375,0.921875,1,1 1912 | 0.859375,0.921875,1,1 1913 | 0.890625,0.921875,1,1 1914 | 0.890625,0.921875,1,1 1915 | 0.921875,0.921875,1,1 1916 | 0.921875,0.921875,1,1 1917 | 0.953125,0.921875,1,1 1918 | 0.953125,0.921875,1,1 1919 | 0.984375,0.921875,1,1 1920 | 0.984375,0.921875,1,1 1921 | 0.015625,0.953125,1,1 1922 | 0.015625,0.953125,1,1 1923 | 0.046875,0.953125,1,1 1924 | 0.046875,0.953125,1,1 1925 | 0.078125,0.953125,1,1 1926 | 0.078125,0.953125,1,1 1927 | 0.109375,0.953125,1,1 1928 | 0.109375,0.953125,1,1 1929 | 0.140625,0.953125,1,1 1930 | 0.140625,0.953125,1,1 1931 | 0.171875,0.953125,1,1 1932 | 0.171875,0.953125,1,1 1933 | 0.203125,0.953125,1,1 1934 | 0.203125,0.953125,1,1 1935 | 0.234375,0.953125,1,1 1936 | 0.234375,0.953125,1,1 1937 | 0.265625,0.953125,1,1 1938 | 0.265625,0.953125,1,1 1939 | 0.296875,0.953125,1,1 1940 | 0.296875,0.953125,1,1 1941 | 0.328125,0.953125,1,1 1942 | 0.328125,0.953125,1,1 1943 | 0.359375,0.953125,1,1 1944 | 0.359375,0.953125,1,1 1945 | 0.390625,0.953125,1,1 1946 | 0.390625,0.953125,1,1 1947 | 0.421875,0.953125,1,1 1948 | 0.421875,0.953125,1,1 1949 | 0.453125,0.953125,1,1 1950 | 0.453125,0.953125,1,1 1951 | 0.484375,0.953125,1,1 1952 | 0.484375,0.953125,1,1 1953 | 0.515625,0.953125,1,1 1954 | 0.515625,0.953125,1,1 1955 | 0.546875,0.953125,1,1 1956 | 0.546875,0.953125,1,1 1957 | 0.578125,0.953125,1,1 1958 | 0.578125,0.953125,1,1 1959 | 0.609375,0.953125,1,1 1960 | 0.609375,0.953125,1,1 1961 | 0.640625,0.953125,1,1 1962 | 0.640625,0.953125,1,1 1963 | 0.671875,0.953125,1,1 1964 | 0.671875,0.953125,1,1 1965 | 0.703125,0.953125,1,1 1966 | 0.703125,0.953125,1,1 1967 | 0.734375,0.953125,1,1 1968 | 0.734375,0.953125,1,1 1969 | 0.765625,0.953125,1,1 1970 | 0.765625,0.953125,1,1 1971 | 0.796875,0.953125,1,1 1972 | 0.796875,0.953125,1,1 1973 | 0.828125,0.953125,1,1 1974 | 0.828125,0.953125,1,1 1975 | 0.859375,0.953125,1,1 1976 | 0.859375,0.953125,1,1 1977 | 0.890625,0.953125,1,1 1978 | 0.890625,0.953125,1,1 1979 | 0.921875,0.953125,1,1 1980 | 0.921875,0.953125,1,1 1981 | 0.953125,0.953125,1,1 1982 | 0.953125,0.953125,1,1 1983 | 0.984375,0.953125,1,1 1984 | 0.984375,0.953125,1,1 1985 | 0.015625,0.984375,1,1 1986 | 0.015625,0.984375,1,1 1987 | 0.046875,0.984375,1,1 1988 | 0.046875,0.984375,1,1 1989 | 0.078125,0.984375,1,1 1990 | 0.078125,0.984375,1,1 1991 | 0.109375,0.984375,1,1 1992 | 0.109375,0.984375,1,1 1993 | 0.140625,0.984375,1,1 1994 | 0.140625,0.984375,1,1 1995 | 0.171875,0.984375,1,1 1996 | 0.171875,0.984375,1,1 1997 | 0.203125,0.984375,1,1 1998 | 0.203125,0.984375,1,1 1999 | 0.234375,0.984375,1,1 2000 | 0.234375,0.984375,1,1 2001 | 0.265625,0.984375,1,1 2002 | 0.265625,0.984375,1,1 2003 | 0.296875,0.984375,1,1 2004 | 0.296875,0.984375,1,1 2005 | 0.328125,0.984375,1,1 2006 | 0.328125,0.984375,1,1 2007 | 0.359375,0.984375,1,1 2008 | 0.359375,0.984375,1,1 2009 | 0.390625,0.984375,1,1 2010 | 0.390625,0.984375,1,1 2011 | 0.421875,0.984375,1,1 2012 | 0.421875,0.984375,1,1 2013 | 0.453125,0.984375,1,1 2014 | 0.453125,0.984375,1,1 2015 | 0.484375,0.984375,1,1 2016 | 0.484375,0.984375,1,1 2017 | 0.515625,0.984375,1,1 2018 | 0.515625,0.984375,1,1 2019 | 0.546875,0.984375,1,1 2020 | 0.546875,0.984375,1,1 2021 | 0.578125,0.984375,1,1 2022 | 0.578125,0.984375,1,1 2023 | 0.609375,0.984375,1,1 2024 | 0.609375,0.984375,1,1 2025 | 0.640625,0.984375,1,1 2026 | 0.640625,0.984375,1,1 2027 | 0.671875,0.984375,1,1 2028 | 0.671875,0.984375,1,1 2029 | 0.703125,0.984375,1,1 2030 | 0.703125,0.984375,1,1 2031 | 0.734375,0.984375,1,1 2032 | 0.734375,0.984375,1,1 2033 | 0.765625,0.984375,1,1 2034 | 0.765625,0.984375,1,1 2035 | 0.796875,0.984375,1,1 2036 | 0.796875,0.984375,1,1 2037 | 0.828125,0.984375,1,1 2038 | 0.828125,0.984375,1,1 2039 | 0.859375,0.984375,1,1 2040 | 0.859375,0.984375,1,1 2041 | 0.890625,0.984375,1,1 2042 | 0.890625,0.984375,1,1 2043 | 0.921875,0.984375,1,1 2044 | 0.921875,0.984375,1,1 2045 | 0.953125,0.984375,1,1 2046 | 0.953125,0.984375,1,1 2047 | 0.984375,0.984375,1,1 2048 | 0.984375,0.984375,1,1 2049 | 0.03125,0.03125,1,1 2050 | 0.03125,0.03125,1,1 2051 | 0.09375,0.03125,1,1 2052 | 0.09375,0.03125,1,1 2053 | 0.15625,0.03125,1,1 2054 | 0.15625,0.03125,1,1 2055 | 0.21875,0.03125,1,1 2056 | 0.21875,0.03125,1,1 2057 | 0.28125,0.03125,1,1 2058 | 0.28125,0.03125,1,1 2059 | 0.34375,0.03125,1,1 2060 | 0.34375,0.03125,1,1 2061 | 0.40625,0.03125,1,1 2062 | 0.40625,0.03125,1,1 2063 | 0.46875,0.03125,1,1 2064 | 0.46875,0.03125,1,1 2065 | 0.53125,0.03125,1,1 2066 | 0.53125,0.03125,1,1 2067 | 0.59375,0.03125,1,1 2068 | 0.59375,0.03125,1,1 2069 | 0.65625,0.03125,1,1 2070 | 0.65625,0.03125,1,1 2071 | 0.71875,0.03125,1,1 2072 | 0.71875,0.03125,1,1 2073 | 0.78125,0.03125,1,1 2074 | 0.78125,0.03125,1,1 2075 | 0.84375,0.03125,1,1 2076 | 0.84375,0.03125,1,1 2077 | 0.90625,0.03125,1,1 2078 | 0.90625,0.03125,1,1 2079 | 0.96875,0.03125,1,1 2080 | 0.96875,0.03125,1,1 2081 | 0.03125,0.09375,1,1 2082 | 0.03125,0.09375,1,1 2083 | 0.09375,0.09375,1,1 2084 | 0.09375,0.09375,1,1 2085 | 0.15625,0.09375,1,1 2086 | 0.15625,0.09375,1,1 2087 | 0.21875,0.09375,1,1 2088 | 0.21875,0.09375,1,1 2089 | 0.28125,0.09375,1,1 2090 | 0.28125,0.09375,1,1 2091 | 0.34375,0.09375,1,1 2092 | 0.34375,0.09375,1,1 2093 | 0.40625,0.09375,1,1 2094 | 0.40625,0.09375,1,1 2095 | 0.46875,0.09375,1,1 2096 | 0.46875,0.09375,1,1 2097 | 0.53125,0.09375,1,1 2098 | 0.53125,0.09375,1,1 2099 | 0.59375,0.09375,1,1 2100 | 0.59375,0.09375,1,1 2101 | 0.65625,0.09375,1,1 2102 | 0.65625,0.09375,1,1 2103 | 0.71875,0.09375,1,1 2104 | 0.71875,0.09375,1,1 2105 | 0.78125,0.09375,1,1 2106 | 0.78125,0.09375,1,1 2107 | 0.84375,0.09375,1,1 2108 | 0.84375,0.09375,1,1 2109 | 0.90625,0.09375,1,1 2110 | 0.90625,0.09375,1,1 2111 | 0.96875,0.09375,1,1 2112 | 0.96875,0.09375,1,1 2113 | 0.03125,0.15625,1,1 2114 | 0.03125,0.15625,1,1 2115 | 0.09375,0.15625,1,1 2116 | 0.09375,0.15625,1,1 2117 | 0.15625,0.15625,1,1 2118 | 0.15625,0.15625,1,1 2119 | 0.21875,0.15625,1,1 2120 | 0.21875,0.15625,1,1 2121 | 0.28125,0.15625,1,1 2122 | 0.28125,0.15625,1,1 2123 | 0.34375,0.15625,1,1 2124 | 0.34375,0.15625,1,1 2125 | 0.40625,0.15625,1,1 2126 | 0.40625,0.15625,1,1 2127 | 0.46875,0.15625,1,1 2128 | 0.46875,0.15625,1,1 2129 | 0.53125,0.15625,1,1 2130 | 0.53125,0.15625,1,1 2131 | 0.59375,0.15625,1,1 2132 | 0.59375,0.15625,1,1 2133 | 0.65625,0.15625,1,1 2134 | 0.65625,0.15625,1,1 2135 | 0.71875,0.15625,1,1 2136 | 0.71875,0.15625,1,1 2137 | 0.78125,0.15625,1,1 2138 | 0.78125,0.15625,1,1 2139 | 0.84375,0.15625,1,1 2140 | 0.84375,0.15625,1,1 2141 | 0.90625,0.15625,1,1 2142 | 0.90625,0.15625,1,1 2143 | 0.96875,0.15625,1,1 2144 | 0.96875,0.15625,1,1 2145 | 0.03125,0.21875,1,1 2146 | 0.03125,0.21875,1,1 2147 | 0.09375,0.21875,1,1 2148 | 0.09375,0.21875,1,1 2149 | 0.15625,0.21875,1,1 2150 | 0.15625,0.21875,1,1 2151 | 0.21875,0.21875,1,1 2152 | 0.21875,0.21875,1,1 2153 | 0.28125,0.21875,1,1 2154 | 0.28125,0.21875,1,1 2155 | 0.34375,0.21875,1,1 2156 | 0.34375,0.21875,1,1 2157 | 0.40625,0.21875,1,1 2158 | 0.40625,0.21875,1,1 2159 | 0.46875,0.21875,1,1 2160 | 0.46875,0.21875,1,1 2161 | 0.53125,0.21875,1,1 2162 | 0.53125,0.21875,1,1 2163 | 0.59375,0.21875,1,1 2164 | 0.59375,0.21875,1,1 2165 | 0.65625,0.21875,1,1 2166 | 0.65625,0.21875,1,1 2167 | 0.71875,0.21875,1,1 2168 | 0.71875,0.21875,1,1 2169 | 0.78125,0.21875,1,1 2170 | 0.78125,0.21875,1,1 2171 | 0.84375,0.21875,1,1 2172 | 0.84375,0.21875,1,1 2173 | 0.90625,0.21875,1,1 2174 | 0.90625,0.21875,1,1 2175 | 0.96875,0.21875,1,1 2176 | 0.96875,0.21875,1,1 2177 | 0.03125,0.28125,1,1 2178 | 0.03125,0.28125,1,1 2179 | 0.09375,0.28125,1,1 2180 | 0.09375,0.28125,1,1 2181 | 0.15625,0.28125,1,1 2182 | 0.15625,0.28125,1,1 2183 | 0.21875,0.28125,1,1 2184 | 0.21875,0.28125,1,1 2185 | 0.28125,0.28125,1,1 2186 | 0.28125,0.28125,1,1 2187 | 0.34375,0.28125,1,1 2188 | 0.34375,0.28125,1,1 2189 | 0.40625,0.28125,1,1 2190 | 0.40625,0.28125,1,1 2191 | 0.46875,0.28125,1,1 2192 | 0.46875,0.28125,1,1 2193 | 0.53125,0.28125,1,1 2194 | 0.53125,0.28125,1,1 2195 | 0.59375,0.28125,1,1 2196 | 0.59375,0.28125,1,1 2197 | 0.65625,0.28125,1,1 2198 | 0.65625,0.28125,1,1 2199 | 0.71875,0.28125,1,1 2200 | 0.71875,0.28125,1,1 2201 | 0.78125,0.28125,1,1 2202 | 0.78125,0.28125,1,1 2203 | 0.84375,0.28125,1,1 2204 | 0.84375,0.28125,1,1 2205 | 0.90625,0.28125,1,1 2206 | 0.90625,0.28125,1,1 2207 | 0.96875,0.28125,1,1 2208 | 0.96875,0.28125,1,1 2209 | 0.03125,0.34375,1,1 2210 | 0.03125,0.34375,1,1 2211 | 0.09375,0.34375,1,1 2212 | 0.09375,0.34375,1,1 2213 | 0.15625,0.34375,1,1 2214 | 0.15625,0.34375,1,1 2215 | 0.21875,0.34375,1,1 2216 | 0.21875,0.34375,1,1 2217 | 0.28125,0.34375,1,1 2218 | 0.28125,0.34375,1,1 2219 | 0.34375,0.34375,1,1 2220 | 0.34375,0.34375,1,1 2221 | 0.40625,0.34375,1,1 2222 | 0.40625,0.34375,1,1 2223 | 0.46875,0.34375,1,1 2224 | 0.46875,0.34375,1,1 2225 | 0.53125,0.34375,1,1 2226 | 0.53125,0.34375,1,1 2227 | 0.59375,0.34375,1,1 2228 | 0.59375,0.34375,1,1 2229 | 0.65625,0.34375,1,1 2230 | 0.65625,0.34375,1,1 2231 | 0.71875,0.34375,1,1 2232 | 0.71875,0.34375,1,1 2233 | 0.78125,0.34375,1,1 2234 | 0.78125,0.34375,1,1 2235 | 0.84375,0.34375,1,1 2236 | 0.84375,0.34375,1,1 2237 | 0.90625,0.34375,1,1 2238 | 0.90625,0.34375,1,1 2239 | 0.96875,0.34375,1,1 2240 | 0.96875,0.34375,1,1 2241 | 0.03125,0.40625,1,1 2242 | 0.03125,0.40625,1,1 2243 | 0.09375,0.40625,1,1 2244 | 0.09375,0.40625,1,1 2245 | 0.15625,0.40625,1,1 2246 | 0.15625,0.40625,1,1 2247 | 0.21875,0.40625,1,1 2248 | 0.21875,0.40625,1,1 2249 | 0.28125,0.40625,1,1 2250 | 0.28125,0.40625,1,1 2251 | 0.34375,0.40625,1,1 2252 | 0.34375,0.40625,1,1 2253 | 0.40625,0.40625,1,1 2254 | 0.40625,0.40625,1,1 2255 | 0.46875,0.40625,1,1 2256 | 0.46875,0.40625,1,1 2257 | 0.53125,0.40625,1,1 2258 | 0.53125,0.40625,1,1 2259 | 0.59375,0.40625,1,1 2260 | 0.59375,0.40625,1,1 2261 | 0.65625,0.40625,1,1 2262 | 0.65625,0.40625,1,1 2263 | 0.71875,0.40625,1,1 2264 | 0.71875,0.40625,1,1 2265 | 0.78125,0.40625,1,1 2266 | 0.78125,0.40625,1,1 2267 | 0.84375,0.40625,1,1 2268 | 0.84375,0.40625,1,1 2269 | 0.90625,0.40625,1,1 2270 | 0.90625,0.40625,1,1 2271 | 0.96875,0.40625,1,1 2272 | 0.96875,0.40625,1,1 2273 | 0.03125,0.46875,1,1 2274 | 0.03125,0.46875,1,1 2275 | 0.09375,0.46875,1,1 2276 | 0.09375,0.46875,1,1 2277 | 0.15625,0.46875,1,1 2278 | 0.15625,0.46875,1,1 2279 | 0.21875,0.46875,1,1 2280 | 0.21875,0.46875,1,1 2281 | 0.28125,0.46875,1,1 2282 | 0.28125,0.46875,1,1 2283 | 0.34375,0.46875,1,1 2284 | 0.34375,0.46875,1,1 2285 | 0.40625,0.46875,1,1 2286 | 0.40625,0.46875,1,1 2287 | 0.46875,0.46875,1,1 2288 | 0.46875,0.46875,1,1 2289 | 0.53125,0.46875,1,1 2290 | 0.53125,0.46875,1,1 2291 | 0.59375,0.46875,1,1 2292 | 0.59375,0.46875,1,1 2293 | 0.65625,0.46875,1,1 2294 | 0.65625,0.46875,1,1 2295 | 0.71875,0.46875,1,1 2296 | 0.71875,0.46875,1,1 2297 | 0.78125,0.46875,1,1 2298 | 0.78125,0.46875,1,1 2299 | 0.84375,0.46875,1,1 2300 | 0.84375,0.46875,1,1 2301 | 0.90625,0.46875,1,1 2302 | 0.90625,0.46875,1,1 2303 | 0.96875,0.46875,1,1 2304 | 0.96875,0.46875,1,1 2305 | 0.03125,0.53125,1,1 2306 | 0.03125,0.53125,1,1 2307 | 0.09375,0.53125,1,1 2308 | 0.09375,0.53125,1,1 2309 | 0.15625,0.53125,1,1 2310 | 0.15625,0.53125,1,1 2311 | 0.21875,0.53125,1,1 2312 | 0.21875,0.53125,1,1 2313 | 0.28125,0.53125,1,1 2314 | 0.28125,0.53125,1,1 2315 | 0.34375,0.53125,1,1 2316 | 0.34375,0.53125,1,1 2317 | 0.40625,0.53125,1,1 2318 | 0.40625,0.53125,1,1 2319 | 0.46875,0.53125,1,1 2320 | 0.46875,0.53125,1,1 2321 | 0.53125,0.53125,1,1 2322 | 0.53125,0.53125,1,1 2323 | 0.59375,0.53125,1,1 2324 | 0.59375,0.53125,1,1 2325 | 0.65625,0.53125,1,1 2326 | 0.65625,0.53125,1,1 2327 | 0.71875,0.53125,1,1 2328 | 0.71875,0.53125,1,1 2329 | 0.78125,0.53125,1,1 2330 | 0.78125,0.53125,1,1 2331 | 0.84375,0.53125,1,1 2332 | 0.84375,0.53125,1,1 2333 | 0.90625,0.53125,1,1 2334 | 0.90625,0.53125,1,1 2335 | 0.96875,0.53125,1,1 2336 | 0.96875,0.53125,1,1 2337 | 0.03125,0.59375,1,1 2338 | 0.03125,0.59375,1,1 2339 | 0.09375,0.59375,1,1 2340 | 0.09375,0.59375,1,1 2341 | 0.15625,0.59375,1,1 2342 | 0.15625,0.59375,1,1 2343 | 0.21875,0.59375,1,1 2344 | 0.21875,0.59375,1,1 2345 | 0.28125,0.59375,1,1 2346 | 0.28125,0.59375,1,1 2347 | 0.34375,0.59375,1,1 2348 | 0.34375,0.59375,1,1 2349 | 0.40625,0.59375,1,1 2350 | 0.40625,0.59375,1,1 2351 | 0.46875,0.59375,1,1 2352 | 0.46875,0.59375,1,1 2353 | 0.53125,0.59375,1,1 2354 | 0.53125,0.59375,1,1 2355 | 0.59375,0.59375,1,1 2356 | 0.59375,0.59375,1,1 2357 | 0.65625,0.59375,1,1 2358 | 0.65625,0.59375,1,1 2359 | 0.71875,0.59375,1,1 2360 | 0.71875,0.59375,1,1 2361 | 0.78125,0.59375,1,1 2362 | 0.78125,0.59375,1,1 2363 | 0.84375,0.59375,1,1 2364 | 0.84375,0.59375,1,1 2365 | 0.90625,0.59375,1,1 2366 | 0.90625,0.59375,1,1 2367 | 0.96875,0.59375,1,1 2368 | 0.96875,0.59375,1,1 2369 | 0.03125,0.65625,1,1 2370 | 0.03125,0.65625,1,1 2371 | 0.09375,0.65625,1,1 2372 | 0.09375,0.65625,1,1 2373 | 0.15625,0.65625,1,1 2374 | 0.15625,0.65625,1,1 2375 | 0.21875,0.65625,1,1 2376 | 0.21875,0.65625,1,1 2377 | 0.28125,0.65625,1,1 2378 | 0.28125,0.65625,1,1 2379 | 0.34375,0.65625,1,1 2380 | 0.34375,0.65625,1,1 2381 | 0.40625,0.65625,1,1 2382 | 0.40625,0.65625,1,1 2383 | 0.46875,0.65625,1,1 2384 | 0.46875,0.65625,1,1 2385 | 0.53125,0.65625,1,1 2386 | 0.53125,0.65625,1,1 2387 | 0.59375,0.65625,1,1 2388 | 0.59375,0.65625,1,1 2389 | 0.65625,0.65625,1,1 2390 | 0.65625,0.65625,1,1 2391 | 0.71875,0.65625,1,1 2392 | 0.71875,0.65625,1,1 2393 | 0.78125,0.65625,1,1 2394 | 0.78125,0.65625,1,1 2395 | 0.84375,0.65625,1,1 2396 | 0.84375,0.65625,1,1 2397 | 0.90625,0.65625,1,1 2398 | 0.90625,0.65625,1,1 2399 | 0.96875,0.65625,1,1 2400 | 0.96875,0.65625,1,1 2401 | 0.03125,0.71875,1,1 2402 | 0.03125,0.71875,1,1 2403 | 0.09375,0.71875,1,1 2404 | 0.09375,0.71875,1,1 2405 | 0.15625,0.71875,1,1 2406 | 0.15625,0.71875,1,1 2407 | 0.21875,0.71875,1,1 2408 | 0.21875,0.71875,1,1 2409 | 0.28125,0.71875,1,1 2410 | 0.28125,0.71875,1,1 2411 | 0.34375,0.71875,1,1 2412 | 0.34375,0.71875,1,1 2413 | 0.40625,0.71875,1,1 2414 | 0.40625,0.71875,1,1 2415 | 0.46875,0.71875,1,1 2416 | 0.46875,0.71875,1,1 2417 | 0.53125,0.71875,1,1 2418 | 0.53125,0.71875,1,1 2419 | 0.59375,0.71875,1,1 2420 | 0.59375,0.71875,1,1 2421 | 0.65625,0.71875,1,1 2422 | 0.65625,0.71875,1,1 2423 | 0.71875,0.71875,1,1 2424 | 0.71875,0.71875,1,1 2425 | 0.78125,0.71875,1,1 2426 | 0.78125,0.71875,1,1 2427 | 0.84375,0.71875,1,1 2428 | 0.84375,0.71875,1,1 2429 | 0.90625,0.71875,1,1 2430 | 0.90625,0.71875,1,1 2431 | 0.96875,0.71875,1,1 2432 | 0.96875,0.71875,1,1 2433 | 0.03125,0.78125,1,1 2434 | 0.03125,0.78125,1,1 2435 | 0.09375,0.78125,1,1 2436 | 0.09375,0.78125,1,1 2437 | 0.15625,0.78125,1,1 2438 | 0.15625,0.78125,1,1 2439 | 0.21875,0.78125,1,1 2440 | 0.21875,0.78125,1,1 2441 | 0.28125,0.78125,1,1 2442 | 0.28125,0.78125,1,1 2443 | 0.34375,0.78125,1,1 2444 | 0.34375,0.78125,1,1 2445 | 0.40625,0.78125,1,1 2446 | 0.40625,0.78125,1,1 2447 | 0.46875,0.78125,1,1 2448 | 0.46875,0.78125,1,1 2449 | 0.53125,0.78125,1,1 2450 | 0.53125,0.78125,1,1 2451 | 0.59375,0.78125,1,1 2452 | 0.59375,0.78125,1,1 2453 | 0.65625,0.78125,1,1 2454 | 0.65625,0.78125,1,1 2455 | 0.71875,0.78125,1,1 2456 | 0.71875,0.78125,1,1 2457 | 0.78125,0.78125,1,1 2458 | 0.78125,0.78125,1,1 2459 | 0.84375,0.78125,1,1 2460 | 0.84375,0.78125,1,1 2461 | 0.90625,0.78125,1,1 2462 | 0.90625,0.78125,1,1 2463 | 0.96875,0.78125,1,1 2464 | 0.96875,0.78125,1,1 2465 | 0.03125,0.84375,1,1 2466 | 0.03125,0.84375,1,1 2467 | 0.09375,0.84375,1,1 2468 | 0.09375,0.84375,1,1 2469 | 0.15625,0.84375,1,1 2470 | 0.15625,0.84375,1,1 2471 | 0.21875,0.84375,1,1 2472 | 0.21875,0.84375,1,1 2473 | 0.28125,0.84375,1,1 2474 | 0.28125,0.84375,1,1 2475 | 0.34375,0.84375,1,1 2476 | 0.34375,0.84375,1,1 2477 | 0.40625,0.84375,1,1 2478 | 0.40625,0.84375,1,1 2479 | 0.46875,0.84375,1,1 2480 | 0.46875,0.84375,1,1 2481 | 0.53125,0.84375,1,1 2482 | 0.53125,0.84375,1,1 2483 | 0.59375,0.84375,1,1 2484 | 0.59375,0.84375,1,1 2485 | 0.65625,0.84375,1,1 2486 | 0.65625,0.84375,1,1 2487 | 0.71875,0.84375,1,1 2488 | 0.71875,0.84375,1,1 2489 | 0.78125,0.84375,1,1 2490 | 0.78125,0.84375,1,1 2491 | 0.84375,0.84375,1,1 2492 | 0.84375,0.84375,1,1 2493 | 0.90625,0.84375,1,1 2494 | 0.90625,0.84375,1,1 2495 | 0.96875,0.84375,1,1 2496 | 0.96875,0.84375,1,1 2497 | 0.03125,0.90625,1,1 2498 | 0.03125,0.90625,1,1 2499 | 0.09375,0.90625,1,1 2500 | 0.09375,0.90625,1,1 2501 | 0.15625,0.90625,1,1 2502 | 0.15625,0.90625,1,1 2503 | 0.21875,0.90625,1,1 2504 | 0.21875,0.90625,1,1 2505 | 0.28125,0.90625,1,1 2506 | 0.28125,0.90625,1,1 2507 | 0.34375,0.90625,1,1 2508 | 0.34375,0.90625,1,1 2509 | 0.40625,0.90625,1,1 2510 | 0.40625,0.90625,1,1 2511 | 0.46875,0.90625,1,1 2512 | 0.46875,0.90625,1,1 2513 | 0.53125,0.90625,1,1 2514 | 0.53125,0.90625,1,1 2515 | 0.59375,0.90625,1,1 2516 | 0.59375,0.90625,1,1 2517 | 0.65625,0.90625,1,1 2518 | 0.65625,0.90625,1,1 2519 | 0.71875,0.90625,1,1 2520 | 0.71875,0.90625,1,1 2521 | 0.78125,0.90625,1,1 2522 | 0.78125,0.90625,1,1 2523 | 0.84375,0.90625,1,1 2524 | 0.84375,0.90625,1,1 2525 | 0.90625,0.90625,1,1 2526 | 0.90625,0.90625,1,1 2527 | 0.96875,0.90625,1,1 2528 | 0.96875,0.90625,1,1 2529 | 0.03125,0.96875,1,1 2530 | 0.03125,0.96875,1,1 2531 | 0.09375,0.96875,1,1 2532 | 0.09375,0.96875,1,1 2533 | 0.15625,0.96875,1,1 2534 | 0.15625,0.96875,1,1 2535 | 0.21875,0.96875,1,1 2536 | 0.21875,0.96875,1,1 2537 | 0.28125,0.96875,1,1 2538 | 0.28125,0.96875,1,1 2539 | 0.34375,0.96875,1,1 2540 | 0.34375,0.96875,1,1 2541 | 0.40625,0.96875,1,1 2542 | 0.40625,0.96875,1,1 2543 | 0.46875,0.96875,1,1 2544 | 0.46875,0.96875,1,1 2545 | 0.53125,0.96875,1,1 2546 | 0.53125,0.96875,1,1 2547 | 0.59375,0.96875,1,1 2548 | 0.59375,0.96875,1,1 2549 | 0.65625,0.96875,1,1 2550 | 0.65625,0.96875,1,1 2551 | 0.71875,0.96875,1,1 2552 | 0.71875,0.96875,1,1 2553 | 0.78125,0.96875,1,1 2554 | 0.78125,0.96875,1,1 2555 | 0.84375,0.96875,1,1 2556 | 0.84375,0.96875,1,1 2557 | 0.90625,0.96875,1,1 2558 | 0.90625,0.96875,1,1 2559 | 0.96875,0.96875,1,1 2560 | 0.96875,0.96875,1,1 2561 | 0.0625,0.0625,1,1 2562 | 0.0625,0.0625,1,1 2563 | 0.0625,0.0625,1,1 2564 | 0.0625,0.0625,1,1 2565 | 0.0625,0.0625,1,1 2566 | 0.0625,0.0625,1,1 2567 | 0.1875,0.0625,1,1 2568 | 0.1875,0.0625,1,1 2569 | 0.1875,0.0625,1,1 2570 | 0.1875,0.0625,1,1 2571 | 0.1875,0.0625,1,1 2572 | 0.1875,0.0625,1,1 2573 | 0.3125,0.0625,1,1 2574 | 0.3125,0.0625,1,1 2575 | 0.3125,0.0625,1,1 2576 | 0.3125,0.0625,1,1 2577 | 0.3125,0.0625,1,1 2578 | 0.3125,0.0625,1,1 2579 | 0.4375,0.0625,1,1 2580 | 0.4375,0.0625,1,1 2581 | 0.4375,0.0625,1,1 2582 | 0.4375,0.0625,1,1 2583 | 0.4375,0.0625,1,1 2584 | 0.4375,0.0625,1,1 2585 | 0.5625,0.0625,1,1 2586 | 0.5625,0.0625,1,1 2587 | 0.5625,0.0625,1,1 2588 | 0.5625,0.0625,1,1 2589 | 0.5625,0.0625,1,1 2590 | 0.5625,0.0625,1,1 2591 | 0.6875,0.0625,1,1 2592 | 0.6875,0.0625,1,1 2593 | 0.6875,0.0625,1,1 2594 | 0.6875,0.0625,1,1 2595 | 0.6875,0.0625,1,1 2596 | 0.6875,0.0625,1,1 2597 | 0.8125,0.0625,1,1 2598 | 0.8125,0.0625,1,1 2599 | 0.8125,0.0625,1,1 2600 | 0.8125,0.0625,1,1 2601 | 0.8125,0.0625,1,1 2602 | 0.8125,0.0625,1,1 2603 | 0.9375,0.0625,1,1 2604 | 0.9375,0.0625,1,1 2605 | 0.9375,0.0625,1,1 2606 | 0.9375,0.0625,1,1 2607 | 0.9375,0.0625,1,1 2608 | 0.9375,0.0625,1,1 2609 | 0.0625,0.1875,1,1 2610 | 0.0625,0.1875,1,1 2611 | 0.0625,0.1875,1,1 2612 | 0.0625,0.1875,1,1 2613 | 0.0625,0.1875,1,1 2614 | 0.0625,0.1875,1,1 2615 | 0.1875,0.1875,1,1 2616 | 0.1875,0.1875,1,1 2617 | 0.1875,0.1875,1,1 2618 | 0.1875,0.1875,1,1 2619 | 0.1875,0.1875,1,1 2620 | 0.1875,0.1875,1,1 2621 | 0.3125,0.1875,1,1 2622 | 0.3125,0.1875,1,1 2623 | 0.3125,0.1875,1,1 2624 | 0.3125,0.1875,1,1 2625 | 0.3125,0.1875,1,1 2626 | 0.3125,0.1875,1,1 2627 | 0.4375,0.1875,1,1 2628 | 0.4375,0.1875,1,1 2629 | 0.4375,0.1875,1,1 2630 | 0.4375,0.1875,1,1 2631 | 0.4375,0.1875,1,1 2632 | 0.4375,0.1875,1,1 2633 | 0.5625,0.1875,1,1 2634 | 0.5625,0.1875,1,1 2635 | 0.5625,0.1875,1,1 2636 | 0.5625,0.1875,1,1 2637 | 0.5625,0.1875,1,1 2638 | 0.5625,0.1875,1,1 2639 | 0.6875,0.1875,1,1 2640 | 0.6875,0.1875,1,1 2641 | 0.6875,0.1875,1,1 2642 | 0.6875,0.1875,1,1 2643 | 0.6875,0.1875,1,1 2644 | 0.6875,0.1875,1,1 2645 | 0.8125,0.1875,1,1 2646 | 0.8125,0.1875,1,1 2647 | 0.8125,0.1875,1,1 2648 | 0.8125,0.1875,1,1 2649 | 0.8125,0.1875,1,1 2650 | 0.8125,0.1875,1,1 2651 | 0.9375,0.1875,1,1 2652 | 0.9375,0.1875,1,1 2653 | 0.9375,0.1875,1,1 2654 | 0.9375,0.1875,1,1 2655 | 0.9375,0.1875,1,1 2656 | 0.9375,0.1875,1,1 2657 | 0.0625,0.3125,1,1 2658 | 0.0625,0.3125,1,1 2659 | 0.0625,0.3125,1,1 2660 | 0.0625,0.3125,1,1 2661 | 0.0625,0.3125,1,1 2662 | 0.0625,0.3125,1,1 2663 | 0.1875,0.3125,1,1 2664 | 0.1875,0.3125,1,1 2665 | 0.1875,0.3125,1,1 2666 | 0.1875,0.3125,1,1 2667 | 0.1875,0.3125,1,1 2668 | 0.1875,0.3125,1,1 2669 | 0.3125,0.3125,1,1 2670 | 0.3125,0.3125,1,1 2671 | 0.3125,0.3125,1,1 2672 | 0.3125,0.3125,1,1 2673 | 0.3125,0.3125,1,1 2674 | 0.3125,0.3125,1,1 2675 | 0.4375,0.3125,1,1 2676 | 0.4375,0.3125,1,1 2677 | 0.4375,0.3125,1,1 2678 | 0.4375,0.3125,1,1 2679 | 0.4375,0.3125,1,1 2680 | 0.4375,0.3125,1,1 2681 | 0.5625,0.3125,1,1 2682 | 0.5625,0.3125,1,1 2683 | 0.5625,0.3125,1,1 2684 | 0.5625,0.3125,1,1 2685 | 0.5625,0.3125,1,1 2686 | 0.5625,0.3125,1,1 2687 | 0.6875,0.3125,1,1 2688 | 0.6875,0.3125,1,1 2689 | 0.6875,0.3125,1,1 2690 | 0.6875,0.3125,1,1 2691 | 0.6875,0.3125,1,1 2692 | 0.6875,0.3125,1,1 2693 | 0.8125,0.3125,1,1 2694 | 0.8125,0.3125,1,1 2695 | 0.8125,0.3125,1,1 2696 | 0.8125,0.3125,1,1 2697 | 0.8125,0.3125,1,1 2698 | 0.8125,0.3125,1,1 2699 | 0.9375,0.3125,1,1 2700 | 0.9375,0.3125,1,1 2701 | 0.9375,0.3125,1,1 2702 | 0.9375,0.3125,1,1 2703 | 0.9375,0.3125,1,1 2704 | 0.9375,0.3125,1,1 2705 | 0.0625,0.4375,1,1 2706 | 0.0625,0.4375,1,1 2707 | 0.0625,0.4375,1,1 2708 | 0.0625,0.4375,1,1 2709 | 0.0625,0.4375,1,1 2710 | 0.0625,0.4375,1,1 2711 | 0.1875,0.4375,1,1 2712 | 0.1875,0.4375,1,1 2713 | 0.1875,0.4375,1,1 2714 | 0.1875,0.4375,1,1 2715 | 0.1875,0.4375,1,1 2716 | 0.1875,0.4375,1,1 2717 | 0.3125,0.4375,1,1 2718 | 0.3125,0.4375,1,1 2719 | 0.3125,0.4375,1,1 2720 | 0.3125,0.4375,1,1 2721 | 0.3125,0.4375,1,1 2722 | 0.3125,0.4375,1,1 2723 | 0.4375,0.4375,1,1 2724 | 0.4375,0.4375,1,1 2725 | 0.4375,0.4375,1,1 2726 | 0.4375,0.4375,1,1 2727 | 0.4375,0.4375,1,1 2728 | 0.4375,0.4375,1,1 2729 | 0.5625,0.4375,1,1 2730 | 0.5625,0.4375,1,1 2731 | 0.5625,0.4375,1,1 2732 | 0.5625,0.4375,1,1 2733 | 0.5625,0.4375,1,1 2734 | 0.5625,0.4375,1,1 2735 | 0.6875,0.4375,1,1 2736 | 0.6875,0.4375,1,1 2737 | 0.6875,0.4375,1,1 2738 | 0.6875,0.4375,1,1 2739 | 0.6875,0.4375,1,1 2740 | 0.6875,0.4375,1,1 2741 | 0.8125,0.4375,1,1 2742 | 0.8125,0.4375,1,1 2743 | 0.8125,0.4375,1,1 2744 | 0.8125,0.4375,1,1 2745 | 0.8125,0.4375,1,1 2746 | 0.8125,0.4375,1,1 2747 | 0.9375,0.4375,1,1 2748 | 0.9375,0.4375,1,1 2749 | 0.9375,0.4375,1,1 2750 | 0.9375,0.4375,1,1 2751 | 0.9375,0.4375,1,1 2752 | 0.9375,0.4375,1,1 2753 | 0.0625,0.5625,1,1 2754 | 0.0625,0.5625,1,1 2755 | 0.0625,0.5625,1,1 2756 | 0.0625,0.5625,1,1 2757 | 0.0625,0.5625,1,1 2758 | 0.0625,0.5625,1,1 2759 | 0.1875,0.5625,1,1 2760 | 0.1875,0.5625,1,1 2761 | 0.1875,0.5625,1,1 2762 | 0.1875,0.5625,1,1 2763 | 0.1875,0.5625,1,1 2764 | 0.1875,0.5625,1,1 2765 | 0.3125,0.5625,1,1 2766 | 0.3125,0.5625,1,1 2767 | 0.3125,0.5625,1,1 2768 | 0.3125,0.5625,1,1 2769 | 0.3125,0.5625,1,1 2770 | 0.3125,0.5625,1,1 2771 | 0.4375,0.5625,1,1 2772 | 0.4375,0.5625,1,1 2773 | 0.4375,0.5625,1,1 2774 | 0.4375,0.5625,1,1 2775 | 0.4375,0.5625,1,1 2776 | 0.4375,0.5625,1,1 2777 | 0.5625,0.5625,1,1 2778 | 0.5625,0.5625,1,1 2779 | 0.5625,0.5625,1,1 2780 | 0.5625,0.5625,1,1 2781 | 0.5625,0.5625,1,1 2782 | 0.5625,0.5625,1,1 2783 | 0.6875,0.5625,1,1 2784 | 0.6875,0.5625,1,1 2785 | 0.6875,0.5625,1,1 2786 | 0.6875,0.5625,1,1 2787 | 0.6875,0.5625,1,1 2788 | 0.6875,0.5625,1,1 2789 | 0.8125,0.5625,1,1 2790 | 0.8125,0.5625,1,1 2791 | 0.8125,0.5625,1,1 2792 | 0.8125,0.5625,1,1 2793 | 0.8125,0.5625,1,1 2794 | 0.8125,0.5625,1,1 2795 | 0.9375,0.5625,1,1 2796 | 0.9375,0.5625,1,1 2797 | 0.9375,0.5625,1,1 2798 | 0.9375,0.5625,1,1 2799 | 0.9375,0.5625,1,1 2800 | 0.9375,0.5625,1,1 2801 | 0.0625,0.6875,1,1 2802 | 0.0625,0.6875,1,1 2803 | 0.0625,0.6875,1,1 2804 | 0.0625,0.6875,1,1 2805 | 0.0625,0.6875,1,1 2806 | 0.0625,0.6875,1,1 2807 | 0.1875,0.6875,1,1 2808 | 0.1875,0.6875,1,1 2809 | 0.1875,0.6875,1,1 2810 | 0.1875,0.6875,1,1 2811 | 0.1875,0.6875,1,1 2812 | 0.1875,0.6875,1,1 2813 | 0.3125,0.6875,1,1 2814 | 0.3125,0.6875,1,1 2815 | 0.3125,0.6875,1,1 2816 | 0.3125,0.6875,1,1 2817 | 0.3125,0.6875,1,1 2818 | 0.3125,0.6875,1,1 2819 | 0.4375,0.6875,1,1 2820 | 0.4375,0.6875,1,1 2821 | 0.4375,0.6875,1,1 2822 | 0.4375,0.6875,1,1 2823 | 0.4375,0.6875,1,1 2824 | 0.4375,0.6875,1,1 2825 | 0.5625,0.6875,1,1 2826 | 0.5625,0.6875,1,1 2827 | 0.5625,0.6875,1,1 2828 | 0.5625,0.6875,1,1 2829 | 0.5625,0.6875,1,1 2830 | 0.5625,0.6875,1,1 2831 | 0.6875,0.6875,1,1 2832 | 0.6875,0.6875,1,1 2833 | 0.6875,0.6875,1,1 2834 | 0.6875,0.6875,1,1 2835 | 0.6875,0.6875,1,1 2836 | 0.6875,0.6875,1,1 2837 | 0.8125,0.6875,1,1 2838 | 0.8125,0.6875,1,1 2839 | 0.8125,0.6875,1,1 2840 | 0.8125,0.6875,1,1 2841 | 0.8125,0.6875,1,1 2842 | 0.8125,0.6875,1,1 2843 | 0.9375,0.6875,1,1 2844 | 0.9375,0.6875,1,1 2845 | 0.9375,0.6875,1,1 2846 | 0.9375,0.6875,1,1 2847 | 0.9375,0.6875,1,1 2848 | 0.9375,0.6875,1,1 2849 | 0.0625,0.8125,1,1 2850 | 0.0625,0.8125,1,1 2851 | 0.0625,0.8125,1,1 2852 | 0.0625,0.8125,1,1 2853 | 0.0625,0.8125,1,1 2854 | 0.0625,0.8125,1,1 2855 | 0.1875,0.8125,1,1 2856 | 0.1875,0.8125,1,1 2857 | 0.1875,0.8125,1,1 2858 | 0.1875,0.8125,1,1 2859 | 0.1875,0.8125,1,1 2860 | 0.1875,0.8125,1,1 2861 | 0.3125,0.8125,1,1 2862 | 0.3125,0.8125,1,1 2863 | 0.3125,0.8125,1,1 2864 | 0.3125,0.8125,1,1 2865 | 0.3125,0.8125,1,1 2866 | 0.3125,0.8125,1,1 2867 | 0.4375,0.8125,1,1 2868 | 0.4375,0.8125,1,1 2869 | 0.4375,0.8125,1,1 2870 | 0.4375,0.8125,1,1 2871 | 0.4375,0.8125,1,1 2872 | 0.4375,0.8125,1,1 2873 | 0.5625,0.8125,1,1 2874 | 0.5625,0.8125,1,1 2875 | 0.5625,0.8125,1,1 2876 | 0.5625,0.8125,1,1 2877 | 0.5625,0.8125,1,1 2878 | 0.5625,0.8125,1,1 2879 | 0.6875,0.8125,1,1 2880 | 0.6875,0.8125,1,1 2881 | 0.6875,0.8125,1,1 2882 | 0.6875,0.8125,1,1 2883 | 0.6875,0.8125,1,1 2884 | 0.6875,0.8125,1,1 2885 | 0.8125,0.8125,1,1 2886 | 0.8125,0.8125,1,1 2887 | 0.8125,0.8125,1,1 2888 | 0.8125,0.8125,1,1 2889 | 0.8125,0.8125,1,1 2890 | 0.8125,0.8125,1,1 2891 | 0.9375,0.8125,1,1 2892 | 0.9375,0.8125,1,1 2893 | 0.9375,0.8125,1,1 2894 | 0.9375,0.8125,1,1 2895 | 0.9375,0.8125,1,1 2896 | 0.9375,0.8125,1,1 2897 | 0.0625,0.9375,1,1 2898 | 0.0625,0.9375,1,1 2899 | 0.0625,0.9375,1,1 2900 | 0.0625,0.9375,1,1 2901 | 0.0625,0.9375,1,1 2902 | 0.0625,0.9375,1,1 2903 | 0.1875,0.9375,1,1 2904 | 0.1875,0.9375,1,1 2905 | 0.1875,0.9375,1,1 2906 | 0.1875,0.9375,1,1 2907 | 0.1875,0.9375,1,1 2908 | 0.1875,0.9375,1,1 2909 | 0.3125,0.9375,1,1 2910 | 0.3125,0.9375,1,1 2911 | 0.3125,0.9375,1,1 2912 | 0.3125,0.9375,1,1 2913 | 0.3125,0.9375,1,1 2914 | 0.3125,0.9375,1,1 2915 | 0.4375,0.9375,1,1 2916 | 0.4375,0.9375,1,1 2917 | 0.4375,0.9375,1,1 2918 | 0.4375,0.9375,1,1 2919 | 0.4375,0.9375,1,1 2920 | 0.4375,0.9375,1,1 2921 | 0.5625,0.9375,1,1 2922 | 0.5625,0.9375,1,1 2923 | 0.5625,0.9375,1,1 2924 | 0.5625,0.9375,1,1 2925 | 0.5625,0.9375,1,1 2926 | 0.5625,0.9375,1,1 2927 | 0.6875,0.9375,1,1 2928 | 0.6875,0.9375,1,1 2929 | 0.6875,0.9375,1,1 2930 | 0.6875,0.9375,1,1 2931 | 0.6875,0.9375,1,1 2932 | 0.6875,0.9375,1,1 2933 | 0.8125,0.9375,1,1 2934 | 0.8125,0.9375,1,1 2935 | 0.8125,0.9375,1,1 2936 | 0.8125,0.9375,1,1 2937 | 0.8125,0.9375,1,1 2938 | 0.8125,0.9375,1,1 2939 | 0.9375,0.9375,1,1 2940 | 0.9375,0.9375,1,1 2941 | 0.9375,0.9375,1,1 2942 | 0.9375,0.9375,1,1 2943 | 0.9375,0.9375,1,1 2944 | 0.9375,0.9375,1,1 2945 | -------------------------------------------------------------------------------- /data/test_img.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/data/test_img.jpg -------------------------------------------------------------------------------- /detect_on_camera.py: -------------------------------------------------------------------------------- 1 | import platform 2 | sysstr = platform.system() 3 | if (sysstr == "Windows"): 4 | print("Call Windows tasks") 5 | elif (sysstr == "Linux"): # 树莓派上也是Linux 6 | print("Call Linux tasks") 7 | else: 8 | print("other System tasks") 9 | 10 | import copy 11 | import time 12 | import numpy as np 13 | import cv2 14 | from collections import deque 15 | 16 | from hand_tracker import HandTracker 17 | from gasture_utils.determine_gasture import create_known_finger_poses, determine_position, get_position_name_with_pose_id 18 | from gasture_utils.FingerPoseEstimate import FingerPoseEstimate 19 | 20 | """ 21 | mediapipe 模型 handdetect模型 22 | """ 23 | 24 | palm_model_path = "./models/palm_detection_without_custom_op.tflite" 25 | landmark_model_path = "./models/mediapipe_hand_landmark.tflite" 26 | anchors_path = "./data/anchors.csv" 27 | MIN_CONFIDENCE = 0.10 28 | # cap = cv2.VideoCapture(r'C:\PythonProject\jing_vision\detection\keras_tf\tflite\posenet_mb2_ssd\dance.flv') 29 | # cap = cv2.VideoCapture(r'hand.flv') # 使用本地视频 30 | cap = cv2.VideoCapture(0) # 调用webcamera 31 | cap.set(cv2.CAP_PROP_FPS, 30) 32 | cap.set(cv2.CAP_PROP_FRAME_WIDTH, 480) 33 | cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) 34 | detector = HandTracker(palm_model_path, landmark_model_path, anchors_path, 35 | box_shift=0.2, box_enlarge=1.3) 36 | 37 | 38 | Q = deque(maxlen=5) 39 | gasture_define = { 'Simple Thumbs Up':0, 40 | 'Thumbs Up Right':1, 41 | 'I love you':2, 42 | 'Victory':3 , 43 | 'Pointing Up':4, 44 | 'Okay':5 , 45 | 'Spock':6, 46 | 'One':7, 47 | 'Three':8 48 | } 49 | reverse_gasture_define = {v:k for k,v in gasture_define.items()} 50 | known_finger_poses = create_known_finger_poses() 51 | # 8 12 16 20 52 | # | | | | 53 | # 7 11 15 19 54 | # 4 | | | | 55 | # | 6 10 14 18 56 | # 3 | | | | 57 | # | 5---9---13--17 58 | # 2 \ / 59 | # \ \ / 60 | # 1 \ / 61 | # \ \ / 62 | # ------0- 63 | 64 | # Anatomy guide 65 | # http://blog.handcare.org/blog/2017/10/26/anatomy-101-finger-joints/ 66 | HAND_POINTS = [ 67 | "BASE", 68 | "T_STT", "T_BCMC", "T_MCP", "T_IP", # Thumb 69 | "I_CMC", "I_MCP", "I_PIP", "I_DIP", # Index 70 | "M_CMC", "M_MCP", "M_PIP", "M_DIP", # Middle 71 | "R_CMC", "R_MCP", "R_PIP", "R_DIP", # Ring 72 | "P_CMC", "P_MCP", "P_PIP", "P_DIP", # Pinky 73 | ] 74 | # 关节连接 75 | limbs = [[0, 1], 76 | [1, 2], 77 | [2, 3], 78 | [3, 4], 79 | [0, 5], 80 | [5, 6], 81 | [6, 7], 82 | [7, 8], 83 | [0, 9], 84 | [9, 10], 85 | [10, 11], 86 | [11, 12], 87 | [0, 13], 88 | [13, 14], 89 | [14, 15], 90 | [15, 16], 91 | [0, 17], 92 | [17, 18], 93 | [18, 19], 94 | [19, 20] 95 | ] 96 | fps_list =[0 for i in range(10)] 97 | joint_color_code = [[139, 53, 255], 98 | [0, 56, 255], 99 | [43, 140, 237], 100 | [37, 168, 36], 101 | [147, 147, 0], 102 | [70, 17, 145]] 103 | 104 | 105 | frame_count = 0 106 | return_track={} 107 | while True: 108 | ret, color_image=cap.read() 109 | show_image=copy.deepcopy(color_image) 110 | color_image=cv2.cvtColor(color_image, cv2.COLOR_BGR2RGB) # 将BGR转为RGB 111 | # print(ret, color_image.shape) 112 | if not ret: 113 | print('video over') 114 | break 115 | start_time=time.time() 116 | # print(color_image.shape) 117 | # 判断检测间隔 118 | if frame_count%7==0: 119 | kp, box,return_track=detector(color_image,None,True) 120 | elif return_track is None: 121 | pass 122 | else: 123 | kp, box, _ = detector(color_image,return_track,False) 124 | if kp is not None and box is not None: 125 | # print('kp is ',kp) 126 | pts=np.array(box, np.int32) 127 | kp=np.array(kp, np.int32) 128 | # 计算手势 129 | fingerPoseEstimate = FingerPoseEstimate(kp) 130 | fingerPoseEstimate.calculate_positions_of_fingers(print_finger_info=False) 131 | obtained_positions = determine_position(fingerPoseEstimate.finger_curled, 132 | fingerPoseEstimate.finger_position, known_finger_poses, 133 | 0.45 * 10) 134 | # print(obtained_positions) 135 | # 根据字典的值进行排序 136 | gasture_pre = sorted(obtained_positions.items(), key=lambda item: item[1], reverse=True) 137 | # 仅绘制最高概率与绘制所有可能概率 138 | if len(gasture_pre)>0: 139 | Q.append(gasture_define[gasture_pre[0][0]]) # 通过队列中最多的元素输出为类别 140 | counts = np.bincount(Q) 141 | # 返回众数 142 | max_index = np.argmax(counts) 143 | print(reverse_gasture_define[max_index]) 144 | cv2.putText(show_image, 'rank 1 pre %s probably %f'%(reverse_gasture_define[max_index],gasture_pre[0][1]), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 155), 1, cv2.LINE_AA) 145 | # cv2.putText(show_image, 'rank 1 pre %s probably %f'%(gasture_pre[0][0],gasture_pre[0][1]), (30, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 155), 1, cv2.LINE_AA) 146 | # for i,pre in enumerate(gasture_pre): 147 | # cv2.putText(show_image, 'rank %d pre:%s probably%f'%(i+1,pre[0],pre[1]), (20, i*20+20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 155), 1, cv2.LINE_AA) 148 | for i in kp: 149 | cv2.circle(show_image, center=(i[0], i[1]), radius=3, color=(0, 255, 0), thickness=-1) 150 | # cv2.rectangle(show_image, (int(box[0,0]), int(box[0,1])), (int(box[1,0]), int(box[1,1])), (0, 255,255), 2) 151 | # 绘制关键点链接线 152 | cv2.line(show_image, (kp[0][0], kp[0][1]), 153 | (kp[1][0], kp[1][1]), (255, 0, 0), 2) 154 | cv2.line(show_image, (kp[1][0], kp[1][1]), 155 | (kp[2][0], kp[2][1]), (255, 0, 0), 2) 156 | cv2.line(show_image, (kp[2][0], kp[2][1]), 157 | (kp[3][0], kp[3][1]), (255, 0, 0), 2) 158 | cv2.line(show_image, (kp[3][0], kp[3][1]), 159 | (kp[4][0], kp[4][1]), (255, 0, 0), 2) 160 | 161 | cv2.line(show_image, (kp[0][0], kp[0][1]), 162 | (kp[5][0], kp[5][1]), (255, 255, 0), 2) 163 | cv2.line(show_image, (kp[5][0], kp[5][1]), 164 | (kp[6][0], kp[6][1]), (255, 255, 0), 2) 165 | cv2.line(show_image, (kp[6][0], kp[6][1]), 166 | (kp[7][0], kp[7][1]), (255, 255, 0), 2) 167 | cv2.line(show_image, (kp[7][0], kp[7][1]), 168 | (kp[8][0], kp[8][1]), (255, 255, 0), 2) 169 | 170 | cv2.line(show_image, (kp[5][0], kp[5][1]), 171 | (kp[9][0], kp[9][1]), (0, 0, 255), 2) 172 | cv2.line(show_image, (kp[9][0], kp[9][1]), 173 | (kp[10][0], kp[10][1]), (0, 0, 255), 2) 174 | cv2.line(show_image, (kp[10][0], kp[10][1]), 175 | (kp[11][0], kp[11][1]), (0, 0, 255), 2) 176 | cv2.line(show_image, (kp[11][0], kp[11][1]), 177 | (kp[12][0], kp[12][1]), (0, 0, 255), 2) 178 | 179 | cv2.line(show_image, (kp[9][0], kp[9][1]), 180 | (kp[13][0], kp[13][1]), (255, 0, 255), 2) 181 | cv2.line(show_image, (kp[13][0], kp[13][1]), 182 | (kp[14][0], kp[14][1]), (255, 0, 255), 2) 183 | cv2.line(show_image, (kp[14][0], kp[14][1]), 184 | (kp[15][0], kp[15][1]), (255, 0, 255), 2) 185 | cv2.line(show_image, (kp[15][0], kp[15][1]), 186 | (kp[16][0], kp[16][1]), (255, 0, 255), 2) 187 | 188 | cv2.line(show_image, (kp[0][0], kp[0][1]), 189 | (kp[17][0], kp[17][1]), (0, 255, 0), 2) 190 | cv2.line(show_image, (kp[13][0], kp[13][1]), 191 | (kp[17][0], kp[17][1]), (0, 255, 0), 2) 192 | cv2.line(show_image, (kp[17][0], kp[17][1]), 193 | (kp[18][0], kp[18][1]), (0, 255, 0), 2) 194 | cv2.line(show_image, (kp[18][0], kp[18][1]), 195 | (kp[19][0], kp[19][1]), (0, 255, 0), 2) 196 | cv2.line(show_image, (kp[19][0], kp[19][1]), 197 | (kp[20][0], kp[20][1]), (0, 255, 0), 2) 198 | 199 | 200 | cv2.polylines(show_image, [pts], True, (0, 255, 255), 1) # 绘制多边形 201 | # print(box) 202 | fps = 1 / (time.time() - start_time) 203 | print('FPS:', fps) 204 | index = frame_count%10 205 | fps_list[index]=fps 206 | cv2.putText(show_image, 207 | 'FPS:%f' % ( np.mean(fps_list)), (30, 70), 208 | cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 155), 1, cv2.LINE_AA) 209 | if sysstr == "Windows": 210 | cv2.namedWindow("USB Camera", cv2.WINDOW_AUTOSIZE) 211 | cv2.imshow("USB Camera", show_image) 212 | if cv2.waitKey(1) & 0xFF == ord('q'): 213 | break 214 | frame_count +=1 215 | 216 | cap.release() 217 | cv2.destroyAllWindows() 218 | -------------------------------------------------------------------------------- /gasture_utils/Finger.py: -------------------------------------------------------------------------------- 1 | from enum import IntEnum 2 | 3 | 4 | class Finger(IntEnum): 5 | Thumb = 0 6 | Index = 1 7 | Middle = 2 8 | Ring = 3 9 | Little = 4 10 | 11 | @staticmethod 12 | def get_array_of_points(finger): 13 | finger_array = None 14 | if finger == Finger.Thumb: 15 | finger_array = [(0, 1), (1, 2), (2 ,3), (3, 4)] 16 | elif finger == Finger.Index: 17 | finger_array = [(0, 5), (5, 6), (6, 7), (7, 8)] 18 | elif finger == Finger.Middle: 19 | finger_array = [(0, 9), (9, 10), (10, 11), (11, 12)] 20 | elif finger == Finger.Ring: 21 | finger_array = [(0, 13), (13, 14), (14, 15), (15, 16)] 22 | else: 23 | finger_array = [(0, 17), (17, 18), (18, 19), (19, 20)] 24 | return finger_array 25 | 26 | @staticmethod 27 | def get_finger_name(finger): 28 | finger_name = '' 29 | if finger == Finger.Thumb: 30 | finger_name = 'Thumb' 31 | elif finger == Finger.Index: 32 | finger_name = 'Index' 33 | elif finger == Finger.Middle: 34 | finger_name = 'Middle' 35 | elif finger == Finger.Ring: 36 | finger_name = 'Ring' 37 | elif finger == Finger.Little: 38 | finger_name = 'Little' 39 | return finger_name -------------------------------------------------------------------------------- /gasture_utils/FingerCurled.py: -------------------------------------------------------------------------------- 1 | from enum import IntEnum 2 | 3 | 4 | class FingerCurled(IntEnum): 5 | """ 6 | 定义手指弯曲 7 | """ 8 | NoCurl = 0 # 无弯曲 9 | HalfCurl = 1 # 微弯曲 10 | FullCurl = 2 #全弯曲 11 | 12 | @staticmethod 13 | def get_finger_curled_name(finger_curled): 14 | finger_curled_name = '' 15 | if finger_curled == FingerCurled.NoCurl: 16 | finger_curled_name = 'No Curl' 17 | elif finger_curled == FingerCurled.HalfCurl: 18 | finger_curled_name = 'Half Curl' 19 | elif finger_curled == FingerCurled.FullCurl: 20 | finger_curled_name = 'Full Curl' 21 | return finger_curled_name -------------------------------------------------------------------------------- /gasture_utils/FingerDataFormation.py: -------------------------------------------------------------------------------- 1 | class FingerDataFormation: 2 | def __init__(self): 3 | self.curl_position = [] 4 | self.finger_position = [] 5 | self.curl_position_confidence = [] 6 | self.finger_position_confidence = [] 7 | self.position_name = '' 8 | self.position_id = -1 -------------------------------------------------------------------------------- /gasture_utils/FingerPoseEstimate.py: -------------------------------------------------------------------------------- 1 | import numpy as np 2 | import math 3 | 4 | from gasture_utils.Finger import Finger 5 | from gasture_utils.FingerCurled import FingerCurled 6 | from gasture_utils.FingerPosition import FingerPosition 7 | 8 | 9 | class FingerPoseEstimate: 10 | def __init__(self, coords_xy): 11 | self.coords_xy = np.squeeze(coords_xy) 12 | 13 | self.finger_position = [ 14 | FingerPosition.VerticalUp, 15 | FingerPosition.VerticalUp, 16 | FingerPosition.VerticalUp, 17 | FingerPosition.VerticalUp, 18 | FingerPosition.VerticalUp] 19 | self.finger_curled = [ 20 | FingerCurled.NoCurl, 21 | FingerCurled.NoCurl, 22 | FingerCurled.NoCurl, 23 | FingerCurled.NoCurl, 24 | FingerCurled.NoCurl, 25 | ] 26 | self.slopes_xy = [] 27 | self.slopes_yz = [] 28 | 29 | def get_slope(self, point1, point2): 30 | slope_xy = self._calculate_slope_procedure( 31 | point1[0], point1[1], point2[0], point2[1]) 32 | if len(point1) == 2: 33 | return slope_xy 34 | 35 | slope_yz = self._calculate_slope_procedure( 36 | point1[1], point1[2], point2[1], point2[2]) 37 | return slope_xy, slope_yz 38 | 39 | def calculate_slope_of_fingers(self): 40 | for finger in Finger: 41 | # print('Angle Finger is {}'.format(Finger.get_finger_name(finger))) 42 | points = Finger.get_array_of_points(finger) 43 | slope_at_xy = [] 44 | for point in points: 45 | 46 | point1 = self.coords_xy[point[0]] 47 | point2 = self.coords_xy[point[1]] 48 | slope_xy = self.get_slope(point1, point2) 49 | slope_at_xy.append(slope_xy) 50 | 51 | self.slopes_xy.append(slope_at_xy) 52 | 53 | 54 | def angle_orientation_at(self, angle, weightage_at=1.0): 55 | is_vertical, is_diagonal, is_horizontal = 0, 0, 0 56 | if angle >= 75.0 and angle <= 105.0: 57 | is_vertical = 1 * weightage_at 58 | elif angle >= 25.0 and angle <= 155.0: 59 | is_diagonal = 1 * weightage_at 60 | else: 61 | is_horizontal = 1 * weightage_at 62 | return (is_vertical, is_diagonal, is_horizontal) 63 | 64 | def is_finger_curled(self, start_point, mid_point, end_point): 65 | start_mid_x_dist = start_point[0] - mid_point[0] 66 | start_end_x_dist = start_point[0] - end_point[0] 67 | mid_end_x_dist = mid_point[0] - end_point[0] 68 | 69 | start_mid_y_dist = start_point[1] - mid_point[1] 70 | start_end_y_dist = start_point[1] - end_point[1] 71 | mid_end_y_dist = mid_point[1] - end_point[1] 72 | 73 | # start_mid_z_dist = start_point[2] - mid_point[2] 74 | # start_end_z_dist = start_point[2] - end_point[2] 75 | # mid_end_z_dist = mid_point[2] - end_point[2] 76 | 77 | start_mid_dist = math.sqrt( 78 | start_mid_x_dist ** 2 + 79 | start_mid_y_dist ** 2 ) 80 | start_end_dist = math.sqrt( 81 | start_end_x_dist ** 2 + 82 | start_end_y_dist ** 2 ) 83 | mid_end_dist = math.sqrt( 84 | mid_end_x_dist ** 2 + 85 | mid_end_y_dist ** 2 ) 86 | 87 | cos_in = (mid_end_dist ** 2 + start_mid_dist ** 2 - 88 | start_end_dist ** 2) / (2 * mid_end_dist * start_mid_dist+1e-10) 89 | if cos_in > 1.0: 90 | cos_in = 1.0 91 | elif cos_in < -1.0: 92 | cos_in = -1.0 93 | angle_of_curve = math.acos(cos_in) 94 | angle_of_curve = (57.2958 * angle_of_curve) % 180 95 | 96 | # print('Angle of curve = {}'.format(angle_of_curve)) 97 | HALF_CURL_START_LIMIT = 60.0 98 | NO_CURL_START_LIMIT = 130.0 99 | 100 | finger_curled = None 101 | if angle_of_curve > NO_CURL_START_LIMIT: 102 | finger_curled = FingerCurled.NoCurl 103 | elif angle_of_curve > HALF_CURL_START_LIMIT: 104 | finger_curled = FingerCurled.HalfCurl 105 | else: 106 | finger_curled = FingerCurled.FullCurl 107 | 108 | return finger_curled 109 | 110 | def estimate_horizontal_direction( 111 | self, 112 | start_end_x_dist, 113 | start_mid_x_dist, 114 | mid_end_x_dist, 115 | max_dist_x): 116 | reqd_direction = None 117 | if max_dist_x == abs(start_end_x_dist): 118 | if start_end_x_dist > 0: 119 | reqd_direction = FingerPosition.HorizontalLeft 120 | else: 121 | reqd_direction = FingerPosition.HorizontalRight 122 | elif max_dist_x == abs(start_mid_x_dist): 123 | if start_mid_x_dist > 0: 124 | reqd_direction = FingerPosition.HorizontalLeft 125 | else: 126 | reqd_direction = FingerPosition.HorizontalRight 127 | else: 128 | if mid_end_x_dist > 0: 129 | reqd_direction = FingerPosition.HorizontalLeft 130 | else: 131 | reqd_direction = FingerPosition.HorizontalRight 132 | return reqd_direction 133 | 134 | def estimate_vertical_direction( 135 | self, 136 | start_end_y_dist, 137 | start_mid_y_dist, 138 | mid_end_y_dist, 139 | max_dist_y): 140 | reqd_direction = None 141 | if max_dist_y == abs(start_end_y_dist): 142 | if start_end_y_dist < 0: 143 | reqd_direction = FingerPosition.VerticalDown 144 | else: 145 | reqd_direction = FingerPosition.VerticalUp 146 | elif max_dist_y == abs(start_mid_y_dist): 147 | if start_mid_y_dist < 0: 148 | reqd_direction = FingerPosition.VerticalDown 149 | else: 150 | reqd_direction = FingerPosition.VerticalUp 151 | else: 152 | if mid_end_y_dist < 0: 153 | reqd_direction = FingerPosition.VerticalDown 154 | else: 155 | reqd_direction = FingerPosition.VerticalUp 156 | return reqd_direction 157 | 158 | def estimate_diagonal_direction( 159 | self, 160 | start_end_y_dist, 161 | start_mid_y_dist, 162 | mid_end_y_dist, 163 | max_dist_y, 164 | start_end_x_dist, 165 | start_mid_x_dist, 166 | mid_end_x_dist, 167 | max_dist_x): 168 | reqd_direction = None 169 | reqd_vertical_direction = self.estimate_vertical_direction( 170 | start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) 171 | reqd_horizontal_direction = self.estimate_horizontal_direction( 172 | start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) 173 | 174 | # print('Direction obtained v = {}, h = {}'.format(FingerPosition.get_finger_position_name(reqd_vertical_direction), 175 | # FingerPosition.get_finger_position_name(reqd_horizontal_direction))) 176 | if reqd_vertical_direction == FingerPosition.VerticalUp: 177 | if reqd_horizontal_direction == FingerPosition.HorizontalLeft: 178 | reqd_direction = FingerPosition.DiagonalUpLeft 179 | else: 180 | reqd_direction = FingerPosition.DiagonalUpRight 181 | else: 182 | if reqd_horizontal_direction == FingerPosition.HorizontalLeft: 183 | reqd_direction = FingerPosition.DiagonalDownLeft 184 | else: 185 | reqd_direction = FingerPosition.DiagonalDownRight 186 | return reqd_direction 187 | 188 | def calculate_direction_of_finger( 189 | self, 190 | start_point, 191 | mid_point, 192 | end_point, 193 | finger_slopes): 194 | start_mid_x_dist = start_point[0] - mid_point[0] 195 | start_end_x_dist = start_point[0] - end_point[0] 196 | mid_end_x_dist = mid_point[0] - end_point[0] 197 | 198 | start_mid_y_dist = start_point[1] - mid_point[1] 199 | start_end_y_dist = start_point[1] - end_point[1] 200 | mid_end_y_dist = mid_point[1] - end_point[1] 201 | 202 | max_dist_x = max( 203 | abs(start_mid_x_dist), 204 | abs(start_end_x_dist), 205 | abs(mid_end_x_dist)) 206 | max_dist_y = max( 207 | abs(start_mid_y_dist), 208 | abs(start_end_y_dist), 209 | abs(mid_end_y_dist)) 210 | 211 | DISTANCE_VOTE_POWER = 1.1 212 | SINGLE_ANGLE_VOTE_POWER = 0.9 213 | TOTAL_ANGLE_VOTE_POWER = 1.6 214 | 215 | vote_vertical, vote_diagonal, vote_horizontal = 0.0, 0.0, 0.0 216 | start_end_x_y_dist_ratio = max_dist_y / (max_dist_x + 0.00001) 217 | if start_end_x_y_dist_ratio > 1.5: 218 | vote_vertical += DISTANCE_VOTE_POWER 219 | elif start_end_x_y_dist_ratio > 0.66: 220 | vote_diagonal += DISTANCE_VOTE_POWER 221 | else: 222 | vote_horizontal += DISTANCE_VOTE_POWER 223 | # print('Iteration 1: Ratio = {:.2f}, ({}, {}, {})'.format(start_end_x_y_dist_ratio, vote_vertical, 224 | # vote_diagonal, vote_horizontal)) 225 | 226 | start_mid_dist = math.sqrt( 227 | start_mid_x_dist ** 2 + 228 | start_mid_y_dist ** 2) 229 | start_end_dist = math.sqrt( 230 | start_end_x_dist ** 2 + 231 | start_end_y_dist ** 2) 232 | mid_end_dist = math.sqrt(mid_end_x_dist ** 2 + mid_end_y_dist ** 2) 233 | 234 | max_dist = max(start_mid_dist, start_end_dist, mid_end_dist) 235 | calc_start_point_x, calc_start_point_y = start_point[0], start_point[1] 236 | calc_end_point_x, calc_end_point_y = end_point[0], end_point[1] 237 | if max_dist == start_mid_dist: 238 | calc_end_point_x, calc_end_point_y = end_point[0], end_point[1] 239 | elif max_dist == mid_end_dist: 240 | calc_start_point_x, calc_start_point_y = mid_point[0], mid_point[1] 241 | 242 | calc_start_point = (calc_start_point_x, calc_start_point_y) 243 | calc_end_point = (calc_end_point_x, calc_end_point_y) 244 | 245 | total_angle = self.get_slope(calc_start_point, calc_end_point) 246 | vote1, vote2, vote3 = self.angle_orientation_at( 247 | total_angle, weightage_at=TOTAL_ANGLE_VOTE_POWER) 248 | vote_vertical += vote1 249 | vote_diagonal += vote2 250 | vote_horizontal += vote3 251 | # print('Iteration 2: Total Angle = {:.3f}, ({}, {}, {})'.format(total_angle, vote1, vote2, vote3)) 252 | 253 | for finger_slope in finger_slopes: 254 | vote1, vote2, vote3 = self.angle_orientation_at( 255 | finger_slope, weightage_at=SINGLE_ANGLE_VOTE_POWER) 256 | vote_vertical += vote1 257 | vote_diagonal += vote2 258 | vote_horizontal += vote3 259 | # print('Iteration 3: Total Angle = {:.3f}, ({}, {}, {})'.format(finger_slope, vote1, vote2, vote3)) 260 | # print('Total weights: ({}, {}, {})'.format(vote_vertical, vote_diagonal, vote_horizontal)) 261 | 262 | # Incase of tie, highest preference goes to Vertical, followed by 263 | # horizontal and then diagonal 264 | reqd_direction = None 265 | if vote_vertical == max(vote_vertical, vote_diagonal, vote_horizontal): 266 | reqd_direction = self.estimate_vertical_direction( 267 | start_end_y_dist, start_mid_y_dist, mid_end_y_dist, max_dist_y) 268 | elif vote_horizontal == max(vote_diagonal, vote_horizontal): 269 | reqd_direction = self.estimate_horizontal_direction( 270 | start_end_x_dist, start_mid_x_dist, mid_end_x_dist, max_dist_x) 271 | else: 272 | reqd_direction = self.estimate_diagonal_direction( 273 | start_end_y_dist, 274 | start_mid_y_dist, 275 | mid_end_y_dist, 276 | max_dist_y, 277 | start_end_x_dist, 278 | start_mid_x_dist, 279 | mid_end_x_dist, 280 | max_dist_x) 281 | # print('Vote at {}, {}, {}'.format(vote_vertical, vote_diagonal, vote_horizontal)) 282 | return reqd_direction 283 | 284 | def calculate_orientation_of_fingers(self, print_finger_info): 285 | for finger in Finger: 286 | point_index_at = 0 287 | if finger == Finger.Thumb: 288 | point_index_at = 1 289 | # print(finger,self.slopes_xy[finger]) 290 | angle_at = self.slopes_xy[finger][point_index_at] 291 | 292 | finger_points_at = Finger.get_array_of_points(finger) 293 | start_point_at = self.coords_xy[finger_points_at[point_index_at][0]] 294 | mid_point_at = self.coords_xy[finger_points_at[point_index_at + 1][1]] 295 | end_point_at = self.coords_xy[finger_points_at[3][1]] 296 | 297 | finger_curled = self.is_finger_curled( 298 | start_point_at, mid_point_at, end_point_at) 299 | # print('Finger: {} = {}'.format(Finger.get_finger_name(finger), FingerCurled.get_finger_curled_name(finger_curled))) 300 | finger_position = self.calculate_direction_of_finger( 301 | start_point_at, mid_point_at, end_point_at, self.slopes_xy[finger][point_index_at:]) 302 | # print('Finger: {} = {}'.format(Finger.get_finger_name(finger), 303 | # FingerPosition.get_finger_position_name(finger_position))) 304 | 305 | self.finger_curled[finger] = finger_curled 306 | self.finger_position[finger] = finger_position 307 | 308 | if print_finger_info: 309 | for finger_index, curl, pos in zip( 310 | Finger, self.finger_curled, self.finger_position): 311 | print( 312 | 'Finger: {}, Curl: {}, Orientation: {}'.format( 313 | Finger.get_finger_name(finger_index), 314 | FingerCurled.get_finger_curled_name(curl), 315 | FingerPosition.get_finger_position_name(pos))) 316 | 317 | def calculate_positions_of_fingers(self, print_finger_info): 318 | """ 319 | 根据手指21点坐标计算各个手指姿势 320 | :param print_finger_info: 321 | :return: 322 | """ 323 | self.calculate_slope_of_fingers() # 计算手指角度 324 | self.calculate_orientation_of_fingers(print_finger_info) # 计算手指指向 325 | 326 | # Private methods 327 | def _calculate_slope_procedure( 328 | self, 329 | point1_x, 330 | point1_y, 331 | point2_x, 332 | point2_y): 333 | """ 334 | 利用反正切计算角度 335 | :param point1_x: 336 | :param point1_y: 337 | :param point2_x: 338 | :param point2_y: 339 | :return: 340 | """ 341 | value = (point1_y - point2_y) / (point1_x - point2_x) 342 | slope = math.degrees(math.atan(value)) 343 | if slope < 0 or slope == -0.0: 344 | slope = -slope 345 | elif slope > 0: 346 | slope = 180 - slope 347 | return slope 348 | -------------------------------------------------------------------------------- /gasture_utils/FingerPosition.py: -------------------------------------------------------------------------------- 1 | from enum import IntEnum 2 | 3 | 4 | class FingerPosition(IntEnum): 5 | """ 6 | 定义手指姿势 7 | """ 8 | VerticalUp = 0 # 垂直向上 9 | VerticalDown = 1 # 垂直向下 10 | HorizontalLeft = 2 # 水平向左 11 | HorizontalRight = 3 # 水平向右 12 | DiagonalUpRight = 4 # 右上 13 | DiagonalUpLeft = 5 # 左上 14 | DiagonalDownRight = 6 # 右下 15 | DiagonalDownLeft = 7 # 左下 16 | 17 | @staticmethod 18 | def get_finger_position_name(finger_position): 19 | if finger_position == FingerPosition.VerticalUp: 20 | finger_type = 'Vertical Up' 21 | elif finger_position == FingerPosition.VerticalDown: 22 | finger_type = 'Vertical Down' 23 | elif finger_position == FingerPosition.HorizontalLeft: 24 | finger_type = 'Horizontal Left' 25 | elif finger_position == FingerPosition.HorizontalRight: 26 | finger_type = 'Horizontal Right' 27 | elif finger_position == FingerPosition.DiagonalUpRight: 28 | finger_type = 'Diagonal Up Right' 29 | elif finger_position == FingerPosition.DiagonalUpLeft: 30 | finger_type = 'Diagonal Up Left' 31 | elif finger_position == FingerPosition.DiagonalDownRight: 32 | finger_type = 'Diagonal Down Right' 33 | elif finger_position == FingerPosition.DiagonalDownLeft: 34 | finger_type = 'Diagonal Down Left' 35 | return finger_type 36 | -------------------------------------------------------------------------------- /gasture_utils/__pycache__/Finger.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/gasture_utils/__pycache__/Finger.cpython-36.pyc -------------------------------------------------------------------------------- /gasture_utils/__pycache__/FingerCurled.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/gasture_utils/__pycache__/FingerCurled.cpython-36.pyc -------------------------------------------------------------------------------- /gasture_utils/__pycache__/FingerDataFormation.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/gasture_utils/__pycache__/FingerDataFormation.cpython-36.pyc -------------------------------------------------------------------------------- /gasture_utils/__pycache__/FingerPoseEstimate.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/gasture_utils/__pycache__/FingerPoseEstimate.cpython-36.pyc -------------------------------------------------------------------------------- /gasture_utils/__pycache__/FingerPosition.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/gasture_utils/__pycache__/FingerPosition.cpython-36.pyc -------------------------------------------------------------------------------- /gasture_utils/__pycache__/determine_gasture.cpython-36.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/gasture_utils/__pycache__/determine_gasture.cpython-36.pyc -------------------------------------------------------------------------------- /gasture_utils/determine_gasture.py: -------------------------------------------------------------------------------- 1 | from gasture_utils.FingerCurled import FingerCurled 2 | from gasture_utils.FingerPosition import FingerPosition 3 | from gasture_utils.FingerDataFormation import FingerDataFormation 4 | 5 | 6 | def determine_position(curled_positions, finger_positions, known_finger_poses, min_threshold): 7 | obtained_positions = {} 8 | 9 | for finger_pose in known_finger_poses: 10 | score_at = 0.0 11 | for known_curl, known_curl_confidence, given_curl in \ 12 | zip(finger_pose.curl_position, finger_pose.curl_position_confidence, curled_positions): 13 | if len(known_curl) == 0: 14 | if len(known_curl_confidence) == 1: 15 | score_at += known_curl_confidence[0] 16 | continue 17 | 18 | if given_curl in known_curl: 19 | confidence_at = known_curl.index(given_curl) 20 | score_at += known_curl_confidence[confidence_at] 21 | 22 | for known_position, known_position_confidence, given_position in \ 23 | zip(finger_pose.finger_position, finger_pose.finger_position_confidence, finger_positions): 24 | if len(known_position) == 0: 25 | if len(known_position_confidence) == 1: 26 | score_at += known_position_confidence[0] 27 | continue 28 | 29 | if given_position in known_position: 30 | confidence_at = known_position.index(given_position) 31 | score_at += known_position_confidence[confidence_at] 32 | 33 | if score_at >= min_threshold: 34 | obtained_positions[finger_pose.position_name] = score_at 35 | 36 | return obtained_positions 37 | 38 | 39 | def get_position_name_with_pose_id(pose_id, finger_poses): 40 | for finger_pose in finger_poses: 41 | if finger_pose.position_id == pose_id: 42 | return finger_pose.position_name 43 | return None 44 | 45 | 46 | def create_known_finger_poses(): 47 | """ 48 | 建立已知的手势的姿态信息 49 | :return: 50 | """ 51 | known_finger_poses = [] 52 | 53 | ####### 1 Simple Thumbs up 大拇指向上 54 | simple_thumbs_up = FingerDataFormation() 55 | simple_thumbs_up.position_name = 'Simple Thumbs Up' 56 | simple_thumbs_up.curl_position = [ 57 | [FingerCurled.NoCurl], # Thumb 58 | [FingerCurled.FullCurl], # Index 59 | [FingerCurled.FullCurl], # Middle 60 | [FingerCurled.FullCurl], # Ring 61 | [FingerCurled.FullCurl] # Little 62 | ] 63 | simple_thumbs_up.curl_position_confidence = [ 64 | [1.0], # Thumb 65 | [1.0], # Index 66 | [1.0], # Middle 67 | [1.0], # Ring 68 | [1.0] # Little 69 | ] 70 | simple_thumbs_up.finger_position = [ 71 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpLeft, FingerPosition.DiagonalUpRight], # Thumb 72 | [FingerPosition.HorizontalLeft, FingerPosition.HorizontalRight], # Index 73 | [FingerPosition.HorizontalLeft, FingerPosition.HorizontalRight], # Middle 74 | [FingerPosition.HorizontalLeft, FingerPosition.HorizontalRight], # Ring 75 | [FingerPosition.HorizontalLeft, FingerPosition.HorizontalRight] # Little 76 | ] 77 | simple_thumbs_up.finger_position_confidence = [ 78 | [1.0, 0.25, 0.25], # Thumb 79 | [1.0, 1.0], # Index 80 | [1.0, 1.0], # Middle 81 | [1.0, 1.0], # Ring 82 | [1.0, 1.0] # Little 83 | ] 84 | simple_thumbs_up.position_id = 0 85 | known_finger_poses.append(simple_thumbs_up) 86 | 87 | ####### 2 Thumbs up right 88 | thumbs_up_right = FingerDataFormation() 89 | thumbs_up_right.position_name = 'Thumbs Up Right' 90 | thumbs_up_right.curl_position = [ 91 | [FingerCurled.NoCurl], # Thumb 92 | [FingerCurled.FullCurl], # Index 93 | [FingerCurled.FullCurl], # Middle 94 | [FingerCurled.FullCurl], # Ring 95 | [FingerCurled.FullCurl] # Little 96 | ] 97 | thumbs_up_right.curl_position_confidence = [ 98 | [1.0], # Thumb 99 | [1.0], # Index 100 | [1.0], # Middle 101 | [1.0], # Ring 102 | [1.0] # Little 103 | ] 104 | thumbs_up_right.finger_position = [ 105 | [FingerPosition.HorizontalLeft, FingerPosition.DiagonalUpLeft, FingerPosition.DiagonalDownLeft], # Thumb 106 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpRight, FingerPosition.DiagonalUpLeft], # Index 107 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpRight, FingerPosition.DiagonalUpLeft], # Middle 108 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpRight, FingerPosition.DiagonalUpLeft], # Ring 109 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpRight, FingerPosition.DiagonalUpLeft] # Little 110 | ] 111 | thumbs_up_right.finger_position_confidence = [ 112 | [1.0, 0.25, 0.25], # Thumb 113 | [1.0, 0.25, 0.25], # Index 114 | [1.0, 0.25, 0.25], # Middle 115 | [1.0, 0.25, 0.25], # Ring 116 | [1.0, 0.25, 0.25] # Little 117 | ] 118 | thumbs_up_right.position_id = 1 119 | known_finger_poses.append(thumbs_up_right) 120 | 121 | ####### 3 Spock 122 | spock = FingerDataFormation() 123 | spock.position_name = 'Spock' 124 | spock.curl_position = [ 125 | [FingerCurled.NoCurl], # Thumb 126 | [FingerCurled.NoCurl], # Index 127 | [FingerCurled.NoCurl], # Middle 128 | [FingerCurled.NoCurl], # Ring 129 | [FingerCurled.NoCurl] # Little 130 | ] 131 | spock.curl_position_confidence = [ 132 | [1.0], # Thumb 133 | [1.0], # Index 134 | [1.0], # Middle 135 | [1.0], # Ring 136 | [1.0] # Little 137 | ] 138 | spock.finger_position = [ 139 | [FingerPosition.DiagonalUpLeft, FingerPosition.HorizontalLeft], # Thumb 140 | [FingerPosition.DiagonalUpLeft], # Index 141 | [FingerPosition.DiagonalUpLeft], # Middle 142 | [FingerPosition.DiagonalUpRight], # Ring 143 | [FingerPosition.DiagonalUpRight] # Little 144 | ] 145 | spock.finger_position_confidence = [ 146 | [1.0, 0.5], # Thumb 147 | [1.0], # Index 148 | [1.0], # Middle 149 | [1.0], # Ring 150 | [1.0] # Little 151 | ] 152 | spock.position_id = 2 153 | known_finger_poses.append(spock) 154 | 155 | ####### 4 I Love you 156 | i_love_you = FingerDataFormation() 157 | i_love_you.position_name = 'I love you' 158 | i_love_you.curl_position = [ 159 | [FingerCurled.NoCurl], # Thumb 160 | [FingerCurled.NoCurl], # Index 161 | [FingerCurled.FullCurl], # Middle 162 | [FingerCurled.FullCurl], # Ring 163 | [FingerCurled.NoCurl] # Little 164 | ] 165 | i_love_you.curl_position_confidence = [ 166 | [1.0], # Thumb 167 | [1.0], # Index 168 | [1.0], # Middle 169 | [1.0], # Ring 170 | [1.0] # Little 171 | ] 172 | i_love_you.finger_position = [ 173 | [FingerPosition.DiagonalUpLeft], # Thumb 174 | [FingerPosition.DiagonalUpLeft, FingerPosition.VerticalUp], # Index 175 | [FingerPosition.DiagonalUpRight], # Middle 176 | [FingerPosition.DiagonalUpRight], # Ring 177 | [FingerPosition.DiagonalUpRight, FingerPosition.VerticalUp] # Little 178 | ] 179 | i_love_you.finger_position_confidence = [ 180 | [1.0], # Thumb 181 | [1.0, 0.25], # Index 182 | [1.0], # Middle 183 | [1.0], # Ring 184 | [1.0, 0.25] # Little 185 | ] 186 | i_love_you.position_id = 3 187 | known_finger_poses.append(i_love_you) 188 | 189 | ####### 5 Pointer 大拇指和食指向上 190 | pointer = FingerDataFormation() 191 | pointer.position_name = 'Pointing Up' 192 | pointer.curl_position = [ 193 | [FingerCurled.NoCurl], # Thumb 194 | [FingerCurled.NoCurl], # Index 195 | [FingerCurled.FullCurl], # Middle 196 | [FingerCurled.FullCurl], # Ring 197 | [FingerCurled.FullCurl] # Little 198 | ] 199 | pointer.curl_position_confidence = [ 200 | [1.0], # Thumb 201 | [1.0], # Index 202 | [1.0], # Middle 203 | [1.0], # Ring 204 | [1.0] # Little 205 | ] 206 | pointer.finger_position = [ 207 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpLeft], # Thumb 208 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpLeft], # Index 209 | [FingerPosition.VerticalUp], # Middle 210 | [FingerPosition.VerticalUp], # Ring 211 | [FingerPosition.VerticalUp] # Little 212 | ] 213 | pointer.finger_position_confidence = [ 214 | [1.0, 0.5], # Thumb 215 | [1.0, 0.3], # Index 216 | [1.0], # Middle 217 | [1.0], # Ring 218 | [1.0] # Little 219 | ] 220 | pointer.position_id = 4 221 | known_finger_poses.append(pointer) 222 | 223 | ####### 6 Ok 224 | ok_pos = FingerDataFormation() 225 | ok_pos.position_name = 'Okay' 226 | ok_pos.curl_position = [ 227 | [FingerCurled.HalfCurl], # Thumb 228 | [FingerCurled.HalfCurl], # Index 229 | [FingerCurled.NoCurl], # Middle 230 | [FingerCurled.NoCurl], # Ring 231 | [FingerCurled.NoCurl] # Little 232 | ] 233 | ok_pos.curl_position_confidence = [ 234 | [1.0], # Thumb 235 | [1.0], # Index 236 | [1.0], # Middle 237 | [1.0], # Ring 238 | [1.0] # Little 239 | ] 240 | ok_pos.finger_position = [ 241 | [FingerPosition.DiagonalUpLeft, FingerPosition.HorizontalLeft], # Thumb 242 | [FingerPosition.DiagonalUpLeft, FingerPosition.HorizontalLeft], # Index 243 | [FingerPosition.VerticalUp], # Middle 244 | [FingerPosition.VerticalUp], # Ring 245 | [FingerPosition.VerticalUp] # Little 246 | ] 247 | ok_pos.finger_position_confidence = [ 248 | [1.0, 0.5], # Thumb 249 | [1.0, 0.2], # Index 250 | [1.0], # Middle 251 | [1.0], # Ring 252 | [1.0] # Little 253 | ] 254 | ok_pos.position_id = 5 255 | known_finger_poses.append(ok_pos) 256 | 257 | ####### 7 Victory V 手势 258 | victory = FingerDataFormation() 259 | victory.position_name = 'Victory' 260 | victory.curl_position = [ 261 | [FingerCurled.FullCurl, FingerCurled.NoCurl], # Thumb 262 | [FingerCurled.NoCurl], # Index 263 | [FingerCurled.NoCurl], # Middle 264 | [FingerCurled.FullCurl], # Ring 265 | [FingerCurled.FullCurl] # Little 266 | ] 267 | victory.curl_position_confidence = [ 268 | [1.0, 1.0], # Thumb 269 | [1.0], # Index 270 | [1.0], # Middle 271 | [1.0], # Ring 272 | [1.0] # Little 273 | ] 274 | victory.finger_position = [ 275 | [FingerPosition.VerticalUp, FingerPosition.HorizontalLeft], # Thumb 276 | [FingerPosition.DiagonalUpLeft, FingerPosition.VerticalUp], # Index 277 | [FingerPosition.DiagonalUpRight], # Middle 278 | [FingerPosition.DiagonalUpRight], # Ring 279 | [FingerPosition.DiagonalUpRight] # Little 280 | ] 281 | victory.finger_position_confidence = [ 282 | [0.5, 1.0], # Thumb 283 | [1.0, 0.4], # Index 284 | [1.0], # Middle 285 | [1.0], # Ring 286 | [1.0] # Little 287 | ] 288 | victory.position_id = 6 289 | known_finger_poses.append(victory) 290 | 291 | 292 | ####### 8 1 食指向上 293 | one = FingerDataFormation() 294 | one.position_name = 'One' 295 | one.curl_position = [ 296 | [FingerCurled.FullCurl], # Thumb 297 | [FingerCurled.NoCurl], # Index 298 | [FingerCurled.FullCurl], # Middle 299 | [FingerCurled.FullCurl], # Ring 300 | [FingerCurled.FullCurl] # Little 301 | ] 302 | one.curl_position_confidence = [ 303 | [1.0], # Thumb 304 | [1.0], # Index 305 | [1.0], # Middle 306 | [1.0], # Ring 307 | [1.0] # Little 308 | ] 309 | one.finger_position = [ 310 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpLeft], # Thumb 311 | [FingerPosition.VerticalUp, FingerPosition.DiagonalUpLeft], # Index 312 | [FingerPosition.VerticalUp], # Middle 313 | [FingerPosition.VerticalUp], # Ring 314 | [FingerPosition.VerticalUp] # Little 315 | ] 316 | one.finger_position_confidence = [ 317 | [1.0, 0.5], # Thumb 318 | [1.0, 0.3], # Index 319 | [1.0], # Middle 320 | [1.0], # Ring 321 | [1.0] # Little 322 | ] 323 | one.position_id = 7 324 | known_finger_poses.append(one) 325 | 326 | ####### 9 3 3 手势 327 | three = FingerDataFormation() 328 | three.position_name = 'Three' 329 | three.curl_position = [ 330 | [FingerCurled.FullCurl, FingerCurled.NoCurl], # Thumb 331 | [FingerCurled.NoCurl], # Index 332 | [FingerCurled.NoCurl], # Middle 333 | [FingerCurled.NoCurl], # Ring 334 | [FingerCurled.FullCurl] # Little 335 | ] 336 | three.curl_position_confidence = [ 337 | [1.0, 1.0], # Thumb 338 | [1.0], # Index 339 | [1.0], # Middle 340 | [1.0], # Ring 341 | [1.0] # Little 342 | ] 343 | three.finger_position = [ 344 | [FingerPosition.VerticalUp, FingerPosition.HorizontalLeft], # Thumb 345 | [FingerPosition.DiagonalUpLeft, FingerPosition.VerticalUp], # Index 346 | [FingerPosition.DiagonalUpLeft, FingerPosition.VerticalUp], # Middle 347 | [FingerPosition.DiagonalUpLeft, FingerPosition.VerticalUp], # Ring 348 | [FingerPosition.DiagonalUpRight] # Little 349 | ] 350 | three.finger_position_confidence = [ 351 | [0.5, 1.0], # Thumb 352 | [1.0, 0.4], # Index 353 | [1.0,1.0], # Middle 354 | [1.0,1.0], # Ring 355 | [1.0] # Little 356 | ] 357 | three.position_id = 8 358 | known_finger_poses.append(three) 359 | 360 | return known_finger_poses -------------------------------------------------------------------------------- /hand_tracker.py: -------------------------------------------------------------------------------- 1 | import csv 2 | import time 3 | import cv2 4 | import numpy as np 5 | try: 6 | import tflite_runtime.interpreter as tflite 7 | except: 8 | import tensorflow as tf 9 | import tensorflow.lite as tflite 10 | 11 | print(tf.__version__) 12 | print(cv2.__version__) 13 | print(csv.__version__) 14 | print(np.__version__) 15 | class HandTracker(): 16 | r""" 17 | Class to use Google's Mediapipe HandTracking pipeline from Python. 18 | So far only detection of a single hand is supported. 19 | Any any image size and aspect ratio supported. 20 | 21 | Args: 22 | palm_model: path to the palm_detection.tflite 23 | joint_model: path to the hand_landmark.tflite 24 | anchors_path: path to the csv containing SSD anchors 25 | Ourput: 26 | (21,2) array of hand joints. 27 | Examples:: 28 | >>> det = HandTracker(path1, path2, path3) 29 | >>> input_img = np.random.randint(0,255, 256*256*3).reshape(256,256,3) 30 | >>> keypoints, bbox = det(input_img) 31 | """ 32 | 33 | def __init__(self, palm_model, joint_model, anchors_path, 34 | box_enlarge=1.5, box_shift=0.2): 35 | self.box_shift = box_shift 36 | self.box_enlarge = box_enlarge 37 | 38 | self.interp_palm = tflite.Interpreter(palm_model) 39 | self.interp_palm.allocate_tensors() 40 | self.interp_joint = tflite.Interpreter(joint_model) 41 | self.interp_joint.allocate_tensors() 42 | 43 | # reading the SSD anchors 44 | with open(anchors_path, "r") as csv_f: 45 | self.anchors = np.r_[ 46 | [x for x in csv.reader(csv_f, quoting=csv.QUOTE_NONNUMERIC)] 47 | ] 48 | # reading tflite model paramteres 49 | output_details = self.interp_palm.get_output_details() 50 | input_details = self.interp_palm.get_input_details() 51 | 52 | self.in_idx = input_details[0]['index'] 53 | self.out_reg_idx = output_details[0]['index'] 54 | self.out_clf_idx = output_details[1]['index'] 55 | 56 | self.in_idx_joint = self.interp_joint.get_input_details()[0]['index'] 57 | self.out_idx_joint = self.interp_joint.get_output_details()[0]['index'] 58 | 59 | # 90° rotation matrix used to create the alignment trianlge 60 | self.R90 = np.r_[[[0,1],[-1,0]]] 61 | 62 | # trianlge target coordinates used to move the detected hand 63 | # into the right position 64 | self._target_triangle = np.float32([ 65 | [128, 128], 66 | [128, 0], 67 | [ 0, 128] 68 | ]) 69 | self._target_box = np.float32([ 70 | [ 0, 0, 1], 71 | [256, 0, 1], 72 | [256, 256, 1], 73 | [ 0, 256, 1], 74 | ]) 75 | 76 | def _get_triangle(self, kp0, kp2, dist=1): 77 | """get a triangle used to calculate Affine transformation matrix""" 78 | 79 | dir_v = kp2 - kp0 80 | dir_v /= np.linalg.norm(dir_v) 81 | 82 | dir_v_r = dir_v @ self.R90.T 83 | return np.float32([kp2, kp2+dir_v*dist, kp2 + dir_v_r*dist]) 84 | 85 | @staticmethod 86 | def _triangle_to_bbox(source): 87 | # plain old vector arithmetics 88 | bbox = np.c_[ 89 | [source[2] - source[0] + source[1]], 90 | [source[1] + source[0] - source[2]], 91 | [3 * source[0] - source[1] - source[2]], 92 | [source[2] - source[1] + source[0]], 93 | ].reshape(-1,2) 94 | return bbox 95 | 96 | @staticmethod 97 | def _im_normalize(img): 98 | return np.ascontiguousarray( 99 | 2 * ((img / 255) - 0.5 100 | ).astype('float32')) 101 | 102 | @staticmethod 103 | def _sigm(x): 104 | return 1 / (1 + np.exp(-x) ) 105 | 106 | @staticmethod 107 | def _pad1(x): 108 | return np.pad(x, ((0,0),(0,1)), constant_values=1, mode='constant') 109 | 110 | 111 | def predict_joints(self, img_norm): 112 | self.interp_joint.set_tensor( 113 | self.in_idx_joint, img_norm.reshape(1,256,256,3)) 114 | self.interp_joint.invoke() 115 | 116 | joints = self.interp_joint.get_tensor(self.out_idx_joint) 117 | return joints.reshape(-1,2) 118 | 119 | def detect_hand(self, img_norm): 120 | assert -1 <= img_norm.min() and img_norm.max() <= 1,\ 121 | "img_norm should be in range [-1, 1]" 122 | assert img_norm.shape == (256, 256, 3),\ 123 | "img_norm shape must be (256, 256, 3)" 124 | 125 | # predict hand location and 7 initial landmarks 126 | self.interp_palm.set_tensor(self.in_idx, img_norm[None]) 127 | self.interp_palm.invoke() 128 | 129 | out_reg = self.interp_palm.get_tensor(self.out_reg_idx)[0] 130 | out_clf = self.interp_palm.get_tensor(self.out_clf_idx)[0,:,0] 131 | 132 | # finding the best prediction 133 | # TODO: replace it with non-max suppression 134 | detecion_mask = self._sigm(out_clf) > 0.7 135 | candidate_detect = out_reg[detecion_mask] 136 | candidate_anchors = self.anchors[detecion_mask] 137 | 138 | if candidate_detect.shape[0] == 0: 139 | print("No hands found") 140 | return None, None 141 | # picking the widest suggestion while NMS is not implemented 142 | max_idx = np.argmax(candidate_detect[:, 3]) 143 | 144 | # bounding box offsets, width and height 145 | dx,dy,w,h = candidate_detect[max_idx, :4] 146 | center_wo_offst = candidate_anchors[max_idx,:2] * 256 147 | 148 | # 7 initial keypoints 149 | keypoints = center_wo_offst + candidate_detect[max_idx,4:].reshape(-1,2) 150 | side = max(w,h) * self.box_enlarge 151 | 152 | # now we need to move and rotate the detected hand for it to occupy a 153 | # 256x256 square 154 | # line from wrist keypoint to middle finger keypoint 155 | # should point straight up 156 | # TODO: replace triangle with the bbox directly 157 | source = self._get_triangle(keypoints[0], keypoints[2], side) 158 | source -= (keypoints[0] - keypoints[2]) * self.box_shift 159 | return source, keypoints 160 | 161 | def preprocess_img(self, img): 162 | # fit the image into a 256x256 square 163 | shape = np.r_[img.shape] 164 | pad = (shape.max() - shape[:2]).astype('uint32') // 2 165 | img_pad = np.pad( 166 | img, 167 | ((pad[0],pad[0]), (pad[1],pad[1]), (0,0)), 168 | mode='constant') 169 | img_small = cv2.resize(img_pad, (256, 256)) 170 | img_small = np.ascontiguousarray(img_small) 171 | 172 | img_norm = self._im_normalize(img_small) 173 | return img_pad, img_norm, pad 174 | 175 | 176 | def __call__(self, img,return_track,detect_hand=True,detect_keypoints=True): 177 | img_pad, img_norm, pad = self.preprocess_img(img) 178 | 179 | if detect_hand: 180 | return_track = {} 181 | hand_detect_start_time = time.time() 182 | source, keypoints = self.detect_hand(img_norm) 183 | # print('hand detect time spend',time.time()-hand_detect_start_time) 184 | return_track['source'] = source 185 | return_track['keypoints'] = keypoints 186 | else: 187 | keypoints = return_track['keypoints'] 188 | source = return_track['source'] 189 | 190 | if source is None: # 未检测到 191 | return None, None,None 192 | 193 | # calculating transformation from img_pad coords 194 | # to img_landmark coords (cropped hand image) 195 | scale = max(img.shape) / 256 196 | Mtr = cv2.getAffineTransform( 197 | source * scale, 198 | self._target_triangle 199 | ) 200 | 201 | img_landmark = cv2.warpAffine( 202 | self._im_normalize(img_pad), Mtr, (256,256) 203 | ) 204 | 205 | joints = self.predict_joints(img_landmark) 206 | 207 | # adding the [0,0,1] row to make the matrix square 208 | Mtr = self._pad1(Mtr.T).T 209 | Mtr[2,:2] = 0 210 | 211 | Minv = np.linalg.inv(Mtr) 212 | 213 | # projecting keypoints back into original image coordinate space 214 | kp_orig = (self._pad1(joints) @ Minv.T)[:,:2] 215 | box_orig = (self._target_box @ Minv.T)[:,:2] 216 | kp_orig -= pad[::-1] 217 | box_orig -= pad[::-1] 218 | 219 | return kp_orig, box_orig,return_track -------------------------------------------------------------------------------- /images/show.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/images/show.png -------------------------------------------------------------------------------- /models/mediapipe_hand_landmark.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/models/mediapipe_hand_landmark.tflite -------------------------------------------------------------------------------- /models/palm_detection_without_custom_op.tflite: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ndkjing/hand-keypoint-detect/143a2d17557ab21bed1b6e2192b3645e882a3296/models/palm_detection_without_custom_op.tflite -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | opencv-python 2 | tensorflow 3 | numpy --------------------------------------------------------------------------------