From 078a6ce66deae8f19b9334bafa8842aa5b57e0ab Mon Sep 17 00:00:00 2001 From: Jasper Date: Fri, 28 May 2021 12:27:12 +0200 Subject: [PATCH 01/30] [ADD] added all the files --- .gitignore | 2 + res/pose/coco/pose_deploy_linevec.prototxt | 2976 +++++++++++++++++ ...se_deploy_linevec_faster_4_stages.prototxt | 2081 ++++++++++++ src/computervision/ObjectDetection.cpp | 6 +- src/computervision/OpenPoseImage.cpp | 149 + src/computervision/OpenPoseVideo.cpp | 144 + src/computervision/OpenPoseVideo.h | 19 + src/main.cpp | 11 +- 8 files changed, 5383 insertions(+), 5 deletions(-) create mode 100644 res/pose/coco/pose_deploy_linevec.prototxt create mode 100644 res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt create mode 100644 src/computervision/OpenPoseImage.cpp create mode 100644 src/computervision/OpenPoseVideo.cpp create mode 100644 src/computervision/OpenPoseVideo.h diff --git a/.gitignore b/.gitignore index 9232336..488f5fe 100644 --- a/.gitignore +++ b/.gitignore @@ -428,4 +428,6 @@ FodyWeavers.xsd **/docs/* **/doc/* +**/pose_iter_160000.caffemodel + # End of https://www.toptal.com/developers/gitignore/api/c++,visualstudio,visualstudiocode,opencv diff --git a/res/pose/coco/pose_deploy_linevec.prototxt b/res/pose/coco/pose_deploy_linevec.prototxt new file mode 100644 index 0000000..90a54fd --- /dev/null +++ b/res/pose/coco/pose_deploy_linevec.prototxt @@ -0,0 +1,2976 @@ +input: "image" +input_dim: 1 +input_dim: 3 +input_dim: 1 # This value will be defined at runtime +input_dim: 1 # This value will be defined at runtime +layer { + name: "conv1_1" + type: "Convolution" + bottom: "image" + top: "conv1_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1_stage1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1_stage1" + top: "conv2_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2_stage1" + type: "Pooling" + bottom: "conv2_2" + top: "pool2_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2_stage1" + top: "conv3_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "conv3_4" + type: "Convolution" + bottom: "conv3_3" + top: "conv3_4" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_4" + type: "ReLU" + bottom: "conv3_4" + top: "conv3_4" +} +layer { + name: "pool3_stage1" + type: "Pooling" + bottom: "conv3_4" + top: "pool3_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3_stage1" + top: "conv4_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3_CPM" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_3_CPM" + type: "ReLU" + bottom: "conv4_3_CPM" + top: "conv4_3_CPM" +} +layer { + name: "conv4_4_CPM" + type: "Convolution" + bottom: "conv4_3_CPM" + top: "conv4_4_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_4_CPM" + type: "ReLU" + bottom: "conv4_4_CPM" + top: "conv4_4_CPM" +} +layer { + name: "conv5_1_CPM_L1" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L1" + type: "ReLU" + bottom: "conv5_1_CPM_L1" + top: "conv5_1_CPM_L1" +} +layer { + name: "conv5_1_CPM_L2" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L2" + type: "ReLU" + bottom: "conv5_1_CPM_L2" + top: "conv5_1_CPM_L2" +} +layer { + name: "conv5_2_CPM_L1" + type: "Convolution" + bottom: "conv5_1_CPM_L1" + top: "conv5_2_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L1" + type: "ReLU" + bottom: "conv5_2_CPM_L1" + top: "conv5_2_CPM_L1" +} +layer { + name: "conv5_2_CPM_L2" + type: "Convolution" + bottom: "conv5_1_CPM_L2" + top: "conv5_2_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L2" + type: "ReLU" + bottom: "conv5_2_CPM_L2" + top: "conv5_2_CPM_L2" +} +layer { + name: "conv5_3_CPM_L1" + type: "Convolution" + bottom: "conv5_2_CPM_L1" + top: "conv5_3_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L1" + type: "ReLU" + bottom: "conv5_3_CPM_L1" + top: "conv5_3_CPM_L1" +} +layer { + name: "conv5_3_CPM_L2" + type: "Convolution" + bottom: "conv5_2_CPM_L2" + top: "conv5_3_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L2" + type: "ReLU" + bottom: "conv5_3_CPM_L2" + top: "conv5_3_CPM_L2" +} +layer { + name: "conv5_4_CPM_L1" + type: "Convolution" + bottom: "conv5_3_CPM_L1" + top: "conv5_4_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L1" + type: "ReLU" + bottom: "conv5_4_CPM_L1" + top: "conv5_4_CPM_L1" +} +layer { + name: "conv5_4_CPM_L2" + type: "Convolution" + bottom: "conv5_3_CPM_L2" + top: "conv5_4_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L2" + type: "ReLU" + bottom: "conv5_4_CPM_L2" + top: "conv5_4_CPM_L2" +} +layer { + name: "conv5_5_CPM_L1" + type: "Convolution" + bottom: "conv5_4_CPM_L1" + top: "conv5_5_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "conv5_5_CPM_L2" + type: "Convolution" + bottom: "conv5_4_CPM_L2" + top: "conv5_5_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage2" + type: "Concat" + bottom: "conv5_5_CPM_L1" + bottom: "conv5_5_CPM_L2" + bottom: "conv4_4_CPM" + top: "concat_stage2" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage2_L1" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L1" + type: "ReLU" + bottom: "Mconv1_stage2_L1" + top: "Mconv1_stage2_L1" +} +layer { + name: "Mconv1_stage2_L2" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L2" + type: "ReLU" + bottom: "Mconv1_stage2_L2" + top: "Mconv1_stage2_L2" +} +layer { + name: "Mconv2_stage2_L1" + type: "Convolution" + bottom: "Mconv1_stage2_L1" + top: "Mconv2_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L1" + type: "ReLU" + bottom: "Mconv2_stage2_L1" + top: "Mconv2_stage2_L1" +} +layer { + name: "Mconv2_stage2_L2" + type: "Convolution" + bottom: "Mconv1_stage2_L2" + top: "Mconv2_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L2" + type: "ReLU" + bottom: "Mconv2_stage2_L2" + top: "Mconv2_stage2_L2" +} +layer { + name: "Mconv3_stage2_L1" + type: "Convolution" + bottom: "Mconv2_stage2_L1" + top: "Mconv3_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L1" + type: "ReLU" + bottom: "Mconv3_stage2_L1" + top: "Mconv3_stage2_L1" +} +layer { + name: "Mconv3_stage2_L2" + type: "Convolution" + bottom: "Mconv2_stage2_L2" + top: "Mconv3_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L2" + type: "ReLU" + bottom: "Mconv3_stage2_L2" + top: "Mconv3_stage2_L2" +} +layer { + name: "Mconv4_stage2_L1" + type: "Convolution" + bottom: "Mconv3_stage2_L1" + top: "Mconv4_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L1" + type: "ReLU" + bottom: "Mconv4_stage2_L1" + top: "Mconv4_stage2_L1" +} +layer { + name: "Mconv4_stage2_L2" + type: "Convolution" + bottom: "Mconv3_stage2_L2" + top: "Mconv4_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L2" + type: "ReLU" + bottom: "Mconv4_stage2_L2" + top: "Mconv4_stage2_L2" +} +layer { + name: "Mconv5_stage2_L1" + type: "Convolution" + bottom: "Mconv4_stage2_L1" + top: "Mconv5_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L1" + type: "ReLU" + bottom: "Mconv5_stage2_L1" + top: "Mconv5_stage2_L1" +} +layer { + name: "Mconv5_stage2_L2" + type: "Convolution" + bottom: "Mconv4_stage2_L2" + top: "Mconv5_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L2" + type: "ReLU" + bottom: "Mconv5_stage2_L2" + top: "Mconv5_stage2_L2" +} +layer { + name: "Mconv6_stage2_L1" + type: "Convolution" + bottom: "Mconv5_stage2_L1" + top: "Mconv6_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L1" + type: "ReLU" + bottom: "Mconv6_stage2_L1" + top: "Mconv6_stage2_L1" +} +layer { + name: "Mconv6_stage2_L2" + type: "Convolution" + bottom: "Mconv5_stage2_L2" + top: "Mconv6_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L2" + type: "ReLU" + bottom: "Mconv6_stage2_L2" + top: "Mconv6_stage2_L2" +} +layer { + name: "Mconv7_stage2_L1" + type: "Convolution" + bottom: "Mconv6_stage2_L1" + top: "Mconv7_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage2_L2" + type: "Convolution" + bottom: "Mconv6_stage2_L2" + top: "Mconv7_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage3" + type: "Concat" + bottom: "Mconv7_stage2_L1" + bottom: "Mconv7_stage2_L2" + bottom: "conv4_4_CPM" + top: "concat_stage3" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage3_L1" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L1" + type: "ReLU" + bottom: "Mconv1_stage3_L1" + top: "Mconv1_stage3_L1" +} +layer { + name: "Mconv1_stage3_L2" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L2" + type: "ReLU" + bottom: "Mconv1_stage3_L2" + top: "Mconv1_stage3_L2" +} +layer { + name: "Mconv2_stage3_L1" + type: "Convolution" + bottom: "Mconv1_stage3_L1" + top: "Mconv2_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L1" + type: "ReLU" + bottom: "Mconv2_stage3_L1" + top: "Mconv2_stage3_L1" +} +layer { + name: "Mconv2_stage3_L2" + type: "Convolution" + bottom: "Mconv1_stage3_L2" + top: "Mconv2_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L2" + type: "ReLU" + bottom: "Mconv2_stage3_L2" + top: "Mconv2_stage3_L2" +} +layer { + name: "Mconv3_stage3_L1" + type: "Convolution" + bottom: "Mconv2_stage3_L1" + top: "Mconv3_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L1" + type: "ReLU" + bottom: "Mconv3_stage3_L1" + top: "Mconv3_stage3_L1" +} +layer { + name: "Mconv3_stage3_L2" + type: "Convolution" + bottom: "Mconv2_stage3_L2" + top: "Mconv3_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L2" + type: "ReLU" + bottom: "Mconv3_stage3_L2" + top: "Mconv3_stage3_L2" +} +layer { + name: "Mconv4_stage3_L1" + type: "Convolution" + bottom: "Mconv3_stage3_L1" + top: "Mconv4_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L1" + type: "ReLU" + bottom: "Mconv4_stage3_L1" + top: "Mconv4_stage3_L1" +} +layer { + name: "Mconv4_stage3_L2" + type: "Convolution" + bottom: "Mconv3_stage3_L2" + top: "Mconv4_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L2" + type: "ReLU" + bottom: "Mconv4_stage3_L2" + top: "Mconv4_stage3_L2" +} +layer { + name: "Mconv5_stage3_L1" + type: "Convolution" + bottom: "Mconv4_stage3_L1" + top: "Mconv5_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L1" + type: "ReLU" + bottom: "Mconv5_stage3_L1" + top: "Mconv5_stage3_L1" +} +layer { + name: "Mconv5_stage3_L2" + type: "Convolution" + bottom: "Mconv4_stage3_L2" + top: "Mconv5_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L2" + type: "ReLU" + bottom: "Mconv5_stage3_L2" + top: "Mconv5_stage3_L2" +} +layer { + name: "Mconv6_stage3_L1" + type: "Convolution" + bottom: "Mconv5_stage3_L1" + top: "Mconv6_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L1" + type: "ReLU" + bottom: "Mconv6_stage3_L1" + top: "Mconv6_stage3_L1" +} +layer { + name: "Mconv6_stage3_L2" + type: "Convolution" + bottom: "Mconv5_stage3_L2" + top: "Mconv6_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L2" + type: "ReLU" + bottom: "Mconv6_stage3_L2" + top: "Mconv6_stage3_L2" +} +layer { + name: "Mconv7_stage3_L1" + type: "Convolution" + bottom: "Mconv6_stage3_L1" + top: "Mconv7_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage3_L2" + type: "Convolution" + bottom: "Mconv6_stage3_L2" + top: "Mconv7_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage4" + type: "Concat" + bottom: "Mconv7_stage3_L1" + bottom: "Mconv7_stage3_L2" + bottom: "conv4_4_CPM" + top: "concat_stage4" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage4_L1" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L1" + type: "ReLU" + bottom: "Mconv1_stage4_L1" + top: "Mconv1_stage4_L1" +} +layer { + name: "Mconv1_stage4_L2" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L2" + type: "ReLU" + bottom: "Mconv1_stage4_L2" + top: "Mconv1_stage4_L2" +} +layer { + name: "Mconv2_stage4_L1" + type: "Convolution" + bottom: "Mconv1_stage4_L1" + top: "Mconv2_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L1" + type: "ReLU" + bottom: "Mconv2_stage4_L1" + top: "Mconv2_stage4_L1" +} +layer { + name: "Mconv2_stage4_L2" + type: "Convolution" + bottom: "Mconv1_stage4_L2" + top: "Mconv2_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L2" + type: "ReLU" + bottom: "Mconv2_stage4_L2" + top: "Mconv2_stage4_L2" +} +layer { + name: "Mconv3_stage4_L1" + type: "Convolution" + bottom: "Mconv2_stage4_L1" + top: "Mconv3_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L1" + type: "ReLU" + bottom: "Mconv3_stage4_L1" + top: "Mconv3_stage4_L1" +} +layer { + name: "Mconv3_stage4_L2" + type: "Convolution" + bottom: "Mconv2_stage4_L2" + top: "Mconv3_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L2" + type: "ReLU" + bottom: "Mconv3_stage4_L2" + top: "Mconv3_stage4_L2" +} +layer { + name: "Mconv4_stage4_L1" + type: "Convolution" + bottom: "Mconv3_stage4_L1" + top: "Mconv4_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L1" + type: "ReLU" + bottom: "Mconv4_stage4_L1" + top: "Mconv4_stage4_L1" +} +layer { + name: "Mconv4_stage4_L2" + type: "Convolution" + bottom: "Mconv3_stage4_L2" + top: "Mconv4_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L2" + type: "ReLU" + bottom: "Mconv4_stage4_L2" + top: "Mconv4_stage4_L2" +} +layer { + name: "Mconv5_stage4_L1" + type: "Convolution" + bottom: "Mconv4_stage4_L1" + top: "Mconv5_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L1" + type: "ReLU" + bottom: "Mconv5_stage4_L1" + top: "Mconv5_stage4_L1" +} +layer { + name: "Mconv5_stage4_L2" + type: "Convolution" + bottom: "Mconv4_stage4_L2" + top: "Mconv5_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L2" + type: "ReLU" + bottom: "Mconv5_stage4_L2" + top: "Mconv5_stage4_L2" +} +layer { + name: "Mconv6_stage4_L1" + type: "Convolution" + bottom: "Mconv5_stage4_L1" + top: "Mconv6_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L1" + type: "ReLU" + bottom: "Mconv6_stage4_L1" + top: "Mconv6_stage4_L1" +} +layer { + name: "Mconv6_stage4_L2" + type: "Convolution" + bottom: "Mconv5_stage4_L2" + top: "Mconv6_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L2" + type: "ReLU" + bottom: "Mconv6_stage4_L2" + top: "Mconv6_stage4_L2" +} +layer { + name: "Mconv7_stage4_L1" + type: "Convolution" + bottom: "Mconv6_stage4_L1" + top: "Mconv7_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage4_L2" + type: "Convolution" + bottom: "Mconv6_stage4_L2" + top: "Mconv7_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage5" + type: "Concat" + bottom: "Mconv7_stage4_L1" + bottom: "Mconv7_stage4_L2" + bottom: "conv4_4_CPM" + top: "concat_stage5" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage5_L1" + type: "Convolution" + bottom: "concat_stage5" + top: "Mconv1_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage5_L1" + type: "ReLU" + bottom: "Mconv1_stage5_L1" + top: "Mconv1_stage5_L1" +} +layer { + name: "Mconv1_stage5_L2" + type: "Convolution" + bottom: "concat_stage5" + top: "Mconv1_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage5_L2" + type: "ReLU" + bottom: "Mconv1_stage5_L2" + top: "Mconv1_stage5_L2" +} +layer { + name: "Mconv2_stage5_L1" + type: "Convolution" + bottom: "Mconv1_stage5_L1" + top: "Mconv2_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage5_L1" + type: "ReLU" + bottom: "Mconv2_stage5_L1" + top: "Mconv2_stage5_L1" +} +layer { + name: "Mconv2_stage5_L2" + type: "Convolution" + bottom: "Mconv1_stage5_L2" + top: "Mconv2_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage5_L2" + type: "ReLU" + bottom: "Mconv2_stage5_L2" + top: "Mconv2_stage5_L2" +} +layer { + name: "Mconv3_stage5_L1" + type: "Convolution" + bottom: "Mconv2_stage5_L1" + top: "Mconv3_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage5_L1" + type: "ReLU" + bottom: "Mconv3_stage5_L1" + top: "Mconv3_stage5_L1" +} +layer { + name: "Mconv3_stage5_L2" + type: "Convolution" + bottom: "Mconv2_stage5_L2" + top: "Mconv3_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage5_L2" + type: "ReLU" + bottom: "Mconv3_stage5_L2" + top: "Mconv3_stage5_L2" +} +layer { + name: "Mconv4_stage5_L1" + type: "Convolution" + bottom: "Mconv3_stage5_L1" + top: "Mconv4_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage5_L1" + type: "ReLU" + bottom: "Mconv4_stage5_L1" + top: "Mconv4_stage5_L1" +} +layer { + name: "Mconv4_stage5_L2" + type: "Convolution" + bottom: "Mconv3_stage5_L2" + top: "Mconv4_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage5_L2" + type: "ReLU" + bottom: "Mconv4_stage5_L2" + top: "Mconv4_stage5_L2" +} +layer { + name: "Mconv5_stage5_L1" + type: "Convolution" + bottom: "Mconv4_stage5_L1" + top: "Mconv5_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage5_L1" + type: "ReLU" + bottom: "Mconv5_stage5_L1" + top: "Mconv5_stage5_L1" +} +layer { + name: "Mconv5_stage5_L2" + type: "Convolution" + bottom: "Mconv4_stage5_L2" + top: "Mconv5_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage5_L2" + type: "ReLU" + bottom: "Mconv5_stage5_L2" + top: "Mconv5_stage5_L2" +} +layer { + name: "Mconv6_stage5_L1" + type: "Convolution" + bottom: "Mconv5_stage5_L1" + top: "Mconv6_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage5_L1" + type: "ReLU" + bottom: "Mconv6_stage5_L1" + top: "Mconv6_stage5_L1" +} +layer { + name: "Mconv6_stage5_L2" + type: "Convolution" + bottom: "Mconv5_stage5_L2" + top: "Mconv6_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage5_L2" + type: "ReLU" + bottom: "Mconv6_stage5_L2" + top: "Mconv6_stage5_L2" +} +layer { + name: "Mconv7_stage5_L1" + type: "Convolution" + bottom: "Mconv6_stage5_L1" + top: "Mconv7_stage5_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage5_L2" + type: "Convolution" + bottom: "Mconv6_stage5_L2" + top: "Mconv7_stage5_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage6" + type: "Concat" + bottom: "Mconv7_stage5_L1" + bottom: "Mconv7_stage5_L2" + bottom: "conv4_4_CPM" + top: "concat_stage6" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage6_L1" + type: "Convolution" + bottom: "concat_stage6" + top: "Mconv1_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage6_L1" + type: "ReLU" + bottom: "Mconv1_stage6_L1" + top: "Mconv1_stage6_L1" +} +layer { + name: "Mconv1_stage6_L2" + type: "Convolution" + bottom: "concat_stage6" + top: "Mconv1_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage6_L2" + type: "ReLU" + bottom: "Mconv1_stage6_L2" + top: "Mconv1_stage6_L2" +} +layer { + name: "Mconv2_stage6_L1" + type: "Convolution" + bottom: "Mconv1_stage6_L1" + top: "Mconv2_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage6_L1" + type: "ReLU" + bottom: "Mconv2_stage6_L1" + top: "Mconv2_stage6_L1" +} +layer { + name: "Mconv2_stage6_L2" + type: "Convolution" + bottom: "Mconv1_stage6_L2" + top: "Mconv2_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage6_L2" + type: "ReLU" + bottom: "Mconv2_stage6_L2" + top: "Mconv2_stage6_L2" +} +layer { + name: "Mconv3_stage6_L1" + type: "Convolution" + bottom: "Mconv2_stage6_L1" + top: "Mconv3_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage6_L1" + type: "ReLU" + bottom: "Mconv3_stage6_L1" + top: "Mconv3_stage6_L1" +} +layer { + name: "Mconv3_stage6_L2" + type: "Convolution" + bottom: "Mconv2_stage6_L2" + top: "Mconv3_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage6_L2" + type: "ReLU" + bottom: "Mconv3_stage6_L2" + top: "Mconv3_stage6_L2" +} +layer { + name: "Mconv4_stage6_L1" + type: "Convolution" + bottom: "Mconv3_stage6_L1" + top: "Mconv4_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage6_L1" + type: "ReLU" + bottom: "Mconv4_stage6_L1" + top: "Mconv4_stage6_L1" +} +layer { + name: "Mconv4_stage6_L2" + type: "Convolution" + bottom: "Mconv3_stage6_L2" + top: "Mconv4_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage6_L2" + type: "ReLU" + bottom: "Mconv4_stage6_L2" + top: "Mconv4_stage6_L2" +} +layer { + name: "Mconv5_stage6_L1" + type: "Convolution" + bottom: "Mconv4_stage6_L1" + top: "Mconv5_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage6_L1" + type: "ReLU" + bottom: "Mconv5_stage6_L1" + top: "Mconv5_stage6_L1" +} +layer { + name: "Mconv5_stage6_L2" + type: "Convolution" + bottom: "Mconv4_stage6_L2" + top: "Mconv5_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage6_L2" + type: "ReLU" + bottom: "Mconv5_stage6_L2" + top: "Mconv5_stage6_L2" +} +layer { + name: "Mconv6_stage6_L1" + type: "Convolution" + bottom: "Mconv5_stage6_L1" + top: "Mconv6_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage6_L1" + type: "ReLU" + bottom: "Mconv6_stage6_L1" + top: "Mconv6_stage6_L1" +} +layer { + name: "Mconv6_stage6_L2" + type: "Convolution" + bottom: "Mconv5_stage6_L2" + top: "Mconv6_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage6_L2" + type: "ReLU" + bottom: "Mconv6_stage6_L2" + top: "Mconv6_stage6_L2" +} +layer { + name: "Mconv7_stage6_L1" + type: "Convolution" + bottom: "Mconv6_stage6_L1" + top: "Mconv7_stage6_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 38 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage6_L2" + type: "Convolution" + bottom: "Mconv6_stage6_L2" + top: "Mconv7_stage6_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 19 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage7" + type: "Concat" + bottom: "Mconv7_stage6_L2" + bottom: "Mconv7_stage6_L1" + # top: "concat_stage7" + top: "net_output" + concat_param { + axis: 1 + } +} \ No newline at end of file diff --git a/res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt b/res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt new file mode 100644 index 0000000..02ec183 --- /dev/null +++ b/res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt @@ -0,0 +1,2081 @@ +input: "image" +input_dim: 1 +input_dim: 3 +input_dim: 1 # This value will be defined at runtime +input_dim: 1 # This value will be defined at runtime +layer { + name: "conv1_1" + type: "Convolution" + bottom: "image" + top: "conv1_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_1" + type: "ReLU" + bottom: "conv1_1" + top: "conv1_1" +} +layer { + name: "conv1_2" + type: "Convolution" + bottom: "conv1_1" + top: "conv1_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 64 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu1_2" + type: "ReLU" + bottom: "conv1_2" + top: "conv1_2" +} +layer { + name: "pool1_stage1" + type: "Pooling" + bottom: "conv1_2" + top: "pool1_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv2_1" + type: "Convolution" + bottom: "pool1_stage1" + top: "conv2_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_1" + type: "ReLU" + bottom: "conv2_1" + top: "conv2_1" +} +layer { + name: "conv2_2" + type: "Convolution" + bottom: "conv2_1" + top: "conv2_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu2_2" + type: "ReLU" + bottom: "conv2_2" + top: "conv2_2" +} +layer { + name: "pool2_stage1" + type: "Pooling" + bottom: "conv2_2" + top: "pool2_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv3_1" + type: "Convolution" + bottom: "pool2_stage1" + top: "conv3_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_1" + type: "ReLU" + bottom: "conv3_1" + top: "conv3_1" +} +layer { + name: "conv3_2" + type: "Convolution" + bottom: "conv3_1" + top: "conv3_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_2" + type: "ReLU" + bottom: "conv3_2" + top: "conv3_2" +} +layer { + name: "conv3_3" + type: "Convolution" + bottom: "conv3_2" + top: "conv3_3" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_3" + type: "ReLU" + bottom: "conv3_3" + top: "conv3_3" +} +layer { + name: "conv3_4" + type: "Convolution" + bottom: "conv3_3" + top: "conv3_4" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu3_4" + type: "ReLU" + bottom: "conv3_4" + top: "conv3_4" +} +layer { + name: "pool3_stage1" + type: "Pooling" + bottom: "conv3_4" + top: "pool3_stage1" + pooling_param { + pool: MAX + kernel_size: 2 + stride: 2 + } +} +layer { + name: "conv4_1" + type: "Convolution" + bottom: "pool3_stage1" + top: "conv4_1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_1" + type: "ReLU" + bottom: "conv4_1" + top: "conv4_1" +} +layer { + name: "conv4_2" + type: "Convolution" + bottom: "conv4_1" + top: "conv4_2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_2" + type: "ReLU" + bottom: "conv4_2" + top: "conv4_2" +} +layer { + name: "conv4_3_CPM" + type: "Convolution" + bottom: "conv4_2" + top: "conv4_3_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 256 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_3_CPM" + type: "ReLU" + bottom: "conv4_3_CPM" + top: "conv4_3_CPM" +} +layer { + name: "conv4_4_CPM" + type: "Convolution" + bottom: "conv4_3_CPM" + top: "conv4_4_CPM" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu4_4_CPM" + type: "ReLU" + bottom: "conv4_4_CPM" + top: "conv4_4_CPM" +} +layer { + name: "conv5_1_CPM_L1" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L1" + type: "ReLU" + bottom: "conv5_1_CPM_L1" + top: "conv5_1_CPM_L1" +} +layer { + name: "conv5_1_CPM_L2" + type: "Convolution" + bottom: "conv4_4_CPM" + top: "conv5_1_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_1_CPM_L2" + type: "ReLU" + bottom: "conv5_1_CPM_L2" + top: "conv5_1_CPM_L2" +} +layer { + name: "conv5_2_CPM_L1" + type: "Convolution" + bottom: "conv5_1_CPM_L1" + top: "conv5_2_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L1" + type: "ReLU" + bottom: "conv5_2_CPM_L1" + top: "conv5_2_CPM_L1" +} +layer { + name: "conv5_2_CPM_L2" + type: "Convolution" + bottom: "conv5_1_CPM_L2" + top: "conv5_2_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_2_CPM_L2" + type: "ReLU" + bottom: "conv5_2_CPM_L2" + top: "conv5_2_CPM_L2" +} +layer { + name: "conv5_3_CPM_L1" + type: "Convolution" + bottom: "conv5_2_CPM_L1" + top: "conv5_3_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L1" + type: "ReLU" + bottom: "conv5_3_CPM_L1" + top: "conv5_3_CPM_L1" +} +layer { + name: "conv5_3_CPM_L2" + type: "Convolution" + bottom: "conv5_2_CPM_L2" + top: "conv5_3_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 1 + kernel_size: 3 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_3_CPM_L2" + type: "ReLU" + bottom: "conv5_3_CPM_L2" + top: "conv5_3_CPM_L2" +} +layer { + name: "conv5_4_CPM_L1" + type: "Convolution" + bottom: "conv5_3_CPM_L1" + top: "conv5_4_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L1" + type: "ReLU" + bottom: "conv5_4_CPM_L1" + top: "conv5_4_CPM_L1" +} +layer { + name: "conv5_4_CPM_L2" + type: "Convolution" + bottom: "conv5_3_CPM_L2" + top: "conv5_4_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 512 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "relu5_4_CPM_L2" + type: "ReLU" + bottom: "conv5_4_CPM_L2" + top: "conv5_4_CPM_L2" +} +layer { + name: "conv5_5_CPM_L1" + type: "Convolution" + bottom: "conv5_4_CPM_L1" + top: "conv5_5_CPM_L1" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "conv5_5_CPM_L2" + type: "Convolution" + bottom: "conv5_4_CPM_L2" + top: "conv5_5_CPM_L2" + param { + lr_mult: 1.0 + decay_mult: 1 + } + param { + lr_mult: 2.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage2" + type: "Concat" + bottom: "conv5_5_CPM_L1" + bottom: "conv5_5_CPM_L2" + bottom: "conv4_4_CPM" + top: "concat_stage2" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage2_L1" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L1" + type: "ReLU" + bottom: "Mconv1_stage2_L1" + top: "Mconv1_stage2_L1" +} +layer { + name: "Mconv1_stage2_L2" + type: "Convolution" + bottom: "concat_stage2" + top: "Mconv1_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage2_L2" + type: "ReLU" + bottom: "Mconv1_stage2_L2" + top: "Mconv1_stage2_L2" +} +layer { + name: "Mconv2_stage2_L1" + type: "Convolution" + bottom: "Mconv1_stage2_L1" + top: "Mconv2_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L1" + type: "ReLU" + bottom: "Mconv2_stage2_L1" + top: "Mconv2_stage2_L1" +} +layer { + name: "Mconv2_stage2_L2" + type: "Convolution" + bottom: "Mconv1_stage2_L2" + top: "Mconv2_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage2_L2" + type: "ReLU" + bottom: "Mconv2_stage2_L2" + top: "Mconv2_stage2_L2" +} +layer { + name: "Mconv3_stage2_L1" + type: "Convolution" + bottom: "Mconv2_stage2_L1" + top: "Mconv3_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L1" + type: "ReLU" + bottom: "Mconv3_stage2_L1" + top: "Mconv3_stage2_L1" +} +layer { + name: "Mconv3_stage2_L2" + type: "Convolution" + bottom: "Mconv2_stage2_L2" + top: "Mconv3_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage2_L2" + type: "ReLU" + bottom: "Mconv3_stage2_L2" + top: "Mconv3_stage2_L2" +} +layer { + name: "Mconv4_stage2_L1" + type: "Convolution" + bottom: "Mconv3_stage2_L1" + top: "Mconv4_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L1" + type: "ReLU" + bottom: "Mconv4_stage2_L1" + top: "Mconv4_stage2_L1" +} +layer { + name: "Mconv4_stage2_L2" + type: "Convolution" + bottom: "Mconv3_stage2_L2" + top: "Mconv4_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage2_L2" + type: "ReLU" + bottom: "Mconv4_stage2_L2" + top: "Mconv4_stage2_L2" +} +layer { + name: "Mconv5_stage2_L1" + type: "Convolution" + bottom: "Mconv4_stage2_L1" + top: "Mconv5_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L1" + type: "ReLU" + bottom: "Mconv5_stage2_L1" + top: "Mconv5_stage2_L1" +} +layer { + name: "Mconv5_stage2_L2" + type: "Convolution" + bottom: "Mconv4_stage2_L2" + top: "Mconv5_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage2_L2" + type: "ReLU" + bottom: "Mconv5_stage2_L2" + top: "Mconv5_stage2_L2" +} +layer { + name: "Mconv6_stage2_L1" + type: "Convolution" + bottom: "Mconv5_stage2_L1" + top: "Mconv6_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L1" + type: "ReLU" + bottom: "Mconv6_stage2_L1" + top: "Mconv6_stage2_L1" +} +layer { + name: "Mconv6_stage2_L2" + type: "Convolution" + bottom: "Mconv5_stage2_L2" + top: "Mconv6_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage2_L2" + type: "ReLU" + bottom: "Mconv6_stage2_L2" + top: "Mconv6_stage2_L2" +} +layer { + name: "Mconv7_stage2_L1" + type: "Convolution" + bottom: "Mconv6_stage2_L1" + top: "Mconv7_stage2_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage2_L2" + type: "Convolution" + bottom: "Mconv6_stage2_L2" + top: "Mconv7_stage2_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage3" + type: "Concat" + bottom: "Mconv7_stage2_L1" + bottom: "Mconv7_stage2_L2" + bottom: "conv4_4_CPM" + top: "concat_stage3" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage3_L1" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L1" + type: "ReLU" + bottom: "Mconv1_stage3_L1" + top: "Mconv1_stage3_L1" +} +layer { + name: "Mconv1_stage3_L2" + type: "Convolution" + bottom: "concat_stage3" + top: "Mconv1_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage3_L2" + type: "ReLU" + bottom: "Mconv1_stage3_L2" + top: "Mconv1_stage3_L2" +} +layer { + name: "Mconv2_stage3_L1" + type: "Convolution" + bottom: "Mconv1_stage3_L1" + top: "Mconv2_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L1" + type: "ReLU" + bottom: "Mconv2_stage3_L1" + top: "Mconv2_stage3_L1" +} +layer { + name: "Mconv2_stage3_L2" + type: "Convolution" + bottom: "Mconv1_stage3_L2" + top: "Mconv2_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage3_L2" + type: "ReLU" + bottom: "Mconv2_stage3_L2" + top: "Mconv2_stage3_L2" +} +layer { + name: "Mconv3_stage3_L1" + type: "Convolution" + bottom: "Mconv2_stage3_L1" + top: "Mconv3_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L1" + type: "ReLU" + bottom: "Mconv3_stage3_L1" + top: "Mconv3_stage3_L1" +} +layer { + name: "Mconv3_stage3_L2" + type: "Convolution" + bottom: "Mconv2_stage3_L2" + top: "Mconv3_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage3_L2" + type: "ReLU" + bottom: "Mconv3_stage3_L2" + top: "Mconv3_stage3_L2" +} +layer { + name: "Mconv4_stage3_L1" + type: "Convolution" + bottom: "Mconv3_stage3_L1" + top: "Mconv4_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L1" + type: "ReLU" + bottom: "Mconv4_stage3_L1" + top: "Mconv4_stage3_L1" +} +layer { + name: "Mconv4_stage3_L2" + type: "Convolution" + bottom: "Mconv3_stage3_L2" + top: "Mconv4_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage3_L2" + type: "ReLU" + bottom: "Mconv4_stage3_L2" + top: "Mconv4_stage3_L2" +} +layer { + name: "Mconv5_stage3_L1" + type: "Convolution" + bottom: "Mconv4_stage3_L1" + top: "Mconv5_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L1" + type: "ReLU" + bottom: "Mconv5_stage3_L1" + top: "Mconv5_stage3_L1" +} +layer { + name: "Mconv5_stage3_L2" + type: "Convolution" + bottom: "Mconv4_stage3_L2" + top: "Mconv5_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage3_L2" + type: "ReLU" + bottom: "Mconv5_stage3_L2" + top: "Mconv5_stage3_L2" +} +layer { + name: "Mconv6_stage3_L1" + type: "Convolution" + bottom: "Mconv5_stage3_L1" + top: "Mconv6_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L1" + type: "ReLU" + bottom: "Mconv6_stage3_L1" + top: "Mconv6_stage3_L1" +} +layer { + name: "Mconv6_stage3_L2" + type: "Convolution" + bottom: "Mconv5_stage3_L2" + top: "Mconv6_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage3_L2" + type: "ReLU" + bottom: "Mconv6_stage3_L2" + top: "Mconv6_stage3_L2" +} +layer { + name: "Mconv7_stage3_L1" + type: "Convolution" + bottom: "Mconv6_stage3_L1" + top: "Mconv7_stage3_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage3_L2" + type: "Convolution" + bottom: "Mconv6_stage3_L2" + top: "Mconv7_stage3_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage4" + type: "Concat" + bottom: "Mconv7_stage3_L1" + bottom: "Mconv7_stage3_L2" + bottom: "conv4_4_CPM" + top: "concat_stage4" + concat_param { + axis: 1 + } +} +layer { + name: "Mconv1_stage4_L1" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L1" + type: "ReLU" + bottom: "Mconv1_stage4_L1" + top: "Mconv1_stage4_L1" +} +layer { + name: "Mconv1_stage4_L2" + type: "Convolution" + bottom: "concat_stage4" + top: "Mconv1_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu1_stage4_L2" + type: "ReLU" + bottom: "Mconv1_stage4_L2" + top: "Mconv1_stage4_L2" +} +layer { + name: "Mconv2_stage4_L1" + type: "Convolution" + bottom: "Mconv1_stage4_L1" + top: "Mconv2_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L1" + type: "ReLU" + bottom: "Mconv2_stage4_L1" + top: "Mconv2_stage4_L1" +} +layer { + name: "Mconv2_stage4_L2" + type: "Convolution" + bottom: "Mconv1_stage4_L2" + top: "Mconv2_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu2_stage4_L2" + type: "ReLU" + bottom: "Mconv2_stage4_L2" + top: "Mconv2_stage4_L2" +} +layer { + name: "Mconv3_stage4_L1" + type: "Convolution" + bottom: "Mconv2_stage4_L1" + top: "Mconv3_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L1" + type: "ReLU" + bottom: "Mconv3_stage4_L1" + top: "Mconv3_stage4_L1" +} +layer { + name: "Mconv3_stage4_L2" + type: "Convolution" + bottom: "Mconv2_stage4_L2" + top: "Mconv3_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu3_stage4_L2" + type: "ReLU" + bottom: "Mconv3_stage4_L2" + top: "Mconv3_stage4_L2" +} +layer { + name: "Mconv4_stage4_L1" + type: "Convolution" + bottom: "Mconv3_stage4_L1" + top: "Mconv4_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L1" + type: "ReLU" + bottom: "Mconv4_stage4_L1" + top: "Mconv4_stage4_L1" +} +layer { + name: "Mconv4_stage4_L2" + type: "Convolution" + bottom: "Mconv3_stage4_L2" + top: "Mconv4_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu4_stage4_L2" + type: "ReLU" + bottom: "Mconv4_stage4_L2" + top: "Mconv4_stage4_L2" +} +layer { + name: "Mconv5_stage4_L1" + type: "Convolution" + bottom: "Mconv4_stage4_L1" + top: "Mconv5_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L1" + type: "ReLU" + bottom: "Mconv5_stage4_L1" + top: "Mconv5_stage4_L1" +} +layer { + name: "Mconv5_stage4_L2" + type: "Convolution" + bottom: "Mconv4_stage4_L2" + top: "Mconv5_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 3 + kernel_size: 7 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu5_stage4_L2" + type: "ReLU" + bottom: "Mconv5_stage4_L2" + top: "Mconv5_stage4_L2" +} +layer { + name: "Mconv6_stage4_L1" + type: "Convolution" + bottom: "Mconv5_stage4_L1" + top: "Mconv6_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L1" + type: "ReLU" + bottom: "Mconv6_stage4_L1" + top: "Mconv6_stage4_L1" +} +layer { + name: "Mconv6_stage4_L2" + type: "Convolution" + bottom: "Mconv5_stage4_L2" + top: "Mconv6_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 128 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mrelu6_stage4_L2" + type: "ReLU" + bottom: "Mconv6_stage4_L2" + top: "Mconv6_stage4_L2" +} +layer { + name: "Mconv7_stage4_L1" + type: "Convolution" + bottom: "Mconv6_stage4_L1" + top: "Mconv7_stage4_L1" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 28 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "Mconv7_stage4_L2" + type: "Convolution" + bottom: "Mconv6_stage4_L2" + top: "Mconv7_stage4_L2" + param { + lr_mult: 4.0 + decay_mult: 1 + } + param { + lr_mult: 8.0 + decay_mult: 0 + } + convolution_param { + num_output: 16 + pad: 0 + kernel_size: 1 + weight_filler { + type: "gaussian" + std: 0.01 + } + bias_filler { + type: "constant" + } + } +} +layer { + name: "concat_stage7" + type: "Concat" + bottom: "Mconv7_stage4_L2" + bottom: "Mconv7_stage4_L1" + top: "net_output" + concat_param { + axis: 1 + } +} diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 62236d2..381b3cf 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -11,7 +11,7 @@ namespace computervision { - cv::VideoCapture cap(0); + cv::VideoCapture cap(1); cv::Mat img, imgGray, img2, img2Gray, img3, img4; @@ -59,10 +59,10 @@ namespace computervision putText(cameraFrame,hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255),3); imshow("camera", cameraFrame); - /* imshow("output", frameOut); + imshow("output", frameOut); imshow("foreground", foreground); imshow("handMask", handMask); - imshow("handDetection", fingerCountDebug);*/ + imshow("handDetection", fingerCountDebug); int key = waitKey(1); diff --git a/src/computervision/OpenPoseImage.cpp b/src/computervision/OpenPoseImage.cpp new file mode 100644 index 0000000..9e6578a --- /dev/null +++ b/src/computervision/OpenPoseImage.cpp @@ -0,0 +1,149 @@ +#include "OpenPoseImage.h" + +using namespace std; +using namespace cv; +using namespace cv::dnn; + +namespace computervision +{ +#define MPI + + +#ifdef MPI + const int POSE_PAIRS[14][2] = + { + {0,1}, {1,2}, {2,3}, + {3,4}, {1,5}, {5,6}, + {6,7}, {1,14}, {14,8}, {8,9}, + {9,10}, {14,11}, {11,12}, {12,13} + }; + + string protoFile = "res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"; + string weightsFile = "res/pose/mpi/pose_iter_160000.caffemodel"; + + int nPoints = 15; +#endif + +#ifdef COCO + const int POSE_PAIRS[17][2] = + { + {1,2}, {1,5}, {2,3}, + {3,4}, {5,6}, {6,7}, + {1,8}, {8,9}, {9,10}, + {1,11}, {11,12}, {12,13}, + {1,0}, {0,14}, + {14,16}, {0,15}, {15,17} + }; + + string protoFile = "pose/coco/pose_deploy_linevec.prototxt"; + string weightsFile = "pose/coco/pose_iter_440000.caffemodel"; + + int nPoints = 18; +#endif + + void OpenPoseImage::movementSkeleton(Mat inputImage) { + + + cout << "USAGE : ./OpenPose " << endl; + cout << "USAGE : ./OpenPose " << endl; + + string device = "cpu"; + + //string imageFile = "single.jpeg"; + // Take arguments from commmand line + /* if (argc == 2) + { + if ((string)argv[1] == "gpu") + device = "gpu"; + else + imageFile = argv[1]; + } + else if (argc == 3) + { + imageFile = argv[1]; + if ((string)argv[2] == "gpu") + device = "gpu"; + }*/ + + + + int inWidth = 368; + int inHeight = 368; + float thresh = 0.1; + + Mat frame = inputImage; + Mat frameCopy = frame.clone(); + int frameWidth = frame.cols; + int frameHeight = frame.rows; + + double t = (double)cv::getTickCount(); + Net net = readNetFromCaffe(protoFile, weightsFile); + + if (device == "cpu") + { + cout << "Using CPU device" << endl; + net.setPreferableBackend(DNN_TARGET_CPU); + } + else if (device == "gpu") + { + cout << "Using GPU device" << endl; + net.setPreferableBackend(DNN_BACKEND_CUDA); + net.setPreferableTarget(DNN_TARGET_CUDA); + } + + Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); + + net.setInput(inpBlob); + + Mat output = net.forward(); + + int H = output.size[2]; + int W = output.size[3]; + + // find the position of the body parts + vector points(nPoints); + for (int n = 0; n < nPoints; n++) + { + // Probability map of corresponding body's part. + Mat probMap(H, W, CV_32F, output.ptr(0, n)); + + Point2f p(-1, -1); + Point maxLoc; + double prob; + minMaxLoc(probMap, 0, &prob, 0, &maxLoc); + if (prob > thresh) + { + p = maxLoc; + p.x *= (float)frameWidth / W; + p.y *= (float)frameHeight / H; + + circle(frameCopy, cv::Point((int)p.x, (int)p.y), 8, Scalar(0, 255, 255), -1); + cv::putText(frameCopy, cv::format("%d", n), cv::Point((int)p.x, (int)p.y), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 0, 255), 2); + + } + points[n] = p; + } + + int nPairs = sizeof(POSE_PAIRS) / sizeof(POSE_PAIRS[0]); + + for (int n = 0; n < nPairs; n++) + { + // lookup 2 connected body/hand parts + Point2f partA = points[POSE_PAIRS[n][0]]; + Point2f partB = points[POSE_PAIRS[n][1]]; + + if (partA.x <= 0 || partA.y <= 0 || partB.x <= 0 || partB.y <= 0) + continue; + + line(frame, partA, partB, Scalar(0, 255, 255), 8); + circle(frame, partA, 8, Scalar(0, 0, 255), -1); + circle(frame, partB, 8, Scalar(0, 0, 255), -1); + } + + t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); + cout << "Time Taken = " << t << endl; + imshow("Output-Keypoints", frameCopy); + imshow("Output-Skeleton", frame); + imwrite("Output-Skeleton.jpg", frame); + } +} \ No newline at end of file diff --git a/src/computervision/OpenPoseVideo.cpp b/src/computervision/OpenPoseVideo.cpp new file mode 100644 index 0000000..882c728 --- /dev/null +++ b/src/computervision/OpenPoseVideo.cpp @@ -0,0 +1,144 @@ +#include "OpenPoseVideo.h" + +using namespace std; +using namespace cv; +using namespace cv::dnn; + +namespace computervision +{ +#define MPI + +#ifdef MPI + const int POSE_PAIRS[7][2] = + { + {0,1}, {1,2}, {2,3}, + {3,4}, {1,5}, {5,6}, + {6,7} + }; + + string protoFile = "res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"; + string weightsFile = "res/pose/mpi/pose_iter_160000.caffemodel"; + + int nPoints = 8; +#endif + +#ifdef COCO + const int POSE_PAIRS[17][2] = + { + {1,2}, {1,5}, {2,3}, + {3,4}, {5,6}, {6,7}, + {1,8}, {8,9}, {9,10}, + {1,11}, {11,12}, {12,13}, + {1,0}, {0,14}, + {14,16}, {0,15}, {15,17} + }; + + string protoFile = "pose/coco/pose_deploy_linevec.prototxt"; + string weightsFile = "pose/coco/pose_iter_440000.caffemodel"; + + int nPoints = 18; +#endif + Net net; + + void OpenPoseVideo::setup() { + net = readNetFromCaffe(protoFile, weightsFile); + } + + void OpenPoseVideo::movementSkeleton(Mat inputImage) { + + //string device = "cpu"; + //string videoFile = "sample_video.mp4"; + + // Take arguments from commmand line + /*if (argc == 2) + { + if ((string)argv[1] == "gpu") + device = "gpu"; + else + videoFile = argv[1]; + } + else if (argc == 3) + { + videoFile = argv[1]; + if ((string)argv[2] == "gpu") + device = "gpu"; + }*/ + + int inWidth = 368; + int inHeight = 368; + float thresh = 0.01; + + Mat frame, frameCopy; + int frameWidth = inputImage.size().width; + int frameHeight = inputImage.size().height; + + /*if (device == "cpu") + { + cout << "Using CPU device" << endl; + net.setPreferableBackend(DNN_TARGET_CPU); + } + else if (device == "gpu") + { + cout << "Using GPU device" << endl; + net.setPreferableBackend(DNN_BACKEND_CUDA); + net.setPreferableTarget(DNN_TARGET_CUDA); + }*/ + + double t = (double)cv::getTickCount(); + + frame = inputImage; + frameCopy = frame.clone(); + Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); + + net.setInput(inpBlob); + + Mat output = net.forward(); + + int H = output.size[2]; + int W = output.size[3]; + + // find the position of the body parts + vector points(nPoints); + for (int n = 0; n < nPoints; n++) + { + // Probability map of corresponding body's part. + Mat probMap(H, W, CV_32F, output.ptr(0, n)); + + Point2f p(-1, -1); + Point maxLoc; + double prob; + minMaxLoc(probMap, 0, &prob, 0, &maxLoc); + if (prob > thresh) + { + p = maxLoc; + p.x *= (float)frameWidth / W; + p.y *= (float)frameHeight / H; + + circle(frameCopy, cv::Point((int)p.x, (int)p.y), 8, Scalar(0, 255, 255), -1); + cv::putText(frameCopy, cv::format("%d", n), cv::Point((int)p.x, (int)p.y), cv::FONT_HERSHEY_COMPLEX, 1.1, cv::Scalar(0, 0, 255), 2); + } + points[n] = p; + } + + int nPairs = sizeof(POSE_PAIRS) / sizeof(POSE_PAIRS[0]); + + for (int n = 0; n < nPairs; n++) + { + // lookup 2 connected body/hand parts + Point2f partA = points[POSE_PAIRS[n][0]]; + Point2f partB = points[POSE_PAIRS[n][1]]; + + if (partA.x <= 0 || partA.y <= 0 || partB.x <= 0 || partB.y <= 0) + continue; + + line(frame, partA, partB, Scalar(0, 255, 255), 8); + circle(frame, partA, 8, Scalar(0, 0, 255), -1); + circle(frame, partB, 8, Scalar(0, 0, 255), -1); + } + + t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); + cv::putText(frame, cv::format("time taken = %.2f sec", t), cv::Point(50, 50), cv::FONT_HERSHEY_COMPLEX, .8, cv::Scalar(255, 50, 0), 2); + // imshow("Output-Keypoints", frameCopy); + imshow("Output-Skeleton", frame); + } +} \ No newline at end of file diff --git a/src/computervision/OpenPoseVideo.h b/src/computervision/OpenPoseVideo.h new file mode 100644 index 0000000..eaef736 --- /dev/null +++ b/src/computervision/OpenPoseVideo.h @@ -0,0 +1,19 @@ +#pragma once + +#include +#include +#include +#include + +using namespace cv; + +namespace computervision +{ + class OpenPoseVideo{ + private: + + public: + void movementSkeleton(Mat inputImage); + void setup(); + }; +} diff --git a/src/main.cpp b/src/main.cpp index 7bab3f9..1e78430 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,6 +18,8 @@ #include "toolbox/toolbox.h" #include "computervision/ObjectDetection.h" +//#include "computervision/OpenPoseImage.h" +#include "computervision/OpenPoseVideo.h" #pragma comment(lib, "glfw3.lib") #pragma comment(lib, "glew32s.lib") @@ -64,12 +66,17 @@ int main(void) // create object detection object instance computervision::ObjectDetection objDetect; + //computervision::OpenPoseImage openPoseImage; + computervision::OpenPoseVideo openPoseVideo; // set up object detection //objDetect.setup(); cv::Mat cameraFrame; + + openPoseVideo.setup(); + // Main game loop while (!glfwWindowShouldClose(window)) { @@ -87,8 +94,8 @@ int main(void) render_engine::renderer::Render(entity, shader); cameraFrame = objDetect.readCamera(); - objDetect.detectHand(cameraFrame); - + //objDetect.detectHand(cameraFrame); + openPoseVideo.movementSkeleton(cameraFrame); // Finish up shader.Stop(); From a68c6a57bf65754881f6824e6ffc8f23de7d845a Mon Sep 17 00:00:00 2001 From: Jasper Date: Fri, 28 May 2021 12:32:10 +0200 Subject: [PATCH 02/30] [EDIT] edited file --- src/computervision/OpenPoseImage.cpp | 149 --------------------------- wk2_fps.vcxproj | 2 + wk2_fps.vcxproj.filters | 6 ++ 3 files changed, 8 insertions(+), 149 deletions(-) delete mode 100644 src/computervision/OpenPoseImage.cpp diff --git a/src/computervision/OpenPoseImage.cpp b/src/computervision/OpenPoseImage.cpp deleted file mode 100644 index 9e6578a..0000000 --- a/src/computervision/OpenPoseImage.cpp +++ /dev/null @@ -1,149 +0,0 @@ -#include "OpenPoseImage.h" - -using namespace std; -using namespace cv; -using namespace cv::dnn; - -namespace computervision -{ -#define MPI - - -#ifdef MPI - const int POSE_PAIRS[14][2] = - { - {0,1}, {1,2}, {2,3}, - {3,4}, {1,5}, {5,6}, - {6,7}, {1,14}, {14,8}, {8,9}, - {9,10}, {14,11}, {11,12}, {12,13} - }; - - string protoFile = "res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"; - string weightsFile = "res/pose/mpi/pose_iter_160000.caffemodel"; - - int nPoints = 15; -#endif - -#ifdef COCO - const int POSE_PAIRS[17][2] = - { - {1,2}, {1,5}, {2,3}, - {3,4}, {5,6}, {6,7}, - {1,8}, {8,9}, {9,10}, - {1,11}, {11,12}, {12,13}, - {1,0}, {0,14}, - {14,16}, {0,15}, {15,17} - }; - - string protoFile = "pose/coco/pose_deploy_linevec.prototxt"; - string weightsFile = "pose/coco/pose_iter_440000.caffemodel"; - - int nPoints = 18; -#endif - - void OpenPoseImage::movementSkeleton(Mat inputImage) { - - - cout << "USAGE : ./OpenPose " << endl; - cout << "USAGE : ./OpenPose " << endl; - - string device = "cpu"; - - //string imageFile = "single.jpeg"; - // Take arguments from commmand line - /* if (argc == 2) - { - if ((string)argv[1] == "gpu") - device = "gpu"; - else - imageFile = argv[1]; - } - else if (argc == 3) - { - imageFile = argv[1]; - if ((string)argv[2] == "gpu") - device = "gpu"; - }*/ - - - - int inWidth = 368; - int inHeight = 368; - float thresh = 0.1; - - Mat frame = inputImage; - Mat frameCopy = frame.clone(); - int frameWidth = frame.cols; - int frameHeight = frame.rows; - - double t = (double)cv::getTickCount(); - Net net = readNetFromCaffe(protoFile, weightsFile); - - if (device == "cpu") - { - cout << "Using CPU device" << endl; - net.setPreferableBackend(DNN_TARGET_CPU); - } - else if (device == "gpu") - { - cout << "Using GPU device" << endl; - net.setPreferableBackend(DNN_BACKEND_CUDA); - net.setPreferableTarget(DNN_TARGET_CUDA); - } - - Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); - - net.setInput(inpBlob); - - Mat output = net.forward(); - - int H = output.size[2]; - int W = output.size[3]; - - // find the position of the body parts - vector points(nPoints); - for (int n = 0; n < nPoints; n++) - { - // Probability map of corresponding body's part. - Mat probMap(H, W, CV_32F, output.ptr(0, n)); - - Point2f p(-1, -1); - Point maxLoc; - double prob; - minMaxLoc(probMap, 0, &prob, 0, &maxLoc); - if (prob > thresh) - { - p = maxLoc; - p.x *= (float)frameWidth / W; - p.y *= (float)frameHeight / H; - - circle(frameCopy, cv::Point((int)p.x, (int)p.y), 8, Scalar(0, 255, 255), -1); - cv::putText(frameCopy, cv::format("%d", n), cv::Point((int)p.x, (int)p.y), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(0, 0, 255), 2); - - } - points[n] = p; - } - - int nPairs = sizeof(POSE_PAIRS) / sizeof(POSE_PAIRS[0]); - - for (int n = 0; n < nPairs; n++) - { - // lookup 2 connected body/hand parts - Point2f partA = points[POSE_PAIRS[n][0]]; - Point2f partB = points[POSE_PAIRS[n][1]]; - - if (partA.x <= 0 || partA.y <= 0 || partB.x <= 0 || partB.y <= 0) - continue; - - line(frame, partA, partB, Scalar(0, 255, 255), 8); - circle(frame, partA, 8, Scalar(0, 0, 255), -1); - circle(frame, partB, 8, Scalar(0, 0, 255), -1); - } - - t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); - cout << "Time Taken = " << t << endl; - imshow("Output-Keypoints", frameCopy); - imshow("Output-Skeleton", frame); - imwrite("Output-Skeleton.jpg", frame); - } -} \ No newline at end of file diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index fe5e71a..62e66d6 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -21,6 +21,7 @@ + @@ -38,6 +39,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 54a06e5..9e83634 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -57,6 +57,9 @@ Source Files + + Source Files + @@ -104,6 +107,9 @@ Header Files + + Header Files + From 40529f84b3e504fbb6720ba2bdc972af5addb757 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 28 May 2021 15:31:21 +0200 Subject: [PATCH 03/30] [ADD] basis for async arm detection --- src/computervision/ObjectDetection.cpp | 7 +- src/computervision/ObjectDetection.h | 2 + src/computervision/OpenPoseVideo.cpp | 64 ++++--------------- src/computervision/OpenPoseVideo.h | 2 +- .../async/async_arm_detection.cpp | 43 +++++++++++++ .../async/async_arm_detection.h | 22 +++++++ src/main.cpp | 17 ++++- wk2_fps.vcxproj | 7 ++ wk2_fps.vcxproj.filters | 11 ++++ 9 files changed, 119 insertions(+), 56 deletions(-) create mode 100644 src/computervision/async/async_arm_detection.cpp create mode 100644 src/computervision/async/async_arm_detection.h diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 381b3cf..a975c51 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -11,7 +11,7 @@ namespace computervision { - cv::VideoCapture cap(1); + cv::VideoCapture cap(0); cv::Mat img, imgGray, img2, img2Gray, img3, img4; @@ -33,6 +33,11 @@ namespace computervision return img; } + cv::VideoCapture ObjectDetection::getCap() + { + return cap; + } + bool ObjectDetection::detectHand(Mat cameraFrame) { Mat inputFrame = generateHandMaskSquare(cameraFrame); diff --git a/src/computervision/ObjectDetection.h b/src/computervision/ObjectDetection.h index bddf4ba..14c2c3d 100644 --- a/src/computervision/ObjectDetection.h +++ b/src/computervision/ObjectDetection.h @@ -65,6 +65,8 @@ namespace computervision */ bool drawHandMaskRect(cv::Mat *input); + cv::VideoCapture getCap(); + }; diff --git a/src/computervision/OpenPoseVideo.cpp b/src/computervision/OpenPoseVideo.cpp index 882c728..9cf1cad 100644 --- a/src/computervision/OpenPoseVideo.cpp +++ b/src/computervision/OpenPoseVideo.cpp @@ -44,59 +44,34 @@ namespace computervision net = readNetFromCaffe(protoFile, weightsFile); } - void OpenPoseVideo::movementSkeleton(Mat inputImage) { - - //string device = "cpu"; - //string videoFile = "sample_video.mp4"; - - // Take arguments from commmand line - /*if (argc == 2) - { - if ((string)argv[1] == "gpu") - device = "gpu"; - else - videoFile = argv[1]; - } - else if (argc == 3) - { - videoFile = argv[1]; - if ((string)argv[2] == "gpu") - device = "gpu"; - }*/ + void OpenPoseVideo::movementSkeleton(Mat inputImage, std::function)> f) { + std::cout << "movement skeleton start" << std::endl; int inWidth = 368; int inHeight = 368; float thresh = 0.01; - Mat frame, frameCopy; + Mat frame; int frameWidth = inputImage.size().width; int frameHeight = inputImage.size().height; - /*if (device == "cpu") - { - cout << "Using CPU device" << endl; - net.setPreferableBackend(DNN_TARGET_CPU); - } - else if (device == "gpu") - { - cout << "Using GPU device" << endl; - net.setPreferableBackend(DNN_BACKEND_CUDA); - net.setPreferableTarget(DNN_TARGET_CUDA); - }*/ - double t = (double)cv::getTickCount(); + std::cout << "reading input image and blob" << std::endl; frame = inputImage; - frameCopy = frame.clone(); Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); + + std::cout << "done reading image and blob" << std::endl; net.setInput(inpBlob); + std::cout << "done setting input to net" << std::endl; Mat output = net.forward(); int H = output.size[2]; int W = output.size[3]; + std::cout << "about to find position of boxy parts" << std::endl; // find the position of the body parts vector points(nPoints); for (int n = 0; n < nPoints; n++) @@ -114,31 +89,16 @@ namespace computervision p.x *= (float)frameWidth / W; p.y *= (float)frameHeight / H; - circle(frameCopy, cv::Point((int)p.x, (int)p.y), 8, Scalar(0, 255, 255), -1); - cv::putText(frameCopy, cv::format("%d", n), cv::Point((int)p.x, (int)p.y), cv::FONT_HERSHEY_COMPLEX, 1.1, cv::Scalar(0, 0, 255), 2); + circle(frame, cv::Point((int)p.x, (int)p.y), 8, Scalar(0, 255, 255), -1); + cv::putText(frame, cv::format("%d", n), cv::Point((int)p.x, (int)p.y), cv::FONT_HERSHEY_COMPLEX, 1.1, cv::Scalar(0, 0, 255), 2); } points[n] = p; } - int nPairs = sizeof(POSE_PAIRS) / sizeof(POSE_PAIRS[0]); - - for (int n = 0; n < nPairs; n++) - { - // lookup 2 connected body/hand parts - Point2f partA = points[POSE_PAIRS[n][0]]; - Point2f partB = points[POSE_PAIRS[n][1]]; - - if (partA.x <= 0 || partA.y <= 0 || partB.x <= 0 || partB.y <= 0) - continue; - - line(frame, partA, partB, Scalar(0, 255, 255), 8); - circle(frame, partA, 8, Scalar(0, 0, 255), -1); - circle(frame, partB, 8, Scalar(0, 0, 255), -1); - } - - t = ((double)cv::getTickCount() - t) / cv::getTickFrequency(); cv::putText(frame, cv::format("time taken = %.2f sec", t), cv::Point(50, 50), cv::FONT_HERSHEY_COMPLEX, .8, cv::Scalar(255, 50, 0), 2); // imshow("Output-Keypoints", frameCopy); imshow("Output-Skeleton", frame); + std::cout << "about to call points receiving method" << std::endl; + f(points); } } \ No newline at end of file diff --git a/src/computervision/OpenPoseVideo.h b/src/computervision/OpenPoseVideo.h index eaef736..8b9d75e 100644 --- a/src/computervision/OpenPoseVideo.h +++ b/src/computervision/OpenPoseVideo.h @@ -13,7 +13,7 @@ namespace computervision private: public: - void movementSkeleton(Mat inputImage); + void movementSkeleton(Mat inputImage,std::function)> f); void setup(); }; } diff --git a/src/computervision/async/async_arm_detection.cpp b/src/computervision/async/async_arm_detection.cpp new file mode 100644 index 0000000..6b27611 --- /dev/null +++ b/src/computervision/async/async_arm_detection.cpp @@ -0,0 +1,43 @@ +#include +#include "async_arm_detection.h" +#include "../OpenPoseVideo.h" +#include + + +namespace computervision +{ + AsyncArmDetection::AsyncArmDetection() + { + + } + + void AsyncArmDetection::run_arm_detection() + { + + } + + void AsyncArmDetection::start(std::function)> points_ready_func, cv::VideoCapture cap, OpenPoseVideo op) + { + + auto lambda = [](std::function)> f, cv::VideoCapture c, OpenPoseVideo op) { + std::cout << "STARTING THREAD LAMBDA" << std::endl; + cv::VideoCapture cap(0); + + if (!cap.isOpened()) + { + std::cout << "error opening video" << std::endl; + return; + } + + while (true) + { + Mat img; + cap.read(img); + op.movementSkeleton(img, f); + } + }; + + std::cout << "starting function" << std::endl; + std::thread async_arm_detect_thread(lambda, points_ready_func, cap, op); + } +} diff --git a/src/computervision/async/async_arm_detection.h b/src/computervision/async/async_arm_detection.h new file mode 100644 index 0000000..6d7572a --- /dev/null +++ b/src/computervision/async/async_arm_detection.h @@ -0,0 +1,22 @@ +#pragma once +#include +#include +#include +#include +#include "../OpenPoseVideo.h" + + +namespace computervision +{ + class AsyncArmDetection + { + public: + AsyncArmDetection(void); + + + void start(std::function)>, cv::VideoCapture cap, computervision::OpenPoseVideo op); + private: + void run_arm_detection(); + }; + +} diff --git a/src/main.cpp b/src/main.cpp index 1e78430..a14dd84 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #define STB_IMAGE_IMPLEMENTATION #include "stb_image.h" #include @@ -21,6 +23,8 @@ //#include "computervision/OpenPoseImage.h" #include "computervision/OpenPoseVideo.h" +#include "computervision/async/async_arm_detection.h" + #pragma comment(lib, "glfw3.lib") #pragma comment(lib, "glew32s.lib") #pragma comment(lib, "opengl32.lib") @@ -29,6 +33,11 @@ static double UpdateDelta(); static GLFWwindow* window; +void retrieve_points(std::vector arm_points) +{ + std::cout << "got points!!" << std::endl; + std::cout << "points: " << arm_points << std::endl; +} int main(void) { @@ -68,6 +77,7 @@ int main(void) computervision::ObjectDetection objDetect; //computervision::OpenPoseImage openPoseImage; computervision::OpenPoseVideo openPoseVideo; + openPoseVideo.setup(); // set up object detection @@ -75,7 +85,11 @@ int main(void) cv::Mat cameraFrame; - openPoseVideo.setup(); + //openPoseVideo.setup(); + + computervision::AsyncArmDetection as; + as.start(retrieve_points, objDetect.getCap(),openPoseVideo); + // Main game loop while (!glfwWindowShouldClose(window)) @@ -95,7 +109,6 @@ int main(void) cameraFrame = objDetect.readCamera(); //objDetect.detectHand(cameraFrame); - openPoseVideo.movementSkeleton(cameraFrame); // Finish up shader.Stop(); diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 62e66d6..098b361 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -19,6 +19,7 @@ + @@ -36,6 +37,7 @@ + @@ -56,6 +58,11 @@ + + + + + 16.0 {A7ECF1BE-DB22-4BF7-BFF6-E3BF72691EE6} diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 9e83634..eda7a9e 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -60,6 +60,9 @@ Source Files + + Source Files + @@ -110,8 +113,16 @@ Header Files + + Header Files + + + + + + \ No newline at end of file From cc7cb378400f8fa0f4f5c42efd9a7b67995c27e0 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 2 Jun 2021 09:44:30 +0200 Subject: [PATCH 04/30] [ADD] caffemodel project entry --- wk2_fps.vcxproj | 1 + wk2_fps.vcxproj.filters | 1 + 2 files changed, 2 insertions(+) diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 098b361..5f36c6f 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -59,6 +59,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index eda7a9e..0986f9d 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -124,5 +124,6 @@ + \ No newline at end of file From 1a149b8b7e649beb310a581ee11466f7b212fee5 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 2 Jun 2021 10:05:09 +0200 Subject: [PATCH 05/30] [ADD] static camera instance --- src/computervision/ObjectDetection.cpp | 4 +++- src/computervision/ObjectDetection.h | 1 + src/computervision/async/StaticCameraInstance.h | 12 ++++++++++++ src/computervision/async/async_arm_detection.cpp | 6 +++--- src/computervision/async/async_arm_detection.h | 1 + src/main.cpp | 2 -- wk2_fps.vcxproj | 1 + wk2_fps.vcxproj.filters | 3 +++ 8 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 src/computervision/async/StaticCameraInstance.h diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index a975c51..dc405ac 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -8,10 +8,10 @@ #include "SkinDetector.h" #include "FaceDetector.h" #include "FingerCount.h" +#include "async/StaticCameraInstance.h" namespace computervision { - cv::VideoCapture cap(0); cv::Mat img, imgGray, img2, img2Gray, img3, img4; @@ -24,6 +24,8 @@ namespace computervision FaceDetector faceDetector; FingerCount fingerCount; + cv::VideoCapture cap = computervision_async::getCap(); + ObjectDetection::ObjectDetection() { } diff --git a/src/computervision/ObjectDetection.h b/src/computervision/ObjectDetection.h index 14c2c3d..45f4c6d 100644 --- a/src/computervision/ObjectDetection.h +++ b/src/computervision/ObjectDetection.h @@ -65,6 +65,7 @@ namespace computervision */ bool drawHandMaskRect(cv::Mat *input); + cv::VideoCapture getCap(); }; diff --git a/src/computervision/async/StaticCameraInstance.h b/src/computervision/async/StaticCameraInstance.h new file mode 100644 index 0000000..625d478 --- /dev/null +++ b/src/computervision/async/StaticCameraInstance.h @@ -0,0 +1,12 @@ +#pragma once +#include + +namespace static_camera +{ + + static cv::VideoCapture getCap() + { + static cv::VideoCapture cap(0); + return cap; + } +}; diff --git a/src/computervision/async/async_arm_detection.cpp b/src/computervision/async/async_arm_detection.cpp index 6b27611..2557e6e 100644 --- a/src/computervision/async/async_arm_detection.cpp +++ b/src/computervision/async/async_arm_detection.cpp @@ -21,12 +21,12 @@ namespace computervision auto lambda = [](std::function)> f, cv::VideoCapture c, OpenPoseVideo op) { std::cout << "STARTING THREAD LAMBDA" << std::endl; - cv::VideoCapture cap(0); + cv::VideoCapture cap = computervision_async::getCap(); if (!cap.isOpened()) { - std::cout << "error opening video" << std::endl; - return; + std::cout << "capture was closed, opening..." << std::endl; + cap.open(0); } while (true) diff --git a/src/computervision/async/async_arm_detection.h b/src/computervision/async/async_arm_detection.h index 6d7572a..a265ce6 100644 --- a/src/computervision/async/async_arm_detection.h +++ b/src/computervision/async/async_arm_detection.h @@ -4,6 +4,7 @@ #include #include #include "../OpenPoseVideo.h" +#include "StaticCameraInstance.h" namespace computervision diff --git a/src/main.cpp b/src/main.cpp index a14dd84..00492e6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -85,8 +85,6 @@ int main(void) cv::Mat cameraFrame; - //openPoseVideo.setup(); - computervision::AsyncArmDetection as; as.start(retrieve_points, objDetect.getCap(),openPoseVideo); diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 5f36c6f..ddc8113 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -38,6 +38,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 0986f9d..a15b786 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -116,6 +116,9 @@ Header Files + + Header Files + From ab30c41beed21a0e5929253cf316a93e367638ab Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Wed, 2 Jun 2021 10:41:50 +0200 Subject: [PATCH 06/30] [FIX] crashing with pose detection --- src/computervision/ObjectDetection.cpp | 2 +- .../async/async_arm_detection.cpp | 40 +++++++++---------- .../async/async_arm_detection.h | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index dc405ac..b305e71 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -24,7 +24,7 @@ namespace computervision FaceDetector faceDetector; FingerCount fingerCount; - cv::VideoCapture cap = computervision_async::getCap(); + cv::VideoCapture cap = static_camera::getCap(); ObjectDetection::ObjectDetection() { diff --git a/src/computervision/async/async_arm_detection.cpp b/src/computervision/async/async_arm_detection.cpp index 2557e6e..cd88542 100644 --- a/src/computervision/async/async_arm_detection.cpp +++ b/src/computervision/async/async_arm_detection.cpp @@ -11,33 +11,33 @@ namespace computervision } - void AsyncArmDetection::run_arm_detection() + void AsyncArmDetection::run_arm_detection(std::function)> points_ready_func, cv::VideoCapture cap, OpenPoseVideo op) { + std::cout << "STARTING THREAD LAMBDA" << std::endl; + /*cv::VideoCapture cap = static_camera::getCap();*/ + if (!cap.isOpened()) + { + std::cout << "capture was closed, opening..." << std::endl; + cap.open(0); + } + + while (true) + { + Mat img; + cap.read(img); + op.movementSkeleton(img, points_ready_func); + } } void AsyncArmDetection::start(std::function)> points_ready_func, cv::VideoCapture cap, OpenPoseVideo op) { - auto lambda = [](std::function)> f, cv::VideoCapture c, OpenPoseVideo op) { - std::cout << "STARTING THREAD LAMBDA" << std::endl; - cv::VideoCapture cap = computervision_async::getCap(); - - if (!cap.isOpened()) - { - std::cout << "capture was closed, opening..." << std::endl; - cap.open(0); - } - - while (true) - { - Mat img; - cap.read(img); - op.movementSkeleton(img, f); - } - }; - std::cout << "starting function" << std::endl; - std::thread async_arm_detect_thread(lambda, points_ready_func, cap, op); + + + std::thread async_arm_detect_thread(&AsyncArmDetection::run_arm_detection,this, points_ready_func, cap, op); + + async_arm_detect_thread.detach(); // makes sure the thread is detached from the variable. } } diff --git a/src/computervision/async/async_arm_detection.h b/src/computervision/async/async_arm_detection.h index a265ce6..c577dc7 100644 --- a/src/computervision/async/async_arm_detection.h +++ b/src/computervision/async/async_arm_detection.h @@ -17,7 +17,7 @@ namespace computervision void start(std::function)>, cv::VideoCapture cap, computervision::OpenPoseVideo op); private: - void run_arm_detection(); + void run_arm_detection(std::function)> points_ready_func, cv::VideoCapture cap, OpenPoseVideo op); }; } From fe94b0f83d5814fdd45f16ebfbe1eb46466bf84b Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 10:55:53 +0200 Subject: [PATCH 07/30] [FIX] showing of pose detection points --- src/computervision/OpenPoseVideo.cpp | 11 +++++----- src/computervision/OpenPoseVideo.h | 2 +- .../async/async_arm_detection.cpp | 9 +++++--- .../async/async_arm_detection.h | 4 ++-- src/main.cpp | 21 +++++++++++++++---- wk2_fps.vcxproj | 6 +++--- 6 files changed, 35 insertions(+), 18 deletions(-) diff --git a/src/computervision/OpenPoseVideo.cpp b/src/computervision/OpenPoseVideo.cpp index 9cf1cad..dbaf6e5 100644 --- a/src/computervision/OpenPoseVideo.cpp +++ b/src/computervision/OpenPoseVideo.cpp @@ -44,7 +44,7 @@ namespace computervision net = readNetFromCaffe(protoFile, weightsFile); } - void OpenPoseVideo::movementSkeleton(Mat inputImage, std::function)> f) { + void OpenPoseVideo::movementSkeleton(Mat inputImage, std::function,cv::Mat poinst_on_image)> f) { std::cout << "movement skeleton start" << std::endl; int inWidth = 368; @@ -60,7 +60,7 @@ namespace computervision frame = inputImage; Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); - + std::cout << "done reading image and blob" << std::endl; net.setInput(inpBlob); @@ -96,9 +96,10 @@ namespace computervision } cv::putText(frame, cv::format("time taken = %.2f sec", t), cv::Point(50, 50), cv::FONT_HERSHEY_COMPLEX, .8, cv::Scalar(255, 50, 0), 2); - // imshow("Output-Keypoints", frameCopy); - imshow("Output-Skeleton", frame); + std::cout << "time taken: " << t << std::endl; + //imshow("Output-Keypoints", frame); + //imshow("Output-Skeleton", frame); std::cout << "about to call points receiving method" << std::endl; - f(points); + f(points,frame); } } \ No newline at end of file diff --git a/src/computervision/OpenPoseVideo.h b/src/computervision/OpenPoseVideo.h index 8b9d75e..7f61449 100644 --- a/src/computervision/OpenPoseVideo.h +++ b/src/computervision/OpenPoseVideo.h @@ -13,7 +13,7 @@ namespace computervision private: public: - void movementSkeleton(Mat inputImage,std::function)> f); + void movementSkeleton(Mat inputImage,std::function, cv::Mat poinst_on_image)> f); void setup(); }; } diff --git a/src/computervision/async/async_arm_detection.cpp b/src/computervision/async/async_arm_detection.cpp index cd88542..e9649a1 100644 --- a/src/computervision/async/async_arm_detection.cpp +++ b/src/computervision/async/async_arm_detection.cpp @@ -2,6 +2,7 @@ #include "async_arm_detection.h" #include "../OpenPoseVideo.h" #include +#include "StaticCameraInstance.h" namespace computervision @@ -11,8 +12,10 @@ namespace computervision } - void AsyncArmDetection::run_arm_detection(std::function)> points_ready_func, cv::VideoCapture cap, OpenPoseVideo op) + void AsyncArmDetection::run_arm_detection(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op) { + VideoCapture cap = static_camera::getCap(); + std::cout << "STARTING THREAD LAMBDA" << std::endl; /*cv::VideoCapture cap = static_camera::getCap();*/ @@ -30,13 +33,13 @@ namespace computervision } } - void AsyncArmDetection::start(std::function)> points_ready_func, cv::VideoCapture cap, OpenPoseVideo op) + void AsyncArmDetection::start(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op) { std::cout << "starting function" << std::endl; - std::thread async_arm_detect_thread(&AsyncArmDetection::run_arm_detection,this, points_ready_func, cap, op); + std::thread async_arm_detect_thread(&AsyncArmDetection::run_arm_detection,this, points_ready_func, op); async_arm_detect_thread.detach(); // makes sure the thread is detached from the variable. } diff --git a/src/computervision/async/async_arm_detection.h b/src/computervision/async/async_arm_detection.h index c577dc7..98fd163 100644 --- a/src/computervision/async/async_arm_detection.h +++ b/src/computervision/async/async_arm_detection.h @@ -15,9 +15,9 @@ namespace computervision AsyncArmDetection(void); - void start(std::function)>, cv::VideoCapture cap, computervision::OpenPoseVideo op); + void start(std::function, cv::Mat poinst_on_image)>, computervision::OpenPoseVideo op); private: - void run_arm_detection(std::function)> points_ready_func, cv::VideoCapture cap, OpenPoseVideo op); + void run_arm_detection(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op); }; } diff --git a/src/main.cpp b/src/main.cpp index 00492e6..260694c 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -32,11 +32,16 @@ static double UpdateDelta(); static GLFWwindow* window; +bool points_img_available = false; +cv::Mat points_img; -void retrieve_points(std::vector arm_points) +void retrieve_points(std::vector arm_points, cv::Mat points_on_image) { + std::cout << "got points!!" << std::endl; std::cout << "points: " << arm_points << std::endl; + points_img = points_on_image; + points_img_available = true; } int main(void) @@ -82,11 +87,15 @@ int main(void) // set up object detection //objDetect.setup(); - cv::Mat cameraFrame; + cv::VideoCapture cam = objDetect.getCap(); + cv::Mat img; + cam.read(img); + imshow("camera in main loop", img); computervision::AsyncArmDetection as; - as.start(retrieve_points, objDetect.getCap(),openPoseVideo); + + as.start(retrieve_points,openPoseVideo); // Main game loop @@ -105,8 +114,12 @@ int main(void) render_engine::renderer::Render(entity, shader); - cameraFrame = objDetect.readCamera(); //objDetect.detectHand(cameraFrame); + if (points_img_available) + { + imshow("points", points_img); + points_img_available = false; + } // Finish up shader.Stop(); diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index ddc8113..64c02b8 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -131,8 +131,8 @@ false - $(VC_IncludePath);$(WindowsSDK_IncludePath);;C:\opencv\opencv\build\include - $(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);C:\opencv\opencv\build\x64\vc15\lib + C:\opencv\build\include\;$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\opencv\opencv\build\include + C:\opencv\build\x64\vc15\lib;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);C:\opencv\opencv\build\x64\vc15\lib @@ -205,7 +205,7 @@ true true $(SolutionDir)lib\glfw-3.3.2\$(Platform);$(SolutionDir)lib\glew-2.1.0\lib\Release\$(Platform);%(AdditionalLibraryDirectories) - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies); opencv_world452.lib + opencv_world452.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies) From 921609de5dfcceafd2ed20206f9ecc10b19f1de2 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 11:39:23 +0200 Subject: [PATCH 08/30] [EDIT] stuff --- src/computervision/OpenPoseVideo.cpp | 5 ++++- src/computervision/OpenPoseVideo.h | 2 +- src/main.cpp | 7 ++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/computervision/OpenPoseVideo.cpp b/src/computervision/OpenPoseVideo.cpp index dbaf6e5..33527a1 100644 --- a/src/computervision/OpenPoseVideo.cpp +++ b/src/computervision/OpenPoseVideo.cpp @@ -42,9 +42,11 @@ namespace computervision void OpenPoseVideo::setup() { net = readNetFromCaffe(protoFile, weightsFile); + + net.setPreferableBackend(DNN_TARGET_CPU); } - void OpenPoseVideo::movementSkeleton(Mat inputImage, std::function,cv::Mat poinst_on_image)> f) { + void OpenPoseVideo::movementSkeleton(Mat& inputImage, std::function&, cv::Mat& poinst_on_image)> f) { std::cout << "movement skeleton start" << std::endl; int inWidth = 368; @@ -67,6 +69,7 @@ namespace computervision std::cout << "done setting input to net" << std::endl; Mat output = net.forward(); + std::cout << "time took to set input and forward: " << t << std::endl; int H = output.size[2]; int W = output.size[3]; diff --git a/src/computervision/OpenPoseVideo.h b/src/computervision/OpenPoseVideo.h index 7f61449..e05737d 100644 --- a/src/computervision/OpenPoseVideo.h +++ b/src/computervision/OpenPoseVideo.h @@ -13,7 +13,7 @@ namespace computervision private: public: - void movementSkeleton(Mat inputImage,std::function, cv::Mat poinst_on_image)> f); + void movementSkeleton(Mat& inputImage, std::function&, cv::Mat& poinst_on_image)> f); void setup(); }; } diff --git a/src/main.cpp b/src/main.cpp index 260694c..d1ef94e 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -87,10 +87,11 @@ int main(void) // set up object detection //objDetect.setup(); - cv::VideoCapture cam = objDetect.getCap(); + //cv::VideoCapture cam = objDetect.getCap(); cv::Mat img; - cam.read(img); - imshow("camera in main loop", img); + cv::VideoCapture cap = objDetect.getCap(); + //cam.read(img); + //imshow("camera in main loop", img); computervision::AsyncArmDetection as; From f5926fffcbac70d8e9029ff137271041afdd7790 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 13:09:51 +0200 Subject: [PATCH 09/30] [ADD] detecting if hand is in square --- src/computervision/ObjectDetection.cpp | 13 +- src/main.cpp | 2 +- src/scenes/startup_Scene.cpp | 3 + wk2_fps.vcxproj | 2 + wk2_fps.vcxproj.filters | 220 ++++++------------------- 5 files changed, 69 insertions(+), 171 deletions(-) diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index b305e71..f0edf1e 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -9,6 +9,7 @@ #include "FaceDetector.h" #include "FingerCount.h" #include "async/StaticCameraInstance.h" +#include "HandPresentChecker.h" namespace computervision { @@ -66,10 +67,14 @@ namespace computervision putText(cameraFrame,hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255),3); imshow("camera", cameraFrame); - imshow("output", frameOut); - imshow("foreground", foreground); - imshow("handMask", handMask); - imshow("handDetection", fingerCountDebug); + //imshow("output", frameOut); + //imshow("foreground", foreground); + //imshow("handMask", handMask); + //imshow("handDetection", fingerCountDebug); + + check_if_hand_present(handMask); + + int key = waitKey(1); diff --git a/src/main.cpp b/src/main.cpp index 9bc4c80..9e0783f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,7 +37,7 @@ static double UpdateDelta(); -scene::Scene& current_scene; +scene::Scene* current_scene; static GLFWwindow* window; bool points_img_available = false; diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index fe67b0f..7d94bb0 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -2,9 +2,11 @@ #include #include #include "startup_Scene.h" +#include "../computervision/ObjectDetection.h" namespace scene { + computervision::ObjectDetection objDetect; scene::Scenes scene::Startup_Scene::start(GLFWwindow *window) { @@ -27,6 +29,7 @@ namespace scene void scene::Startup_Scene::update(GLFWwindow* window) { + objDetect.detectHand(objDetect.readCamera()); } diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 50aac4f..f962a64 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -20,6 +20,7 @@ + @@ -45,6 +46,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index d118db9..a60c7ce 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -1,181 +1,69 @@  - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - + + + + + + + + + + + + + + + + + + + + + + + - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - Header Files - - - Header Files - - - Header Files - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file From 81dec3b9f4c27845b9bfedbc9c57cff52e90ae1b Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 13:10:11 +0200 Subject: [PATCH 10/30] [ADD] detecting if hand is in square --- src/computervision/HandPresentChecker.cpp | 18 ++++++++++++++++++ src/computervision/HandPresentChecker.h | 7 +++++++ 2 files changed, 25 insertions(+) create mode 100644 src/computervision/HandPresentChecker.cpp create mode 100644 src/computervision/HandPresentChecker.h diff --git a/src/computervision/HandPresentChecker.cpp b/src/computervision/HandPresentChecker.cpp new file mode 100644 index 0000000..2cb4784 --- /dev/null +++ b/src/computervision/HandPresentChecker.cpp @@ -0,0 +1,18 @@ +#include "HandPresentChecker.h" +#include +#include + + +namespace computervision +{ + bool check_if_hand_present(cv::Mat inputImage) + { + std::vector> points; + cv::Mat imgCont; + cv::findContours(inputImage, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); + bool hand_present = points.size() > 0; + std::cout << (hand_present ? "hey a hand!" : "damn no hand") << std::endl; + return hand_present; + } + +} diff --git a/src/computervision/HandPresentChecker.h b/src/computervision/HandPresentChecker.h new file mode 100644 index 0000000..5f0b0b7 --- /dev/null +++ b/src/computervision/HandPresentChecker.h @@ -0,0 +1,7 @@ +#pragma once + +#include +namespace computervision +{ + bool check_if_hand_present(cv::Mat inputImage); +} From cfd2d00d08b9d887a3b793ae27baf4426c3732f4 Mon Sep 17 00:00:00 2001 From: Menno Date: Fri, 4 Jun 2021 14:32:16 +0200 Subject: [PATCH 11/30] [ADDED] simple house generation --- .gitignore | 2 + res/House.obj | 4495 ------------------------------- src/entities/HouseGenerator.cpp | 35 + src/entities/HouseGenerator.h | 37 + src/models/Model.h | 1 + src/renderEngine/Renderer.cpp | 7 +- src/renderEngine/Renderer.h | 3 +- src/scenes/in_Game_Scene.cpp | 51 +- src/scenes/in_Game_Scene.h | 1 + src/shaders/entity_shader.cpp | 2 +- wk2_fps.vcxproj | 2 + wk2_fps.vcxproj.filters | 6 + 12 files changed, 116 insertions(+), 4526 deletions(-) delete mode 100644 res/House.obj create mode 100644 src/entities/HouseGenerator.cpp create mode 100644 src/entities/HouseGenerator.h diff --git a/.gitignore b/.gitignore index 488f5fe..743428a 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ # Created by https://www.toptal.com/developers/gitignore/api/c++,visualstudio,visualstudiocode,opencv # Edit at https://www.toptal.com/developers/gitignore?templates=c++,visualstudio,visualstudiocode,opencv +res/** + ### C++ ### # Prerequisites *.d diff --git a/res/House.obj b/res/House.obj deleted file mode 100644 index 220eb01..0000000 --- a/res/House.obj +++ /dev/null @@ -1,4495 +0,0 @@ -# Blender v2.91.0 OBJ File: '' -# www.blender.org -mtllib House.mtl -o ObjObject -v -12.800000 0.199998 9.900000 -v -12.800000 -0.000002 9.900000 -v -12.800000 -0.000002 10.000000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.000002 -10.000000 -v -12.800000 19.899998 9.900002 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 9.900002 -v -12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.999997 -v -12.700000 0.400001 -9.200000 -v -12.700000 0.300002 -9.300000 -v -12.700000 0.300002 -9.200000 -v -12.700000 0.400002 -9.300000 -v -9.900000 0.300001 -7.800000 -v -9.900000 0.200001 -7.900000 -v -9.900000 0.200001 -7.800000 -v -9.900000 0.300001 -7.900000 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.200001 -8.500000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.300001 -8.500000 -v -9.400000 0.400001 -7.800000 -v -9.400000 0.300001 -7.900000 -v -9.400000 0.300001 -7.800000 -v -9.400000 0.400001 -7.900000 -v -8.400000 13.199998 9.900002 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.900001 -v -8.400000 13.199998 9.800002 -v -8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.899999 -v -8.400000 6.800002 -9.799999 -v -8.400000 13.200002 -9.899998 -v -6.400000 9.899998 10.000002 -v -6.400000 6.999999 9.900001 -v -6.400000 6.999999 10.000001 -v -6.400000 6.999999 9.800001 -v -6.400000 9.899998 9.800002 -v -6.400000 9.900002 -9.799998 -v -6.400000 7.000001 -9.999999 -v -6.400000 7.000001 -9.899999 -v -6.400000 7.000001 -9.799999 -v -6.400000 9.900002 -9.999998 -v -6.400000 12.999998 10.000002 -v -6.400000 10.099998 9.800002 -v -6.400000 10.099998 10.000002 -v -6.400000 12.999998 9.900002 -v -6.400000 12.999998 9.800002 -v -6.400000 13.000002 -9.799998 -v -6.400000 10.100002 -9.999998 -v -6.400000 10.100002 -9.799998 -v -6.400000 13.000002 -9.899998 -v -6.400000 13.000002 -9.999998 -v -5.700000 0.400001 -9.200000 -v -5.700000 0.300002 -9.300000 -v -5.700000 0.300002 -9.200000 -v -5.700000 0.400002 -9.300000 -v -4.600000 9.899998 10.000002 -v -4.600000 6.999999 9.900001 -v -4.600000 6.999999 10.000001 -v -4.600000 9.899998 9.900002 -v -4.600000 6.999999 9.800001 -v -4.600000 9.899998 9.800002 -v -4.600000 9.900002 -9.799998 -v -4.600000 7.000001 -9.899999 -v -4.600000 7.000001 -9.799999 -v -4.600000 9.900002 -9.899998 -v -4.600000 7.000001 -9.999999 -v -4.600000 9.900002 -9.999998 -v -4.600000 12.999998 10.000002 -v -4.600000 10.099998 9.900002 -v -4.600000 10.099998 10.000002 -v -4.600000 12.999998 9.900002 -v -4.600000 10.099998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.600000 13.000002 -9.799998 -v -4.600000 10.100002 -9.899998 -v -4.600000 10.100002 -9.799998 -v -4.600000 13.000002 -9.899998 -v -4.600000 10.100002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -2.000000 0.400001 -7.800000 -v -2.000000 0.300001 -7.900000 -v -2.000000 0.300001 -7.800000 -v -2.000000 0.400001 -7.900000 -v 4.400000 13.199998 9.900002 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.900001 -v 4.400000 13.199998 9.800002 -v 4.400000 13.200002 -9.799998 -v 4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.799999 -v 4.400000 13.200002 -9.899998 -v 6.200000 9.899998 10.000002 -v 6.200000 6.999999 9.900001 -v 6.200000 6.999999 10.000001 -v 6.200000 6.999999 9.800001 -v 6.200000 9.899998 9.800002 -v 6.200000 9.900002 -9.799998 -v 6.200000 7.000001 -9.999999 -v 6.200000 7.000001 -9.899999 -v 6.200000 7.000001 -9.799999 -v 6.200000 9.900002 -9.999998 -v 6.200000 12.999998 10.000002 -v 6.200000 10.099998 9.800002 -v 6.200000 10.099998 10.000002 -v 6.200000 12.999998 9.900002 -v 6.200000 12.999998 9.800002 -v 6.200000 13.000002 -9.799998 -v 6.200000 10.100002 -9.999998 -v 6.200000 10.100002 -9.799998 -v 6.200000 13.000002 -9.899998 -v 6.200000 13.000002 -9.999998 -v 8.200000 9.899998 10.000002 -v 8.200000 6.999999 9.900001 -v 8.200000 6.999999 10.000001 -v 8.200000 9.899998 9.900002 -v 8.200000 6.999999 9.800001 -v 8.200000 9.899998 9.800002 -v 8.200000 9.900002 -9.799998 -v 8.200000 7.000001 -9.899999 -v 8.200000 7.000001 -9.799999 -v 8.200000 9.900002 -9.899998 -v 8.200000 7.000001 -9.999999 -v 8.200000 9.900002 -9.999998 -v 8.200000 12.999998 10.000002 -v 8.200000 10.099998 9.900002 -v 8.200000 10.099998 10.000002 -v 8.200000 12.999998 9.900002 -v 8.200000 10.099998 9.800002 -v 8.200000 12.999998 9.800002 -v 8.200000 13.000002 -9.799998 -v 8.200000 10.100002 -9.899998 -v 8.200000 10.100002 -9.799998 -v 8.200000 13.000002 -9.899998 -v 8.200000 10.100002 -9.999998 -v 8.200000 13.000002 -9.999998 -v -12.600000 0.300002 -9.200000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.400001 -9.200000 -v -12.600000 0.400002 -9.300000 -v -9.800000 0.200001 -7.800000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.300001 -7.800000 -v -9.800000 0.300001 -7.900000 -v -9.300000 0.300001 -7.800000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.400001 -7.800000 -v -9.300000 0.400001 -7.900000 -v -8.200000 6.999999 10.000001 -v -8.200000 6.999999 9.900001 -v -8.200000 9.899998 10.000002 -v -8.200000 6.999999 9.800001 -v -8.200000 9.899998 9.900002 -v -8.200000 9.899998 9.800002 -v -8.200000 7.000001 -9.799999 -v -8.200000 7.000001 -9.899999 -v -8.200000 9.900002 -9.799998 -v -8.200000 7.000001 -9.999999 -v -8.200000 9.900002 -9.899998 -v -8.200000 9.900002 -9.999998 -v -8.200000 10.099998 10.000002 -v -8.200000 10.099998 9.900002 -v -8.200000 12.999998 10.000002 -v -8.200000 10.099998 9.800002 -v -8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.800002 -v -8.200000 10.100002 -9.799998 -v -8.200000 10.100002 -9.899998 -v -8.200000 13.000002 -9.799998 -v -8.200000 10.100002 -9.999998 -v -8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.999998 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 9.900001 -v -6.200000 9.899998 10.000002 -v -6.200000 6.999999 9.800001 -v -6.200000 9.899998 9.800002 -v -6.200000 7.000001 -9.899999 -v -6.200000 7.000001 -9.999999 -v -6.200000 9.900002 -9.799998 -v -6.200000 7.000001 -9.799999 -v -6.200000 9.900002 -9.999998 -v -6.200000 10.099998 10.000002 -v -6.200000 10.099998 9.800002 -v -6.200000 12.999998 10.000002 -v -6.200000 12.999998 9.900002 -v -6.200000 12.999998 9.800002 -v -6.200000 10.100002 -9.799998 -v -6.200000 10.100002 -9.999998 -v -6.200000 13.000002 -9.799998 -v -6.200000 13.000002 -9.899998 -v -6.200000 13.000002 -9.999998 -v -5.600000 0.300002 -9.200000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.400001 -9.200000 -v -5.600000 0.400002 -9.300000 -v -5.400000 0.200001 -8.500000 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300002 -9.900000 -v -4.400000 6.799999 9.900001 -v -4.400000 6.799999 9.800001 -v -4.400000 13.199998 9.900002 -v -4.400000 13.199998 9.800002 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.899999 -v -4.400000 13.200002 -9.799998 -v -4.400000 13.200002 -9.899998 -v -1.900000 0.300001 -7.800000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.400001 -7.800000 -v -1.900000 0.400001 -7.900000 -v -1.600000 0.200001 -7.200000 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -8.500000 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 9.900001 -v 4.600000 9.899998 10.000002 -v 4.600000 6.999999 9.800001 -v 4.600000 9.899998 9.900002 -v 4.600000 9.899998 9.800002 -v 4.600000 7.000001 -9.799999 -v 4.600000 7.000001 -9.899999 -v 4.600000 9.900002 -9.799998 -v 4.600000 7.000001 -9.999999 -v 4.600000 9.900002 -9.899998 -v 4.600000 9.900002 -9.999998 -v 4.600000 10.099998 10.000002 -v 4.600000 10.099998 9.900002 -v 4.600000 12.999998 10.000002 -v 4.600000 10.099998 9.800002 -v 4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.800002 -v 4.600000 10.100002 -9.799998 -v 4.600000 10.100002 -9.899998 -v 4.600000 13.000002 -9.799998 -v 4.600000 10.100002 -9.999998 -v 4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.999998 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 9.900001 -v 6.400000 9.899998 10.000002 -v 6.400000 6.999999 9.800001 -v 6.400000 9.899998 9.800002 -v 6.400000 7.000001 -9.899999 -v 6.400000 7.000001 -9.999999 -v 6.400000 9.900002 -9.799998 -v 6.400000 7.000001 -9.799999 -v 6.400000 9.900002 -9.999998 -v 6.400000 10.099998 10.000002 -v 6.400000 10.099998 9.800002 -v 6.400000 12.999998 10.000002 -v 6.400000 12.999998 9.900002 -v 6.400000 12.999998 9.800002 -v 6.400000 10.100002 -9.799998 -v 6.400000 10.100002 -9.999998 -v 6.400000 13.000002 -9.799998 -v 6.400000 13.000002 -9.899998 -v 6.400000 13.000002 -9.999998 -v 8.400000 6.799999 9.900001 -v 8.400000 6.799999 9.800001 -v 8.400000 13.199998 9.900002 -v 8.400000 13.199998 9.800002 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.899999 -v 8.400000 13.200002 -9.799998 -v 8.400000 13.200002 -9.899998 -v 12.700000 -0.000002 9.900000 -v 12.700000 0.000002 -9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.200002 -9.900000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 9.900000 -v 12.800000 19.899998 9.900002 -v 12.800000 0.000002 -9.900000 -v 12.800000 0.000002 -10.000000 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.999998 10.000003 -v 12.800000 19.999998 9.900002 -v 12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.999997 -v -8.200000 6.999999 10.000001 -v -12.800000 19.999998 10.000003 -v -12.800000 -0.000002 10.000000 -v -8.200000 9.899998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 12.999998 10.000002 -v -6.400000 6.999999 10.000001 -v -6.400000 9.899998 10.000002 -v -6.400000 10.099998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.200000 6.999999 10.000001 -v -6.200000 9.899998 10.000002 -v -6.200000 10.099998 10.000002 -v -6.200000 12.999998 10.000002 -v -4.600000 6.999999 10.000001 -v -4.600000 9.899998 10.000002 -v -4.600000 10.099998 10.000002 -v -4.600000 12.999998 10.000002 -v 4.600000 6.999999 10.000001 -v 4.600000 9.899998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 12.999998 10.000002 -v 6.200000 6.999999 10.000001 -v 6.200000 9.899998 10.000002 -v 6.200000 10.099998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.400000 6.999999 10.000001 -v 6.400000 9.899998 10.000002 -v 6.400000 10.099998 10.000002 -v 6.400000 12.999998 10.000002 -v 8.200000 6.999999 10.000001 -v 8.200000 9.899998 10.000002 -v 8.200000 10.099998 10.000002 -v 8.200000 12.999998 10.000002 -v 12.800000 -0.000002 10.000000 -v 12.800000 19.999998 10.000003 -v -1.600000 0.200001 -7.200000 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -9.800000 0.200001 -7.800000 -v -9.900000 0.300001 -7.800000 -v -9.900000 0.200001 -7.800000 -v -9.800000 0.300001 -7.800000 -v -9.300000 0.300001 -7.800000 -v -9.400000 0.400001 -7.800000 -v -9.400000 0.300001 -7.800000 -v -9.300000 0.400001 -7.800000 -v -1.900000 0.300001 -7.800000 -v -2.000000 0.400001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -1.900000 0.400001 -7.800000 -v -9.600000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.200001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -12.600000 0.300002 -9.200000 -v -12.700000 0.400001 -9.200000 -v -12.700000 0.300002 -9.200000 -v -12.600000 0.400001 -9.200000 -v -5.600000 0.300002 -9.200000 -v -5.700000 0.400001 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.600000 0.400001 -9.200000 -v -8.200000 7.000001 -9.799999 -v -8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.799999 -v -8.200000 9.900002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 13.000002 -9.799998 -v -6.400000 7.000001 -9.799999 -v -6.400000 9.900002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.200000 7.000001 -9.799999 -v -6.200000 9.900002 -9.799998 -v -6.200000 10.100002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -4.600000 7.000001 -9.799999 -v -4.600000 9.900002 -9.799998 -v -4.600000 10.100002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.400000 6.800002 -9.799999 -v -4.400000 13.200002 -9.799998 -v 4.600000 7.000001 -9.799999 -v 4.400000 13.200002 -9.799998 -v 4.400000 6.800002 -9.799999 -v 4.600000 9.900002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 13.000002 -9.799998 -v 6.200000 7.000001 -9.799999 -v 6.200000 9.900002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.400000 7.000001 -9.799999 -v 6.400000 9.900002 -9.799998 -v 6.400000 10.100002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 8.200000 7.000001 -9.799999 -v 8.200000 9.900002 -9.799998 -v 8.200000 10.100002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.400000 6.800002 -9.799999 -v 8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.899999 -v -12.800000 19.900002 -9.899997 -v -12.800000 0.300002 -9.900000 -v -8.400000 13.200002 -9.899998 -v -5.400000 0.300002 -9.900000 -v -4.400000 6.800002 -9.899999 -v -5.400000 0.200002 -9.900000 -v -4.400000 13.200002 -9.899998 -v 4.400000 6.800002 -9.899999 -v 4.400000 13.200002 -9.899998 -v 8.400000 6.800002 -9.899999 -v 8.400000 13.200002 -9.899998 -v 12.700000 0.200002 -9.900000 -v 12.800000 0.000002 -9.900000 -v 12.700000 0.000002 -9.900000 -v 12.800000 19.900002 -9.899997 -v -12.800000 0.199998 9.900000 -v -12.800000 19.899998 9.900002 -v -8.400000 6.799999 9.900001 -v -8.400000 13.199998 9.900002 -v -4.400000 6.799999 9.900001 -v -4.400000 13.199998 9.900002 -v 4.400000 6.799999 9.900001 -v 4.400000 13.199998 9.900002 -v 8.400000 6.799999 9.900001 -v 8.400000 13.199998 9.900002 -v 12.700000 0.199998 9.900000 -v 12.700000 -0.000002 9.900000 -v 12.800000 -0.000002 9.900000 -v 12.800000 19.899998 9.900002 -v -8.400000 6.799999 9.800001 -v -8.400000 13.199998 9.800002 -v -8.200000 6.999999 9.800001 -v -8.200000 9.899998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 12.999998 9.800002 -v -6.400000 6.999999 9.800001 -v -6.400000 9.899998 9.800002 -v -6.400000 10.099998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.200000 6.999999 9.800001 -v -6.200000 9.899998 9.800002 -v -6.200000 10.099998 9.800002 -v -6.200000 12.999998 9.800002 -v -4.600000 6.999999 9.800001 -v -4.600000 9.899998 9.800002 -v -4.600000 10.099998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.400000 6.799999 9.800001 -v -4.400000 13.199998 9.800002 -v 4.400000 6.799999 9.800001 -v 4.400000 13.199998 9.800002 -v 4.600000 6.999999 9.800001 -v 4.600000 9.899998 9.800002 -v 4.600000 10.099998 9.800002 -v 4.600000 12.999998 9.800002 -v 6.200000 6.999999 9.800001 -v 6.200000 9.899998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.400000 6.999999 9.800001 -v 6.400000 9.899998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 12.999998 9.800002 -v 8.200000 6.999999 9.800001 -v 8.200000 9.899998 9.800002 -v 8.200000 10.099998 9.800002 -v 8.200000 12.999998 9.800002 -v 8.400000 6.799999 9.800001 -v 8.400000 13.199998 9.800002 -v -9.900000 0.200001 -7.900000 -v -9.900000 0.300001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.300001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -9.400000 0.400001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.400001 -7.900000 -v -2.000000 0.300001 -7.900000 -v -2.000000 0.400001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.400001 -7.900000 -v -5.400000 0.200001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.300001 -8.500000 -v -12.700000 0.300002 -9.300000 -v -12.700000 0.400002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.400002 -9.300000 -v -5.700000 0.300002 -9.300000 -v -5.700000 0.400002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.400002 -9.300000 -v -12.800000 0.000002 -10.000000 -v -12.800000 20.000002 -9.999997 -v -8.200000 7.000001 -9.999999 -v -8.200000 9.900002 -9.999998 -v -8.200000 10.100002 -9.999998 -v -8.200000 13.000002 -9.999998 -v -6.400000 7.000001 -9.999999 -v -6.400000 9.900002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.200000 7.000001 -9.999999 -v -6.200000 9.900002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -6.200000 13.000002 -9.999998 -v -4.600000 7.000001 -9.999999 -v -4.600000 9.900002 -9.999998 -v -4.600000 10.100002 -9.999998 -v -4.600000 13.000002 -9.999998 -v 4.600000 7.000001 -9.999999 -v 4.600000 9.900002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 4.600000 13.000002 -9.999998 -v 6.200000 7.000001 -9.999999 -v 6.200000 9.900002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.400000 7.000001 -9.999999 -v 6.400000 9.900002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 8.200000 7.000001 -9.999999 -v 8.200000 9.900002 -9.999998 -v 8.200000 10.100002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 12.800000 0.000002 -10.000000 -v 12.800000 20.000002 -9.999997 -v -12.800000 -0.000002 9.900000 -v 12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v 12.700000 -0.000002 9.900000 -v 12.800000 -0.000002 9.900000 -v -12.800000 0.000002 -9.900000 -v 12.700000 0.000002 -9.900000 -v -12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -9.900000 -v 12.800000 0.000002 -10.000000 -v -8.400000 6.799999 9.800001 -v -4.400000 6.799999 9.900001 -v -8.400000 6.799999 9.900001 -v -4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v 8.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v 8.400000 6.799999 9.800001 -v -8.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.899999 -v 8.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.899999 -v -8.200000 9.899998 9.900002 -v -6.400000 9.899998 10.000002 -v -8.200000 9.899998 10.000002 -v -4.600000 9.899998 9.900002 -v -4.600000 9.899998 10.000002 -v -6.200000 9.899998 10.000002 -v 4.600000 9.899998 9.900002 -v 6.200000 9.899998 10.000002 -v 4.600000 9.899998 10.000002 -v 8.200000 9.899998 9.900002 -v 8.200000 9.899998 10.000002 -v 6.400000 9.899998 10.000002 -v -8.200000 9.899998 9.800002 -v -6.400000 9.899998 9.800002 -v -6.200000 9.899998 9.800002 -v -4.600000 9.899998 9.800002 -v 4.600000 9.899998 9.800002 -v 6.200000 9.899998 9.800002 -v 6.400000 9.899998 9.800002 -v 8.200000 9.899998 9.800002 -v -8.200000 9.900002 -9.899998 -v -6.400000 9.900002 -9.799998 -v -8.200000 9.900002 -9.799998 -v -4.600000 9.900002 -9.899998 -v -4.600000 9.900002 -9.799998 -v -6.200000 9.900002 -9.799998 -v 4.600000 9.900002 -9.899998 -v 6.200000 9.900002 -9.799998 -v 4.600000 9.900002 -9.799998 -v 8.200000 9.900002 -9.899998 -v 8.200000 9.900002 -9.799998 -v 6.400000 9.900002 -9.799998 -v -8.200000 9.900002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.200000 9.900002 -9.999998 -v -4.600000 9.900002 -9.999998 -v 4.600000 9.900002 -9.999998 -v 6.200000 9.900002 -9.999998 -v 6.400000 9.900002 -9.999998 -v 8.200000 9.900002 -9.999998 -v -8.200000 12.999998 9.900002 -v -6.400000 12.999998 10.000002 -v -8.200000 12.999998 10.000002 -v -6.400000 12.999998 9.900002 -v -6.200000 12.999998 9.900002 -v -4.600000 12.999998 10.000002 -v -6.200000 12.999998 10.000002 -v -4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.900002 -v 6.200000 12.999998 10.000002 -v 4.600000 12.999998 10.000002 -v 6.200000 12.999998 9.900002 -v 6.400000 12.999998 9.900002 -v 8.200000 12.999998 10.000002 -v 6.400000 12.999998 10.000002 -v 8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.200000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v 4.600000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.400000 12.999998 9.800002 -v 8.200000 12.999998 9.800002 -v -8.200000 13.000002 -9.899998 -v -6.400000 13.000002 -9.799998 -v -8.200000 13.000002 -9.799998 -v -6.400000 13.000002 -9.899998 -v -6.200000 13.000002 -9.899998 -v -4.600000 13.000002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.899998 -v 6.200000 13.000002 -9.799998 -v 4.600000 13.000002 -9.799998 -v 6.200000 13.000002 -9.899998 -v 6.400000 13.000002 -9.899998 -v 8.200000 13.000002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.200000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v 4.600000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v -12.800000 19.900002 -9.899997 -v 12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v 12.800000 19.900002 -9.899997 -v -12.800000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v -9.600000 0.200001 -7.200000 -v -1.600000 0.200001 -7.200000 -v -9.900000 0.200001 -7.800000 -v -9.800000 0.200001 -7.800000 -v -9.900000 0.200001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -12.800000 0.200001 -8.500000 -v -9.600000 0.200001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -5.400000 0.200001 -8.500000 -v -5.400000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v -9.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -9.400000 0.300001 -7.800000 -v -9.300000 0.300001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -1.900000 0.300001 -7.800000 -v -9.900000 0.300001 -7.800000 -v -9.800000 0.300001 -7.800000 -v -9.900000 0.300001 -7.900000 -v -9.800000 0.300001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -2.000000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -9.600000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -1.600000 0.300001 -8.500000 -v -12.700000 0.300002 -9.200000 -v -12.800000 0.300001 -8.500000 -v -12.600000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.600000 0.300002 -9.200000 -v -12.700000 0.300002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -5.700000 0.300002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -12.800000 0.300002 -9.900000 -v -5.400000 0.300002 -9.900000 -v -9.400000 0.400001 -7.800000 -v -9.300000 0.400001 -7.800000 -v -9.400000 0.400001 -7.900000 -v -9.300000 0.400001 -7.900000 -v -2.000000 0.400001 -7.800000 -v -1.900000 0.400001 -7.800000 -v -2.000000 0.400001 -7.900000 -v -1.900000 0.400001 -7.900000 -v -12.700000 0.400001 -9.200000 -v -12.600000 0.400001 -9.200000 -v -12.700000 0.400002 -9.300000 -v -12.600000 0.400002 -9.300000 -v -5.700000 0.400001 -9.200000 -v -5.600000 0.400001 -9.200000 -v -5.700000 0.400002 -9.300000 -v -5.600000 0.400002 -9.300000 -v -8.200000 6.999999 10.000001 -v -6.400000 6.999999 10.000001 -v -8.200000 6.999999 9.900001 -v -6.400000 6.999999 9.900001 -v -6.200000 6.999999 10.000001 -v -4.600000 6.999999 10.000001 -v -6.200000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v 4.600000 6.999999 10.000001 -v 6.200000 6.999999 10.000001 -v 4.600000 6.999999 9.900001 -v 6.200000 6.999999 9.900001 -v 6.400000 6.999999 10.000001 -v 8.200000 6.999999 10.000001 -v 6.400000 6.999999 9.900001 -v 8.200000 6.999999 9.900001 -v -8.200000 6.999999 9.800001 -v -6.400000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -4.600000 6.999999 9.800001 -v 4.600000 6.999999 9.800001 -v 6.200000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 8.200000 6.999999 9.800001 -v -8.200000 7.000001 -9.799999 -v -6.400000 7.000001 -9.799999 -v -8.200000 7.000001 -9.899999 -v -6.400000 7.000001 -9.899999 -v -6.200000 7.000001 -9.799999 -v -4.600000 7.000001 -9.799999 -v -6.200000 7.000001 -9.899999 -v -4.600000 7.000001 -9.899999 -v 4.600000 7.000001 -9.799999 -v 6.200000 7.000001 -9.799999 -v 4.600000 7.000001 -9.899999 -v 6.200000 7.000001 -9.899999 -v 6.400000 7.000001 -9.799999 -v 8.200000 7.000001 -9.799999 -v 6.400000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v -8.200000 7.000001 -9.999999 -v -6.400000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 6.200000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 8.200000 7.000001 -9.999999 -v -8.200000 10.099998 10.000002 -v -6.400000 10.099998 10.000002 -v -8.200000 10.099998 9.900002 -v -6.200000 10.099998 10.000002 -v -4.600000 10.099998 10.000002 -v -4.600000 10.099998 9.900002 -v 4.600000 10.099998 10.000002 -v 6.200000 10.099998 10.000002 -v 4.600000 10.099998 9.900002 -v 6.400000 10.099998 10.000002 -v 8.200000 10.099998 10.000002 -v 8.200000 10.099998 9.900002 -v -8.200000 10.099998 9.800002 -v -6.400000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -4.600000 10.099998 9.800002 -v 4.600000 10.099998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v 8.200000 10.099998 9.800002 -v -8.200000 10.100002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -8.200000 10.100002 -9.899998 -v -6.200000 10.100002 -9.799998 -v -4.600000 10.100002 -9.799998 -v -4.600000 10.100002 -9.899998 -v 4.600000 10.100002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 4.600000 10.100002 -9.899998 -v 6.400000 10.100002 -9.799998 -v 8.200000 10.100002 -9.799998 -v 8.200000 10.100002 -9.899998 -v -8.200000 10.100002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -4.600000 10.100002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 8.200000 10.100002 -9.999998 -v -8.400000 13.199998 9.900002 -v -4.400000 13.199998 9.900002 -v -8.400000 13.199998 9.800002 -v -4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.900002 -v 8.400000 13.199998 9.900002 -v 4.400000 13.199998 9.800002 -v 8.400000 13.199998 9.800002 -v -8.400000 13.200002 -9.799998 -v -4.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.899998 -v -4.400000 13.200002 -9.899998 -v 4.400000 13.200002 -9.799998 -v 8.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.899998 -v 8.400000 13.200002 -9.899998 -v -12.800000 19.999998 10.000003 -v 12.800000 19.999998 10.000003 -v -12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v -12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.999997 -v 12.800000 20.000002 -9.999997 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 -0.000002 9.900000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v 6.400000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 8.200000 9.900002 -9.999998 -v 8.200000 9.900002 -9.999998 -v 8.200000 9.900002 -9.999998 -v -4.600000 10.100002 -9.899998 -v -4.600000 10.100002 -9.899998 -v -6.200000 10.100002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.400000 9.900002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -4.400000 13.199998 9.900002 -v -8.400000 13.199998 9.800002 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 10.000003 -v -8.200000 9.899998 10.000002 -v -8.200000 9.899998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 10.099998 10.000002 -v -8.200000 12.999998 10.000002 -v -6.200000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -4.600000 9.899998 9.800002 -v -4.600000 9.899998 9.800002 -v -4.600000 9.899998 9.800002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.400000 12.999998 10.000002 -v -6.200000 12.999998 10.000002 -v -6.200000 12.999998 10.000002 -v 8.400000 13.199998 9.900002 -v 8.400000 13.199998 9.900002 -v 8.400000 13.199998 9.900002 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v -6.400000 12.999998 10.000002 -v -6.400000 10.099998 9.800002 -v -6.400000 10.099998 9.800002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v -4.600000 12.999998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 10.099998 10.000002 -v 4.600000 12.999998 10.000002 -v 4.600000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.200000 12.999998 10.000002 -v 6.400000 12.999998 10.000002 -v 6.400000 12.999998 10.000002 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 8.200000 12.999998 10.000002 -v 8.200000 12.999998 10.000002 -v 8.200000 12.999998 10.000002 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 12.800000 19.999998 10.000003 -v -6.400000 7.000001 -9.799999 -v -6.400000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -6.200000 7.000001 -9.799999 -v -4.600000 13.000002 -9.799998 -v -4.600000 10.100002 -9.899998 -v -4.600000 10.100002 -9.899998 -v 8.200000 10.099998 10.000002 -v 8.200000 10.099998 10.000002 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.799998 -v -8.200000 9.900002 -9.799998 -v -8.200000 9.900002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 10.100002 -9.799998 -v -8.200000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.400000 13.000002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -6.200000 13.000002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.600000 13.000002 -9.799998 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.799999 -v -4.400000 6.800002 -9.799999 -v -4.400000 13.200002 -9.799998 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.600000 0.200001 -7.200000 -v -9.900000 0.200001 -7.800000 -v -9.900000 0.200001 -7.800000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.200001 -7.900000 -v -2.000000 0.300001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -2.000000 0.300001 -7.800000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v 12.800000 19.899998 9.900002 -v 12.800000 19.899998 9.900002 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.300001 -7.200000 -v -9.400000 0.300001 -7.800000 -v -9.400000 0.300001 -7.800000 -v -6.200000 9.899998 9.800002 -v -6.200000 9.899998 9.800002 -v -9.900000 0.200001 -7.900000 -v -9.900000 0.200001 -7.900000 -v 6.200000 9.899998 9.800002 -v 6.200000 9.899998 9.800002 -v 6.200000 9.899998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.200000 10.099998 9.800002 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.400000 6.999999 9.800001 -v 6.200000 9.900002 -9.999998 -v 6.200000 9.900002 -9.999998 -v 6.200000 9.900002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 6.200000 10.100002 -9.999998 -v -2.000000 0.400001 -7.900000 -v -1.900000 0.300001 -7.900000 -v 4.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 4.400000 6.800002 -9.799999 -v 6.200000 7.000001 -9.799999 -v 6.200000 7.000001 -9.799999 -v -8.200000 6.999999 10.000001 -v -8.200000 6.999999 10.000001 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -12.800000 -0.000002 10.000000 -v -6.400000 12.999998 9.900002 -v -4.600000 9.899998 9.900002 -v -4.600000 9.899998 9.900002 -v -4.600000 6.999999 9.800001 -v -1.900000 0.300001 -7.800000 -v -2.000000 0.400001 -7.800000 -v -4.600000 13.000002 -9.899998 -v -4.600000 13.000002 -9.899998 -v -4.600000 12.999998 9.900002 -v -4.600000 12.999998 9.900002 -v -6.200000 12.999998 9.800002 -v -8.200000 7.000001 -9.799999 -v -8.200000 7.000001 -9.799999 -v -8.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v -8.400000 6.800002 -9.799999 -v 6.200000 13.000002 -9.799998 -v 6.200000 10.100002 -9.999998 -v 6.200000 10.100002 -9.999998 -v 8.200000 13.000002 -9.899998 -v 8.200000 13.000002 -9.899998 -v 6.400000 13.000002 -9.999998 -v 6.400000 10.100002 -9.799998 -v 6.400000 10.100002 -9.799998 -v 6.400000 10.100002 -9.799998 -v 8.200000 9.900002 -9.799998 -v 8.200000 9.900002 -9.799998 -v 8.200000 9.900002 -9.799998 -v -8.200000 7.000001 -9.899999 -v -8.200000 7.000001 -9.899999 -v -8.200000 9.900002 -9.799998 -v -8.200000 9.900002 -9.899998 -v -8.200000 9.900002 -9.899998 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -12.800000 20.000002 -9.999997 -v -8.200000 7.000001 -9.999999 -v -8.200000 7.000001 -9.999999 -v 6.200000 6.999999 9.800001 -v 6.200000 6.999999 9.800001 -v -8.200000 9.900002 -9.999998 -v -8.200000 9.900002 -9.999998 -v -6.400000 7.000001 -9.799999 -v -8.200000 7.000001 -9.899999 -v -8.200000 7.000001 -9.899999 -v -6.400000 6.999999 9.800001 -v -6.400000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v -6.200000 6.999999 9.800001 -v 4.600000 6.999999 9.800001 -v 4.600000 9.899998 9.900002 -v 4.600000 9.899998 9.900002 -v 4.600000 10.100002 -9.899998 -v 4.600000 10.100002 -9.899998 -v 4.600000 13.000002 -9.799998 -v 4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.899998 -v 6.400000 10.099998 10.000002 -v 8.200000 10.099998 9.900002 -v 8.200000 10.099998 9.900002 -v -6.200000 10.100002 -9.799998 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v -4.600000 13.000002 -9.999998 -v 12.700000 0.000002 -9.900000 -v 12.700000 0.000002 -9.900000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -9.900000 0.300001 -7.800000 -v -9.900000 0.200001 -7.900000 -v 4.600000 13.000002 -9.999998 -v 4.600000 13.000002 -9.999998 -v 4.400000 6.800002 -9.899999 -v 8.400000 6.800002 -9.799999 -v -8.400000 13.200002 -9.799998 -v -8.400000 6.800002 -9.899999 -v 4.600000 9.899998 10.000002 -v 4.600000 9.899998 10.000002 -v -5.600000 0.400001 -9.200000 -v -5.700000 0.400002 -9.300000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.700000 0.300002 -9.300000 -v -12.700000 0.300002 -9.300000 -v -6.200000 12.999998 9.900002 -v -6.200000 12.999998 9.900002 -v -4.600000 12.999998 10.000002 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 6.200000 6.999999 9.900001 -v 6.200000 6.999999 9.800001 -v 8.200000 9.900002 -9.899998 -v 8.200000 9.900002 -9.899998 -v 6.400000 9.900002 -9.799998 -v 6.400000 13.000002 -9.899998 -v 6.400000 13.000002 -9.899998 -v 8.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.899998 -v 8.200000 12.999998 10.000002 -v 8.200000 10.099998 9.900002 -v 8.200000 10.099998 9.900002 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.799999 -v 8.400000 6.800002 -9.799999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v 8.400000 13.200002 -9.899998 -v 8.400000 13.200002 -9.899998 -v 8.400000 13.200002 -9.899998 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.900002 -9.899997 -v -6.200000 6.999999 9.900001 -v -6.200000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v -6.200000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -6.200000 13.000002 -9.799998 -v -6.200000 13.000002 -9.899998 -v -4.600000 10.100002 -9.799998 -v -4.600000 10.100002 -9.799998 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.200000 12.999998 9.800002 -v 6.400000 12.999998 9.800002 -v 6.400000 12.999998 9.800002 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.800001 -v -8.400000 6.799999 9.800001 -v -8.200000 6.999999 9.800001 -v -8.200000 6.999999 9.800001 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -9.600000 0.300001 -8.500000 -v -12.700000 0.300002 -9.200000 -v -12.700000 0.300002 -9.200000 -v -12.700000 0.300002 -9.200000 -v 6.400000 7.000001 -9.899999 -v 6.400000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v -5.700000 0.400002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 12.700000 0.000002 -9.900000 -v 12.700000 0.199998 9.900000 -v 6.400000 9.900002 -9.999998 -v 6.400000 9.900002 -9.999998 -v -12.800000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v 4.600000 9.899998 9.900002 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 12.800000 0.000002 -9.900000 -v 8.200000 6.999999 10.000001 -v 6.400000 6.999999 9.900001 -v 6.400000 6.999999 9.900001 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -5.400000 0.300001 -8.500000 -v -6.400000 6.999999 10.000001 -v -6.400000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -6.200000 6.999999 10.000001 -v -4.600000 6.999999 10.000001 -v -4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 4.600000 6.999999 10.000001 -v 6.200000 6.999999 10.000001 -v 6.200000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 6.400000 6.999999 10.000001 -v 8.200000 6.999999 10.000001 -v 8.200000 6.999999 10.000001 -v 6.400000 9.900002 -9.999998 -v -4.600000 10.100002 -9.999998 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v -6.200000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -6.200000 10.100002 -9.999998 -v -4.600000 9.900002 -9.999998 -v -4.600000 9.900002 -9.999998 -v -4.600000 9.900002 -9.999998 -v -4.600000 7.000001 -9.799999 -v -4.600000 7.000001 -9.799999 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 12.700000 0.199998 9.900000 -v 8.200000 12.999998 9.900002 -v 8.200000 12.999998 9.900002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.400000 13.199998 9.800002 -v 4.600000 9.899998 9.800002 -v 4.600000 9.899998 9.800002 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -9.300000 0.300001 -7.800000 -v -9.300000 0.300001 -7.800000 -v -9.800000 0.200001 -7.900000 -v -9.800000 0.300001 -7.800000 -v -12.600000 0.300002 -9.200000 -v -12.600000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -5.700000 0.300002 -9.200000 -v -8.200000 7.000001 -9.999999 -v -6.200000 6.999999 9.900001 -v -6.200000 9.899998 10.000002 -v -6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v 6.200000 9.899998 10.000002 -v -6.200000 6.999999 9.800001 -v 8.200000 12.999998 9.800002 -v 8.200000 12.999998 9.800002 -v 8.200000 12.999998 9.800002 -v -4.400000 6.800002 -9.899999 -v -4.400000 13.200002 -9.799998 -v -6.400000 10.099998 10.000002 -v -6.400000 10.099998 10.000002 -v -6.400000 10.100002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -8.200000 10.100002 -9.899998 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.200002 -9.900000 -v 4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.899999 -v 4.400000 6.800002 -9.899999 -v 6.400000 7.000001 -9.999999 -v 4.600000 10.100002 -9.999998 -v 6.200000 10.099998 10.000002 -v 6.200000 10.099998 10.000002 -v 4.600000 10.099998 9.800002 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 6.400000 7.000001 -9.999999 -v 8.200000 7.000001 -9.999999 -v 8.200000 7.000001 -9.999999 -v 8.400000 13.199998 9.900002 -v 4.400000 13.199998 9.800002 -v -12.800000 20.000002 -9.999997 -v -6.200000 9.900002 -9.999998 -v -6.200000 9.900002 -9.999998 -v -4.600000 9.900002 -9.799998 -v -4.600000 7.000001 -9.899999 -v -4.600000 7.000001 -9.899999 -v 8.200000 10.100002 -9.999998 -v 8.200000 10.100002 -9.999998 -v 8.400000 6.799999 9.800001 -v 8.400000 6.799999 9.800001 -v 8.400000 6.799999 9.800001 -v 8.400000 6.799999 9.800001 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.600000 9.900002 -9.799998 -v 4.600000 9.900002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 10.100002 -9.799998 -v 4.600000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.200000 13.000002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 6.400000 13.000002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.200000 13.000002 -9.799998 -v 8.400000 13.200002 -9.799998 -v -12.800000 0.200001 -8.500000 -v -12.800000 0.200001 -8.500000 -v -5.700000 0.300002 -9.300000 -v -5.700000 0.300002 -9.300000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v -12.800000 0.300002 -9.900000 -v -6.200000 6.999999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 6.799999 9.800001 -v 6.400000 9.899998 9.800002 -v 6.400000 9.899998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.300001 -7.900000 -v -1.600000 0.300001 -8.500000 -v -8.200000 9.900002 -9.899998 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -4.600000 10.100002 -9.999998 -v -4.600000 10.100002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 6.400000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 8.200000 13.000002 -9.999998 -v 12.800000 20.000002 -9.999997 -v -5.400000 0.300001 -8.500000 -v -1.600000 0.200001 -8.500000 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -4.600000 9.899998 9.900002 -v -4.600000 9.899998 9.900002 -v -6.200000 9.899998 10.000002 -v 8.200000 9.899998 9.800002 -v 8.200000 9.899998 9.800002 -v 8.200000 9.899998 9.800002 -v -6.200000 9.899998 9.800002 -v -4.600000 10.099998 9.800002 -v -4.600000 10.099998 9.800002 -v -6.400000 13.000002 -9.799998 -v -6.400000 10.100002 -9.999998 -v -6.400000 10.100002 -9.999998 -v -1.600000 0.200001 -7.200000 -v -9.600000 0.300001 -7.200000 -v -4.600000 9.900002 -9.899998 -v -4.600000 9.900002 -9.899998 -v -9.600000 0.200001 -8.500000 -v -12.800000 0.300001 -8.500000 -v -6.200000 9.900002 -9.799998 -v -6.200000 9.900002 -9.799998 -v 6.200000 12.999998 9.900002 -v 6.200000 12.999998 9.900002 -v 4.600000 12.999998 9.800002 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -6.400000 13.000002 -9.899998 -v -6.400000 13.000002 -9.899998 -v -8.200000 13.000002 -9.999998 -v 4.600000 7.000001 -9.799999 -v 4.600000 7.000001 -9.799999 -v 8.200000 10.099998 9.800002 -v -9.600000 0.200001 -8.500000 -v 12.700000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v 12.800000 0.000002 -9.900000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.300002 -9.300000 -v -5.400000 0.300002 -9.900000 -v -9.300000 0.400001 -7.800000 -v -9.400000 0.400001 -7.900000 -v -1.600000 0.200001 -7.200000 -v -4.600000 6.999999 9.800001 -v -4.600000 6.999999 9.800001 -v -4.600000 7.000001 -9.799999 -v -6.200000 7.000001 -9.899999 -v -6.200000 7.000001 -9.899999 -v 4.600000 7.000001 -9.899999 -v 4.600000 7.000001 -9.899999 -v 4.600000 9.900002 -9.799998 -v 4.600000 9.900002 -9.899998 -v 4.600000 9.900002 -9.899998 -v -4.600000 7.000001 -9.999999 -v -4.600000 7.000001 -9.999999 -v 6.200000 10.100002 -9.799998 -v 6.200000 10.100002 -9.799998 -v 4.600000 10.100002 -9.899998 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v -12.800000 0.000002 -10.000000 -v 4.600000 10.100002 -9.999998 -v -8.400000 6.799999 9.800001 -v -4.400000 6.799999 9.900001 -v -9.600000 0.300001 -7.200000 -v -9.600000 0.200001 -8.500000 -v -4.600000 6.999999 10.000001 -v -8.200000 9.899998 9.900002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 9.899998 10.000002 -v -6.400000 6.999999 9.900001 -v -6.400000 6.999999 9.800001 -v -6.400000 13.000002 -9.899998 -v -12.800000 -0.000002 9.900000 -v -12.800000 -0.000002 9.900000 -v 12.800000 -0.000002 10.000000 -v 12.800000 -0.000002 10.000000 -v 8.200000 9.899998 10.000002 -v 8.200000 9.899998 10.000002 -v 8.200000 9.899998 10.000002 -v 4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.900002 -v 6.200000 12.999998 10.000002 -v -2.000000 0.400001 -7.800000 -v -2.000000 0.300001 -7.900000 -v -8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.899998 -v -6.400000 13.000002 -9.799998 -v -6.400000 10.100002 -9.799998 -v -6.400000 10.100002 -9.799998 -v 8.200000 9.899998 10.000002 -v 8.200000 6.999999 9.900001 -v 8.200000 6.999999 9.900001 -v 6.400000 12.999998 9.900002 -v 6.400000 12.999998 9.900002 -v 8.200000 12.999998 9.900002 -v 8.200000 12.999998 9.900002 -v -9.800000 0.200001 -7.800000 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.400000 13.199998 9.800002 -v -8.200000 9.899998 9.800002 -v -8.200000 9.899998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 10.099998 9.800002 -v -8.200000 12.999998 9.800002 -v 8.400000 6.799999 9.900001 -v 8.400000 6.799999 9.900001 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.400000 12.999998 9.800002 -v -6.200000 12.999998 9.800002 -v -6.200000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.600000 12.999998 9.800002 -v -4.400000 13.199998 9.800002 -v 4.600000 6.999999 9.900001 -v 4.600000 6.999999 9.900001 -v 6.200000 6.999999 9.900001 -v 6.200000 6.999999 9.900001 -v -6.400000 7.000001 -9.899999 -v -6.400000 7.000001 -9.899999 -v -8.200000 10.100002 -9.999998 -v -8.200000 10.100002 -9.999998 -v -8.200000 10.100002 -9.999998 -v -8.200000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.400000 13.000002 -9.999998 -v -6.200000 13.000002 -9.999998 -v -6.200000 13.000002 -9.999998 -v 4.600000 9.900002 -9.999998 -v 4.600000 9.900002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 4.600000 10.100002 -9.999998 -v 4.600000 10.100002 -9.999998 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -8.400000 13.200002 -9.899998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.200000 13.000002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 10.100002 -9.999998 -v 6.400000 13.000002 -9.799998 -v 6.400000 13.000002 -9.899998 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 19.900002 -9.899997 -v -12.800000 20.000002 -9.899997 -v -12.800000 20.000002 -9.899997 -v -12.800000 19.999998 9.900002 -v -12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v -6.200000 10.099998 10.000002 -v -4.600000 10.099998 9.900002 -v -4.600000 10.099998 9.900002 -v -8.200000 9.899998 9.800002 -v -4.600000 7.000001 -9.999999 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 7.000001 -9.999999 -v 6.200000 7.000001 -9.899999 -v 8.200000 9.899998 9.900002 -v 8.200000 9.899998 9.900002 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 6.400000 7.000001 -9.799999 -v 8.200000 7.000001 -9.799999 -v 8.200000 7.000001 -9.799999 -v -9.800000 0.300001 -7.800000 -v -9.900000 0.300001 -7.900000 -v -9.300000 0.300001 -7.900000 -v -9.300000 0.400001 -7.800000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -8.200000 10.099998 9.900002 -v -8.200000 10.099998 9.900002 -v -8.200000 12.999998 10.000002 -v -8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.900002 -v -6.200000 7.000001 -9.899999 -v -6.200000 9.900002 -9.799998 -v -6.200000 9.900002 -9.799998 -v -5.600000 0.300002 -9.300000 -v -5.600000 0.400001 -9.200000 -v 8.200000 10.100002 -9.799998 -v 8.200000 10.100002 -9.799998 -v 4.600000 6.999999 9.800001 -v -1.900000 0.300001 -7.900000 -v -1.900000 0.400001 -7.800000 -v -8.200000 7.000001 -9.999999 -v 4.600000 7.000001 -9.999999 -v -6.400000 7.000001 -9.999999 -v -6.400000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v -6.200000 7.000001 -9.999999 -v 6.400000 6.999999 9.900001 -v 6.400000 9.899998 10.000002 -v 6.400000 9.899998 10.000002 -v 6.200000 7.000001 -9.999999 -v 6.200000 7.000001 -9.999999 -v -12.800000 19.999998 10.000003 -v -12.800000 19.999998 9.900002 -v -12.800000 19.999998 9.900002 -v 12.700000 -0.000002 9.900000 -v 12.700000 -0.000002 9.900000 -v 12.700000 -0.000002 9.900000 -v 6.400000 10.099998 9.800002 -v 6.400000 10.099998 9.800002 -v 6.400000 12.999998 9.900002 -v -4.400000 13.200002 -9.799998 -v -8.400000 13.200002 -9.899998 -v -6.200000 9.899998 10.000002 -v -6.200000 9.899998 10.000002 -v -6.200000 10.099998 10.000002 -v -6.200000 10.099998 10.000002 -v -6.200000 10.099998 10.000002 -v 6.400000 9.899998 10.000002 -v 6.400000 9.899998 10.000002 -v 6.400000 10.099998 10.000002 -v 6.400000 10.099998 10.000002 -v 6.400000 10.099998 10.000002 -v -6.200000 10.100002 -9.799998 -v -6.200000 10.100002 -9.799998 -v -6.200000 10.100002 -9.799998 -v 6.400000 12.999998 10.000002 -v -9.900000 0.300001 -7.900000 -v -9.800000 0.200001 -7.900000 -v 8.200000 13.000002 -9.799998 -v 8.200000 10.100002 -9.899998 -v 8.200000 10.100002 -9.899998 -v -5.400000 0.200002 -9.900000 -v 12.700000 0.200002 -9.900000 -v -4.400000 13.200002 -9.899998 -v -4.400000 13.200002 -9.899998 -v -4.400000 13.200002 -9.899998 -v 4.400000 13.200002 -9.899998 -v 4.400000 13.200002 -9.899998 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -12.800000 19.899998 9.900002 -v -8.400000 6.799999 9.900001 -v -8.400000 6.799999 9.900001 -v -8.400000 13.199998 9.900002 -v -2.000000 0.300001 -7.900000 -v -2.000000 0.300001 -7.900000 -v -4.400000 13.199998 9.900002 -v -4.400000 13.199998 9.900002 -v -4.400000 13.199998 9.900002 -v 4.400000 13.199998 9.900002 -v 4.400000 13.199998 9.900002 -v -6.200000 7.000001 -9.999999 -v 6.200000 10.099998 10.000002 -v 6.200000 10.099998 10.000002 -v 6.400000 6.999999 9.800001 -v 12.800000 19.899998 9.900002 -v 12.800000 19.899998 9.900002 -v 12.800000 19.899998 9.900002 -v 12.800000 19.999998 10.000003 -v 12.800000 19.999998 9.900002 -v 12.800000 19.999998 9.900002 -v 4.600000 9.899998 9.800002 -v -4.600000 9.900002 -9.899998 -v -4.600000 9.900002 -9.899998 -v -6.200000 9.900002 -9.799998 -v -6.200000 9.900002 -9.999998 -v -9.800000 0.200001 -7.800000 -v -9.900000 0.300001 -7.800000 -v -12.700000 0.400002 -9.300000 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.300002 -9.200000 -v -12.700000 0.400001 -9.200000 -v 6.400000 12.999998 9.800002 -v -4.600000 13.000002 -9.899998 -v -4.600000 13.000002 -9.899998 -v -6.200000 13.000002 -9.999998 -v 8.200000 6.999999 9.800001 -v 4.600000 10.099998 9.900002 -v -8.400000 6.800002 -9.899999 -v -8.400000 6.800002 -9.899999 -v -8.400000 6.800002 -9.899999 -v 8.200000 13.000002 -9.899998 -v 8.200000 13.000002 -9.899998 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -12.800000 0.199998 9.900000 -v -4.400000 6.799999 9.900001 -v -4.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v 4.400000 6.799999 9.900001 -v -8.200000 10.099998 9.800002 -v 12.800000 19.999998 10.000003 -v -6.400000 6.999999 10.000001 -v -8.200000 6.999999 9.900001 -v -8.200000 6.999999 9.900001 -v 8.200000 6.999999 9.800001 -v 8.200000 6.999999 9.800001 -v 6.200000 7.000001 -9.799999 -v 4.600000 7.000001 -9.899999 -v 4.600000 7.000001 -9.899999 -v -1.900000 0.400001 -7.800000 -v -2.000000 0.400001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -9.400000 0.300001 -7.900000 -v -8.200000 12.999998 9.900002 -v -8.200000 12.999998 9.900002 -v -6.400000 12.999998 10.000002 -v -6.400000 10.099998 10.000002 -v -6.400000 10.099998 10.000002 -v -8.200000 10.099998 9.800002 -v -6.400000 12.999998 9.900002 -v -6.400000 12.999998 9.900002 -v 8.400000 6.799999 9.800001 -v 8.400000 13.199998 9.900002 -v 8.200000 10.100002 -9.899998 -v 8.200000 10.100002 -9.899998 -v 6.400000 10.100002 -9.999998 -v 4.400000 6.799999 9.800001 -v 8.400000 6.799999 9.900001 -v -9.400000 0.400001 -7.800000 -v -9.400000 0.300001 -7.900000 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.900002 -9.899997 -v 12.800000 19.900002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 12.800000 20.000002 -9.899997 -v 8.200000 10.099998 9.800002 -v 8.200000 10.099998 9.800002 -v -5.700000 0.400001 -9.200000 -v -5.700000 0.300002 -9.300000 -v -4.600000 12.999998 10.000002 -v -4.600000 10.099998 9.900002 -v -4.600000 10.099998 9.900002 -v 8.200000 12.999998 10.000002 -v 4.400000 13.199998 9.900002 -v 4.400000 6.799999 9.800001 -v 6.400000 9.900002 -9.799998 -v 6.400000 9.900002 -9.799998 -v -6.200000 13.000002 -9.899998 -v -6.200000 13.000002 -9.899998 -v -4.600000 13.000002 -9.799998 -v 4.600000 6.999999 9.800001 -v 4.600000 6.999999 9.800001 -v 4.600000 10.099998 9.800002 -v 4.600000 10.099998 9.800002 -v 4.600000 10.099998 9.800002 -v 4.600000 12.999998 9.800002 -v 8.200000 6.999999 9.900001 -v 8.200000 6.999999 9.900001 -v 8.400000 13.199998 9.800002 -v -4.600000 7.000001 -9.899999 -v -4.600000 7.000001 -9.899999 -v 12.800000 0.000002 -10.000000 -v 12.800000 0.000002 -10.000000 -v -6.400000 9.900002 -9.799998 -v -6.400000 9.900002 -9.799998 -v -6.400000 7.000001 -9.999999 -v -6.400000 7.000001 -9.899999 -v -8.200000 9.900002 -9.999998 -v -4.600000 12.999998 9.900002 -v -4.600000 12.999998 9.900002 -v -12.800000 0.000002 -9.900000 -v -12.800000 0.000002 -9.900000 -v 8.200000 10.100002 -9.999998 -v -8.200000 6.999999 9.900001 -v -8.200000 6.999999 9.900001 -v -8.200000 9.899998 10.000002 -v -8.200000 9.899998 9.900002 -v -8.200000 9.899998 9.900002 -v -6.400000 9.899998 9.800002 -v -6.400000 9.899998 9.800002 -v -6.400000 9.899998 9.800002 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v 4.400000 6.799999 9.800001 -v -5.400000 0.200002 -9.900000 -v -5.400000 0.300001 -8.500000 -v 6.400000 6.999999 9.800001 -v -1.600000 0.200001 -8.500000 -v -1.600000 0.300001 -7.200000 -v -6.200000 7.000001 -9.999999 -v 4.600000 10.099998 9.900002 -v 4.600000 10.099998 9.900002 -v 4.600000 12.999998 10.000002 -v 4.600000 12.999998 9.900002 -v 4.600000 12.999998 9.900002 -v 6.400000 7.000001 -9.899999 -v 6.400000 9.900002 -9.799998 -v 6.400000 9.900002 -9.799998 -v -12.800000 0.300002 -9.900000 -v -5.400000 0.300002 -9.900000 -v -5.400000 0.300002 -9.900000 -v -8.200000 10.100002 -9.999998 -v -6.400000 10.099998 9.800002 -v -6.400000 10.099998 9.800002 -v 8.400000 13.200002 -9.799998 -v 4.400000 13.200002 -9.899998 -v 12.800000 -0.000002 10.000000 -v 4.600000 9.900002 -9.899998 -v 6.200000 9.900002 -9.799998 -v 6.200000 9.900002 -9.799998 -v 6.200000 12.999998 10.000002 -v 6.200000 10.099998 9.800002 -v 6.200000 10.099998 9.800002 -v 8.200000 9.900002 -9.799998 -v 8.200000 7.000001 -9.899999 -v 8.200000 7.000001 -9.899999 -v -4.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.899999 -v -9.400000 0.400001 -7.900000 -v -9.300000 0.300001 -7.900000 -v 6.400000 7.000001 -9.999999 -v -4.600000 9.899998 10.000002 -v -4.600000 9.899998 10.000002 -v -4.600000 9.899998 10.000002 -v 4.600000 9.900002 -9.999998 -v -9.300000 0.300001 -7.800000 -v -9.400000 0.400001 -7.800000 -v -4.600000 10.099998 9.800002 -v -8.200000 10.099998 9.900002 -v -8.200000 12.999998 9.800002 -v -5.600000 0.300002 -9.200000 -v -5.700000 0.400001 -9.200000 -v 8.200000 9.899998 9.900002 -v 8.200000 9.899998 9.900002 -v 6.400000 9.899998 10.000002 -v 6.200000 12.999998 9.900002 -v 6.200000 13.000002 -9.899998 -v 6.200000 13.000002 -9.899998 -v 4.600000 13.000002 -9.999998 -v 8.200000 9.900002 -9.899998 -v 8.200000 9.900002 -9.899998 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.600000 0.300001 -7.200000 -v -1.900000 0.300001 -7.800000 -v -8.200000 6.999999 9.800001 -v -8.200000 10.100002 -9.899998 -v -8.200000 10.100002 -9.899998 -v -8.200000 13.000002 -9.799998 -v -8.200000 13.000002 -9.899998 -v -8.200000 13.000002 -9.899998 -v -6.200000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -6.200000 12.999998 10.000002 -v -6.200000 12.999998 9.900002 -v 8.200000 7.000001 -9.799999 -v 4.600000 10.099998 9.800002 -v -6.200000 10.099998 9.800002 -v -12.700000 0.400001 -9.200000 -v -12.700000 0.300002 -9.300000 -v -12.600000 0.400001 -9.200000 -v -12.700000 0.400002 -9.300000 -v -8.400000 6.800002 -9.899999 -v -4.400000 6.800002 -9.799999 -v -8.400000 13.199998 9.900002 -v -8.400000 6.799999 9.800001 -v -4.600000 10.099998 10.000002 -v -4.600000 10.099998 10.000002 -v -4.600000 9.899998 10.000002 -v -4.600000 6.999999 9.900001 -v -4.600000 6.999999 9.900001 -v 6.400000 10.100002 -9.799998 -v 4.400000 13.200002 -9.799998 -v 4.400000 6.800002 -9.899999 -v 4.600000 13.000002 -9.899998 -v 4.600000 13.000002 -9.899998 -v 6.200000 13.000002 -9.799998 -v -4.600000 9.900002 -9.799998 -v -4.600000 9.900002 -9.799998 -v -4.600000 9.900002 -9.799998 -v -12.800000 19.900002 -9.899997 -v 12.800000 19.899998 9.900002 -v 8.400000 6.800002 -9.899999 -v 8.400000 6.800002 -9.899999 -v -6.400000 6.999999 9.900001 -v -6.400000 6.999999 9.900001 -v 8.400000 6.800002 -9.899999 -v 8.400000 13.200002 -9.799998 -v 6.200000 7.000001 -9.899999 -v 6.200000 7.000001 -9.899999 -v 6.200000 6.999999 10.000001 -v 6.400000 9.899998 9.800002 -v 12.800000 -0.000002 9.900000 -v 8.200000 7.000001 -9.999999 -v -12.600000 0.300002 -9.300000 -v -12.600000 0.400001 -9.200000 -v -5.600000 0.300002 -9.200000 -v 6.400000 10.099998 9.800002 -v -8.200000 10.100002 -9.999998 -v -8.200000 6.999999 9.800001 -v -4.400000 6.799999 9.800001 -v -4.400000 13.199998 9.900002 -v 4.600000 6.999999 9.900001 -v 4.600000 6.999999 9.900001 -v 4.600000 9.899998 10.000002 -v 4.600000 7.000001 -9.999999 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.373047 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.982422 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.966797 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.958984 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vt 0.962891 0.500000 -vn -1.0000 0.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn 0.0000 -0.0000 1.0000 -vn -0.0001 0.0000 1.0000 -vn 0.0001 0.0000 1.0000 -vn 0.0000 0.0000 -1.0000 -vn 0.0001 0.0000 -1.0000 -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 1.0000 0.0000 -usemtl palette -s 1 -f 811/1/1 814/2/1 815/3/1 -f 812/4/1 817/5/1 2/6/1 -f 1195/7/1 818/8/1 813/9/1 -f 1196/10/1 819/11/1 5/12/1 -f 1197/13/1 1449/14/1 820/15/1 -f 1198/16/1 4/17/1 6/18/1 -f 1082/19/1 1/20/1 816/21/1 -f 1554/22/1 1450/23/1 7/24/1 -f 1617/25/1 1084/26/1 3/27/1 -f 1618/28/1 1555/29/1 1083/30/1 -f 1619/31/1 9/32/1 11/33/1 -f 1557/34/1 1451/35/1 1556/36/1 -f 1558/37/1 10/38/1 12/39/1 -f 14/40/1 8/41/1 13/42/1 -f 1873/43/1 1874/44/1 17/45/1 -f 18/46/1 16/47/1 15/48/1 -f 1094/49/1 1095/50/1 21/51/1 -f 22/52/1 20/53/1 19/54/1 -f 1455/55/1 1456/56/1 25/57/1 -f 26/58/1 24/59/1 23/60/1 -f 1739/61/1 1740/62/1 29/63/1 -f 30/64/1 28/65/1 27/66/1 -f 1879/67/1 1880/68/1 33/69/1 -f 34/70/1 32/71/1 31/72/1 -f 1100/73/1 1101/74/1 37/75/1 -f 38/76/1 36/77/1 35/78/1 -f 1461/79/1 1463/80/1 41/81/1 -f 1462/82/1 1464/83/1 40/84/1 -f 43/85/1 42/86/1 39/87/1 -f 1774/88/1 1776/89/1 1777/90/1 -f 1775/91/1 46/92/1 47/93/1 -f 48/94/1 45/95/1 44/96/1 -f 874/97/1 875/98/1 51/99/1 -f 1009/100/1 876/101/1 49/102/1 -f 53/103/1 50/104/1 52/105/1 -f 1398/106/1 1399/107/1 56/108/1 -f 1465/109/1 1400/110/1 54/111/1 -f 58/112/1 55/113/1 57/114/1 -f 1748/115/1 1749/116/1 61/117/1 -f 62/118/1 60/119/1 59/120/1 -f 1883/121/1 1884/122/1 65/123/1 -f 1010/124/1 1012/125/1 1885/126/1 -f 66/127/1 64/128/1 63/129/1 -f 68/130/1 67/131/1 1011/132/1 -f 1317/133/1 1318/134/1 71/135/1 -f 1404/136/1 1567/137/1 1319/138/1 -f 1403/139/1 70/140/1 69/141/1 -f 74/142/1 73/143/1 72/144/1 -f 1750/145/1 1751/146/1 77/147/1 -f 1780/148/1 1840/149/1 1752/150/1 -f 1779/151/1 76/152/1 75/153/1 -f 80/154/1 79/155/1 78/156/1 -f 914/157/1 915/158/1 83/159/1 -f 1016/160/1 1237/161/1 916/162/1 -f 1015/163/1 82/164/1 81/165/1 -f 86/166/1 85/167/1 84/168/1 -f 1476/169/1 1477/170/1 89/171/1 -f 90/172/1 88/173/1 87/174/1 -f 1754/175/1 1755/176/1 93/177/1 -f 94/178/1 92/179/1 91/180/1 -f 1887/181/1 1888/182/1 97/183/1 -f 98/184/1 96/185/1 95/186/1 -f 1121/187/1 1123/188/1 101/189/1 -f 1122/190/1 1124/191/1 100/192/1 -f 103/193/1 102/194/1 99/195/1 -f 1568/196/1 1570/197/1 1571/198/1 -f 1569/199/1 106/200/1 107/201/1 -f 108/202/1 105/203/1 104/204/1 -f 1822/205/1 1823/206/1 111/207/1 -f 1848/208/1 1824/209/1 109/210/1 -f 113/211/1 110/212/1 112/213/1 -f 1026/214/1 1027/215/1 116/216/1 -f 1131/217/1 1028/218/1 114/219/1 -f 118/220/1 115/221/1 117/222/1 -f 1483/223/1 1484/224/1 121/225/1 -f 1573/226/1 1694/227/1 1485/228/1 -f 1572/229/1 120/230/1 119/231/1 -f 124/232/1 123/233/1 122/234/1 -f 1825/235/1 1826/236/1 127/237/1 -f 1853/238/1 129/239/1 1827/240/1 -f 1852/241/1 126/242/1 125/243/1 -f 130/244/1 1908/245/1 128/246/1 -f 1132/247/1 1133/248/1 133/249/1 -f 1254/250/1 1420/251/1 1134/252/1 -f 1253/253/1 132/254/1 131/255/1 -f 136/256/1 135/257/1 134/258/1 -f 1644/259/1 1645/260/1 139/261/1 -f 1700/262/1 1783/263/1 1646/264/1 -f 1699/265/1 138/266/1 137/267/1 -f 142/268/1 141/269/1 140/270/1 -f 143/271/2 1909/272/2 145/273/2 -f 1910/274/2 144/275/2 146/276/2 -f 147/277/2 1269/278/2 1270/279/2 -f 149/280/2 148/281/2 150/282/2 -f 151/283/2 1583/284/2 1584/285/2 -f 153/286/2 152/287/2 154/288/2 -f 155/289/2 1784/290/2 1786/291/2 -f 1785/292/2 1860/293/2 1787/294/2 -f 157/295/2 156/296/2 1788/297/2 -f 159/298/2 158/299/2 160/300/2 -f 161/301/2 1038/302/2 1040/303/2 -f 1039/304/2 1276/305/2 1041/306/2 -f 163/307/2 162/308/2 1042/309/2 -f 165/310/2 164/311/2 166/312/2 -f 167/313/2 1588/314/2 1590/315/2 -f 1589/316/2 1710/317/2 1591/318/2 -f 169/319/2 168/320/2 1592/321/2 -f 171/322/2 170/323/2 172/324/2 -f 173/325/2 1861/326/2 1863/327/2 -f 1862/328/2 1913/329/2 1865/330/2 -f 175/331/2 174/332/2 177/333/2 -f 1864/334/2 176/335/2 178/336/2 -f 179/337/2 1277/338/2 1278/339/2 -f 180/340/2 1358/341/2 1279/342/2 -f 181/343/2 182/344/2 183/345/2 -f 1593/346/2 1669/347/2 1594/348/2 -f 187/349/2 184/350/2 1595/351/2 -f 186/352/2 185/353/2 188/354/2 -f 189/355/2 1866/356/2 1868/357/2 -f 191/358/2 1867/359/2 1869/360/2 -f 192/361/2 190/362/2 193/363/2 -f 194/364/2 1153/365/2 1155/366/2 -f 196/367/2 1154/368/2 1156/369/2 -f 197/370/2 195/371/2 198/372/2 -f 199/373/2 1596/374/2 1597/375/2 -f 201/376/2 200/377/2 202/378/2 -f 203/379/2 1796/380/2 1797/381/2 -f 205/382/2 204/383/2 206/384/2 -f 207/385/2 1915/386/2 209/387/2 -f 1916/388/2 208/389/2 210/390/2 -f 211/391/2 1287/392/2 1288/393/2 -f 213/394/2 212/395/2 214/396/2 -f 215/397/2 1601/398/2 1602/399/2 -f 217/400/2 216/401/2 218/402/2 -f 219/403/2 1799/404/2 1800/405/2 -f 221/406/2 220/407/2 222/408/2 -f 223/409/2 1917/410/2 225/411/2 -f 1918/412/2 1070/413/2 1072/414/2 -f 1919/415/2 224/416/2 1071/417/2 -f 227/418/2 226/419/2 228/420/2 -f 229/421/2 1439/422/2 1441/423/2 -f 1440/424/2 1604/425/2 1442/426/2 -f 231/427/2 230/428/2 1443/429/2 -f 233/430/2 232/431/2 234/432/2 -f 235/433/2 1802/434/2 1804/435/2 -f 1803/436/2 1871/437/2 1805/438/2 -f 237/439/2 236/440/2 1806/441/2 -f 239/442/2 238/443/2 240/444/2 -f 241/445/2 1073/446/2 1075/447/2 -f 1074/448/2 1301/449/2 1076/450/2 -f 243/451/2 242/452/2 1077/453/2 -f 245/454/2 244/455/2 246/456/2 -f 247/457/2 1612/458/2 1613/459/2 -f 248/460/2 1672/461/2 1614/462/2 -f 249/463/2 250/464/2 251/465/2 -f 1807/466/2 1833/467/2 1808/468/2 -f 255/469/2 252/470/2 1809/471/2 -f 254/472/2 253/473/2 256/474/2 -f 257/475/2 1623/476/2 259/477/2 -f 1641/478/2 1624/479/2 260/480/2 -f 1625/481/2 258/482/2 261/483/2 -f 262/484/2 1550/485/2 1552/486/2 -f 264/487/2 1551/488/2 1553/489/2 -f 265/490/2 263/491/2 266/492/2 -f 267/493/2 1732/494/2 1733/495/2 -f 269/496/2 268/497/2 270/498/2 -f 271/499/2 1901/500/2 273/501/2 -f 1902/502/2 272/503/2 274/504/2 -f 275/505/2 1191/506/2 1192/507/2 -f 277/508/2 276/509/2 278/510/2 -f 1818/511/2 280/512/2 1673/513/2 -f 282/514/2 1772/515/2 1741/516/2 -f 279/517/2 1675/518/2 1676/519/2 -f 1674/520/2 1742/521/2 1677/522/2 -f 285/523/2 281/524/2 286/525/2 -f 1743/526/2 1773/527/2 1744/528/2 -f 1678/529/2 284/530/2 1745/531/2 -f 287/532/2 283/533/2 288/534/2 -f 999/535/3 837/536/3 1001/537/3 -f 848/538/3 838/539/3 1000/540/3 -f 850/541/3 839/542/3 292/543/3 -f 853/544/3 840/545/3 851/546/3 -f 1213/547/3 289/548/3 1002/549/3 -f 1386/550/3 852/551/3 849/552/3 -f 1290/553/3 293/554/3 1388/555/3 -f 860/556/3 841/557/3 294/558/3 -f 1217/559/4 1289/560/4 296/561/4 -f 1218/562/3 861/563/3 297/564/3 -f 1216/565/3 295/566/3 1003/567/3 -f 299/568/3 1387/569/3 1214/570/3 -f 1628/571/3 862/572/3 1219/573/3 -f 1630/574/3 863/575/3 1629/576/3 -f 865/577/3 842/578/3 864/579/3 -f 866/580/3 298/581/3 1631/582/3 -f 1220/583/3 1215/584/3 1004/585/3 -f 1834/586/3 1632/587/3 300/588/3 -f 1882/589/3 301/590/3 1835/591/3 -f 880/592/3 847/593/3 302/594/3 -f 1222/595/3 303/596/3 1005/597/3 -f 1225/598/3 879/599/3 1881/600/3 -f 1226/601/3 305/602/3 1836/603/3 -f 307/604/3 304/605/3 1221/606/3 -f 308/607/3 881/608/3 1223/609/3 -f 882/610/3 877/611/3 1102/612/3 -f 885/613/3 846/614/3 878/615/3 -f 310/616/3 306/617/3 309/618/3 -f 1227/619/3 1224/620/3 1006/621/3 -f 1280/622/3 883/623/3 1103/624/3 -f 1670/625/3 884/626/3 312/627/3 -f 887/628/3 843/629/3 886/630/3 -f 1229/631/3 311/632/3 1007/633/3 -f 1231/634/3 888/635/3 1671/636/3 -f 1230/637/4 313/638/4 1281/639/4 -f 315/640/3 1282/641/3 1228/642/3 -f 1633/643/3 889/644/3 1232/645/3 -f 1635/646/3 890/647/3 316/648/3 -f 892/649/3 844/650/3 891/651/3 -f 318/652/3 314/653/3 1636/654/3 -f 1234/655/3 1233/656/3 1008/657/3 -f 1471/658/3 1637/659/3 1634/660/3 -f 918/661/3 317/662/3 1470/663/3 -f 899/664/3 845/665/3 893/666/3 -f 903/667/3 1235/668/3 291/669/3 -f 902/670/3 900/671/3 917/672/3 -f 905/673/3 321/674/3 1472/675/3 -f 323/676/3 320/677/3 319/678/3 -f 906/679/3 290/680/3 901/681/3 -f 324/682/3 322/683/3 904/684/3 -f 1401/685/3 1402/686/3 327/687/3 -f 328/688/3 326/689/3 325/690/3 -f 1684/691/3 1685/692/3 331/693/3 -f 332/694/3 330/695/3 329/696/3 -f 1838/697/3 1839/698/3 335/699/3 -f 336/700/3 334/701/3 333/702/3 -f 1013/703/3 1014/704/3 339/705/3 -f 340/706/3 338/707/3 337/708/3 -f 1405/709/3 1406/710/3 343/711/3 -f 344/712/3 342/713/3 341/714/3 -f 1688/715/3 1689/716/3 347/717/3 -f 348/718/3 346/719/3 345/720/3 -f 1843/721/3 1844/722/3 351/723/3 -f 352/724/3 350/725/3 349/726/3 -f 1020/727/3 919/728/3 1022/729/3 -f 926/730/3 920/731/3 1021/732/3 -f 928/733/3 921/734/3 356/735/3 -f 931/736/3 922/737/3 929/738/3 -f 908/739/3 353/740/3 1023/741/3 -f 1412/742/3 930/743/3 927/744/3 -f 1481/745/3 357/746/3 1413/747/3 -f 932/748/3 923/749/3 358/750/3 -f 910/751/5 361/752/5 1414/753/5 -f 911/754/3 934/755/3 1482/756/3 -f 909/757/3 907/758/3 1024/759/3 -f 363/760/3 360/761/3 359/762/3 -f 1407/763/3 933/764/3 912/765/3 -f 1638/766/4 935/767/4 1408/768/4 -f 937/769/3 924/770/3 936/771/3 -f 366/772/3 362/773/3 1639/774/3 -f 1248/775/3 913/776/3 1025/777/3 -f 1892/778/3 1640/779/3 364/780/3 -f 1158/781/3 365/782/3 1893/783/3 -f 939/784/3 925/785/3 938/786/3 -f 943/787/3 367/788/3 355/789/3 -f 942/790/3 940/791/3 1157/792/3 -f 945/793/3 369/794/3 1894/795/3 -f 371/796/3 368/797/3 1249/798/3 -f 946/799/3 354/800/3 941/801/3 -f 372/802/3 370/803/3 944/804/3 -f 1418/805/3 1327/806/3 994/807/3 -f 1333/808/3 1328/809/3 1419/810/3 -f 1335/811/3 1329/812/3 376/813/3 -f 1338/814/3 1330/815/3 1336/816/3 -f 997/817/3 373/818/3 993/819/3 -f 895/820/3 377/821/3 1334/822/3 -f 897/823/3 1337/824/3 894/825/3 -f 1339/826/3 1331/827/3 378/828/3 -f 1576/829/5 381/830/5 896/831/5 -f 1575/832/3 1340/833/3 898/834/3 -f 1574/835/3 379/836/3 995/837/3 -f 383/838/3 380/839/3 998/840/3 -f 1756/841/3 1341/842/3 1577/843/3 -f 385/844/4 1342/845/4 1757/846/4 -f 386/847/3 1332/848/3 1343/849/3 -f 1345/850/3 382/851/3 1032/852/3 -f 1580/853/3 1578/854/3 996/855/3 -f 1035/856/3 1033/857/3 384/858/3 -f 1598/859/3 1034/860/3 388/861/3 -f 1346/862/3 374/863/3 1344/864/3 -f 1137/865/3 387/866/3 375/867/3 -f 1136/868/3 1347/869/3 1599/870/3 -f 1135/871/3 389/872/3 1036/873/3 -f 391/874/3 1037/875/3 1579/876/3 -f 1349/877/3 1326/878/3 1348/879/3 -f 392/880/3 390/881/3 1138/882/3 -f 1696/883/3 1539/884/3 1810/885/3 -f 1544/886/3 1540/887/3 1698/888/3 -f 1811/889/3 393/890/3 395/891/3 -f 1828/892/3 1697/893/3 1812/894/3 -f 1829/895/3 397/896/3 1295/897/3 -f 1649/898/3 1541/899/3 396/900/3 -f 1299/901/3 398/902/3 1294/903/3 -f 401/904/3 1650/905/3 1830/906/3 -f 402/907/3 1542/908/3 1651/909/3 -f 1653/910/3 400/911/3 1297/912/3 -f 1897/913/3 1298/914/3 1296/915/3 -f 1144/916/3 1543/917/3 1652/918/3 -f 1424/919/3 403/920/3 399/921/3 -f 1425/922/3 1146/923/3 1898/924/3 -f 1426/925/3 1422/926/3 407/927/3 -f 1147/928/3 394/929/3 1145/930/3 -f 1148/931/3 1423/932/3 406/933/3 -f 408/934/3 404/935/3 405/936/3 -f 1701/937/6 1654/938/6 1660/939/6 -f 411/940/6 1655/941/6 1661/942/6 -f 1702/943/6 1659/944/6 1705/945/6 -f 412/946/6 1656/947/6 1664/948/6 -f 1703/949/6 1706/950/6 1707/951/6 -f 413/952/6 1665/953/6 1708/954/6 -f 1666/955/6 1657/956/6 1667/957/6 -f 1709/958/6 414/959/6 416/960/6 -f 1704/961/6 415/962/6 417/963/6 -f 1668/964/6 1658/965/6 869/966/6 -f 409/967/6 1505/968/6 872/969/6 -f 1504/970/6 867/971/6 870/972/6 -f 420/973/6 871/974/6 421/975/6 -f 868/976/6 410/977/6 963/978/6 -f 1907/979/6 873/980/6 964/981/6 -f 419/982/6 418/983/6 422/984/6 -f 1166/985/6 1497/986/6 1170/987/6 -f 1171/988/6 1491/989/6 1498/990/6 -f 1499/991/7 1492/992/7 1500/993/7 -f 1501/994/6 1493/995/6 1503/996/6 -f 1168/997/6 425/998/6 1064/999/6 -f 426/1000/6 1502/1001/6 1789/1002/6 -f 1791/1003/6 427/1004/6 1814/1005/6 -f 428/1006/6 1494/1007/6 1506/1008/6 -f 1790/1009/6 1815/1010/6 1069/1011/6 -f 431/1012/6 1507/1013/6 1068/1014/6 -f 1169/1015/6 1063/1016/6 1067/1017/6 -f 429/1018/6 430/1019/6 433/1020/6 -f 1065/1021/6 1508/1022/6 434/1023/6 -f 972/1024/6 1509/1025/6 855/1026/6 -f 1510/1027/6 1495/1028/6 436/1029/6 -f 856/1030/6 432/1031/6 1512/1032/6 -f 423/1033/6 1066/1034/6 1434/1035/6 -f 973/1036/6 854/1037/6 857/1038/6 -f 859/1039/6 435/1040/6 1396/1041/6 -f 1511/1042/6 1496/1043/6 1513/1044/6 -f 1167/1045/6 437/1046/6 1359/1047/6 -f 1397/1048/6 1514/1049/6 1361/1050/6 -f 858/1051/6 439/1052/6 1360/1053/6 -f 1435/1054/6 438/1055/6 441/1056/6 -f 1515/1057/6 424/1058/6 1516/1059/6 -f 1362/1060/6 440/1061/6 442/1062/6 -f 1793/1063/6 1258/1064/6 1762/1065/6 -f 445/1066/6 1255/1067/6 1262/1068/6 -f 446/1069/7 1259/1070/7 1763/1071/7 -f 1765/1072/6 1260/1073/6 1766/1074/6 -f 1794/1075/6 1761/1076/6 449/1077/6 -f 1263/1078/6 447/1079/6 450/1080/6 -f 976/1081/6 1764/1082/6 979/1083/6 -f 448/1084/6 1261/1085/6 1161/1086/6 -f 977/1087/6 980/1088/6 981/1089/6 -f 451/1090/6 1160/1091/6 985/1092/6 -f 1795/1093/6 1057/1094/6 982/1095/6 -f 1056/1096/6 978/1097/6 453/1098/6 -f 983/1099/6 1162/1100/6 454/1101/6 -f 1363/1102/6 1163/1103/6 1365/1104/6 -f 1159/1105/6 444/1106/6 1164/1107/6 -f 1367/1108/6 452/1109/6 456/1110/6 -f 443/1111/6 984/1112/6 1715/1113/6 -f 1364/1114/6 1366/1115/6 1392/1116/6 -f 458/1117/6 455/1118/6 1746/1119/6 -f 1165/1120/6 1256/1121/6 1284/1122/6 -f 1792/1123/6 457/1124/6 1324/1125/6 -f 1747/1126/6 1285/1127/6 1322/1128/6 -f 1393/1129/6 459/1130/6 1323/1131/6 -f 1716/1132/6 1394/1133/6 461/1134/6 -f 1286/1135/6 1257/1136/6 1769/1137/6 -f 1325/1138/6 460/1139/6 462/1140/6 -f 463/1141/6 1642/1142/6 465/1143/6 -f 1643/1144/6 464/1145/6 466/1146/6 -f 467/1147/6 468/1148/6 469/1149/6 -f 1832/1150/6 1831/1151/6 470/1152/6 -f 471/1153/6 991/1154/6 992/1155/6 -f 473/1156/6 472/1157/6 474/1158/6 -f 475/1159/6 1384/1160/6 1385/1161/6 -f 477/1162/6 476/1163/6 478/1164/6 -f 479/1165/6 1686/1166/6 481/1167/6 -f 1687/1168/6 480/1169/6 482/1170/6 -f 483/1171/6 1185/1172/6 1186/1173/6 -f 485/1174/6 484/1175/6 486/1176/6 -f 1113/1177/6 1043/1178/6 1054/1179/6 -f 1055/1180/6 1044/1181/6 1058/1182/6 -f 1059/1183/6 1049/1184/6 1523/1185/6 -f 1524/1186/6 1050/1187/6 1526/1188/6 -f 1118/1189/6 489/1190/6 1605/1191/6 -f 490/1192/6 1525/1193/6 831/1194/6 -f 830/1195/6 491/1196/6 833/1197/6 -f 492/1198/6 1051/1199/6 1527/1200/6 -f 832/1201/7 495/1202/7 1610/1203/7 -f 834/1204/6 1528/1205/6 1611/1206/6 -f 1119/1207/6 493/1208/6 1608/1209/6 -f 1606/1210/6 494/1211/6 497/1212/6 -f 1607/1213/6 1529/1214/6 1316/1215/6 -f 498/1216/6 1530/1217/6 499/1218/6 -f 1531/1219/6 1052/1220/6 500/1221/6 -f 1243/1222/6 496/1223/6 1533/1224/6 -f 1120/1225/6 1609/1226/6 501/1227/6 -f 1315/1228/6 1242/1229/6 1245/1230/6 -f 1246/1231/6 1244/1232/6 1376/1233/6 -f 1532/1234/6 1045/1235/6 1085/1236/6 -f 1114/1237/6 1445/1238/6 1140/1239/6 -f 1377/1240/6 1086/1241/6 1139/1242/6 -f 1247/1243/6 503/1244/6 1141/1245/6 -f 1444/1246/6 502/1247/6 505/1248/6 -f 1142/1249/6 1087/1250/6 1534/1251/6 -f 506/1252/6 1088/1253/6 1536/1254/6 -f 1089/1255/6 1046/1256/6 1096/1257/6 -f 1537/1258/6 504/1259/6 508/1260/6 -f 487/1261/6 1143/1262/6 1615/1263/6 -f 1535/1264/6 1538/1265/6 987/1266/6 -f 986/1267/6 507/1268/6 989/1269/6 -f 1097/1270/6 1053/1271/6 1545/1272/6 -f 1115/1273/6 509/1274/6 1306/1275/6 -f 990/1276/6 1546/1277/6 1308/1278/6 -f 510/1279/7 511/1280/7 1309/1281/7 -f 1616/1282/6 988/1283/6 513/1284/6 -f 1305/1285/6 1547/1286/6 1193/1287/6 -f 1194/1288/6 1548/1289/6 515/1290/6 -f 1549/1291/6 1047/1292/6 516/1293/6 -f 823/1294/6 512/1295/6 1378/1296/6 -f 1116/1297/6 1307/1298/6 1310/1299/6 -f 514/1300/6 821/1301/6 824/1302/6 -f 518/1303/6 822/1304/6 1320/1305/6 -f 1379/1306/6 1048/1307/6 1380/1308/6 -f 1117/1309/6 517/1310/6 1239/1311/6 -f 1321/1312/6 1381/1313/6 1240/1314/6 -f 825/1315/6 519/1316/6 1238/1317/6 -f 1311/1318/6 826/1319/6 521/1320/6 -f 1382/1321/6 488/1322/6 1383/1323/6 -f 1241/1324/6 520/1325/6 522/1326/6 -f 1466/1327/8 1468/1328/8 525/1329/8 -f 1620/1330/8 1469/1331/8 1467/1332/8 -f 527/1333/8 524/1334/8 526/1335/8 -f 1781/1336/8 1621/1337/8 523/1338/8 -f 529/1339/8 1622/1340/8 1782/1341/8 -f 1092/1342/8 1090/1343/8 528/1344/8 -f 1093/1345/8 531/1346/8 1091/1347/8 -f 532/1348/8 1202/1349/8 530/1350/8 -f 1453/1351/8 534/1352/8 535/1353/8 -f 536/1354/8 1454/1355/8 533/1356/8 -f 537/1357/8 538/1358/8 539/1359/8 -f 540/1360/8 1738/1361/8 1737/1362/8 -f 541/1363/8 542/1364/8 543/1365/8 -f 544/1366/8 1878/1367/8 1877/1368/8 -f 1098/1369/8 1099/1370/8 547/1371/8 -f 548/1372/8 546/1373/8 545/1374/8 -f 1458/1375/8 1459/1376/8 551/1377/8 -f 1389/1378/8 553/1379/8 1391/1380/8 -f 1199/1381/8 1200/1382/8 557/1383/8 -f 1845/1384/8 559/1385/8 560/1386/8 -f 561/1387/8 1460/1388/8 549/1389/8 -f 562/1390/8 550/1391/8 1566/1392/8 -f 563/1393/8 1390/1394/8 554/1395/8 -f 564/1396/8 552/1397/8 1395/1398/8 -f 565/1399/8 1201/1400/8 555/1401/8 -f 566/1402/8 556/1403/8 1679/1404/8 -f 567/1405/8 1846/1406/8 1847/1407/8 -f 568/1408/8 558/1409/8 1906/1410/8 -f 1373/1411/8 1374/1412/8 571/1413/8 -f 1680/1414/8 573/1415/8 1682/1416/8 -f 1819/1417/8 1820/1418/8 577/1419/8 -f 1125/1420/8 579/1421/8 580/1422/8 -f 581/1423/8 1375/1424/8 569/1425/8 -f 582/1426/8 570/1427/8 1778/1428/8 -f 1683/1429/8 1681/1430/8 574/1431/8 -f 584/1432/8 572/1433/8 583/1434/8 -f 585/1435/8 1821/1436/8 575/1437/8 -f 586/1438/8 576/1439/8 1837/1440/8 -f 1236/1441/8 1126/1442/8 1127/1443/8 -f 588/1444/8 578/1445/8 587/1446/8 -f 1724/1447/8 1726/1448/8 591/1449/8 -f 1731/1450/8 590/1451/8 1725/1452/8 -f 1110/1453/8 1112/1454/8 595/1455/8 -f 596/1456/8 594/1457/8 1111/1458/8 -f 1473/1459/8 1475/1460/8 599/1461/8 -f 600/1462/8 598/1463/8 597/1464/8 -f 1486/1465/8 1753/1466/8 603/1467/8 -f 1488/1468/8 602/1469/8 1487/1470/8 -f 1842/1471/8 592/1472/8 589/1473/8 -f 606/1474/8 1730/1475/8 605/1476/8 -f 607/1477/8 1017/1478/8 593/1479/8 -f 608/1480/8 1018/1481/8 1019/1482/8 -f 609/1483/8 1409/1484/8 1474/1485/8 -f 610/1486/8 1410/1487/8 1411/1488/8 -f 611/1489/8 1489/1490/8 601/1491/8 -f 612/1492/8 604/1493/8 1690/1494/8 -f 1478/1495/8 1480/1496/8 615/1497/8 -f 1416/1498/8 614/1499/8 1479/1500/8 -f 1758/1501/8 1760/1502/8 619/1503/8 -f 620/1504/8 618/1505/8 1759/1506/8 -f 1889/1507/8 622/1508/8 623/1509/8 -f 1849/1510/8 1891/1511/8 1890/1512/8 -f 1128/1513/8 1130/1514/8 627/1515/8 -f 628/1516/8 626/1517/8 625/1518/8 -f 1417/1519/8 1415/1520/8 613/1521/8 -f 630/1522/8 616/1523/8 629/1524/8 -f 1693/1525/8 1691/1526/8 617/1527/8 -f 632/1528/8 1692/1529/8 631/1530/8 -f 633/1531/8 1850/1532/8 621/1533/8 -f 634/1534/8 624/1535/8 1851/1536/8 -f 1031/1537/8 1029/1538/8 1129/1539/8 -f 636/1540/8 1030/1541/8 635/1542/8 -f 1895/1543/8 638/1544/8 639/1545/8 -f 640/1546/8 1896/1547/8 637/1548/8 -f 965/1549/9 1250/1550/9 951/1551/9 -f 947/1552/9 642/1553/9 1433/1554/9 -f 966/1555/9 948/1556/9 952/1557/9 -f 953/1558/9 643/1559/9 1490/1560/9 -f 967/1561/9 645/1562/9 974/1563/9 -f 646/1564/9 949/1565/9 954/1566/9 -f 641/1567/9 975/1568/9 1350/1569/9 -f 647/1570/9 955/1571/9 1351/1572/9 -f 956/1573/9 950/1574/9 1421/1575/9 -f 649/1576/9 648/1577/9 650/1578/9 -f 644/1579/9 1251/1580/9 1264/1581/9 -f 652/1582/9 1265/1583/9 1647/1584/9 -f 1266/1585/9 1252/1586/9 1648/1587/9 -f 653/1588/9 651/1589/9 654/1590/9 -f 968/1591/9 1854/1592/9 970/1593/9 -f 971/1594/9 1856/1595/9 1267/1596/9 -f 1268/1597/9 1857/1598/9 958/1599/9 -f 659/1600/9 1858/1601/9 660/1602/9 -f 661/1603/9 1581/1604/9 1582/1605/9 -f 663/1606/9 662/1607/9 664/1608/9 -f 969/1609/9 657/1610/9 1722/1611/9 -f 658/1612/9 957/1613/9 960/1614/9 -f 666/1615/9 959/1616/9 1662/1617/9 -f 1859/1618/9 656/1619/9 1368/1620/9 -f 962/1621/9 1663/1622/9 1174/1623/9 -f 667/1624/9 1369/1625/9 1173/1626/9 -f 655/1627/9 1723/1628/9 1175/1629/9 -f 665/1630/9 961/1631/9 669/1632/9 -f 1176/1633/9 1371/1634/9 1207/1635/9 -f 1370/1636/9 1855/1637/9 1372/1638/9 -f 1208/1639/9 668/1640/9 671/1641/9 -f 1172/1642/9 1206/1643/9 1178/1644/9 -f 673/1645/9 1177/1646/9 1179/1647/9 -f 1180/1648/9 1209/1649/9 674/1650/9 -f 1271/1651/9 1210/1652/9 1275/1653/9 -f 1273/1654/9 1211/1655/9 1911/1656/9 -f 1106/1657/9 672/1658/9 1108/1659/9 -f 1272/1660/9 675/1661/9 1585/1662/9 -f 1587/1663/9 1274/1664/9 1352/1665/9 -f 676/1666/9 1212/1667/9 1427/1668/9 -f 678/1669/9 679/1670/9 1355/1671/9 -f 1353/1672/9 1428/1673/9 1356/1674/9 -f 1107/1675/9 1109/1676/9 1354/1677/9 -f 677/1678/9 1586/1679/9 681/1680/9 -f 1429/1681/9 670/1682/9 1430/1683/9 -f 1357/1684/9 680/1685/9 682/1686/9 -f 683/1687/9 1431/1688/9 1432/1689/9 -f 685/1690/9 684/1691/9 686/1692/9 -f 687/1693/9 1720/1694/9 689/1695/9 -f 1721/1696/9 688/1697/9 690/1698/9 -f 691/1699/9 692/1700/9 1876/1701/9 -f 693/1702/9 1875/1703/9 694/1704/9 -f 695/1705/9 1104/1706/9 1105/1707/9 -f 697/1708/9 696/1709/9 698/1710/9 -f 699/1711/9 1712/1712/9 1713/1713/9 -f 1714/1714/9 700/1715/9 1899/1716/9 -f 703/1717/9 1457/1718/9 705/1719/9 -f 1149/1720/9 704/1721/9 1151/1722/9 -f 707/1723/9 1905/1724/9 709/1725/9 -f 1517/1726/9 708/1727/9 1519/1728/9 -f 711/1729/9 1203/1730/9 1204/1731/9 -f 1205/1732/9 712/1733/9 1767/1734/9 -f 701/1735/9 1900/1736/9 715/1737/9 -f 1914/1738/9 702/1739/9 716/1740/9 -f 1150/1741/9 1152/1742/9 1283/1743/9 -f 717/1744/9 706/1745/9 718/1746/9 -f 1518/1747/9 1520/1748/9 1600/1749/9 -f 719/1750/9 710/1751/9 720/1752/9 -f 713/1753/9 714/1754/9 721/1755/9 -f 1798/1756/9 1768/1757/9 722/1758/9 -f 723/1759/9 1060/1760/9 1061/1761/9 -f 1062/1762/9 724/1763/9 1521/1764/9 -f 727/1765/9 1436/1766/9 1437/1767/9 -f 1438/1768/9 728/1769/9 1770/1770/9 -f 731/1771/9 1717/1772/9 1718/1773/9 -f 1719/1774/9 732/1775/9 1903/1776/9 -f 735/1777/9 1870/1778/9 737/1779/9 -f 1181/1780/9 736/1781/9 1183/1782/9 -f 725/1783/9 1522/1784/9 739/1785/9 -f 1603/1786/9 726/1787/9 740/1788/9 -f 729/1789/9 1771/1790/9 741/1791/9 -f 1801/1792/9 730/1793/9 742/1794/9 -f 733/1795/9 1904/1796/9 743/1797/9 -f 1920/1798/9 734/1799/9 744/1800/9 -f 1182/1801/9 1184/1802/9 1300/1803/9 -f 745/1804/9 738/1805/9 746/1806/9 -f 747/1807/9 1727/1808/9 1841/1809/9 -f 1563/1810/9 751/1811/9 1564/1812/9 -f 753/1813/9 1302/1814/9 755/1815/9 -f 1078/1816/9 757/1817/9 1079/1818/9 -f 749/1819/9 748/1820/9 759/1821/9 -f 1729/1822/9 1728/1823/9 760/1824/9 -f 750/1825/9 1565/1826/9 761/1827/9 -f 1872/1828/9 752/1829/9 762/1830/9 -f 1695/1831/9 1303/1832/9 1304/1833/9 -f 763/1834/9 754/1835/9 764/1836/9 -f 756/1837/9 758/1838/9 1912/1839/9 -f 765/1840/9 1080/1841/9 766/1842/9 -f 767/1843/9 1291/1844/9 1293/1845/9 -f 1081/1846/9 771/1847/9 772/1848/9 -f 773/1849/9 1446/1850/9 775/1851/9 -f 776/1852/9 777/1853/9 778/1854/9 -f 769/1855/9 1292/1856/9 1813/1857/9 -f 779/1858/9 768/1859/9 780/1860/9 -f 770/1861/9 827/1862/9 829/1863/9 -f 781/1864/9 828/1865/9 782/1866/9 -f 1448/1867/9 1447/1868/9 1452/1869/9 -f 783/1870/9 774/1871/9 784/1872/9 -f 1886/1873/9 1734/1874/9 785/1875/9 -f 1736/1876/9 1735/1877/9 786/1878/9 -f 787/1879/9 835/1880/9 836/1881/9 -f 789/1882/9 788/1883/9 790/1884/9 -f 791/1885/9 1312/1886/9 1313/1887/9 -f 793/1888/9 792/1889/9 794/1890/9 -f 795/1891/9 1626/1892/9 1627/1893/9 -f 797/1894/9 796/1895/9 798/1896/9 -f 799/1897/9 1816/1898/9 801/1899/9 -f 1817/1900/9 800/1901/9 802/1902/9 -f 803/1903/9 804/1904/9 1559/1905/9 -f 1560/1906/9 1711/1907/9 1561/1908/9 -f 805/1909/9 806/1910/9 807/1911/9 -f 1187/1912/9 1562/1913/9 1190/1914/9 -f 1188/1915/9 808/1916/9 1314/1917/9 -f 809/1918/9 1189/1919/9 810/1920/9 diff --git a/src/entities/HouseGenerator.cpp b/src/entities/HouseGenerator.cpp new file mode 100644 index 0000000..1d9a8ec --- /dev/null +++ b/src/entities/HouseGenerator.cpp @@ -0,0 +1,35 @@ +#include "HouseGenerator.h" +#include "../renderEngine/obj_loader.h" +#include "../renderEngine/Loader.h" + +namespace entities +{ + HouseGenerator::HouseGenerator() + { + models::RawModel raw_model = render_engine::LoadObjModel("res/HouseNew.obj"); + models::ModelTexture texture = { render_engine::loader::LoadTexture("res/Texture.png") }; + texture.shine_damper = 10; + house_model = { raw_model, texture }; + + GenerateFurnitureModels(); + } + + std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) + { + std::deque> furniture; + + // Add house + furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); + + + + // Add furniture + + return furniture; + } + + void HouseGenerator::GenerateFurnitureModels() + { + + } +} diff --git a/src/entities/HouseGenerator.h b/src/entities/HouseGenerator.h new file mode 100644 index 0000000..8169e5f --- /dev/null +++ b/src/entities/HouseGenerator.h @@ -0,0 +1,37 @@ +#pragma once + +#include +#include +#include "../models/Model.h" +#include "../collision/collision.h" + +namespace entities +{ + class HouseGenerator + { + private: + const float HOUSE_SIZE = 30; + + models::TexturedModel house_model; + + std::deque furniture_models; + + public: + HouseGenerator(); + + /* + * @brief: This function generates a house with furniture at the given position and rotation + * + * @param position: The position of the house to render + * @param y_rotation: The y rotation the house needs to be rendered with + * + * @return: A list with all the entities of the generated house (the furniture) + */ + std::deque> GenerateHouse(const glm::vec3& position, float y_rotation); + + float GetHouseDepth() const { return house_model.raw_model.model_size.x * HOUSE_SIZE; } + + private: + void GenerateFurnitureModels(); + }; +} diff --git a/src/models/Model.h b/src/models/Model.h index 2df9e94..fa4067c 100644 --- a/src/models/Model.h +++ b/src/models/Model.h @@ -1,6 +1,7 @@ #pragma once #include +#include namespace models { diff --git a/src/renderEngine/Renderer.cpp b/src/renderEngine/Renderer.cpp index a91a5ec..9eadbae 100644 --- a/src/renderEngine/Renderer.cpp +++ b/src/renderEngine/Renderer.cpp @@ -4,7 +4,6 @@ #include "loader.h" #include "../toolbox/toolbox.h" #include "renderer.h" - #include namespace render_engine @@ -51,9 +50,9 @@ namespace render_engine /* This function will Render a Model on the screen. */ - void Render(entities::Entity& entity, shaders::EntityShader& shader) + void Render(std::shared_ptr entity, shaders::EntityShader& shader) { - const models::TexturedModel model = entity.GetModel(); + const models::TexturedModel model = entity.get()->GetModel(); const models::RawModel raw_model = model.raw_model; const models::ModelTexture texture = model.texture; @@ -66,7 +65,7 @@ namespace render_engine glEnableVertexAttribArray(2); // Load the transformation of the model into the shader - const glm::mat4 modelMatrix = toolbox::CreateModelMatrix(entity.GetPosition(), entity.GetRotation(), entity.GetScale()); + const glm::mat4 modelMatrix = toolbox::CreateModelMatrix(entity.get()->GetPosition(), entity.get()->GetRotation(), entity.get()->GetScale()); shader.LoadModelMatrix(modelMatrix); shader.LoadShineVariables(texture.shine_damper, texture.reflectivity); diff --git a/src/renderEngine/Renderer.h b/src/renderEngine/Renderer.h index 8f4cef3..8a7a473 100644 --- a/src/renderEngine/Renderer.h +++ b/src/renderEngine/Renderer.h @@ -1,5 +1,6 @@ #pragma once +#include #include "../gui/gui_element.h" #include "../entities/entity.h" #include "../shaders/entity_shader.h" @@ -30,7 +31,7 @@ namespace render_engine @param entity: The entity which needs to be rendered @param shader: The shader the entity needs to be rendered with */ - void Render(entities::Entity& entity, shaders::EntityShader& shader); + void Render(std::shared_ptr entity, shaders::EntityShader& shader); /* @brief: Call this function to render gui_textures on the screen diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 281df17..6fcec5b 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -10,7 +10,10 @@ #include "../renderEngine/renderer.h" #include "../shaders/entity_shader.h" #include "../toolbox/toolbox.h" +#include "../entities/HouseGenerator.h" #include +#include +#include #define MAX_MODEL_DEQUE_SIZE 6 // max amount of models to load at the same time #define UPCOMING_MODEL_AMOUNT 4 // how much models should be loaded in front of us @@ -18,9 +21,10 @@ namespace scene { - std::deque house_models; + entities::HouseGenerator* house_generator; + std::deque> house_models; std::deque lights; - std::deque trees; + std::deque> trees; models::RawModel raw_model; models::ModelTexture texture; @@ -29,9 +33,6 @@ namespace scene entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)); std::vector guis; - models::TexturedModel model; - models::TexturedModel tree; - In_Game_Scene::In_Game_Scene() { @@ -43,6 +44,11 @@ namespace scene gui_shader->Init(); } + In_Game_Scene::~In_Game_Scene() + { + delete house_generator; + } + /** * @brief loads a new chunk in front of the camera, and deletes the chunk behind the camera. * @@ -51,32 +57,27 @@ namespace scene */ void load_chunk(int model_pos) { + static unsigned int furniture_count = 0; + std::cout << "loading model chunk" << std::endl; if (house_models.size() >= MAX_MODEL_DEQUE_SIZE) { - house_models.pop_back(); - trees.pop_back(); + for (int i = 0; i < furniture_count; i++) + { + house_models.pop_back(); + } } - int z_offset = model_pos * (model.raw_model.model_size.x * 20); // how much "in the distance" we should load the model - house_models.push_front(entities::Entity(model, glm::vec3(0, -50, -50 - z_offset), glm::vec3(0, 90, 0), 20)); + int z_offset = model_pos * (house_generator->GetHouseDepth()); // how much "in the distance" we should load the model - trees.push_front(entities::Entity(tree, glm::vec3(0, 0, -50 - z_offset), glm::vec3(0, 90, 0), 3)); + std::deque> furniture = house_generator->GenerateHouse(glm::vec3(0, -75, -50 - z_offset), 90); + furniture_count = furniture.size(); + house_models.insert(house_models.begin(), furniture.begin(), furniture.end()); } scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window) - { - raw_model = render_engine::LoadObjModel("res/House.obj"); - texture = { render_engine::loader::LoadTexture("res/Texture.png") }; - texture.shine_damper = 10; - texture.reflectivity = 0; - model = { raw_model, texture }; - - models::RawModel raw_tree_model = render_engine::LoadObjModel("res/Tree.obj"); - models::ModelTexture tree_texture = { render_engine::loader::LoadTexture("res/TreeTexture.png") }; - tree = { raw_tree_model, tree_texture }; - - + { + house_generator = new entities::HouseGenerator(); // load the first few house models for (int i = 0; i <= UPCOMING_MODEL_AMOUNT; i++) { @@ -123,12 +124,12 @@ namespace scene shader->LoadLightsDeque(lights); shader->LoadViewMatrix(camera); - for (entities::Entity& model_entity : house_models) + for (std::shared_ptr model_entity : house_models) { render_engine::renderer::Render(model_entity, *shader); } - for (entities::Entity& tree_entity : trees) + for (std::shared_ptr tree_entity : trees) { render_engine::renderer::Render(tree_entity, *shader); } @@ -146,7 +147,7 @@ namespace scene // calculate where the next house model should be loaded static int last_model_pos = 0; - int model_pos = -round(camera.GetPosition().z / (model.raw_model.model_size.x * 20)); // how much models we have passed, minus because we are moving in the negative z axis + int model_pos = -round(camera.GetPosition().z / (house_generator->GetHouseDepth())); // how much models we have passed, minus because we are moving in the negative z axis // if we have passed a model, load a new one and delete the one behind us if (last_model_pos != model_pos) diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 4581855..eb5f1a8 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -11,6 +11,7 @@ namespace scene public: In_Game_Scene(); + ~In_Game_Scene(); Scenes start(GLFWwindow* window) override; void render() override; diff --git a/src/shaders/entity_shader.cpp b/src/shaders/entity_shader.cpp index 973d7c4..d0a9ba2 100644 --- a/src/shaders/entity_shader.cpp +++ b/src/shaders/entity_shader.cpp @@ -29,7 +29,7 @@ namespace shaders uniform vec3 light_position[4]; const float density = 0.0017; - const float gradient = 4; + const float gradient = 3; void main(void) { diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 555ce4b..f5db84e 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -20,6 +20,7 @@ + @@ -43,6 +44,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 3dc1142..3057d3f 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -75,6 +75,9 @@ Source Files + + Source Files + @@ -155,6 +158,9 @@ Header Files + + Header Files + From ca2959bf2d1e3a3c10f4a67c93b2c8e248e847a2 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 14:48:19 +0200 Subject: [PATCH 12/30] [FIX] detecting hand when its just a finger or hair --- src/computervision/HandPresentChecker.cpp | 14 +++++++++++--- src/computervision/ObjectDetection.cpp | 4 ++-- src/computervision/ObjectDetection.h | 3 ++- src/scenes/startup_Scene.cpp | 5 ++++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/computervision/HandPresentChecker.cpp b/src/computervision/HandPresentChecker.cpp index 2cb4784..74ec08d 100644 --- a/src/computervision/HandPresentChecker.cpp +++ b/src/computervision/HandPresentChecker.cpp @@ -2,6 +2,7 @@ #include #include +#define MIN_HAND_SIZE 10000 namespace computervision { @@ -10,9 +11,16 @@ namespace computervision std::vector> points; cv::Mat imgCont; cv::findContours(inputImage, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); - bool hand_present = points.size() > 0; - std::cout << (hand_present ? "hey a hand!" : "damn no hand") << std::endl; - return hand_present; + + if (points.size() == 0) return false; + + for (int p = 0; p < points.size(); p++) + { + int area = cv::contourArea(points[p]); + if (area > MIN_HAND_SIZE) return true; + } + + return false; } } diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index f0edf1e..d0f554f 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -41,7 +41,7 @@ namespace computervision return cap; } - bool ObjectDetection::detectHand(Mat cameraFrame) + bool ObjectDetection::detectHand(Mat cameraFrame, bool& hand_present) { Mat inputFrame = generateHandMaskSquare(cameraFrame); frameOut = inputFrame.clone(); @@ -72,7 +72,7 @@ namespace computervision //imshow("handMask", handMask); //imshow("handDetection", fingerCountDebug); - check_if_hand_present(handMask); + hand_present = check_if_hand_present(handMask); diff --git a/src/computervision/ObjectDetection.h b/src/computervision/ObjectDetection.h index 45f4c6d..5deeaa6 100644 --- a/src/computervision/ObjectDetection.h +++ b/src/computervision/ObjectDetection.h @@ -54,9 +54,10 @@ namespace computervision * @brief detects a hand based on the given hand mask input frame. * * @param inputFrame the input frame from the camera + * @param hand_present boolean that will hold true if the hand is detected, false if not. * @return true if hand is open, false if hand is closed */ - bool detectHand(cv::Mat cameraFrame); + bool detectHand(cv::Mat cameraFrame, bool& hand_present); /** * @brief draws the hand mask rectangle on the given input matrix. diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index 7d94bb0..3a990f1 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -3,6 +3,7 @@ #include #include "startup_Scene.h" #include "../computervision/ObjectDetection.h" +#include namespace scene { @@ -29,7 +30,9 @@ namespace scene void scene::Startup_Scene::update(GLFWwindow* window) { - objDetect.detectHand(objDetect.readCamera()); + bool hand_detected = false; + objDetect.detectHand(objDetect.readCamera(),hand_detected); + if (hand_detected) std::cout << "there's a hand!" << std::endl; } From b80653b668185647abe452fbc430d22331983ff9 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 15:07:36 +0200 Subject: [PATCH 13/30] [EDIT] change method names in compliance with code style guide --- src/computervision/HandPresentChecker.cpp | 5 ++--- src/computervision/HandPresentChecker.h | 8 +++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/computervision/HandPresentChecker.cpp b/src/computervision/HandPresentChecker.cpp index 74ec08d..31a9e00 100644 --- a/src/computervision/HandPresentChecker.cpp +++ b/src/computervision/HandPresentChecker.cpp @@ -6,11 +6,10 @@ namespace computervision { - bool check_if_hand_present(cv::Mat inputImage) + bool check_if_hand_present(cv::Mat input_image) { std::vector> points; - cv::Mat imgCont; - cv::findContours(inputImage, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); + cv::findContours(input_image, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); if (points.size() == 0) return false; diff --git a/src/computervision/HandPresentChecker.h b/src/computervision/HandPresentChecker.h index 5f0b0b7..6a6a8f3 100644 --- a/src/computervision/HandPresentChecker.h +++ b/src/computervision/HandPresentChecker.h @@ -3,5 +3,11 @@ #include namespace computervision { - bool check_if_hand_present(cv::Mat inputImage); + /** + * @brief checks if the hand is present in the input image. + * + * @param input_image the image to check + * @return true if the hand was found, false if not + */ + bool CheckIfHandPresent(cv::Mat input_image); } From e4b5dc39c062fa52dda2cd642ea7e89d5fccab5f Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 15:10:19 +0200 Subject: [PATCH 14/30] [EDIT] change variable names in compliance with code style guide --- src/computervision/ObjectDetection.cpp | 51 +++++++++++++------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index d0f554f..5fcac46 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -19,11 +19,10 @@ namespace computervision int handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight; bool handMaskGenerated = false; - Mat frame, frameOut, handMask, foreground, fingerCountDebug; - BackgroundRemover backgroundRemover; - SkinDetector skinDetector; - FaceDetector faceDetector; - FingerCount fingerCount; + Mat frame, frame_out, handMask, foreground, fingerCountDebug; + BackgroundRemover background_remover; + SkinDetector skin_detector; + FingerCount finger_count; cv::VideoCapture cap = static_camera::getCap(); @@ -31,62 +30,62 @@ namespace computervision { } - cv::Mat ObjectDetection::readCamera() { + cv::Mat ObjectDetection::ReadCamera() { cap.read(img); return img; } - cv::VideoCapture ObjectDetection::getCap() + cv::VideoCapture ObjectDetection::GetCap() { return cap; } - bool ObjectDetection::detectHand(Mat cameraFrame, bool& hand_present) + bool ObjectDetection::DetectHand(Mat camera_frame, bool& hand_present) { - Mat inputFrame = generateHandMaskSquare(cameraFrame); - frameOut = inputFrame.clone(); + Mat input_frame = GenerateHandMaskSquare(camera_frame); + frame_out = input_frame.clone(); // detect skin color - skinDetector.drawSkinColorSampler(frameOut); + skin_detector.drawSkinColorSampler(frame_out); // remove background from image - foreground = backgroundRemover.getForeground(inputFrame); + foreground = background_remover.getForeground(input_frame); // detect the hand contours - handMask = skinDetector.getSkinMask(foreground); + handMask = skin_detector.getSkinMask(foreground); // count the amount of fingers and put the info on the matrix - fingerCountDebug = fingerCount.findFingersCount(handMask, frameOut); + fingerCountDebug = finger_count.findFingersCount(handMask, frame_out); // get the amount of fingers - int fingers_amount = fingerCount.getAmountOfFingers(); + int fingers_amount = finger_count.getAmountOfFingers(); // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. - drawHandMaskRect(&cameraFrame); + DrawHandMask(&camera_frame); string hand_text = fingers_amount > 0 ? "open" : "closed"; - putText(cameraFrame,hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255),3); - imshow("camera", cameraFrame); + putText(camera_frame,hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255),3); + imshow("camera", camera_frame); - //imshow("output", frameOut); + //imshow("output", frame_out); //imshow("foreground", foreground); //imshow("handMask", handMask); //imshow("handDetection", fingerCountDebug); - hand_present = check_if_hand_present(handMask); + hand_present = CheckIfHandPresent(handMask); int key = waitKey(1); if (key == 98) // b, calibrate the background - backgroundRemover.calibrate(inputFrame); + background_remover.calibrate(input_frame); else if (key == 115) // s, calibrate the skin color - skinDetector.calibrate(inputFrame); + skin_detector.calibrate(input_frame); return fingers_amount > 0; } - void ObjectDetection::calculateDifference() + void ObjectDetection::CalculateDifference() { cap.read(img); cap.read(img2); @@ -101,7 +100,7 @@ namespace computervision } - cv::Mat ObjectDetection::generateHandMaskSquare(cv::Mat img) + cv::Mat ObjectDetection::GenerateHandMaskSquare(cv::Mat img) { handMaskStartXPos = 20; handMaskStartYPos = img.rows / 5; @@ -121,14 +120,14 @@ namespace computervision } - bool ObjectDetection::drawHandMaskRect(cv::Mat* input) + bool ObjectDetection::DrawHandMask(cv::Mat* input) { if (!handMaskGenerated) return false; rectangle(*input, Rect(handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight), Scalar(255, 255, 255)); return true; } - void ObjectDetection::showWebcam() + void ObjectDetection::ShowWebcam() { imshow("Webcam image", img); } From 8c50792657138bc4f8b82da3480792047cc2986a Mon Sep 17 00:00:00 2001 From: Menno Date: Fri, 4 Jun 2021 15:49:56 +0200 Subject: [PATCH 15/30] [FEATURE] simple house generator --- src/entities/HouseGenerator.cpp | 39 ++++++++++++++++++++++++++++----- src/entities/HouseGenerator.h | 16 ++++++++++++-- src/renderEngine/Renderer.cpp | 2 +- src/scenes/in_Game_Scene.cpp | 12 ++++++---- src/toolbox/toolbox.cpp | 12 ++++++++++ src/toolbox/toolbox.h | 10 +++++++++ 6 files changed, 78 insertions(+), 13 deletions(-) diff --git a/src/entities/HouseGenerator.cpp b/src/entities/HouseGenerator.cpp index 1d9a8ec..7ca82f0 100644 --- a/src/entities/HouseGenerator.cpp +++ b/src/entities/HouseGenerator.cpp @@ -1,15 +1,20 @@ #include "HouseGenerator.h" + +#include +#include + #include "../renderEngine/obj_loader.h" #include "../renderEngine/Loader.h" +#include "../toolbox/toolbox.h" namespace entities { HouseGenerator::HouseGenerator() { models::RawModel raw_model = render_engine::LoadObjModel("res/HouseNew.obj"); - models::ModelTexture texture = { render_engine::loader::LoadTexture("res/Texture.png") }; - texture.shine_damper = 10; - house_model = { raw_model, texture }; + default_texture = { render_engine::loader::LoadTexture("res/Texture.png") }; + default_texture.shine_damper = 10; + house_model = { raw_model, default_texture }; GenerateFurnitureModels(); } @@ -21,15 +26,37 @@ namespace entities // Add house furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); - - // Add furniture - + models::TexturedModel couch = GetFurnitureModel(Furniture::COUCH); + furniture.push_back(std::make_shared(couch, glm::vec3(position.x, position.y + 20, position.z + 10), glm::vec3(0, 0, 0), 1)); + return furniture; } + models::TexturedModel HouseGenerator::GetFurnitureModel(Furniture furniture) + { + const auto found = furniture_models.find(furniture); + if (found == furniture_models.end()) + { + std::cerr << "OH NEEEEEEEEEEEEEEE"; + } + + auto models = found->second; + + const int modelNumber = toolbox::Random(0, models.size() - 1); + + return models[modelNumber]; + } + void HouseGenerator::GenerateFurnitureModels() { + // Couches + std::deque couches; + models::RawModel couch_inside_model = render_engine::LoadObjModel("res/couchThree.obj"); + models::TexturedModel couch_inside = { couch_inside_model, default_texture }; + couches.push_back(couch_inside); + + furniture_models.insert(std::pair>(Furniture::COUCH, couches)); } } diff --git a/src/entities/HouseGenerator.h b/src/entities/HouseGenerator.h index 8169e5f..8198dbf 100644 --- a/src/entities/HouseGenerator.h +++ b/src/entities/HouseGenerator.h @@ -2,19 +2,26 @@ #include #include +#include #include "../models/Model.h" #include "../collision/collision.h" namespace entities { + enum class Furniture + { + COUCH + }; + class HouseGenerator { private: const float HOUSE_SIZE = 30; models::TexturedModel house_model; - - std::deque furniture_models; + models::ModelTexture default_texture; + + std::map> furniture_models; public: HouseGenerator(); @@ -29,9 +36,14 @@ namespace entities */ std::deque> GenerateHouse(const glm::vec3& position, float y_rotation); + /* + * @brief: Returns the depth of the house (chunk) + */ float GetHouseDepth() const { return house_model.raw_model.model_size.x * HOUSE_SIZE; } private: void GenerateFurnitureModels(); + + models::TexturedModel GetFurnitureModel(Furniture furniture); }; } diff --git a/src/renderEngine/Renderer.cpp b/src/renderEngine/Renderer.cpp index 9eadbae..984860f 100644 --- a/src/renderEngine/Renderer.cpp +++ b/src/renderEngine/Renderer.cpp @@ -55,7 +55,7 @@ namespace render_engine const models::TexturedModel model = entity.get()->GetModel(); const models::RawModel raw_model = model.raw_model; const models::ModelTexture texture = model.texture; - + // Enable the model (VAO) glBindVertexArray(raw_model.vao_id); diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 6fcec5b..18f53d0 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #define MAX_MODEL_DEQUE_SIZE 6 // max amount of models to load at the same time #define UPCOMING_MODEL_AMOUNT 4 // how much models should be loaded in front of us @@ -60,23 +61,26 @@ namespace scene static unsigned int furniture_count = 0; std::cout << "loading model chunk" << std::endl; - if (house_models.size() >= MAX_MODEL_DEQUE_SIZE) + if (house_models.size() >= MAX_MODEL_DEQUE_SIZE * furniture_count) { for (int i = 0; i < furniture_count; i++) { - house_models.pop_back(); + house_models.pop_front(); } } int z_offset = model_pos * (house_generator->GetHouseDepth()); // how much "in the distance" we should load the model std::deque> furniture = house_generator->GenerateHouse(glm::vec3(0, -75, -50 - z_offset), 90); furniture_count = furniture.size(); - house_models.insert(house_models.begin(), furniture.begin(), furniture.end()); + + house_models.insert(house_models.end(), furniture.begin(), furniture.end()); + + std::cout << house_models.size() << std::endl; } scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window) - { + { house_generator = new entities::HouseGenerator(); // load the first few house models for (int i = 0; i <= UPCOMING_MODEL_AMOUNT; i++) diff --git a/src/toolbox/toolbox.cpp b/src/toolbox/toolbox.cpp index 57473a9..53c27ad 100644 --- a/src/toolbox/toolbox.cpp +++ b/src/toolbox/toolbox.cpp @@ -1,3 +1,4 @@ +#include #include "toolbox.h" namespace toolbox @@ -31,4 +32,15 @@ namespace toolbox matrix = glm::translate(matrix, negative_cam_pos); return matrix; } + + int Random(const int min, const int max) + { + static bool first = true; + if (first) + { + srand(time(0)); + first = false; + } + return min + rand() % ((max + 1) - min); + } } diff --git a/src/toolbox/toolbox.h b/src/toolbox/toolbox.h index f8bcef6..67dcd8f 100644 --- a/src/toolbox/toolbox.h +++ b/src/toolbox/toolbox.h @@ -46,4 +46,14 @@ namespace toolbox * @return: The view matrix */ glm::mat4 CreateViewMatrix(entities::Camera& camera); + + /* + * @brief: This function will return a value between min and max + * + * @param min: The min value + * @param max: The max value + * + * @return: The random number + */ + int Random(const int min, const int max); } From aa9c6a0fbbbfd5117f28f9b3d4ad46c3f5969082 Mon Sep 17 00:00:00 2001 From: Menno Date: Fri, 4 Jun 2021 15:54:23 +0200 Subject: [PATCH 16/30] [ADDED] comments --- src/entities/HouseGenerator.cpp | 8 ++++---- src/entities/HouseGenerator.h | 16 +++++++++++++--- src/scenes/in_Game_Scene.cpp | 2 -- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/entities/HouseGenerator.cpp b/src/entities/HouseGenerator.cpp index 7ca82f0..972ceb7 100644 --- a/src/entities/HouseGenerator.cpp +++ b/src/entities/HouseGenerator.cpp @@ -27,13 +27,13 @@ namespace entities furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); // Add furniture - models::TexturedModel couch = GetFurnitureModel(Furniture::COUCH); - furniture.push_back(std::make_shared(couch, glm::vec3(position.x, position.y + 20, position.z + 10), glm::vec3(0, 0, 0), 1)); + models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); + furniture.push_back(std::make_shared(couch, glm::vec3(position.x, position.y + 20, position.z + 10), glm::vec3(0, 0, 0), HOUSE_SIZE)); return furniture; } - models::TexturedModel HouseGenerator::GetFurnitureModel(Furniture furniture) + models::TexturedModel HouseGenerator::GetFurnitureModel(FurnitureType furniture) { const auto found = furniture_models.find(furniture); if (found == furniture_models.end()) @@ -57,6 +57,6 @@ namespace entities models::TexturedModel couch_inside = { couch_inside_model, default_texture }; couches.push_back(couch_inside); - furniture_models.insert(std::pair>(Furniture::COUCH, couches)); + furniture_models.insert(std::pair>(FurnitureType::COUCH, couches)); } } diff --git a/src/entities/HouseGenerator.h b/src/entities/HouseGenerator.h index 8198dbf..7495f24 100644 --- a/src/entities/HouseGenerator.h +++ b/src/entities/HouseGenerator.h @@ -8,7 +8,7 @@ namespace entities { - enum class Furniture + enum class FurnitureType { COUCH }; @@ -21,7 +21,7 @@ namespace entities models::TexturedModel house_model; models::ModelTexture default_texture; - std::map> furniture_models; + std::map> furniture_models; public: HouseGenerator(); @@ -42,8 +42,18 @@ namespace entities float GetHouseDepth() const { return house_model.raw_model.model_size.x * HOUSE_SIZE; } private: + /* + * @brief: This function loads all the 3D furniture models + */ void GenerateFurnitureModels(); - models::TexturedModel GetFurnitureModel(Furniture furniture); + /* + * @brief: This funtion chooses and returns a random furniture of the given furniture type + * + * @param furniture: The furniture you want to get + * + * @return: The model of the random furniture of the chosen furniture type + */ + models::TexturedModel GetFurnitureModel(FurnitureType furniture); }; } diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 18f53d0..3706ab5 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -74,8 +74,6 @@ namespace scene furniture_count = furniture.size(); house_models.insert(house_models.end(), furniture.begin(), furniture.end()); - - std::cout << house_models.size() << std::endl; } From 1ab5ae798e0a07f9d3b514dd5f9dfdcbaf6a3d28 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 16:27:30 +0200 Subject: [PATCH 17/30] [ADD] hand calibration screen --- src/computervision/FaceDetector.cpp | 53 --------------- src/computervision/FaceDetector.h | 31 --------- src/computervision/HandPresentChecker.cpp | 25 ------- src/computervision/ObjectDetection.cpp | 56 +++++++++------ src/computervision/ObjectDetection.h | 14 ++-- src/computervision/SkinDetector.cpp | 2 +- .../async/async_arm_detection.cpp | 2 +- .../calibration/HandCalibrator.cpp | 68 +++++++++++++++++++ .../calibration/HandCalibrator.h | 42 ++++++++++++ .../calibration/HandPresentChecker.cpp | 14 ++++ .../{ => calibration}/HandPresentChecker.h | 0 src/scenes/startup_Scene.cpp | 2 +- wk2_fps.vcxproj | 8 +-- wk2_fps.vcxproj.filters | 8 +-- 14 files changed, 176 insertions(+), 149 deletions(-) delete mode 100644 src/computervision/FaceDetector.cpp delete mode 100644 src/computervision/FaceDetector.h delete mode 100644 src/computervision/HandPresentChecker.cpp create mode 100644 src/computervision/calibration/HandCalibrator.cpp create mode 100644 src/computervision/calibration/HandCalibrator.h create mode 100644 src/computervision/calibration/HandPresentChecker.cpp rename src/computervision/{ => calibration}/HandPresentChecker.h (100%) diff --git a/src/computervision/FaceDetector.cpp b/src/computervision/FaceDetector.cpp deleted file mode 100644 index a628983..0000000 --- a/src/computervision/FaceDetector.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "FaceDetector.h" - - -/* - Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti -*/ -namespace computervision -{ - Rect getFaceRect(Mat input); - - String faceClassifierFileName = "res/haarcascade_frontalface_alt.xml"; - CascadeClassifier faceCascadeClassifier; - - FaceDetector::FaceDetector(void) { - if (!faceCascadeClassifier.load(faceClassifierFileName)) - throw runtime_error("can't load file " + faceClassifierFileName); - } - - void FaceDetector::removeFaces(Mat input, Mat output) { - vector faces; - Mat frameGray; - - cvtColor(input, frameGray, CV_BGR2GRAY); - equalizeHist(frameGray, frameGray); - - faceCascadeClassifier.detectMultiScale(frameGray, faces, 1.1, 2, 0 | 2, Size(120, 120)); // HAAR_SCALE_IMAGE is 2 - - for (size_t i = 0; i < faces.size(); i++) { - rectangle( - output, - Point(faces[i].x, faces[i].y), - Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), - Scalar(0, 0, 0), - -1 - ); - } - } - - Rect getFaceRect(Mat input) { - vector faceRectangles; - Mat inputGray; - - cvtColor(input, inputGray, CV_BGR2GRAY); - equalizeHist(inputGray, inputGray); - - faceCascadeClassifier.detectMultiScale(inputGray, faceRectangles, 1.1, 2, 0 | 2, Size(120, 120)); // HAAR_SCALE_IMAGE is 2 - - if (faceRectangles.size() > 0) - return faceRectangles[0]; - else - return Rect(0, 0, 1, 1); - } -} \ No newline at end of file diff --git a/src/computervision/FaceDetector.h b/src/computervision/FaceDetector.h deleted file mode 100644 index 208e051..0000000 --- a/src/computervision/FaceDetector.h +++ /dev/null @@ -1,31 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include -/* - Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti -*/ - -using namespace cv; -using namespace std; - -namespace computervision -{ - class FaceDetector { - public: - /** - * @brief Constructor for the class FaceDetector, loads training data from a file - * - */ - FaceDetector(void); - /** - * @brief Detects faces on an image and blocks them with a black rectangle - * - * @param input Input image - * @param output Output image - */ - void removeFaces(Mat input, Mat output); - }; -} \ No newline at end of file diff --git a/src/computervision/HandPresentChecker.cpp b/src/computervision/HandPresentChecker.cpp deleted file mode 100644 index 31a9e00..0000000 --- a/src/computervision/HandPresentChecker.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include "HandPresentChecker.h" -#include -#include - -#define MIN_HAND_SIZE 10000 - -namespace computervision -{ - bool check_if_hand_present(cv::Mat input_image) - { - std::vector> points; - cv::findContours(input_image, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); - - if (points.size() == 0) return false; - - for (int p = 0; p < points.size(); p++) - { - int area = cv::contourArea(points[p]); - if (area > MIN_HAND_SIZE) return true; - } - - return false; - } - -} diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 5fcac46..669a229 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -6,23 +6,24 @@ #include "ObjectDetection.h" #include "BackgroundRemover.h" #include "SkinDetector.h" -#include "FaceDetector.h" #include "FingerCount.h" #include "async/StaticCameraInstance.h" -#include "HandPresentChecker.h" +#include "calibration/HandPresentChecker.h" +#include "calibration/HandCalibrator.h" namespace computervision { - cv::Mat img, imgGray, img2, img2Gray, img3, img4; + cv::Mat img, img_gray, img2, img2_gray, img3, img4; - int handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight; - bool handMaskGenerated = false; + int hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height; + bool hand_mask_generated = false; Mat frame, frame_out, handMask, foreground, fingerCountDebug; BackgroundRemover background_remover; SkinDetector skin_detector; FingerCount finger_count; + handcalibration::HandCalibrator hand_calibrator; cv::VideoCapture cap = static_camera::getCap(); @@ -46,7 +47,7 @@ namespace computervision frame_out = input_frame.clone(); // detect skin color - skin_detector.drawSkinColorSampler(frame_out); + skin_detector.drawSkinColorSampler(camera_frame); // remove background from image foreground = background_remover.getForeground(input_frame); @@ -63,7 +64,9 @@ namespace computervision // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. DrawHandMask(&camera_frame); string hand_text = fingers_amount > 0 ? "open" : "closed"; - putText(camera_frame,hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255),3); + putText(camera_frame, hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255), 3); + + hand_calibrator.DrawHandCalibrationText(camera_frame); imshow("camera", camera_frame); //imshow("output", frame_out); @@ -71,16 +74,25 @@ namespace computervision //imshow("handMask", handMask); //imshow("handDetection", fingerCountDebug); - hand_present = CheckIfHandPresent(handMask); + hand_present = hand_calibrator.CheckIfHandPresent(handMask); + hand_calibrator.SetHandPresent(hand_present); int key = waitKey(1); if (key == 98) // b, calibrate the background + { background_remover.calibrate(input_frame); + hand_calibrator.SetBackGroundCalibrated(true); + } else if (key == 115) // s, calibrate the skin color + { skin_detector.calibrate(input_frame); + hand_calibrator.SetSkinCalibration(true); + + } + return fingers_amount > 0; } @@ -90,10 +102,10 @@ namespace computervision cap.read(img); cap.read(img2); - cv::cvtColor(img, imgGray, cv::COLOR_RGBA2GRAY); - cv::cvtColor(img2, img2Gray, cv::COLOR_RGBA2GRAY); + cv::cvtColor(img, img_gray, cv::COLOR_RGBA2GRAY); + cv::cvtColor(img2, img2_gray, cv::COLOR_RGBA2GRAY); - cv::absdiff(imgGray, img2Gray, img3); + cv::absdiff(img_gray, img2_gray, img3); cv::threshold(img3, img4, 50, 170, cv::THRESH_BINARY); imshow("threshold", img4); @@ -102,28 +114,28 @@ namespace computervision cv::Mat ObjectDetection::GenerateHandMaskSquare(cv::Mat img) { - handMaskStartXPos = 20; - handMaskStartYPos = img.rows / 5; - handMaskWidth = img.cols / 3; - handMaskHeight = img.cols / 3; + hand_mask_start_x_pos = 20; + hand_mask_start_y_pos = img.rows / 5; + hand_mask_width = img.cols / 3; + hand_mask_height = img.cols / 3; cv::Mat mask = cv::Mat::zeros(img.size(), img.type()); - cv::Mat dstImg = cv::Mat::zeros(img.size(), img.type()); + cv::Mat distance_img = cv::Mat::zeros(img.size(), img.type()); - cv::rectangle(mask, Rect(handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight), Scalar(255, 255, 255), -1); + cv::rectangle(mask, Rect(hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height), Scalar(255, 255, 255), -1); - img.copyTo(dstImg, mask); + img.copyTo(distance_img, mask); - handMaskGenerated = true; - return dstImg; + hand_mask_generated = true; + return distance_img; } bool ObjectDetection::DrawHandMask(cv::Mat* input) { - if (!handMaskGenerated) return false; - rectangle(*input, Rect(handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight), Scalar(255, 255, 255)); + if (!hand_mask_generated) return false; + rectangle(*input, Rect(hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height), Scalar(255, 255, 255)); return true; } diff --git a/src/computervision/ObjectDetection.h b/src/computervision/ObjectDetection.h index 5deeaa6..1b65e1f 100644 --- a/src/computervision/ObjectDetection.h +++ b/src/computervision/ObjectDetection.h @@ -27,13 +27,13 @@ namespace computervision * @brief Displays an image of the current webcam-footage * */ - void showWebcam(); + void ShowWebcam(); /** * @brief Calculates the difference between two images * and outputs an image that only shows the difference * */ - void calculateDifference(); + void CalculateDifference(); /** * @brief generates the square that will hold the mask in which the hand will be detected. @@ -41,14 +41,14 @@ namespace computervision * @param img the current camear frame * @return a matrix containing the mask */ - cv::Mat generateHandMaskSquare(cv::Mat img); + cv::Mat GenerateHandMaskSquare(cv::Mat img); /** * @brief reads the camera and returns it in a matrix. * * @return the camera frame in a matrix */ - cv::Mat readCamera(); + cv::Mat ReadCamera(); /** * @brief detects a hand based on the given hand mask input frame. @@ -57,17 +57,17 @@ namespace computervision * @param hand_present boolean that will hold true if the hand is detected, false if not. * @return true if hand is open, false if hand is closed */ - bool detectHand(cv::Mat cameraFrame, bool& hand_present); + bool DetectHand(cv::Mat camera_frame, bool& hand_present); /** * @brief draws the hand mask rectangle on the given input matrix. * * @param input the input matrix to draw the rectangle on */ - bool drawHandMaskRect(cv::Mat *input); + bool DrawHandMask(cv::Mat *input); - cv::VideoCapture getCap(); + cv::VideoCapture GetCap(); }; diff --git a/src/computervision/SkinDetector.cpp b/src/computervision/SkinDetector.cpp index 088cce0..971ff2a 100644 --- a/src/computervision/SkinDetector.cpp +++ b/src/computervision/SkinDetector.cpp @@ -23,7 +23,7 @@ namespace computervision int frameWidth = input.size().width, frameHeight = input.size().height; int rectangleSize = 25; - Scalar rectangleColor = Scalar(255, 0, 255); + Scalar rectangleColor = Scalar(0, 255, 255); skinColorSamplerRectangle1 = Rect(frameWidth / 5, frameHeight / 2, rectangleSize, rectangleSize); skinColorSamplerRectangle2 = Rect(frameWidth / 5, frameHeight / 3, rectangleSize, rectangleSize); diff --git a/src/computervision/async/async_arm_detection.cpp b/src/computervision/async/async_arm_detection.cpp index e9649a1..a43b7dc 100644 --- a/src/computervision/async/async_arm_detection.cpp +++ b/src/computervision/async/async_arm_detection.cpp @@ -17,7 +17,7 @@ namespace computervision VideoCapture cap = static_camera::getCap(); std::cout << "STARTING THREAD LAMBDA" << std::endl; - /*cv::VideoCapture cap = static_camera::getCap();*/ + /*cv::VideoCapture cap = static_camera::GetCap();*/ if (!cap.isOpened()) { diff --git a/src/computervision/calibration/HandCalibrator.cpp b/src/computervision/calibration/HandCalibrator.cpp new file mode 100644 index 0000000..9d91a46 --- /dev/null +++ b/src/computervision/calibration/HandCalibrator.cpp @@ -0,0 +1,68 @@ + +#include "HandCalibrator.h" + +#define MIN_HAND_SIZE 10000 +namespace computervision +{ + namespace handcalibration + { + + static bool background_calibrated; + static bool skintone_calibrated; + static bool hand_present; + + HandCalibrator::HandCalibrator() + { + + } + + void HandCalibrator::DrawHandCalibrationText(cv::Mat& output_frame) + { + cv::rectangle(output_frame,cv::Rect(0, 0, output_frame.cols, 40),cv::Scalar(0,0,0),-1); + cv::putText(output_frame, "Hand calibration", cv::Point(output_frame.cols/2-100, 25), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); + cv::putText(output_frame, "press 'b' to calibrate background,then press 's' to calibrate skin tone", cv::Point(5, 35), cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(18, 219, 65), 1); + + cv::putText(output_frame, "hand in frame:", cv::Point(5, output_frame.rows - 50), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(270, output_frame.rows - 70, 20, 20), hand_present ? cv::Scalar(0, 255, 0) : cv::Scalar(0,0,255), -1); + + + cv::putText(output_frame, (background_calibrated ? "background calibrated" : "background not calibrated"), cv::Point(5, output_frame.rows-30), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::putText(output_frame, (skintone_calibrated ? "skincolor calibrated" : "skincolor not calibrated"), cv::Point(5, output_frame.rows-10), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + } + + void HandCalibrator::SetSkinCalibration(bool val) + { + skintone_calibrated = val; + } + + void HandCalibrator::SetBackGroundCalibrated(bool val) + { + background_calibrated = val; + } + + void HandCalibrator::SetHandPresent(bool val) + { + hand_present = val; + } + + bool HandCalibrator::CheckIfHandPresent(cv::Mat input_image) + { + std::vector> points; + cv::findContours(input_image, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); + + if (points.size() == 0) return false; + + for (int p = 0; p < points.size(); p++) + { + int area = cv::contourArea(points[p]); + if (area > MIN_HAND_SIZE) return true; + } + + return false; + } + + + + + } +} diff --git a/src/computervision/calibration/HandCalibrator.h b/src/computervision/calibration/HandCalibrator.h new file mode 100644 index 0000000..40fdd95 --- /dev/null +++ b/src/computervision/calibration/HandCalibrator.h @@ -0,0 +1,42 @@ +#pragma once +#include +#include +#include + +namespace computervision +{ + namespace handcalibration + { + class HandCalibrator + { + public: + HandCalibrator(); + + /** + * @brief draws the text to show the status of the calibration on the image + * + * @param output_frame the frame to draw on. + */ + void DrawHandCalibrationText(cv::Mat& output_frame); + + /** + * @brief sets the skin calibration variable. + * + * @param val the value to set + */ + void SetSkinCalibration(bool val); + + /** + * @brief sets the background calibration variable. + * + * @param val the value to set + */ + void SetBackGroundCalibrated(bool val); + + bool CheckIfHandPresent(cv::Mat input_image); + + void SetHandPresent(bool val); + }; + + } +} diff --git a/src/computervision/calibration/HandPresentChecker.cpp b/src/computervision/calibration/HandPresentChecker.cpp new file mode 100644 index 0000000..194f6c9 --- /dev/null +++ b/src/computervision/calibration/HandPresentChecker.cpp @@ -0,0 +1,14 @@ +#include "HandPresentChecker.h" +#include +#include + + + +namespace computervision +{ + namespace handcalibration + { + + } + +} diff --git a/src/computervision/HandPresentChecker.h b/src/computervision/calibration/HandPresentChecker.h similarity index 100% rename from src/computervision/HandPresentChecker.h rename to src/computervision/calibration/HandPresentChecker.h diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index 3a990f1..e889139 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -31,7 +31,7 @@ namespace scene void scene::Startup_Scene::update(GLFWwindow* window) { bool hand_detected = false; - objDetect.detectHand(objDetect.readCamera(),hand_detected); + objDetect.DetectHand(objDetect.ReadCamera(),hand_detected); if (hand_detected) std::cout << "there's a hand!" << std::endl; } diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index f962a64..ba853d9 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -20,10 +20,10 @@ - + + - @@ -46,12 +46,12 @@ - + + - diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index a60c7ce..129165a 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -4,7 +4,6 @@ - @@ -23,7 +22,8 @@ - + + @@ -32,7 +32,6 @@ - @@ -55,7 +54,8 @@ - + + From e70d2ef19dbead7631e0b427f3c5007662c5bde3 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 4 Jun 2021 16:32:30 +0200 Subject: [PATCH 18/30] [EDIT] removed unused hand stuff --- src/computervision/ObjectDetection.cpp | 9 ++++----- .../calibration/HandPresentChecker.cpp | 14 -------------- .../calibration/HandPresentChecker.h | 13 ------------- wk2_fps.vcxproj | 2 -- wk2_fps.vcxproj.filters | 2 -- 5 files changed, 4 insertions(+), 36 deletions(-) delete mode 100644 src/computervision/calibration/HandPresentChecker.cpp delete mode 100644 src/computervision/calibration/HandPresentChecker.h diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 669a229..ba8030d 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -8,7 +8,6 @@ #include "SkinDetector.h" #include "FingerCount.h" #include "async/StaticCameraInstance.h" -#include "calibration/HandPresentChecker.h" #include "calibration/HandCalibrator.h" namespace computervision @@ -69,10 +68,10 @@ namespace computervision hand_calibrator.DrawHandCalibrationText(camera_frame); imshow("camera", camera_frame); - //imshow("output", frame_out); - //imshow("foreground", foreground); - //imshow("handMask", handMask); - //imshow("handDetection", fingerCountDebug); + /*imshow("output", frame_out); + imshow("foreground", foreground); + imshow("handMask", handMask); + imshow("handDetection", fingerCountDebug);*/ hand_present = hand_calibrator.CheckIfHandPresent(handMask); hand_calibrator.SetHandPresent(hand_present); diff --git a/src/computervision/calibration/HandPresentChecker.cpp b/src/computervision/calibration/HandPresentChecker.cpp deleted file mode 100644 index 194f6c9..0000000 --- a/src/computervision/calibration/HandPresentChecker.cpp +++ /dev/null @@ -1,14 +0,0 @@ -#include "HandPresentChecker.h" -#include -#include - - - -namespace computervision -{ - namespace handcalibration - { - - } - -} diff --git a/src/computervision/calibration/HandPresentChecker.h b/src/computervision/calibration/HandPresentChecker.h deleted file mode 100644 index 6a6a8f3..0000000 --- a/src/computervision/calibration/HandPresentChecker.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include -namespace computervision -{ - /** - * @brief checks if the hand is present in the input image. - * - * @param input_image the image to check - * @return true if the hand was found, false if not - */ - bool CheckIfHandPresent(cv::Mat input_image); -} diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index ba853d9..9658b78 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -21,7 +21,6 @@ - @@ -47,7 +46,6 @@ - diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 129165a..de921ef 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -22,7 +22,6 @@ - @@ -54,7 +53,6 @@ - From bb68d98bfe1ebd0fd61180d60f037f260adb9cf1 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 10:43:59 +0200 Subject: [PATCH 19/30] [ADD] comments --- src/computervision/calibration/HandCalibrator.h | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/computervision/calibration/HandCalibrator.h b/src/computervision/calibration/HandCalibrator.h index 40fdd95..f402adb 100644 --- a/src/computervision/calibration/HandCalibrator.h +++ b/src/computervision/calibration/HandCalibrator.h @@ -33,9 +33,20 @@ namespace computervision */ void SetBackGroundCalibrated(bool val); + /** + * @brief sets the value for if the hand is present. + * + * @param val the value to set. + */ + void SetHandPresent(bool val); + + /** + * @brief checks if the hand is present in the given image + * + * @param input_image the input image to check. + */ bool CheckIfHandPresent(cv::Mat input_image); - void SetHandPresent(bool val); }; } From afd3e00ddb0e44c6584f70b72e607819fac45391 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 11:03:22 +0200 Subject: [PATCH 20/30] [ADD] contour of hand in calibration screen --- src/computervision/FingerCount.cpp | 11 +++++++---- src/computervision/FingerCount.h | 10 ++++++++++ src/computervision/ObjectDetection.cpp | 2 +- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/computervision/FingerCount.cpp b/src/computervision/FingerCount.cpp index 590e2a2..bdd1938 100644 --- a/src/computervision/FingerCount.cpp +++ b/src/computervision/FingerCount.cpp @@ -14,6 +14,7 @@ namespace computervision { + FingerCount::FingerCount(void) { color_blue = Scalar(255, 0, 0); color_green = Scalar(0, 255, 0); @@ -35,9 +36,6 @@ namespace computervision if (input_image.channels() != 1) return contours_image; - vector> contours; - vector hierarchy; - findContours(input_image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE); // we need at least one contour to work @@ -45,7 +43,7 @@ namespace computervision return contours_image; // find the biggest contour (let's suppose it's our hand) - int biggest_contour_index = -1; + biggest_contour_index = -1; double biggest_area = 0.0; for (int i = 0; i < contours.size(); i++) { @@ -156,6 +154,11 @@ namespace computervision return contours_image; } + void FingerCount::DrawHandContours(Mat& image) + { + drawContours(image, contours, biggest_contour_index, color_green, 2, 8, hierarchy); + } + int FingerCount::getAmountOfFingers() { return amount_of_fingers; diff --git a/src/computervision/FingerCount.h b/src/computervision/FingerCount.h index 3319150..4b31c92 100644 --- a/src/computervision/FingerCount.h +++ b/src/computervision/FingerCount.h @@ -31,7 +31,15 @@ namespace computervision */ int getAmountOfFingers(); + void DrawHandContours(Mat& image); + private: + + int biggest_contour_index; + vector> contours; + vector hierarchy; + + // colors to use Scalar color_blue; Scalar color_green; @@ -115,5 +123,7 @@ namespace computervision * @param with_numbers if the numbers should be drawn with the points */ void drawVectorPoints(Mat image, vector points, Scalar color, bool with_numbers); + + }; } \ No newline at end of file diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index ba8030d..1d36826 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -64,7 +64,7 @@ namespace computervision DrawHandMask(&camera_frame); string hand_text = fingers_amount > 0 ? "open" : "closed"; putText(camera_frame, hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255), 3); - + finger_count.DrawHandContours(camera_frame); hand_calibrator.DrawHandCalibrationText(camera_frame); imshow("camera", camera_frame); From ef470bd4f1db9c1eaf4908227b4f4a5c34c7bb5c Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 11:54:48 +0200 Subject: [PATCH 21/30] [ADD] start of multiple squares --- src/computervision/HandDetectRegion.cpp | 10 +++++++ src/computervision/HandDetectRegion.h | 22 ++++++++++++++ src/computervision/ObjectDetection.cpp | 5 ++-- src/computervision/ObjectDetection.h | 18 ++++++++++++ .../calibration/HandCalibrator.cpp | 29 +++++++++++++------ .../calibration/HandCalibrator.h | 12 ++++++++ 6 files changed, 85 insertions(+), 11 deletions(-) create mode 100644 src/computervision/HandDetectRegion.cpp create mode 100644 src/computervision/HandDetectRegion.h diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp new file mode 100644 index 0000000..0b012db --- /dev/null +++ b/src/computervision/HandDetectRegion.cpp @@ -0,0 +1,10 @@ + +#include "HandDetectRegion.h" +namespace computervision +{ + HandDetectRegion::HandDetectRegion() + { + } + + +} diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/HandDetectRegion.h new file mode 100644 index 0000000..4bdadf2 --- /dev/null +++ b/src/computervision/HandDetectRegion.h @@ -0,0 +1,22 @@ +#pragma once + +#include +namespace computervision +{ + class HandDetectRegion + { + public: + HandDetectRegion(); + + cv::Mat GenerateHandMaskSquare(); + + void detectHand(cv::Mat camera_frame); + + private: + int start_x_pos; + int start_y_pos; + int height; + int width; + }; + +} diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 1d36826..530e474 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -62,8 +62,9 @@ namespace computervision // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. DrawHandMask(&camera_frame); - string hand_text = fingers_amount > 0 ? "open" : "closed"; - putText(camera_frame, hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255), 3); + + + hand_calibrator.SetAmountOfFingers(fingers_amount); finger_count.DrawHandContours(camera_frame); hand_calibrator.DrawHandCalibrationText(camera_frame); imshow("camera", camera_frame); diff --git a/src/computervision/ObjectDetection.h b/src/computervision/ObjectDetection.h index 1b65e1f..92fc335 100644 --- a/src/computervision/ObjectDetection.h +++ b/src/computervision/ObjectDetection.h @@ -66,9 +66,27 @@ namespace computervision */ bool DrawHandMask(cv::Mat *input); + /** + * @brief checks if the hand of the user is open. + * + * @return true if the hand is open, false if not. + */ + bool IsHandOpen(); + + + /** + * @brief checks whether the hand is held within the detection square. + * + * @return true if the hand is in the detection square, false if not. + */ + bool IsHandPresent(); cv::VideoCapture GetCap(); + private: + bool is_hand_open; + bool is_hand_present; + }; diff --git a/src/computervision/calibration/HandCalibrator.cpp b/src/computervision/calibration/HandCalibrator.cpp index 9d91a46..36c64ea 100644 --- a/src/computervision/calibration/HandCalibrator.cpp +++ b/src/computervision/calibration/HandCalibrator.cpp @@ -7,10 +7,6 @@ namespace computervision namespace handcalibration { - static bool background_calibrated; - static bool skintone_calibrated; - static bool hand_present; - HandCalibrator::HandCalibrator() { @@ -18,16 +14,26 @@ namespace computervision void HandCalibrator::DrawHandCalibrationText(cv::Mat& output_frame) { - cv::rectangle(output_frame,cv::Rect(0, 0, output_frame.cols, 40),cv::Scalar(0,0,0),-1); - cv::putText(output_frame, "Hand calibration", cv::Point(output_frame.cols/2-100, 25), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); + cv::rectangle(output_frame, cv::Rect(0, 0, output_frame.cols, 40), cv::Scalar(0, 0, 0), -1); + cv::putText(output_frame, "Hand calibration", cv::Point(output_frame.cols / 2 - 100, 25), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); cv::putText(output_frame, "press 'b' to calibrate background,then press 's' to calibrate skin tone", cv::Point(5, 35), cv::FONT_HERSHEY_PLAIN, 1.0, cv::Scalar(18, 219, 65), 1); + cv::rectangle(output_frame, cv::Rect(0, output_frame.rows - 80, 450, output_frame.cols), cv::Scalar(0, 0, 0), -1); + cv::putText(output_frame, "hand in frame:", cv::Point(5, output_frame.rows - 50), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); - cv::rectangle(output_frame, cv::Rect(270, output_frame.rows - 70, 20, 20), hand_present ? cv::Scalar(0, 255, 0) : cv::Scalar(0,0,255), -1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 67, 15, 15), hand_present ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + cv::putText(output_frame, "background calibrated:", cv::Point(5, output_frame.rows - 30), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 47, 15, 15), background_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); - cv::putText(output_frame, (background_calibrated ? "background calibrated" : "background not calibrated"), cv::Point(5, output_frame.rows-30), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); - cv::putText(output_frame, (skintone_calibrated ? "skincolor calibrated" : "skincolor not calibrated"), cv::Point(5, output_frame.rows-10), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::putText(output_frame, "skin color calibrated:", cv::Point(5, output_frame.rows - 10), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 27, 15, 15), skintone_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + + if (hand_present) + { + std::string hand_text = fingers_amount > 0 ? "open" : "closed"; + cv::putText(output_frame, hand_text, cv::Point(10, 75), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 0, 255), 3); + } } void HandCalibrator::SetSkinCalibration(bool val) @@ -45,6 +51,11 @@ namespace computervision hand_present = val; } + void HandCalibrator::SetAmountOfFingers(int amount) + { + fingers_amount = amount; + } + bool HandCalibrator::CheckIfHandPresent(cv::Mat input_image) { std::vector> points; diff --git a/src/computervision/calibration/HandCalibrator.h b/src/computervision/calibration/HandCalibrator.h index f402adb..9b2f7ae 100644 --- a/src/computervision/calibration/HandCalibrator.h +++ b/src/computervision/calibration/HandCalibrator.h @@ -47,6 +47,18 @@ namespace computervision */ bool CheckIfHandPresent(cv::Mat input_image); + /** + * @brief sets the amount of fingers that are currently detected. + * + * @param amount the amount of fingers. + */ + void SetAmountOfFingers(int amount); + private: + + bool background_calibrated; + bool skintone_calibrated; + bool hand_present; + int fingers_amount; }; } From 625965ed1b3ba6d1ac3c5062c6ba559c81deef45 Mon Sep 17 00:00:00 2001 From: Menno Date: Tue, 8 Jun 2021 12:22:54 +0200 Subject: [PATCH 22/30] [ADDED] rotating bounding boxes --- src/collision/collision.h | 13 +++++++++++++ src/entities/HouseGenerator.cpp | 8 ++++++-- src/main.cpp | 11 +++++++++++ src/scenes/in_Game_Scene.cpp | 2 +- 4 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/collision/collision.h b/src/collision/collision.h index d04f974..dadb11f 100644 --- a/src/collision/collision.h +++ b/src/collision/collision.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "../entities/entity.h" @@ -15,6 +16,18 @@ namespace collision { glm::vec3 center_pos; glm::vec3 size; + + void SetRotation(float angle) + { + double sinTheta = glm::sin(glm::radians(angle)); + double cosTheta = glm::cos(glm::radians(angle)); + + float x = size.x * cosTheta + size.z * sinTheta; + float z = size.z * cosTheta - size.x * sinTheta; + + size.x = x < 0 ? -x : x; + size.z = z < 0 ? -z : z; + } }; /* diff --git a/src/entities/HouseGenerator.cpp b/src/entities/HouseGenerator.cpp index 972ceb7..0767071 100644 --- a/src/entities/HouseGenerator.cpp +++ b/src/entities/HouseGenerator.cpp @@ -6,6 +6,7 @@ #include "../renderEngine/obj_loader.h" #include "../renderEngine/Loader.h" #include "../toolbox/toolbox.h" +#include "collision_entity.h" namespace entities { @@ -27,8 +28,11 @@ namespace entities furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); // Add furniture - models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); - furniture.push_back(std::make_shared(couch, glm::vec3(position.x, position.y + 20, position.z + 10), glm::vec3(0, 0, 0), HOUSE_SIZE)); + models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); + glm::vec3 couchPos = glm::vec3(position.x, position.y + 20, position.z + 10); + collision::Box couchBox = { couchPos, couch.raw_model.model_size }; + couchBox.SetRotation(90); + furniture.push_back(std::make_shared(couch, couchPos, glm::vec3(0, 0, 0), HOUSE_SIZE, couchBox)); return furniture; } diff --git a/src/main.cpp b/src/main.cpp index cf20294..b6f5604 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -12,6 +12,7 @@ #include #include +#include "collision/collision.h" #include "gui/gui_interactable.h" #include "models/model.h" #include "renderEngine/loader.h" @@ -36,6 +37,16 @@ scene::Scene* current_scene; int main(void) { + + collision::Box box = { glm::vec3(0, 0, 0), glm::vec3(5, 2, 10) }; + box.SetRotation(180); + std::cout << box.size.x << std::endl; + std::cout << box.size.y << std::endl; + std::cout << box.size.z << std::endl; + + return 0; + + #pragma region OPENGL_SETTINGS if (!glfwInit()) throw "Could not inditialize glwf"; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 3706ab5..9c3284d 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -162,7 +162,7 @@ namespace scene void scene::In_Game_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods) { - if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) { return_value = scene::Scenes::STOP; } From 1e55736615593b22471ddb6fb7bcdacbba93ff82 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 13:17:07 +0200 Subject: [PATCH 23/30] [ADD] multiple hand detection squares --- src/computervision/HandDetectRegion.cpp | 97 ++++++++++++++++++++++++- src/computervision/HandDetectRegion.h | 34 +++++++-- src/computervision/SkinDetector.cpp | 70 ++++++++++++++++++ src/computervision/SkinDetector.h | 9 +++ src/scenes/startup_Scene.cpp | 33 ++++++++- wk2_fps.vcxproj | 2 + wk2_fps.vcxproj.filters | 2 + 7 files changed, 238 insertions(+), 9 deletions(-) diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp index 0b012db..cf09f07 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/HandDetectRegion.cpp @@ -1,10 +1,105 @@ #include "HandDetectRegion.h" + namespace computervision { - HandDetectRegion::HandDetectRegion() + + HandDetectRegion::HandDetectRegion(std::string id,int x_pos, int y_pos, int width, int height) { + region_id = id; + start_x_pos = x_pos; + start_y_pos = y_pos; + region_width = width; + region_height = height; + hand_mask_generated = false; + hand_present = false; } + void HandDetectRegion::DetectHand(cv::Mat& camera_frame) + { + Mat input_frame = GenerateHandMaskSquare(camera_frame); + frame_out = input_frame.clone(); + + // detect skin color + skin_detector.drawSkinColorSampler(camera_frame,start_x_pos,start_y_pos,region_width,region_height); + + // remove background from image + foreground = background_remover.getForeground(input_frame); + + // detect the hand contours + handMask = skin_detector.getSkinMask(foreground); + + // count the amount of fingers and put the info on the matrix + //fingerCountDebug = finger_count.findFingersCount(handMask, frame_out); + + //// get the amount of fingers + //int fingers_amount = finger_count.getAmountOfFingers(); + + // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. + DrawHandMask(&camera_frame); + + + //hand_calibrator.SetAmountOfFingers(fingers_amount); + //finger_count.DrawHandContours(camera_frame); + //hand_calibrator.DrawHandCalibrationText(camera_frame); + //imshow("camera", camera_frame); + + imshow("output" + region_id, frame_out); + imshow("foreground" + region_id, foreground); + imshow("handMask" + region_id, handMask); + /*imshow("handDetection", fingerCountDebug);*/ + + hand_present = hand_calibrator.CheckIfHandPresent(handMask); + std::string text = (hand_present ? "hand" : "no"); + cv::putText(camera_frame, text, cv::Point(start_x_pos, start_y_pos), cv::FONT_HERSHEY_COMPLEX, 2.0, cv::Scalar(0, 255, 255), 2); + hand_calibrator.SetHandPresent(hand_present); + + } + + cv::Mat HandDetectRegion::GenerateHandMaskSquare(cv::Mat img) + { + cv::Mat mask = cv::Mat::zeros(img.size(), img.type()); + cv::Mat distance_img = cv::Mat::zeros(img.size(), img.type()); + + cv::rectangle(mask, cv::Rect(start_x_pos, start_y_pos, region_width, region_height), cv::Scalar(255, 255, 255), -1); + + img.copyTo(distance_img, mask); + + hand_mask_generated = true; + return distance_img; + } + + bool HandDetectRegion::DrawHandMask(cv::Mat* input) + { + if (!hand_mask_generated) return false; + rectangle(*input, Rect(start_x_pos, start_y_pos, region_width, region_height), Scalar(255, 255, 255)); + return true; + } + + bool HandDetectRegion::IsHandPresent() + { + return hand_present; + } + + void HandDetectRegion::CalibrateBackground() + { + background_remover.calibrate(frame_out); + hand_calibrator.SetBackGroundCalibrated(true); + } + void HandDetectRegion::CalibrateSkin() + { + skin_detector.calibrate(frame_out); + hand_calibrator.SetSkinCalibration(true); + } + + std::vector HandDetectRegion::CalculateSkinTresholds() + { + return skin_detector.calibrateAndReturn(frame_out); + } + + void HandDetectRegion::setSkinTresholds(std::vector& tresholds) + { + skin_detector.setTresholds(tresholds); + } } diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/HandDetectRegion.h index 4bdadf2..3594ff3 100644 --- a/src/computervision/HandDetectRegion.h +++ b/src/computervision/HandDetectRegion.h @@ -1,22 +1,46 @@ #pragma once #include +#include +#include "async/StaticCameraInstance.h" +#include "calibration/HandCalibrator.h" +#include "BackgroundRemover.h" +#include "SkinDetector.h" +#include "FingerCount.h" namespace computervision { class HandDetectRegion { public: - HandDetectRegion(); + HandDetectRegion(std::string id,int x_pos, int y_pos, int width, int height); - cv::Mat GenerateHandMaskSquare(); + cv::Mat GenerateHandMaskSquare(cv::Mat img); - void detectHand(cv::Mat camera_frame); + void DetectHand(cv::Mat& camera_frame); + + bool IsHandPresent(); + + void CalibrateBackground(); + void CalibrateSkin(); + + std::vector CalculateSkinTresholds(); + + void setSkinTresholds(std::vector& tresholds); private: int start_x_pos; int start_y_pos; - int height; - int width; + int region_height; + int region_width; + bool hand_mask_generated; + bool hand_present; + cv::Mat frame, frame_out, handMask, foreground, fingerCountDebug; + BackgroundRemover background_remover; + SkinDetector skin_detector; + handcalibration::HandCalibrator hand_calibrator; + std::string region_id; + + bool DrawHandMask(cv::Mat* input); }; } diff --git a/src/computervision/SkinDetector.cpp b/src/computervision/SkinDetector.cpp index 971ff2a..100f25f 100644 --- a/src/computervision/SkinDetector.cpp +++ b/src/computervision/SkinDetector.cpp @@ -1,4 +1,5 @@ #include "SkinDetector.h" +#include /* Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti @@ -41,6 +42,29 @@ namespace computervision ); } + void SkinDetector::drawSkinColorSampler(Mat input,int x, int y,int width, int height) { + int frameWidth = width, frameHeight = height; + + int rectangleSize = 25; + Scalar rectangleColor = Scalar(0, 255, 255); + + skinColorSamplerRectangle1 = Rect(frameWidth / 5 + x, frameHeight / 2 + y, rectangleSize, rectangleSize); + skinColorSamplerRectangle2 = Rect(frameWidth / 5 + x, frameHeight / 3 + y, rectangleSize, rectangleSize); + + rectangle( + input, + skinColorSamplerRectangle1, + rectangleColor + ); + + rectangle( + input, + skinColorSamplerRectangle2, + rectangleColor + ); + } + + void SkinDetector::calibrate(Mat input) { Mat hsvInput; @@ -54,6 +78,19 @@ namespace computervision calibrated = true; } + std::vector SkinDetector::calibrateAndReturn(Mat input) + { + Mat hsvInput; + cvtColor(input, hsvInput, CV_BGR2HSV); + + Mat sample1 = Mat(hsvInput, skinColorSamplerRectangle1); + Mat sample2 = Mat(hsvInput, skinColorSamplerRectangle2); + + calibrated = true; + return calculateAndReturnTresholds(sample1, sample2); + + } + void SkinDetector::calculateThresholds(Mat sample1, Mat sample2) { int offsetLowThreshold = 80; int offsetHighThreshold = 30; @@ -75,6 +112,39 @@ namespace computervision //vHighThreshold = 255; } + std::vector SkinDetector::calculateAndReturnTresholds(Mat sample1, Mat sample2) + { + + calculateThresholds(sample1, sample2); + std::vector res; + res.push_back(hLowThreshold); + res.push_back(hHighThreshold); + res.push_back(sLowThreshold); + res.push_back(sHighThreshold); + res.push_back(vLowThreshold); + res.push_back(vHighThreshold); + return res; + } + + void SkinDetector::setTresholds(std::vector& tresholds) + { + if (tresholds.size() != 6) + { + std::cout << "tresholds array not the right size!" << std::endl; + return; + } + + hLowThreshold = tresholds[0]; + hHighThreshold = tresholds[1]; + sLowThreshold = tresholds[2]; + sHighThreshold = tresholds[3]; + vLowThreshold = tresholds[4]; + vHighThreshold = tresholds[5]; + + calibrated = true; + + } + Mat SkinDetector::getSkinMask(Mat input) { Mat skinMask; diff --git a/src/computervision/SkinDetector.h b/src/computervision/SkinDetector.h index c6cf158..02e9dfb 100644 --- a/src/computervision/SkinDetector.h +++ b/src/computervision/SkinDetector.h @@ -24,6 +24,9 @@ namespace computervision */ void drawSkinColorSampler(Mat input); + void drawSkinColorSampler(Mat input, int x, int y, int width, int heigth); + + /* * @brief calibrates the skin color detector with the given input frame * @@ -31,6 +34,10 @@ namespace computervision */ void calibrate(Mat input); + std::vector calibrateAndReturn(Mat input); + + void setTresholds(std::vector& tresholds); + /* * @brief gets the mask for the hand * @@ -63,6 +70,8 @@ namespace computervision */ void calculateThresholds(Mat sample1, Mat sample2); + std::vector calculateAndReturnTresholds(Mat sample1, Mat sample2); + /** * @brief the opening. it generates the structuring element and performs the morphological transformations required to detect the hand. * This needs to be done to get the skin mask. diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index e889139..dc9d12c 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -3,14 +3,20 @@ #include #include "startup_Scene.h" #include "../computervision/ObjectDetection.h" +#include "../computervision/HandDetectRegion.h" #include namespace scene { + std::vector regions; computervision::ObjectDetection objDetect; + computervision::HandDetectRegion reg1("left",20,100,150,150); + computervision::HandDetectRegion reg2("right",200,200,150,150); scene::Scenes scene::Startup_Scene::start(GLFWwindow *window) { + regions.push_back(reg1); + regions.push_back(reg2); while (return_value == scene::Scenes::STARTUP) { render(); @@ -30,9 +36,30 @@ namespace scene void scene::Startup_Scene::update(GLFWwindow* window) { - bool hand_detected = false; - objDetect.DetectHand(objDetect.ReadCamera(),hand_detected); - if (hand_detected) std::cout << "there's a hand!" << std::endl; + cv::Mat camera_frame = objDetect.ReadCamera(); + reg1.DetectHand(camera_frame); + reg2.DetectHand(camera_frame); + + cv::imshow("camera", camera_frame); + + int key = cv::waitKey(1); + + if (key == 98) // b, calibrate the background + { + for (int i = 0; i < regions.size(); i++) + { + regions[i].CalibrateBackground(); + } + } + else if (key == 115) // s, calibrate the skin color + { + std::vector tresholds = regions[0].CalculateSkinTresholds(); + for (int i = 1; i < regions.size(); i++) + { + regions[i].setSkinTresholds(tresholds); + } + + } } diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 9658b78..4d0fabf 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -21,6 +21,7 @@ + @@ -46,6 +47,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index de921ef..3e9201f 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -23,6 +23,7 @@ + @@ -54,6 +55,7 @@ + From cadee7d8e9a2a4fc5db6010f8ea996f8dbdf4a8b Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 13:38:47 +0200 Subject: [PATCH 24/30] [ADD] hand detection type enum --- src/computervision/HandDetectRegion.cpp | 19 ++++-------- .../calibration/HandCalibrator.cpp | 11 +++++-- .../calibration/HandCalibrator.h | 11 ++++++- src/scenes/in_Game_Scene.cpp | 29 ++++++++++++++++++ src/scenes/in_Game_Scene.h | 1 + src/scenes/startup_Scene.cpp | 30 ------------------- 6 files changed, 53 insertions(+), 48 deletions(-) diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp index cf09f07..f789db6 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/HandDetectRegion.cpp @@ -29,23 +29,11 @@ namespace computervision // detect the hand contours handMask = skin_detector.getSkinMask(foreground); - // count the amount of fingers and put the info on the matrix - //fingerCountDebug = finger_count.findFingersCount(handMask, frame_out); - - //// get the amount of fingers - //int fingers_amount = finger_count.getAmountOfFingers(); - // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. DrawHandMask(&camera_frame); - - //hand_calibrator.SetAmountOfFingers(fingers_amount); - //finger_count.DrawHandContours(camera_frame); - //hand_calibrator.DrawHandCalibrationText(camera_frame); - //imshow("camera", camera_frame); - - imshow("output" + region_id, frame_out); - imshow("foreground" + region_id, foreground); + //imshow("output" + region_id, frame_out); + //imshow("foreground" + region_id, foreground); imshow("handMask" + region_id, handMask); /*imshow("handDetection", fingerCountDebug);*/ @@ -83,6 +71,7 @@ namespace computervision void HandDetectRegion::CalibrateBackground() { + std::cout << "calibrating background " << region_id << std::endl; background_remover.calibrate(frame_out); hand_calibrator.SetBackGroundCalibrated(true); } @@ -94,11 +83,13 @@ namespace computervision std::vector HandDetectRegion::CalculateSkinTresholds() { + std::cout << "calibrating skin " << region_id << std::endl; return skin_detector.calibrateAndReturn(frame_out); } void HandDetectRegion::setSkinTresholds(std::vector& tresholds) { + std::cout << "setting skin " << region_id << std::endl; skin_detector.setTresholds(tresholds); } diff --git a/src/computervision/calibration/HandCalibrator.cpp b/src/computervision/calibration/HandCalibrator.cpp index 36c64ea..86f3aa5 100644 --- a/src/computervision/calibration/HandCalibrator.cpp +++ b/src/computervision/calibration/HandCalibrator.cpp @@ -1,7 +1,8 @@ #include "HandCalibrator.h" -#define MIN_HAND_SIZE 10000 +#define MIN_MENU_HAND_SIZE 10000 +#define MIN_GAME_HAND_SIZE 10000 // todo change namespace computervision { namespace handcalibration @@ -56,7 +57,7 @@ namespace computervision fingers_amount = amount; } - bool HandCalibrator::CheckIfHandPresent(cv::Mat input_image) + bool HandCalibrator::CheckIfHandPresent(cv::Mat input_image, HandDetectionType type) { std::vector> points; cv::findContours(input_image, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE); @@ -66,7 +67,11 @@ namespace computervision for (int p = 0; p < points.size(); p++) { int area = cv::contourArea(points[p]); - if (area > MIN_HAND_SIZE) return true; + if (type == handcalibration::HandDetectionType::MENU) + if (area > MIN_MENU_HAND_SIZE) return true; + + if (type == handcalibration::HandDetectionType::GAME) + if (area > MIN_GAME_HAND_SIZE) return true; } return false; diff --git a/src/computervision/calibration/HandCalibrator.h b/src/computervision/calibration/HandCalibrator.h index 9b2f7ae..fadc66d 100644 --- a/src/computervision/calibration/HandCalibrator.h +++ b/src/computervision/calibration/HandCalibrator.h @@ -7,11 +7,19 @@ namespace computervision { namespace handcalibration { + enum class HandDetectionType + { + MENU, + GAME + }; + class HandCalibrator { public: HandCalibrator(); + + /** * @brief draws the text to show the status of the calibration on the image * @@ -45,7 +53,7 @@ namespace computervision * * @param input_image the input image to check. */ - bool CheckIfHandPresent(cv::Mat input_image); + bool CheckIfHandPresent(cv::Mat input_image, HandDetectionType type); /** * @brief sets the amount of fingers that are currently detected. @@ -53,6 +61,7 @@ namespace computervision * @param amount the amount of fingers. */ void SetAmountOfFingers(int amount); + private: bool background_calibrated; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 0e7c268..bbadf93 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -10,6 +10,9 @@ #include "../renderEngine/renderer.h" #include "../shaders/entity_shader.h" #include "../toolbox/toolbox.h" +#include +#include "../computervision/HandDetectRegion.h" +#include "../computervision/ObjectDetection.h" namespace scene @@ -23,6 +26,11 @@ namespace scene entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)); std::vector guis; + std::vector regions; + computervision::ObjectDetection objDetect; + computervision::HandDetectRegion reg1("left", 20, 100, 150, 150); + computervision::HandDetectRegion reg2("right", 200, 200, 150, 150); + In_Game_Scene::In_Game_Scene() { @@ -105,6 +113,7 @@ namespace scene void scene::In_Game_Scene::update(GLFWwindow* window) { camera.Move(window); + update_hand_detection(); } void scene::In_Game_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods) @@ -113,6 +122,26 @@ namespace scene { return_value = scene::Scenes::STOP; } + + if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS) + { + reg1.CalibrateBackground(); + reg2.CalibrateBackground(); + } + + if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) + { + std::vector tresholds = reg1.CalculateSkinTresholds(); + reg2.setSkinTresholds(tresholds); + } } + void scene::In_Game_Scene::update_hand_detection() + { + cv::Mat camera_frame = objDetect.ReadCamera(); + reg1.DetectHand(camera_frame); + reg2.DetectHand(camera_frame); + + cv::imshow("camera", camera_frame); + } } diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 4581855..cb420d3 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -8,6 +8,7 @@ namespace scene { private: scene::Scenes return_value = scene::Scenes::INGAME; + void update_hand_detection(); public: In_Game_Scene(); diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index dc9d12c..7ef51db 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -8,15 +8,9 @@ namespace scene { - std::vector regions; - computervision::ObjectDetection objDetect; - computervision::HandDetectRegion reg1("left",20,100,150,150); - computervision::HandDetectRegion reg2("right",200,200,150,150); scene::Scenes scene::Startup_Scene::start(GLFWwindow *window) { - regions.push_back(reg1); - regions.push_back(reg2); while (return_value == scene::Scenes::STARTUP) { render(); @@ -36,30 +30,6 @@ namespace scene void scene::Startup_Scene::update(GLFWwindow* window) { - cv::Mat camera_frame = objDetect.ReadCamera(); - reg1.DetectHand(camera_frame); - reg2.DetectHand(camera_frame); - - cv::imshow("camera", camera_frame); - - int key = cv::waitKey(1); - - if (key == 98) // b, calibrate the background - { - for (int i = 0; i < regions.size(); i++) - { - regions[i].CalibrateBackground(); - } - } - else if (key == 115) // s, calibrate the skin color - { - std::vector tresholds = regions[0].CalculateSkinTresholds(); - for (int i = 1; i < regions.size(); i++) - { - regions[i].setSkinTresholds(tresholds); - } - - } } From b092bd5f0a46a5599fd203cbb6bd6b9664a85344 Mon Sep 17 00:00:00 2001 From: Menno Date: Tue, 8 Jun 2021 14:24:12 +0200 Subject: [PATCH 25/30] [ADD] furniture --- src/entities/Camera.cpp | 6 +- src/entities/Camera.h | 2 +- src/entities/HouseGenerator.cpp | 66 ---------- src/entities/house_generator.cpp | 116 ++++++++++++++++++ .../{HouseGenerator.h => house_generator.h} | 4 +- src/main.cpp | 10 -- src/scenes/in_Game_Scene.cpp | 4 +- wk2_fps.vcxproj | 4 +- wk2_fps.vcxproj.filters | 4 +- 9 files changed, 130 insertions(+), 86 deletions(-) delete mode 100644 src/entities/HouseGenerator.cpp create mode 100644 src/entities/house_generator.cpp rename src/entities/{HouseGenerator.h => house_generator.h} (98%) diff --git a/src/entities/Camera.cpp b/src/entities/Camera.cpp index d2b38cf..16a3ff9 100644 --- a/src/entities/Camera.cpp +++ b/src/entities/Camera.cpp @@ -33,12 +33,14 @@ namespace entities if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { - rotation.x -= ROT_SPEED; + //rotation.x -= ROT_SPEED; + position.y += 5; } if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) { - rotation.x += ROT_SPEED; + //rotation.x += ROT_SPEED; + position.y -= 5; } float dx = glm::cos(glm::radians(rotation.y + 90)) * movement_speed; diff --git a/src/entities/Camera.h b/src/entities/Camera.h index a47af65..46797f4 100644 --- a/src/entities/Camera.h +++ b/src/entities/Camera.h @@ -13,7 +13,7 @@ namespace entities { private: // The movement speed of the camera - const float SPEED = 0.52f; + const float SPEED = 2.0f; const float ROT_SPEED = 1.0f; glm::vec3 position; diff --git a/src/entities/HouseGenerator.cpp b/src/entities/HouseGenerator.cpp deleted file mode 100644 index 0767071..0000000 --- a/src/entities/HouseGenerator.cpp +++ /dev/null @@ -1,66 +0,0 @@ -#include "HouseGenerator.h" - -#include -#include - -#include "../renderEngine/obj_loader.h" -#include "../renderEngine/Loader.h" -#include "../toolbox/toolbox.h" -#include "collision_entity.h" - -namespace entities -{ - HouseGenerator::HouseGenerator() - { - models::RawModel raw_model = render_engine::LoadObjModel("res/HouseNew.obj"); - default_texture = { render_engine::loader::LoadTexture("res/Texture.png") }; - default_texture.shine_damper = 10; - house_model = { raw_model, default_texture }; - - GenerateFurnitureModels(); - } - - std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) - { - std::deque> furniture; - - // Add house - furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); - - // Add furniture - models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); - glm::vec3 couchPos = glm::vec3(position.x, position.y + 20, position.z + 10); - collision::Box couchBox = { couchPos, couch.raw_model.model_size }; - couchBox.SetRotation(90); - furniture.push_back(std::make_shared(couch, couchPos, glm::vec3(0, 0, 0), HOUSE_SIZE, couchBox)); - - return furniture; - } - - models::TexturedModel HouseGenerator::GetFurnitureModel(FurnitureType furniture) - { - const auto found = furniture_models.find(furniture); - if (found == furniture_models.end()) - { - std::cerr << "OH NEEEEEEEEEEEEEEE"; - } - - auto models = found->second; - - const int modelNumber = toolbox::Random(0, models.size() - 1); - - return models[modelNumber]; - } - - void HouseGenerator::GenerateFurnitureModels() - { - // Couches - std::deque couches; - - models::RawModel couch_inside_model = render_engine::LoadObjModel("res/couchThree.obj"); - models::TexturedModel couch_inside = { couch_inside_model, default_texture }; - couches.push_back(couch_inside); - - furniture_models.insert(std::pair>(FurnitureType::COUCH, couches)); - } -} diff --git a/src/entities/house_generator.cpp b/src/entities/house_generator.cpp new file mode 100644 index 0000000..f868920 --- /dev/null +++ b/src/entities/house_generator.cpp @@ -0,0 +1,116 @@ +#include "house_generator.h" + +#include +#include + +#include "../renderEngine/obj_loader.h" +#include "../renderEngine/Loader.h" +#include "../toolbox/toolbox.h" +#include "collision_entity.h" + +namespace entities +{ + HouseGenerator::HouseGenerator() + { + models::RawModel raw_model = render_engine::LoadObjModel("res/HouseNew.obj"); + default_texture = { render_engine::loader::LoadTexture("res/Texture.png") }; + default_texture.shine_damper = 10; + house_model = { raw_model, default_texture }; + + GenerateFurnitureModels(); + } + + std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) + { + std::deque> furniture; + + // Add house + furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); + + // Add furniture + models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); + glm::vec3 couch_pos = glm::vec3(position.x + 200, position.y, position.z + 10); + collision::Box couch_box = { couch_pos, couch.raw_model.model_size }; + couch_box.SetRotation(-90); + furniture.push_back(std::make_shared(couch, couch_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, couch_box)); + + models::TexturedModel table = GetFurnitureModel(FurnitureType::TABLE); + glm::vec3 table_pos = glm::vec3(position.x - 30, position.y, position.z); + collision::Box table_box = { table_pos, table.raw_model.model_size }; + furniture.push_back(std::make_shared(table, table_pos, glm::vec3(0, 0, 0), HOUSE_SIZE * 1.3, table_box)); + + models::TexturedModel chair = GetFurnitureModel(FurnitureType::CHAIR); + glm::vec3 chair_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box chair_box = { chair_pos, chair.raw_model.model_size }; + furniture.push_back(std::make_shared(chair, chair_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, chair_box)); + + return furniture; + } + + models::TexturedModel HouseGenerator::GetFurnitureModel(FurnitureType furniture) + { + const auto found = furniture_models.find(furniture); + if (found == furniture_models.end()) + { + std::cerr << "OH NEEEEEEEEEEEEEEE"; + } + + auto models = found->second; + + const int modelNumber = toolbox::Random(0, models.size() - 1); + + return models[modelNumber]; + } + + void HouseGenerator::GenerateFurnitureModels() + { + // Couches + std::deque couches; + + models::RawModel couch_inside_model = render_engine::LoadObjModel("res/couchThree.obj"); + models::TexturedModel couch_inside = { couch_inside_model, default_texture }; + couches.push_back(couch_inside); + + models::RawModel couch_inside_model2 = render_engine::LoadObjModel("res/Coach.obj"); + models::TexturedModel couch_inside2 = { couch_inside_model2, default_texture }; + couches.push_back(couch_inside2); + + models::RawModel couch_inside_model3 = render_engine::LoadObjModel("res/lawnBenchOne.obj"); + models::TexturedModel couch_inside3 = { couch_inside_model3, default_texture }; + couches.push_back(couch_inside3); + + furniture_models.insert(std::pair>(FurnitureType::COUCH, couches)); + + // Tables + std::deque tables; + + models::RawModel table_model1 = render_engine::LoadObjModel("res/tableOne.obj"); + models::TexturedModel table1 = { table_model1, default_texture }; + tables.push_back(table1); + + models::RawModel table_model2 = render_engine::LoadObjModel("res/tableTwo.obj"); + models::TexturedModel table2 = { table_model2, default_texture }; + tables.push_back(table2); + + furniture_models.insert(std::pair>(FurnitureType::TABLE, tables)); + + // Chairs + std::deque chairs; + + models::RawModel chair_model1 = render_engine::LoadObjModel("res/launchchair.obj"); + models::TexturedModel chair1 = { chair_model1, default_texture }; + chairs.push_back(chair1); + + models::RawModel chair_model2 = render_engine::LoadObjModel("res/lawnChairOne.obj"); + models::TexturedModel chair2 = { chair_model2, default_texture }; + chairs.push_back(chair2); + + models::RawModel chair_model3 = render_engine::LoadObjModel("res/ugly_chair.obj"); + models::TexturedModel chair3 = { chair_model3, default_texture }; + chairs.push_back(chair3); + + // Plants + + furniture_models.insert(std::pair>(FurnitureType::CHAIR, chairs)); + } +} diff --git a/src/entities/HouseGenerator.h b/src/entities/house_generator.h similarity index 98% rename from src/entities/HouseGenerator.h rename to src/entities/house_generator.h index 7495f24..dad3f76 100644 --- a/src/entities/HouseGenerator.h +++ b/src/entities/house_generator.h @@ -10,7 +10,9 @@ namespace entities { enum class FurnitureType { - COUCH + COUCH, + TABLE, + CHAIR }; class HouseGenerator diff --git a/src/main.cpp b/src/main.cpp index b6f5604..cd145fe 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -37,16 +37,6 @@ scene::Scene* current_scene; int main(void) { - - collision::Box box = { glm::vec3(0, 0, 0), glm::vec3(5, 2, 10) }; - box.SetRotation(180); - std::cout << box.size.x << std::endl; - std::cout << box.size.y << std::endl; - std::cout << box.size.z << std::endl; - - return 0; - - #pragma region OPENGL_SETTINGS if (!glfwInit()) throw "Could not inditialize glwf"; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 9c3284d..7f53413 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -10,7 +10,7 @@ #include "../renderEngine/renderer.h" #include "../shaders/entity_shader.h" #include "../toolbox/toolbox.h" -#include "../entities/HouseGenerator.h" +#include "../entities/house_generator.h" #include #include #include @@ -31,7 +31,7 @@ namespace scene models::ModelTexture texture; shaders::EntityShader* shader; shaders::GuiShader* gui_shader; - entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)); + entities::Camera camera(glm::vec3(0, -50, 0), glm::vec3(0, 0, 0)); std::vector guis; diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index f5db84e..d8fb3c7 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -20,7 +20,7 @@ - + @@ -44,7 +44,7 @@ - + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 3057d3f..0ab51e8 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -75,7 +75,7 @@ Source Files - + Source Files @@ -158,7 +158,7 @@ Header Files - + Header Files From 5e137faef5ead4894838780f1a3475205a4602fe Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 14:48:46 +0200 Subject: [PATCH 26/30] [ADD] up left and right detection regions --- src/computervision/HandDetectRegion.cpp | 2 +- src/computervision/HandDetectRegion.h | 10 +++++++ src/computervision/ObjectDetection.cpp | 2 +- .../calibration/HandCalibrator.cpp | 5 +++- src/scenes/in_Game_Scene.cpp | 28 +++++++++++++------ 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp index f789db6..9c451a9 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/HandDetectRegion.cpp @@ -37,7 +37,7 @@ namespace computervision imshow("handMask" + region_id, handMask); /*imshow("handDetection", fingerCountDebug);*/ - hand_present = hand_calibrator.CheckIfHandPresent(handMask); + hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::GAME); std::string text = (hand_present ? "hand" : "no"); cv::putText(camera_frame, text, cv::Point(start_x_pos, start_y_pos), cv::FONT_HERSHEY_COMPLEX, 2.0, cv::Scalar(0, 255, 255), 2); hand_calibrator.SetHandPresent(hand_present); diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/HandDetectRegion.h index 3594ff3..7cc1a9a 100644 --- a/src/computervision/HandDetectRegion.h +++ b/src/computervision/HandDetectRegion.h @@ -14,6 +14,16 @@ namespace computervision public: HandDetectRegion(std::string id,int x_pos, int y_pos, int width, int height); + void SetXPos(int x) { start_x_pos = x; } + void SetYPos(int y) { start_y_pos = y; } + int GetXPos() { return start_x_pos; } + int GetYPos() { return start_y_pos; } + + void SetWidth(int width) { region_width = width; } + void SetHeigth(int height) { region_height = height; } + int GetWidth() { return region_width; } + int GetHeight() { return region_height; } + cv::Mat GenerateHandMaskSquare(cv::Mat img); void DetectHand(cv::Mat& camera_frame); diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 530e474..155512e 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -74,7 +74,7 @@ namespace computervision imshow("handMask", handMask); imshow("handDetection", fingerCountDebug);*/ - hand_present = hand_calibrator.CheckIfHandPresent(handMask); + hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::MENU); hand_calibrator.SetHandPresent(hand_present); diff --git a/src/computervision/calibration/HandCalibrator.cpp b/src/computervision/calibration/HandCalibrator.cpp index 86f3aa5..caa4d03 100644 --- a/src/computervision/calibration/HandCalibrator.cpp +++ b/src/computervision/calibration/HandCalibrator.cpp @@ -1,8 +1,9 @@ #include "HandCalibrator.h" +#include #define MIN_MENU_HAND_SIZE 10000 -#define MIN_GAME_HAND_SIZE 10000 // todo change +#define MIN_GAME_HAND_SIZE 4000 // todo change namespace computervision { namespace handcalibration @@ -64,9 +65,11 @@ namespace computervision if (points.size() == 0) return false; + std::cout << std::endl; for (int p = 0; p < points.size(); p++) { int area = cv::contourArea(points[p]); + std::cout << area << std::endl; if (type == handcalibration::HandDetectionType::MENU) if (area > MIN_MENU_HAND_SIZE) return true; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index bbadf93..0eede19 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -26,10 +26,10 @@ namespace scene entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)); std::vector guis; + std::vector regions; computervision::ObjectDetection objDetect; - computervision::HandDetectRegion reg1("left", 20, 100, 150, 150); - computervision::HandDetectRegion reg2("right", 200, 200, 150, 150); + computervision::HandDetectRegion reg_left("left", 0, 0, 150, 150), reg_right("right", 0, 0, 150, 150), reg_up("up", 0, 0, 150, 150); In_Game_Scene::In_Game_Scene() @@ -44,6 +44,15 @@ namespace scene scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window) { + cv::Mat camera_frame = objDetect.ReadCamera(); // get camera frame to know the width and heigth + reg_left.SetXPos(10); + reg_left.SetYPos(camera_frame.rows / 2 - reg_left.GetHeight()/2); + reg_right.SetXPos(camera_frame.cols - 10 - reg_right.GetWidth()); + reg_right.SetYPos(camera_frame.rows / 2 - reg_right.GetHeight()/2); + reg_up.SetXPos(camera_frame.cols / 2 - reg_up.GetWidth() / 2); + reg_up.SetYPos(10); + + raw_model = render_engine::LoadObjModel("res/House.obj"); texture = { render_engine::loader::LoadTexture("res/Texture.png") }; texture.shine_damper = 10; @@ -125,22 +134,25 @@ namespace scene if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS) { - reg1.CalibrateBackground(); - reg2.CalibrateBackground(); + reg_left.CalibrateBackground(); + reg_right.CalibrateBackground(); + reg_up.CalibrateBackground(); } if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) { - std::vector tresholds = reg1.CalculateSkinTresholds(); - reg2.setSkinTresholds(tresholds); + std::vector tresholds = reg_left.CalculateSkinTresholds(); + reg_right.setSkinTresholds(tresholds); + reg_up.setSkinTresholds(tresholds); } } void scene::In_Game_Scene::update_hand_detection() { cv::Mat camera_frame = objDetect.ReadCamera(); - reg1.DetectHand(camera_frame); - reg2.DetectHand(camera_frame); + reg_left.DetectHand(camera_frame); + reg_right.DetectHand(camera_frame); + reg_up.DetectHand(camera_frame); cv::imshow("camera", camera_frame); } From 27594d466b405fe13a0798401e22304d8e7796c3 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 15:11:54 +0200 Subject: [PATCH 27/30] [ADD] better info on camera --- src/computervision/HandDetectRegion.cpp | 13 +++++++++--- .../calibration/HandCalibrator.cpp | 21 ++++++++++++------- .../calibration/HandCalibrator.h | 2 ++ src/scenes/in_Game_Scene.cpp | 1 + 4 files changed, 26 insertions(+), 11 deletions(-) diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp index 9c451a9..3ef6c28 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/HandDetectRegion.cpp @@ -38,10 +38,15 @@ namespace computervision /*imshow("handDetection", fingerCountDebug);*/ hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::GAME); - std::string text = (hand_present ? "hand" : "no"); - cv::putText(camera_frame, text, cv::Point(start_x_pos, start_y_pos), cv::FONT_HERSHEY_COMPLEX, 2.0, cv::Scalar(0, 255, 255), 2); + //std::string text = (hand_present ? "hand" : "no"); + //cv::putText(camera_frame, text, cv::Point(start_x_pos, start_y_pos), cv::FONT_HERSHEY_COMPLEX, 2.0, cv::Scalar(0, 255, 255), 2); hand_calibrator.SetHandPresent(hand_present); + //draw black rectangle behind calibration information text + cv::rectangle(camera_frame, cv::Rect(0, camera_frame.rows - 55, 450, camera_frame.cols), cv::Scalar(0, 0, 0), -1); + + hand_calibrator.DrawBackgroundSkinCalibrated(camera_frame); + } cv::Mat HandDetectRegion::GenerateHandMaskSquare(cv::Mat img) @@ -60,7 +65,7 @@ namespace computervision bool HandDetectRegion::DrawHandMask(cv::Mat* input) { if (!hand_mask_generated) return false; - rectangle(*input, Rect(start_x_pos, start_y_pos, region_width, region_height), Scalar(255, 255, 255)); + rectangle(*input, Rect(start_x_pos, start_y_pos, region_width, region_height), (hand_present ? Scalar(0, 255, 0) : Scalar(0,0,255)),2); return true; } @@ -84,6 +89,7 @@ namespace computervision std::vector HandDetectRegion::CalculateSkinTresholds() { std::cout << "calibrating skin " << region_id << std::endl; + hand_calibrator.SetSkinCalibration(true); return skin_detector.calibrateAndReturn(frame_out); } @@ -91,6 +97,7 @@ namespace computervision { std::cout << "setting skin " << region_id << std::endl; skin_detector.setTresholds(tresholds); + hand_calibrator.SetSkinCalibration(true); } } diff --git a/src/computervision/calibration/HandCalibrator.cpp b/src/computervision/calibration/HandCalibrator.cpp index caa4d03..dcf2911 100644 --- a/src/computervision/calibration/HandCalibrator.cpp +++ b/src/computervision/calibration/HandCalibrator.cpp @@ -3,7 +3,7 @@ #include #define MIN_MENU_HAND_SIZE 10000 -#define MIN_GAME_HAND_SIZE 4000 // todo change +#define MIN_GAME_HAND_SIZE 3000 // todo change namespace computervision { namespace handcalibration @@ -25,11 +25,7 @@ namespace computervision cv::putText(output_frame, "hand in frame:", cv::Point(5, output_frame.rows - 50), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 67, 15, 15), hand_present ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); - cv::putText(output_frame, "background calibrated:", cv::Point(5, output_frame.rows - 30), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); - cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 47, 15, 15), background_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); - - cv::putText(output_frame, "skin color calibrated:", cv::Point(5, output_frame.rows - 10), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); - cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 27, 15, 15), skintone_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + DrawBackgroundSkinCalibrated(output_frame); if (hand_present) { @@ -38,6 +34,16 @@ namespace computervision } } + void HandCalibrator::DrawBackgroundSkinCalibrated(cv::Mat& output_frame) + { + + cv::putText(output_frame, "background calibrated:", cv::Point(5, output_frame.rows - 30), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 47, 15, 15), background_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + + cv::putText(output_frame, "skin color calibrated:", cv::Point(5, output_frame.rows - 10), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1); + cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 27, 15, 15), skintone_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1); + } + void HandCalibrator::SetSkinCalibration(bool val) { skintone_calibrated = val; @@ -65,11 +71,10 @@ namespace computervision if (points.size() == 0) return false; - std::cout << std::endl; for (int p = 0; p < points.size(); p++) { int area = cv::contourArea(points[p]); - std::cout << area << std::endl; + if (type == handcalibration::HandDetectionType::MENU) if (area > MIN_MENU_HAND_SIZE) return true; diff --git a/src/computervision/calibration/HandCalibrator.h b/src/computervision/calibration/HandCalibrator.h index fadc66d..ca71fde 100644 --- a/src/computervision/calibration/HandCalibrator.h +++ b/src/computervision/calibration/HandCalibrator.h @@ -62,6 +62,8 @@ namespace computervision */ void SetAmountOfFingers(int amount); + void DrawBackgroundSkinCalibrated(cv::Mat& output_frame); + private: bool background_calibrated; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 0eede19..44db2e9 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -44,6 +44,7 @@ namespace scene scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window) { + // set up squares according to size of camera input cv::Mat camera_frame = objDetect.ReadCamera(); // get camera frame to know the width and heigth reg_left.SetXPos(10); reg_left.SetYPos(camera_frame.rows / 2 - reg_left.GetHeight()/2); From 88252f4dc8be82211652f2fdbd075623e1bff122 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 15:35:03 +0200 Subject: [PATCH 28/30] [ADD] static skin treshold --- src/computervision/HandDetectRegion.cpp | 4 +++- src/computervision/HandDetectRegion.h | 1 + src/computervision/ObjectDetection.cpp | 11 +++++++++-- src/computervision/calibration/StaticSkinTreshold.h | 10 ++++++++++ src/scenes/in_Game_Scene.cpp | 1 + 5 files changed, 24 insertions(+), 3 deletions(-) create mode 100644 src/computervision/calibration/StaticSkinTreshold.h diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp index 3ef6c28..87f3538 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/HandDetectRegion.cpp @@ -34,7 +34,7 @@ namespace computervision //imshow("output" + region_id, frame_out); //imshow("foreground" + region_id, foreground); - imshow("handMask" + region_id, handMask); + //imshow("handMask" + region_id, handMask); /*imshow("handDetection", fingerCountDebug);*/ hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::GAME); @@ -47,6 +47,8 @@ namespace computervision hand_calibrator.DrawBackgroundSkinCalibrated(camera_frame); + + } cv::Mat HandDetectRegion::GenerateHandMaskSquare(cv::Mat img) diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/HandDetectRegion.h index 7cc1a9a..067badd 100644 --- a/src/computervision/HandDetectRegion.h +++ b/src/computervision/HandDetectRegion.h @@ -7,6 +7,7 @@ #include "BackgroundRemover.h" #include "SkinDetector.h" #include "FingerCount.h" +#include "calibration/StaticSkinTreshold.h" namespace computervision { class HandDetectRegion diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 155512e..ad3e13e 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -10,6 +10,8 @@ #include "async/StaticCameraInstance.h" #include "calibration/HandCalibrator.h" +#include "calibration/StaticSkinTreshold.h" + namespace computervision { @@ -62,7 +64,6 @@ namespace computervision // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. DrawHandMask(&camera_frame); - hand_calibrator.SetAmountOfFingers(fingers_amount); finger_count.DrawHandContours(camera_frame); @@ -88,7 +89,13 @@ namespace computervision } else if (key == 115) // s, calibrate the skin color { - skin_detector.calibrate(input_frame); + std::vector treshold = skin_detector.calibrateAndReturn(input_frame); + StaticSkinTreshold::hLowThreshold = treshold[0]; + StaticSkinTreshold::hHighThreshold = treshold[1]; + StaticSkinTreshold::sLowThreshold = treshold[2]; + StaticSkinTreshold::sHighThreshold = treshold[3]; + StaticSkinTreshold::vLowThreshold = treshold[4]; + StaticSkinTreshold::vHighThreshold = treshold[5]; hand_calibrator.SetSkinCalibration(true); } diff --git a/src/computervision/calibration/StaticSkinTreshold.h b/src/computervision/calibration/StaticSkinTreshold.h new file mode 100644 index 0000000..cfce1f7 --- /dev/null +++ b/src/computervision/calibration/StaticSkinTreshold.h @@ -0,0 +1,10 @@ +#pragma once +namespace StaticSkinTreshold +{ + static int hLowThreshold, + hHighThreshold, + sLowThreshold, + sHighThreshold, + vLowThreshold, + vHighThreshold; +}; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 44db2e9..48d099b 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -130,6 +130,7 @@ namespace scene { if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { + cv::destroyWindow("camera"); return_value = scene::Scenes::STOP; } From dd6ee773161c0518035ae1037b1178894657dc11 Mon Sep 17 00:00:00 2001 From: Menno Date: Tue, 8 Jun 2021 15:53:51 +0200 Subject: [PATCH 29/30] [ADD] added all the models to the project --- src/entities/house_generator.cpp | 146 ++++++++++++++++++++++++++++++- src/entities/house_generator.h | 8 +- 2 files changed, 151 insertions(+), 3 deletions(-) diff --git a/src/entities/house_generator.cpp b/src/entities/house_generator.cpp index f868920..6573701 100644 --- a/src/entities/house_generator.cpp +++ b/src/entities/house_generator.cpp @@ -26,7 +26,18 @@ namespace entities // Add house furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); + + for(int i = 0; i(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); + } + /* // Add furniture models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); glm::vec3 couch_pos = glm::vec3(position.x + 200, position.y, position.z + 10); @@ -43,7 +54,37 @@ namespace entities glm::vec3 chair_pos = glm::vec3(position.x - 50, position.y, position.z + 220); collision::Box chair_box = { chair_pos, chair.raw_model.model_size }; furniture.push_back(std::make_shared(chair, chair_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, chair_box)); + + models::TexturedModel plant = GetFurnitureModel(FurnitureType::PLANT); + glm::vec3 plant_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box plant_box = { plant_pos, plant.raw_model.model_size }; + furniture.push_back(std::make_shared(plant, plant_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, plant_box)); + + models::TexturedModel guitar = GetFurnitureModel(FurnitureType::GUITAR); + glm::vec3 guitar_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box guitar_box = { guitar_pos, guitar.raw_model.model_size }; + furniture.push_back(std::make_shared(guitar, guitar_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, guitar_box)); + models::TexturedModel bookshelf = GetFurnitureModel(FurnitureType::BOOKSHELF); + glm::vec3 bookshelf_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box bookshelf_box = { bookshelf_pos, bookshelf.raw_model.model_size }; + furniture.push_back(std::make_shared(bookshelf, bookshelf_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, bookshelf_box)); + + models::TexturedModel lamp = GetFurnitureModel(FurnitureType::LAMP); + glm::vec3 lamp_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box lamp_box = { lamp_pos, lamp.raw_model.model_size }; + furniture.push_back(std::make_shared(lamp, lamp_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, lamp_box)); + + models::TexturedModel ceiling_object = GetFurnitureModel(FurnitureType::CEILING_OBJECTS); + glm::vec3 ceiling_object_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box ceiling_object_box = { ceiling_object_pos, ceiling_object.raw_model.model_size }; + furniture.push_back(std::make_shared(ceiling_object, ceiling_object_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, ceiling_object_box)); + + models::TexturedModel misc = GetFurnitureModel(FurnitureType::MISC); + glm::vec3 misc_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + collision::Box misc_box = { misc_pos, misc.raw_model.model_size }; + furniture.push_back(std::make_shared(misc, misc_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, misc_box)); + */ return furniture; } @@ -91,6 +132,10 @@ namespace entities models::RawModel table_model2 = render_engine::LoadObjModel("res/tableTwo.obj"); models::TexturedModel table2 = { table_model2, default_texture }; tables.push_back(table2); + + models::RawModel table_model3 = render_engine::LoadObjModel("res/bureauOne.obj"); + models::TexturedModel table3 = { table_model3, default_texture }; + tables.push_back(table3); furniture_models.insert(std::pair>(FurnitureType::TABLE, tables)); @@ -109,8 +154,105 @@ namespace entities models::TexturedModel chair3 = { chair_model3, default_texture }; chairs.push_back(chair3); - // Plants - furniture_models.insert(std::pair>(FurnitureType::CHAIR, chairs)); + + + // Plants + std::deque plants; + + models::RawModel plant_model1 = render_engine::LoadObjModel("res/plantOne.obj"); + models::TexturedModel plant1 = { plant_model1, default_texture }; + plants.push_back(plant1); + + models::RawModel plant_model2 = render_engine::LoadObjModel("res/plantTwo.obj"); + models::TexturedModel plant2 = { plant_model2, default_texture }; + plants.push_back(plant2); + + models::RawModel plant_model3 = render_engine::LoadObjModel("res/plantThree.obj"); + models::TexturedModel plant3 = { plant_model3, default_texture }; + plants.push_back(plant3); + + furniture_models.insert(std::pair>(FurnitureType::PLANT, plants)); + + // Guitars + std::deque guitars; + + models::RawModel guitar_model1 = render_engine::LoadObjModel("res/guitarOne.obj"); + models::TexturedModel guitar1 = { guitar_model1, default_texture }; + guitars.push_back(guitar1); + + models::RawModel guitar_model2 = render_engine::LoadObjModel("res/guitarTwo.obj"); + models::TexturedModel guitar2 = { guitar_model2, default_texture }; + guitars.push_back(guitar2); + + furniture_models.insert(std::pair>(FurnitureType::GUITAR, guitars)); + + // Bookshelves + std::deque bookshelves; + + models::RawModel bookshelf_model1 = render_engine::LoadObjModel("res/bookShelfOne.obj"); + models::TexturedModel bookshelf1 = { bookshelf_model1, default_texture }; + bookshelves.push_back(bookshelf1); + + models::RawModel bookshelf_model2 = render_engine::LoadObjModel("res/bookShelfTwo.obj"); + models::TexturedModel bookshelf2 = { bookshelf_model2, default_texture }; + bookshelves.push_back(bookshelf2); + + models::RawModel bookshelf_model3 = render_engine::LoadObjModel("res/bookShelfThree.obj"); + models::TexturedModel bookshelf3 = { bookshelf_model3, default_texture }; + bookshelves.push_back(bookshelf3); + + furniture_models.insert(std::pair>(FurnitureType::BOOKSHELF, bookshelves)); + + // Lamps + std::dequelamps; + + models::RawModel lamp_model1 = render_engine::LoadObjModel("res/lampOne.obj"); + models::TexturedModel lamp1 = { lamp_model1, default_texture }; + lamps.push_back(lamp1); + + models::RawModel lamp_model2 = render_engine::LoadObjModel("res/lampTwo.obj"); + models::TexturedModel lamp2 = { lamp_model2, default_texture }; + lamps.push_back(lamp2); + + furniture_models.insert(std::pair>(FurnitureType::LAMP, lamps)); + + // Ceiling objects + std::dequeceiling_Objects; + + models::RawModel ceiling_Obj_model1 = render_engine::LoadObjModel("res/ceilingFan.obj"); + models::TexturedModel ceiling_Obj1 = { ceiling_Obj_model1, default_texture }; + ceiling_Objects.push_back(ceiling_Obj1); + + models::RawModel ceiling_Obj_model2 = render_engine::LoadObjModel("res/ceilingFanTwo.obj"); + models::TexturedModel ceiling_Obj2 = { ceiling_Obj_model2, default_texture }; + ceiling_Objects.push_back(ceiling_Obj2); + + models::RawModel ceiling_Obj_model3 = render_engine::LoadObjModel("res/ceilingLampOne.obj"); + models::TexturedModel ceiling_Obj3 = { ceiling_Obj_model3, default_texture }; + ceiling_Objects.push_back(ceiling_Obj3); + + models::RawModel ceiling_Obj_model4 = render_engine::LoadObjModel("res/ceilingLampTwo.obj"); + models::TexturedModel ceiling_Obj4 = { ceiling_Obj_model4, default_texture }; + ceiling_Objects.push_back(ceiling_Obj4); + + furniture_models.insert(std::pair>(FurnitureType::CEILING_OBJECTS, ceiling_Objects)); + + // Miscs + std::deque miscs; + + models::RawModel misc_model1 = render_engine::LoadObjModel("res/tv.obj"); + models::TexturedModel misc1 = { misc_model1, default_texture }; + miscs.push_back(misc1); + + models::RawModel misc_model2 = render_engine::LoadObjModel("res/radio.obj"); + models::TexturedModel misc2 = { misc_model2, default_texture }; + miscs.push_back(misc2); + + models::RawModel misc_model3 = render_engine::LoadObjModel("res/Flowerpot.obj"); + models::TexturedModel misc3 = { misc_model3, default_texture }; + miscs.push_back(misc3); + + furniture_models.insert(std::pair>(FurnitureType::MISC, miscs)); } } diff --git a/src/entities/house_generator.h b/src/entities/house_generator.h index dad3f76..12fbfa0 100644 --- a/src/entities/house_generator.h +++ b/src/entities/house_generator.h @@ -12,7 +12,13 @@ namespace entities { COUCH, TABLE, - CHAIR + CHAIR, + PLANT, + GUITAR, + BOOKSHELF, + LAMP, + CEILING_OBJECTS, + MISC }; class HouseGenerator From a8996f63ef50177615893c7c88e220b35c7b2ba2 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Tue, 8 Jun 2021 16:06:46 +0200 Subject: [PATCH 30/30] [ADD] start game scene fingers --- src/computervision/HandDetectRegion.h | 1 - src/computervision/ObjectDetection.cpp | 13 ++++--------- src/computervision/calibration/StaticSkinTreshold.h | 10 ---------- src/scenes/in_Game_Scene.cpp | 7 ++++--- src/scenes/startup_Scene.cpp | 6 ++++-- wk2_fps.vcxproj | 1 + wk2_fps.vcxproj.filters | 1 + 7 files changed, 14 insertions(+), 25 deletions(-) delete mode 100644 src/computervision/calibration/StaticSkinTreshold.h diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/HandDetectRegion.h index 067badd..7cc1a9a 100644 --- a/src/computervision/HandDetectRegion.h +++ b/src/computervision/HandDetectRegion.h @@ -7,7 +7,6 @@ #include "BackgroundRemover.h" #include "SkinDetector.h" #include "FingerCount.h" -#include "calibration/StaticSkinTreshold.h" namespace computervision { class HandDetectRegion diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index ad3e13e..829953c 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -10,8 +10,6 @@ #include "async/StaticCameraInstance.h" #include "calibration/HandCalibrator.h" -#include "calibration/StaticSkinTreshold.h" - namespace computervision { @@ -64,12 +62,15 @@ namespace computervision // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. DrawHandMask(&camera_frame); + hand_calibrator.SetAmountOfFingers(fingers_amount); finger_count.DrawHandContours(camera_frame); hand_calibrator.DrawHandCalibrationText(camera_frame); imshow("camera", camera_frame); + + /*imshow("output", frame_out); imshow("foreground", foreground); imshow("handMask", handMask); @@ -89,13 +90,7 @@ namespace computervision } else if (key == 115) // s, calibrate the skin color { - std::vector treshold = skin_detector.calibrateAndReturn(input_frame); - StaticSkinTreshold::hLowThreshold = treshold[0]; - StaticSkinTreshold::hHighThreshold = treshold[1]; - StaticSkinTreshold::sLowThreshold = treshold[2]; - StaticSkinTreshold::sHighThreshold = treshold[3]; - StaticSkinTreshold::vLowThreshold = treshold[4]; - StaticSkinTreshold::vHighThreshold = treshold[5]; + skin_detector.calibrate(input_frame); hand_calibrator.SetSkinCalibration(true); } diff --git a/src/computervision/calibration/StaticSkinTreshold.h b/src/computervision/calibration/StaticSkinTreshold.h deleted file mode 100644 index cfce1f7..0000000 --- a/src/computervision/calibration/StaticSkinTreshold.h +++ /dev/null @@ -1,10 +0,0 @@ -#pragma once -namespace StaticSkinTreshold -{ - static int hLowThreshold, - hHighThreshold, - sLowThreshold, - sHighThreshold, - vLowThreshold, - vHighThreshold; -}; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 48d099b..f0d5946 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -28,7 +28,6 @@ namespace scene std::vector regions; - computervision::ObjectDetection objDetect; computervision::HandDetectRegion reg_left("left", 0, 0, 150, 150), reg_right("right", 0, 0, 150, 150), reg_up("up", 0, 0, 150, 150); @@ -45,7 +44,8 @@ namespace scene scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window) { // set up squares according to size of camera input - cv::Mat camera_frame = objDetect.ReadCamera(); // get camera frame to know the width and heigth + cv::Mat camera_frame; + static_camera::getCap().read(camera_frame); // get camera frame to know the width and heigth reg_left.SetXPos(10); reg_left.SetYPos(camera_frame.rows / 2 - reg_left.GetHeight()/2); reg_right.SetXPos(camera_frame.cols - 10 - reg_right.GetWidth()); @@ -151,7 +151,8 @@ namespace scene void scene::In_Game_Scene::update_hand_detection() { - cv::Mat camera_frame = objDetect.ReadCamera(); + cv::Mat camera_frame; + static_camera::getCap().read(camera_frame); reg_left.DetectHand(camera_frame); reg_right.DetectHand(camera_frame); reg_up.DetectHand(camera_frame); diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index 7ef51db..a492c18 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -8,7 +8,7 @@ namespace scene { - + computervision::ObjectDetection objDetect; scene::Scenes scene::Startup_Scene::start(GLFWwindow *window) { while (return_value == scene::Scenes::STARTUP) @@ -30,7 +30,8 @@ namespace scene void scene::Startup_Scene::update(GLFWwindow* window) { - + bool hand_present; + objDetect.DetectHand(objDetect.ReadCamera(),hand_present); } void scene::Startup_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods) @@ -38,6 +39,7 @@ namespace scene if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { return_value = scene::Scenes::INGAME; + cv::destroyWindow("camera"); } } } diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 4d0fabf..28b43a2 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -47,6 +47,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 3e9201f..abb170d 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -56,6 +56,7 @@ +