├── .cproject ├── .gitignore ├── .project ├── BOWAssigner.cpp ├── BOWAssigner.h ├── Combined.model ├── FPFH.model ├── FPFHVocab.dat ├── HOG.model ├── HOGVocab.dat ├── LicensePreamble.txt ├── OCLCommon.cpp ├── OCLCommon.h ├── OCLMain.cpp ├── OCLPose3D.cpp ├── OCLPose3D.h ├── OCLUtils.cpp ├── OCLUtils.h ├── ObjectClassification.vcxproj ├── ObjectClassification.vcxproj.filters ├── ObjectClassification.vcxproj.user ├── ObjectClassifier.cpp ├── ObjectClassifier.h ├── ObjectDescription.cpp ├── ObjectDescription.h ├── README.md ├── SIFT.model ├── SIFTVocab.dat ├── SVMUtils.hpp ├── TestClouds ├── Axe.ply ├── CartoonCup.ply ├── MinuteMaid.ply └── OrangeJuice.ply ├── svm.cpp └── svm.h /.cproject: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 44 | 45 | 46 | 47 | 51 | 52 | 53 | 95 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Disregard certain folders 2 | .svn/ 3 | Release/ 4 | -------------------------------------------------------------------------------- /.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | ObjectClassification 4 | 5 | 6 | 7 | 8 | 9 | org.eclipse.cdt.managedbuilder.core.genmakebuilder 10 | clean,full,incremental, 11 | 12 | 13 | 14 | 15 | org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder 16 | full,incremental, 17 | 18 | 19 | 20 | 21 | 22 | org.eclipse.cdt.core.cnature 23 | org.eclipse.cdt.core.ccnature 24 | org.eclipse.cdt.managedbuilder.core.managedBuildNature 25 | org.eclipse.cdt.managedbuilder.core.ScannerConfigNature 26 | 27 | 28 | -------------------------------------------------------------------------------- /BOWAssigner.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | #include 5 | #include "BOWAssigner.h" 6 | 7 | namespace ocl { 8 | 9 | BOWAssigner::BOWAssigner() { 10 | matcher = cv::DescriptorMatcher::create("BruteForce"); 11 | } 12 | 13 | 14 | BOWAssigner::~BOWAssigner() 15 | { 16 | } 17 | 18 | 19 | void BOWAssigner::setVocabulary(const cv::Mat& vocab) { 20 | matcher->clear(); 21 | vocabulary = vocab; 22 | matcher->add( std::vector(1, vocab) ); 23 | } 24 | 25 | 26 | const cv::Mat& BOWAssigner::getVocabulary() const { 27 | return vocabulary; 28 | } 29 | 30 | 31 | int BOWAssigner::getVocabularySize() const { 32 | return vocabulary.empty() ? 0 : vocabulary.rows; 33 | } 34 | 35 | 36 | void BOWAssigner::compute(const cv::Mat& queryDesc, cv::Mat& bowDescriptor) { 37 | bowDescriptor.release(); 38 | 39 | std::vector matches; 40 | matcher->match(queryDesc, matches); 41 | 42 | bowDescriptor = cv::Mat(1, getVocabularySize(), CV_32F, cv::Scalar::all(0.0)); 43 | float *descPtr = (float*) bowDescriptor.data; 44 | 45 | for (size_t i = 0; i < matches.size(); i++) { 46 | int queryIdx = matches[i].queryIdx; 47 | int trainIdx = matches[i].trainIdx; // cluster index 48 | CV_Assert( queryIdx == static_cast(i)); 49 | 50 | descPtr[trainIdx] = descPtr[trainIdx] + 1.0f; 51 | } 52 | 53 | bowDescriptor /= queryDesc.rows; 54 | 55 | } 56 | 57 | 58 | } /* ocl */ 59 | -------------------------------------------------------------------------------- /BOWAssigner.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Software License Agreement (BSD License) 3 | * 4 | * Object Classification 5 | * Copyright (c) 2013, Kester Duncan 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions 11 | * are met: 12 | * 13 | * * Redistributions of source code must retain the above copyright 14 | * notice, this list of conditions and the following disclaimer. 15 | * * Redistributions in binary form must reproduce the above 16 | * copyright notice, this list of conditions and the following 17 | * disclaimer in the documentation and/or other materials provided 18 | * with the distribution. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | * POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | * \file BOWAssigner.h 34 | * \brief Assigns the Bag-of-Words (Bags-of-Features) representation to feature descriptor set 35 | * \author Kester Duncan 36 | */ 37 | #pragma once 38 | #ifndef BOW_ASSIGNER_H_ 39 | #define BOW_ASSIGNER_H_ 40 | 41 | #include 42 | 43 | namespace ocl { 44 | 45 | class BOWAssigner 46 | { 47 | public: 48 | BOWAssigner(); 49 | virtual ~BOWAssigner(); 50 | 51 | /// Sets the visual vocabulary that would be used to assign the BoW 52 | void setVocabulary(const cv::Mat& vocab); 53 | 54 | /// Gets a copy of the visual vocabulary 55 | const cv::Mat& getVocabulary() const; 56 | 57 | /// Gets the size of the visual vocabulary 58 | int getVocabularySize() const; 59 | 60 | /// Computes the BoW for the given set of feature descriptors 61 | void compute(const cv::Mat& queryDesc, cv::Mat& bowDescriptor); 62 | 63 | 64 | private: 65 | cv::Mat vocabulary; 66 | cv::Ptr matcher; 67 | }; 68 | 69 | 70 | } /* ocl */ 71 | 72 | #endif /* BOW_ASSIGNER_H_ */ 73 | -------------------------------------------------------------------------------- /Combined.model: -------------------------------------------------------------------------------- 1 | svm_type c_svc 2 | kernel_type rbf 3 | gamma 0.5 4 | nr_class 11 5 | total_sv 170 6 | rho -0.0303227 0.0321085 -0.0182533 -0.0279114 -0.0215584 -0.00899534 -0.00699951 0.00230412 -0.0432372 0.0065151 0.0112907 0.0140793 -0.00118691 0.0183202 0.0209789 0.0391549 0.0330262 0.0196597 0.0289916 -0.00900845 -0.0289838 0.0206499 -0.0143698 0.00291839 -0.0151268 0.0161745 -0.0420781 -0.00430061 -0.00285448 -0.00430533 0.0318882 0.0247081 -0.00418942 0.0242762 0.00919101 0.0190048 0.038587 0.0321223 0.0283049 0.0220862 0.0141933 0.0372262 -0.00113522 0.0194859 0.0214589 0.0261072 0.0109896 -0.00449724 0.0249784 -0.0123405 -0.0102056 -0.0134637 -0.0122609 -0.0213842 0.00793631 7 | label 1 2 3 4 5 6 7 8 9 10 11 8 | probA -4.2639 -4.36696 -4.53524 -4.26986 -4.38285 -4.40102 -4.52346 -4.40968 -4.48958 -4.4127 -4.20427 -4.28484 -4.14769 -4.23852 -4.22623 -4.25531 -4.23339 -4.28729 -4.23618 -4.41771 -4.21302 -4.29129 -4.31341 -4.34409 -4.3504 -4.37276 -4.35224 -4.31318 -4.47329 -4.41521 -4.54352 -4.48647 -4.56896 -4.49685 -4.20741 -4.21243 -4.26984 -4.24252 -4.2787 -4.26632 -4.35162 -4.41794 -4.37208 -4.45548 -4.36704 -4.38597 -4.34801 -4.41068 -4.34527 -4.42476 -4.54724 -4.38363 -4.44555 -4.4129 -4.41338 9 | probB 0.0693697 -0.359456 0.0891368 -0.184656 0.00723791 -0.0738942 0.0623388 -0.0964875 0.144512 -0.111182 -0.190547 -0.0725282 -0.134262 -0.0815527 -0.174401 -0.0792604 -0.087328 -0.0404281 -0.148106 0.229849 0.061783 0.0258335 0.158529 0.216382 0.204423 0.172911 0.33617 -0.19432 -0.0393986 -0.0490292 -0.0480398 -0.162344 -0.0197026 -0.124152 0.121188 0.0782329 0.10252 0.0677145 0.151455 0.0914793 -0.135202 -0.072726 0.00756706 0.0131795 -0.127268 0.0637987 0.000907574 0.0760016 -0.0841237 -0.0487103 -0.155256 -0.0317233 0.164123 0.00458593 -0.0783529 10 | nr_sv 17 14 17 20 13 16 14 16 14 16 13 11 | SV 12 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.308552 2:0.00133 3:0.002233 4:0.004226 5:0.001479 6:0.003649 7:0.003033 8:0.00276 9:0.002097 10:0.001772 11:0.002203 12:0.179341 13:0.009591 14:0.015798 15:0.014867 16:0.005293 17:0.013724 18:0.012719 19:0.024064 20:0.015273 21:0.017784 22:0.02488 23:0.081782 24:0.004205 25:0.012312 26:0.089235 27:0.001933 28:0.044577 29:0.04847 30:0.019628 31:0.005367 32:0.011782 33:0.014043 13 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.28909 2:0.001786 3:0.003561 4:0.009534 5:0.002378 6:0.006486 7:0.004662 8:0.007012 9:0.003136 10:0.002178 11:0.00351 12:0.155396 13:0.003442 14:0.00626 15:0.017835 16:0.005527 17:0.019144 18:0.013208 19:0.034487 20:0.057177 21:0.007257 22:0.0136 23:0.169754 24:0.002103 25:0.008555 26:0.042541 27:0.002614 28:0.012017 29:0.047605 30:0.022279 31:0.007314 32:0.007115 33:0.011436 14 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.233393 2:0.002207 3:0.041708 4:0.009728 5:0.015105 6:0.00687 7:0.005647 8:0.004995 9:0.005236 10:0.002454 11:0.00599 12:0.025395 13:0.006505 14:0.145841 15:0.006572 16:0.019664 17:0.01661 18:0.006818 19:0.010524 20:0.065057 21:0.005943 22:0.024403 23:0.06199 24:0.002583 25:0.184317 26:0.005101 27:0.003437 28:0.029142 29:0.005009 30:0.002569 31:0.023573 32:0.006045 33:0.009568 15 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.160741 2:0.003132 3:0.049297 4:0.021726 5:0.041881 6:0.011053 7:0.015873 8:0.007956 9:0.008116 10:0.003561 11:0.009997 12:0.051263 13:0.015402 14:0.10923 15:0.011498 16:0.005996 17:0.010745 18:0.015538 19:0.025566 20:0.056113 21:0.013907 22:0.018074 23:0.032869 24:0.007237 25:0.049074 26:0.03067 27:0.008086 28:0.020661 29:0.009955 30:0.004879 31:0.082282 32:0.005571 33:0.082049 16 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.31335 2:0.001031 3:0.001883 4:0.003287 5:0.001395 6:0.002857 7:0.003019 8:0.001958 9:0.001679 10:0.001118 11:0.001756 12:0.100627 13:0.010787 14:0.052059 15:0.023168 16:0.029604 17:0.011939 18:0.00934 19:0.032078 20:0.036878 21:0.01471 22:0.012142 23:0.138107 24:0.003443 25:0.022583 26:0.057052 27:0.003665 28:0.01162 29:0.007476 30:0.0265 31:0.016428 32:0.030666 33:0.015791 17 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.309286 2:0.001294 3:0.002193 4:0.00493 5:0.00151 6:0.002794 7:0.002858 8:0.002939 9:0.001913 10:0.001513 11:0.002103 12:0.02883 13:0.040089 14:0.066615 15:0.02918 16:0.013879 17:0.01993 18:0.038416 19:0.02191 20:0.049419 21:0.014096 22:0.010969 23:0.158313 24:0.004324 25:0.044295 26:0.012236 27:0.007721 28:0.00644 29:0.01753 30:0.016001 31:0.038497 32:0.018547 33:0.009427 18 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.268439 2:0.002288 3:0.005015 4:0.012812 5:0.003851 6:0.013297 7:0.009104 8:0.006542 9:0.004262 10:0.002888 11:0.004834 12:0.016203 13:0.014029 14:0.093377 15:0.079284 16:0.011597 17:0.014415 18:0.02593 19:0.032795 20:0.026957 21:0.006452 22:0.012294 23:0.022991 24:0.005135 25:0.023211 26:0.102191 27:0.00428 28:0.034497 29:0.012254 30:0.044456 31:0.016423 32:0.005874 33:0.062021 19 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.299725 2:0.001745 3:0.002673 4:0.006565 5:0.001693 6:0.004659 7:0.003238 8:0.004896 9:0.003061 10:0.002383 11:0.002696 12:0.019593 13:0.007371 14:0.230965 15:0.008395 16:0.015692 17:0.004035 18:0.003375 19:0.010184 20:0.016368 21:0.006191 22:0.011165 23:0.235514 24:0.002813 25:0.004407 26:0.012817 27:0.006689 28:0.007078 29:0.006978 30:0.013689 31:0.021744 32:0.015461 33:0.006143 20 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.296492 2:0.002394 3:0.003344 4:0.006246 5:0.001411 6:0.003777 7:0.006194 8:0.004324 9:0.002542 10:0.003892 11:0.002717 12:0.046953 13:0.019645 14:0.071554 15:0.010657 16:0.112587 17:0.005976 18:0.008564 19:0.010765 20:0.015863 21:0.006899 22:0.02387 23:0.122135 24:0.002225 25:0.008375 26:0.062682 27:0.009733 28:0.003955 29:0.008958 30:0.02614 31:0.039615 32:0.030223 33:0.019291 21 | 0.5 0.5 0.5 0.3788794645353393 0.5 0.5 0.5 0.5 0.5 0.5 1:0.306949 2:0.002477 3:0.003508 4:0.003522 5:0.001323 6:0.00207 7:0.002562 8:0.00283 9:0.001563 10:0.003937 11:0.002594 12:0.328438 13:0.000543 14:0.000803 15:0.000379 16:0.000647 17:0.000409 18:0.000286 19:0.000373 20:0.000481 21:0.000391 22:0.000583 23:0.330821 24:0.000389 25:0.000321 26:0.000107 27:0.000314 28:0.0002 29:0.000172 30:0.000263 31:0.000166 32:0.000379 33:0.000203 22 | 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.302777 2:0.001152 3:0.006483 4:0.004144 5:0.005362 6:0.002702 7:0.002855 8:0.002151 9:0.002184 10:0.001149 11:0.002373 12:0.32804 13:0.000459 14:0.000771 15:0.000569 16:0.000386 17:0.000713 18:0.000374 19:0.000685 20:0.00055 21:0.000373 22:0.000413 23:0.330537 24:0.000512 25:0.000482 26:0.00024 27:0.000277 28:0.000202 29:0.000215 30:0.000131 31:0.000334 32:0.000144 33:0.000259 23 | 0.2463361657354981 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.307042 2:0.001599 3:0.002912 4:0.003821 5:0.001354 6:0.002726 7:0.002607 8:0.003211 9:0.001944 10:0.003902 11:0.002216 12:0.329024 13:0.000279 14:0.000609 15:0.000395 16:0.000399 17:0.000931 18:0.000189 19:0.00036 20:0.000495 21:0.000272 22:0.00038 23:0.329821 24:0.000401 25:0.000569 26:0.00017 27:0.000614 28:0.000315 29:0.000223 30:0.000469 31:0.000192 32:0.000362 33:0.000198 24 | 0 0.1826834284658926 0 0 0 0 0 0 0 0 1:0.310768 2:0.001174 3:0.004842 4:0.002769 5:0.002562 6:0.002133 7:0.002085 8:0.001887 9:0.001917 10:0.001281 11:0.001916 12:0.328209 13:0.000417 14:0.000839 15:0.000455 16:0.000571 17:0.00061 18:0.000459 19:0.000416 20:0.000444 21:0.000307 22:0.000605 23:0.330468 24:0.000428 25:0.000534 26:0.000183 27:0.000425 28:0.000222 29:0.000136 30:0.000151 31:0.000221 32:0.000166 33:0.000401 25 | 0 0 0.1143913428414623 0 0 0 0 0 0 0 1:0.308869 2:0.001313 3:0.002105 4:0.004224 5:0.00135 6:0.003159 7:0.003022 8:0.003572 9:0.001822 10:0.001928 11:0.001968 12:0.328528 13:0.000381 14:0.000832 15:0.000575 16:0.000424 17:0.0006 18:0.000377 19:0.000395 20:0.000581 21:0.000317 22:0.000322 23:0.330277 24:0.000489 25:0.000303 26:0.00034 27:0.000289 28:0.000144 29:0.000251 30:0.000504 31:0.000285 32:0.000165 33:0.000287 26 | 0 0 0 0 0 0 0.4905401380388153 0 0 0 1:0.309972 2:0.001667 3:0.001654 4:0.002873 5:0.000968 6:0.003448 7:0.002043 8:0.004919 9:0.001643 10:0.002397 11:0.001749 12:0.32917 13:0.000378 14:0.000176 15:0.000621 16:8.1e-005 17:0.000938 18:0.000501 19:0.000381 20:0.000347 21:0.000551 22:0.000189 23:0.329774 24:0.000719 25:0.000582 26:0.000218 27:0.00023 28:0.000336 29:0.000528 30:0.000141 31:0.000224 32:0.000132 33:0.000449 27 | 0 0 0.5 0 0.08988435177488136 0.1514508171952226 0 0.3373819658913881 0.5 0.2446021435004448 1:0.308293 2:0.00157 3:0.002667 4:0.004282 5:0.001388 6:0.002881 7:0.002827 8:0.002745 9:0.002043 10:0.002271 11:0.002366 12:0.329556 13:0.000189 14:0.000166 15:0.00079 16:4.3e-005 17:0.000909 18:0.000576 19:0.000186 20:0.000274 21:0.000468 22:0.000176 23:0.330191 24:0.000469 25:0.000458 26:0.000275 27:0.00026 28:0.000405 29:0.000375 30:0.000235 31:0.000219 32:0.000214 33:0.000232 28 | 0 0 0 0 0 0 0 0 0.004883308688503885 0 1:0.30899 2:0.001779 3:0.002131 4:0.00416 5:0.001078 6:0.002517 7:0.002774 8:0.002984 9:0.001888 10:0.002907 11:0.002125 12:0.330006 13:0.000198 14:0.000288 15:0.000467 16:8.9e-005 17:0.000811 18:0.000178 19:0.000612 20:0.000249 21:0.000256 22:0.000179 23:0.330265 24:0.000424 25:0.000236 26:0.000287 27:0.000273 28:0.000341 29:0.000204 30:0.000275 31:0.000223 32:0.000432 33:0.000374 29 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.003366 2:0.306223 3:0.002661 4:0.004815 5:0.001658 6:0.003365 7:0.002557 8:0.002676 9:0.001913 10:0.001794 11:0.002305 12:0.005054 13:0.30394 14:0.003707 15:0.002531 16:0.00342 17:0.003411 18:0.001203 19:0.001919 20:0.003532 21:0.002375 22:0.002241 23:0.001401 24:0.307196 25:0.006632 26:0.002439 27:0.001006 28:0.001416 29:0.002019 30:0.001303 31:0.002143 32:0.002026 33:0.005752 30 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.008551 2:0.275116 3:0.004113 4:0.01061 5:0.002056 6:0.005706 7:0.006014 8:0.006312 9:0.003144 10:0.007296 11:0.004415 12:0.006703 13:0.18543 14:0.040995 15:0.005894 16:0.01062 17:0.006727 18:0.021675 19:0.023568 20:0.013449 21:0.007959 22:0.010314 23:0.006416 24:0.154112 25:0.01438 26:0.008458 27:0.002505 28:0.032346 29:0.028196 30:0.003642 31:0.027858 32:0.007132 33:0.048288 31 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.004081 2:0.299614 3:0.003433 4:0.006085 5:0.002126 6:0.004223 7:0.003052 8:0.003245 9:0.002433 10:0.002043 11:0.002998 12:0.019136 13:0.12457 14:0.036791 15:0.005753 16:0.052581 17:0.009338 18:0.008086 19:0.010464 20:0.024997 21:0.015935 22:0.025681 23:0.002374 24:0.266082 25:0.014563 26:0.006078 27:0.002029 28:0.003467 29:0.010745 30:0.002624 31:0.006298 32:0.00229 33:0.016784 32 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.004385 2:0.296726 3:0.003737 4:0.006703 5:0.002354 6:0.00469 7:0.003284 8:0.003482 9:0.002613 10:0.002165 11:0.003195 12:0.00709 13:0.219391 14:0.022178 15:0.008708 16:0.016539 17:0.005766 18:0.003769 19:0.00758 20:0.02142 21:0.006194 22:0.014698 23:0.001044 24:0.313211 25:0.003449 26:0.001325 27:0.001575 28:0.001395 29:0.001806 30:0.000872 31:0.002299 32:0.001475 33:0.004883 33 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.00504 2:0.291306 3:0.004191 4:0.008006 5:0.002604 6:0.005202 7:0.003783 8:0.003939 9:0.002918 10:0.002751 11:0.003593 12:0.00324 13:0.275441 14:0.00898 15:0.004651 16:0.008058 17:0.003128 18:0.001872 19:0.004801 20:0.007481 21:0.002609 22:0.013071 23:0.001999 24:0.30492 25:0.004614 26:0.002212 27:0.001272 28:0.0015 29:0.00558 30:0.001719 31:0.002315 32:0.001941 33:0.005261 34 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.008947 2:0.257735 3:0.007519 4:0.014325 5:0.00451 6:0.010017 7:0.007039 8:0.007066 9:0.005003 10:0.004365 11:0.006807 12:0.006633 13:0.211218 14:0.036105 15:0.005179 16:0.017476 17:0.005201 18:0.006175 19:0.011096 20:0.020813 21:0.003205 22:0.010231 23:0.000755 24:0.315514 25:0.003288 26:0.001336 27:0.001082 28:0.000825 29:0.002358 30:0.000825 31:0.002407 32:0.000629 33:0.004313 35 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.01121 2:0.248207 3:0.01032 4:0.015044 5:0.005253 6:0.009974 7:0.007855 8:0.007327 9:0.00444 10:0.006548 11:0.007155 12:0.007472 13:0.0614 14:0.017095 15:0.014956 16:0.012207 17:0.008046 18:0.144408 19:0.034562 20:0.021583 21:0.004879 22:0.006725 23:0.013251 24:0.027413 25:0.037649 26:0.037039 27:0.002079 28:0.130235 29:0.055031 30:0.003519 31:0.006336 32:0.007162 33:0.013619 36 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.01842 2:0.145423 3:0.020915 4:0.028872 5:0.012725 6:0.020393 7:0.018848 8:0.012915 9:0.009864 10:0.015432 11:0.029527 12:0.015573 13:0.061541 14:0.118257 15:0.017191 16:0.032097 17:0.007685 18:0.020621 19:0.013818 20:0.016424 21:0.008364 22:0.021763 23:0.008857 24:0.075494 25:0.068377 26:0.012212 27:0.003139 28:0.026525 29:0.029216 30:0.002871 31:0.02404 32:0.004247 33:0.078356 37 | -0.5 0.4621181426760759 0.5 0.274524848919301 0.5 0 0.3052021248131678 0.5 0 0.2373713904597603 1:0.005422 2:0.289709 3:0.004361 4:0.008033 5:0.00258 6:0.005356 7:0.003946 8:0.004303 9:0.003031 10:0.002835 11:0.003757 12:0.001641 13:0.32038 14:0.001798 15:0.001476 16:0.000692 17:0.001406 18:0.000735 19:0.000971 20:0.001416 21:0.001255 22:0.001564 23:0.000505 24:0.325387 25:0.001253 26:0.000694 27:0.000458 28:0.000644 29:0.00097 30:0.000337 31:0.001096 32:0.000427 33:0.001562 38 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.006291 2:0.291416 3:0.002865 4:0.00712 5:0.001465 6:0.003796 7:0.004434 8:0.004701 9:0.002318 10:0.006122 11:0.002803 12:0.000898 13:0.321668 14:0.00173 15:0.001001 16:0.000668 17:0.001069 18:0.00144 19:0.001161 20:0.00161 21:0.001068 22:0.00102 23:0.000902 24:0.319824 25:0.00201 26:0.002881 27:0.00053 28:0.001358 29:0.001302 30:0.000466 31:0.001436 32:0.000866 33:0.001759 39 | -0 0 0.3913246197698911 0 0 0 0 0 0 0 1:0.005343 2:0.289676 3:0.00441 4:0.008019 5:0.002649 6:0.005474 7:0.003945 8:0.004246 9:0.003049 10:0.002742 11:0.003782 12:0.000881 13:0.321365 14:0.001712 15:0.000928 16:0.001342 17:0.001033 18:0.000816 19:0.00115 20:0.002009 21:0.00092 22:0.001177 23:0.000482 24:0.326242 25:0.001288 26:0.001299 27:0.000452 28:0.00053 29:0.000566 30:0.000495 31:0.000646 32:0.000434 33:0.000899 40 | -0 0 0 0 0 0.1813692843604132 0 0 0.3176095030431924 0 1:0.006207 2:0.289662 3:0.00449 4:0.007273 5:0.002057 6:0.004564 7:0.004702 8:0.004223 9:0.002296 10:0.004578 11:0.003282 12:0.000852 13:0.322426 14:0.001147 15:0.000866 16:0.000995 17:0.000902 18:0.001848 19:0.001328 20:0.001235 21:0.000828 22:0.000906 23:0.00076 24:0.325201 25:0.001681 26:0.000705 27:0.000401 28:0.001358 29:0.00148 30:0.000368 31:0.000604 32:0.000477 33:0.0003 41 | -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.005807 2:0.287794 3:0.005575 4:0.007293 5:0.004341 6:0.004598 7:0.004432 8:0.003931 9:0.002303 10:0.00381 11:0.003449 12:0.000921 13:0.32308 14:0.00151 15:0.000985 16:0.000756 17:0.000879 18:0.001046 19:0.001676 20:0.000722 21:0.000762 22:0.000996 23:0.000728 24:0.321201 25:0.001921 26:0.001188 27:0.000402 28:0.001792 29:0.00339 30:0.000459 31:0.000624 32:0.000996 33:0.000632 42 | -0.2463361657354981 0 0 0 0.03915619058248873 0.5 0.5 0.2119437026143853 0.5 0.5 1:0.005596 2:0.288241 3:0.004239 4:0.007137 5:0.002429 6:0.004579 7:0.004496 8:0.004032 9:0.002572 10:0.005043 11:0.00497 12:0.000589 13:0.322883 14:0.001626 15:0.000879 16:0.001086 17:0.000886 18:0.001449 19:0.000734 20:0.001231 21:0.000939 22:0.001029 23:0.000863 24:0.325247 25:0.001558 26:0.000617 27:0.000423 28:0.000912 29:0.001466 30:0.000372 31:0.000862 32:0.000399 33:0.000615 43 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.02193 2:0.003767 3:0.260151 4:0.00979 5:0.002121 6:0.005057 7:0.007519 8:0.006802 9:0.003655 10:0.007796 11:0.004745 12:0.015399 13:7.8e-005 14:4.4e-005 15:0.006135 16:3.5e-005 17:0.149514 18:0.000133 19:0.00036 20:5.6e-005 21:0.161403 22:0.000176 23:0.002226 24:0.002702 25:0.246765 26:0.004595 27:0.000459 28:0.066702 29:0.002926 30:0.001279 31:0.000995 32:0.002284 33:0.0024 44 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.004813 2:0.001053 3:0.303985 4:0.004066 5:0.004688 6:0.003093 7:0.002591 8:0.001985 9:0.002881 10:0.001101 11:0.003079 12:0.012158 13:0.04875 14:0.137276 15:0.010482 16:0.037652 17:0.010784 18:0.006384 19:0.011618 20:0.027779 21:0.004588 22:0.025862 23:0.0119 24:0.005654 25:0.15921 26:0.014429 27:0.00204 28:0.010577 29:0.010156 30:0.002269 31:0.093077 32:0.003742 33:0.020279 45 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.005119 2:0.001083 3:0.304893 4:0.004059 5:0.003962 6:0.002993 7:0.002608 8:0.002063 9:0.002504 10:0.001179 11:0.002871 12:0.013714 13:0.040108 14:0.091183 15:0.012661 16:0.075916 17:0.016752 18:0.0104 19:0.011502 20:0.024599 21:0.009173 22:0.027325 23:0.005576 24:0.005178 25:0.139661 26:0.081664 27:0.005405 28:0.008612 29:0.008421 30:0.001632 31:0.026002 32:0.00241 33:0.048772 46 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.006787 2:0.002212 3:0.270652 4:0.008177 5:0.007221 6:0.005478 7:0.011845 8:0.003953 9:0.00439 10:0.002423 11:0.010197 12:0.011309 13:0.025631 14:0.123127 15:0.010562 16:0.045622 17:0.010252 18:0.007601 19:0.019582 20:0.022155 21:0.012941 22:0.044552 23:0.003763 24:0.002793 25:0.224636 26:0.0043 27:0.00396 28:0.023889 29:0.012074 30:0.002792 31:0.043372 32:0.005319 33:0.006436 47 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.016205 2:0.002789 3:0.253845 4:0.010864 5:0.00459 6:0.007104 7:0.006375 8:0.005771 9:0.004492 10:0.007465 11:0.013834 12:0.011209 13:0.009614 14:0.067191 15:0.010416 16:0.101167 17:0.011195 18:0.011395 19:0.011472 20:0.083971 21:0.0062 22:0.009504 23:0.01219 24:0.003779 25:0.101231 26:0.023557 27:0.024346 28:0.004648 29:0.008319 30:0.015222 31:0.022191 32:0.1041 33:0.01375 48 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.00224 2:0.000988 3:0.298614 4:0.00171 5:0.022359 6:0.001321 7:0.001403 8:0.001287 9:0.00103 10:0.001112 11:0.001269 12:0.009483 13:0.009135 14:0.200664 15:0.005609 16:0.067202 17:0.004639 18:0.007842 19:0.006881 20:0.010946 21:0.002909 22:0.008024 23:0.008112 24:0.001275 25:0.237988 26:0.002194 27:0.010161 28:0.002801 29:0.00144 30:0.006414 31:0.012631 32:0.045147 33:0.00517 49 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.003498 2:0.000963 3:0.309585 4:0.002493 5:0.006521 6:0.0021 7:0.001892 8:0.001646 9:0.001598 10:0.001015 11:0.002021 12:0.005075 13:0.011711 14:0.238454 15:0.006117 16:0.022548 17:0.009023 18:0.006791 19:0.005769 20:0.007186 21:0.003674 22:0.016986 23:0.002099 24:0.004971 25:0.295904 26:0.00566 27:0.002177 28:0.00292 29:0.002777 30:0.000818 31:0.009131 32:0.000637 33:0.006239 50 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.003198 2:0.001019 3:0.315547 4:0.002377 5:0.001495 6:0.001797 7:0.001897 8:0.001691 9:0.001388 10:0.001263 11:0.001662 12:0.004832 13:0.005818 14:0.259471 15:0.007243 16:0.012613 17:0.003536 18:0.006168 19:0.004971 20:0.018699 21:0.003022 22:0.006959 23:0.010596 24:0.007489 25:0.124696 26:0.04022 27:0.015308 28:0.027556 29:0.017781 30:0.00478 31:0.027958 32:0.020107 33:0.036842 51 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.006207 2:0.001506 3:0.295773 4:0.005627 5:0.004728 6:0.004181 7:0.003464 8:0.002854 9:0.003212 10:0.001586 11:0.004195 12:0.011972 13:0.017423 14:0.151231 15:0.010318 16:0.023351 17:0.024138 18:0.011271 19:0.017324 20:0.027484 21:0.022408 22:0.016412 23:0.014485 24:0.002736 25:0.235224 26:0.008787 27:0.002902 28:0.012961 29:0.013291 30:0.001538 31:0.030368 32:0.007527 33:0.003513 52 | -0 -0 0 0 0 0 0 0 0.5 0 1:0.008518 2:0.002526 3:0.294918 4:0.005457 5:0.000985 6:0.002724 7:0.004244 8:0.003845 9:0.002101 10:0.005373 11:0.002642 12:0.001627 13:0.000512 14:0.324694 15:0.001024 16:0.000101 17:0.002981 18:0.00041 19:0.000616 20:0.000325 21:0.000696 22:0.000347 23:0.00015 24:0.000331 25:0.331948 26:0.000104 27:3.8e-005 28:0.000221 29:0.000189 30:0.000104 31:9.7e-005 32:6.8e-005 33:8.4e-005 53 | -0.1826834284658926 -0 0.1770741083740255 0 0.2642635986038323 0.3635046794631114 0 0 0 0 1:0.007778 2:0.001585 3:0.295881 4:0.005812 5:0.00235 6:0.003981 7:0.00357 8:0.003026 9:0.003132 10:0.002099 11:0.004121 12:0.001773 13:0.000979 14:0.321561 15:0.001164 16:0.000257 17:0.002511 18:0.001106 19:0.001694 20:0.000868 21:0.000774 22:0.000648 23:0.000109 24:0.000871 25:0.330969 26:0.000163 27:5.7e-005 28:0.000204 29:0.000371 30:6.9e-005 31:0.000129 32:5.1e-005 33:0.00034 54 | -0.5 -0.4621181426760759 0.5 0.3185989047101716 0.5 0.5 0.5 0.5 0.5 0.5 1:0.009687 2:0.001441 3:0.291126 4:0.006357 5:0.004438 6:0.004478 7:0.003517 8:0.00303 9:0.003074 10:0.001737 11:0.004447 12:0.001609 13:0.000359 14:0.324007 15:0.001773 16:2.1e-005 17:0.002938 18:0.000478 19:0.000429 20:0.000194 21:0.000996 22:0.000529 23:0.00012 24:0.001555 25:0.330155 26:0.000192 27:6.4e-005 28:0.000312 29:0.000353 30:8.6e-005 31:0.00013 32:6e-005 33:0.000307 55 | -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.006144 2:0.001245 3:0.287782 4:0.005141 5:0.015448 6:0.003796 7:0.003208 8:0.00244 9:0.003197 10:0.001343 11:0.003588 12:0.000701 13:0.001341 14:0.324935 15:0.000525 16:0.001083 17:0.000822 18:0.000578 19:0.000609 20:0.00101 21:0.000457 22:0.001274 23:0.000115 24:0.000458 25:0.330906 26:0.000171 27:0.000259 28:9.9e-005 29:0.000448 30:9.5e-005 31:0.000278 32:0.000108 33:0.000395 56 | -0 -0 0 0 0 0 0.0961825580740978 0.1366513405489752 0 0.5 1:0.006843 2:0.002073 3:0.294918 4:0.005027 5:0.004085 6:0.003125 7:0.003226 8:0.002988 9:0.002493 10:0.002672 11:0.005883 12:0.001089 13:0.001273 14:0.322362 15:0.000938 16:0.001125 17:0.001185 18:0.00071 19:0.001328 20:0.001322 21:0.000927 22:0.001073 23:0.000218 24:0.000512 25:0.331117 26:0.000141 27:8.9e-005 28:0.000132 29:0.000281 30:0.000144 31:0.000227 32:0.000252 33:0.00022 57 | -0.5 -0 0.5 0 0 0 0.5 0.5 0.1577623079534603 0 1:0.007933 2:0.001827 3:0.293961 4:0.005565 5:0.001987 6:0.003404 7:0.003505 8:0.003245 9:0.002651 10:0.003799 11:0.005456 12:0.000925 13:0.001029 14:0.323468 15:0.000986 16:0.002675 17:0.000798 18:0.000564 19:0.000676 20:0.001207 21:0.000384 22:0.000622 23:0.000283 24:0.000251 25:0.332124 26:8.1e-005 27:7.3e-005 28:9.5e-005 29:8.6e-005 30:9.2e-005 31:6.9e-005 32:0.000117 33:6.1e-005 58 | -0 -0 0 0 0 0 0 0 0 0.1874870363625801 1:0.003997 2:0.001456 3:0.297253 4:0.004127 5:0.00525 6:0.003088 7:0.002898 8:0.002449 9:0.002555 10:0.001593 11:0.008667 12:0.000836 13:0.001279 14:0.32349 15:0.00076 16:0.001186 17:0.001106 18:0.000811 19:0.001116 20:0.001271 21:0.000504 22:0.000976 23:9.8e-005 24:0.000355 25:0.331962 26:7.3e-005 27:9.6e-005 28:0.000133 29:0.000171 30:7.2e-005 31:0.000105 32:5.5e-005 33:0.000214 59 | -0 -0 0 0.5 0 0 0 0 0 0 1:0.004299 2:0.001263 3:0.29756 4:0.003724 5:0.011011 6:0.002986 7:0.002664 8:0.002093 9:0.002468 10:0.001215 11:0.004052 12:0.000829 13:0.001343 14:0.323385 15:0.000784 16:0.002086 17:0.000916 18:0.000668 19:0.000755 20:0.00088 21:0.000638 22:0.001051 23:0.000118 24:0.000529 25:0.331307 26:0.000187 27:0.000161 28:0.000169 29:0.000244 30:7.6e-005 31:0.000184 32:7.8e-005 33:0.00028 60 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.002917 2:0.001817 3:0.002235 4:0.28165 5:0.001462 6:0.02728 7:0.007179 8:0.00253 9:0.001628 10:0.00233 11:0.002305 12:0.020695 13:0.008353 14:0.031584 15:0.021468 16:0.131089 17:0.009865 18:0.004043 19:0.012867 20:0.043049 21:0.03978 22:0.010541 23:0.005594 24:0.002209 25:0.038228 26:0.171836 27:0.002753 28:0.010501 29:0.005954 30:0.003923 31:0.031098 32:0.011211 33:0.050027 61 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.001911 2:0.001152 3:0.001882 4:0.299826 5:0.001411 6:0.016466 7:0.004279 8:0.001601 9:0.00157 10:0.001262 11:0.001973 12:0.034972 13:0.021227 14:0.029547 15:0.063337 16:0.016359 17:0.02899 18:0.007568 19:0.00967 20:0.012986 21:0.011375 22:0.097302 23:0.026932 24:0.009409 25:0.059794 26:0.080989 27:0.003387 28:0.005628 29:0.011302 30:0.00925 31:0.095934 32:0.009414 33:0.021295 62 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.002913 2:0.001835 3:0.001222 4:0.309601 5:0.000723 6:0.001649 7:0.001666 8:0.006615 9:0.001138 10:0.004596 11:0.001376 12:0.039252 13:0.0023 14:0.005313 15:0.147512 16:0.00082 17:0.072553 18:0.003673 19:0.010089 20:0.005639 21:0.041905 22:0.004279 23:0.036066 24:0.003918 25:0.011645 26:0.043241 27:0.010578 28:0.016375 29:0.009261 30:0.046722 31:0.089956 32:0.035796 33:0.029776 63 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.009052 2:0.002269 3:0.007392 4:0.197542 5:0.005325 6:0.020131 7:0.012455 8:0.055487 9:0.005508 10:0.011276 11:0.006895 12:0.018072 13:0.014596 14:0.051473 15:0.022443 16:0.056716 17:0.016711 18:0.016014 19:0.031211 20:0.031637 21:0.009541 22:0.064918 23:0.025298 24:0.007638 25:0.031498 26:0.07367 27:0.003584 28:0.033884 29:0.034414 30:0.070178 31:0.01565 32:0.01481 33:0.022709 64 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.00799 2:0.001384 3:0.003877 4:0.272421 5:0.003 6:0.01263 7:0.006217 8:0.017076 9:0.003597 10:0.001686 11:0.003456 12:0.010048 13:0.015876 14:0.088777 15:0.021064 16:0.027594 17:0.014309 18:0.013027 19:0.056324 20:0.026777 21:0.00864 22:0.050898 23:0.066114 24:0.006705 25:0.018987 26:0.078518 27:0.002839 28:0.00634 29:0.043613 30:0.046648 31:0.015176 32:0.040152 33:0.008241 65 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.006927 2:0.001512 3:0.006063 4:0.227737 5:0.003853 6:0.060861 7:0.004496 8:0.00494 9:0.010818 10:0.001623 11:0.004502 12:0.039053 13:0.021961 14:0.042617 15:0.032094 16:0.050565 17:0.012855 18:0.012357 19:0.040445 20:0.052247 21:0.011007 22:0.018134 23:0.110327 24:0.003186 25:0.04014 26:0.044601 27:0.007075 28:0.016437 29:0.011656 30:0.004491 31:0.055483 32:0.015125 33:0.024814 66 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.033145 2:0.004233 3:0.016578 4:0.203589 5:0.00793 6:0.015118 7:0.011083 8:0.011853 9:0.008647 10:0.009462 11:0.011696 12:0.024264 13:0.014724 14:0.045795 15:0.127836 16:0.008925 17:0.024025 18:0.017193 19:0.027532 20:0.014103 21:0.015538 22:0.013397 23:0.049366 24:0.003212 25:0.016971 26:0.197817 27:0.002941 28:0.004078 29:0.010113 30:0.026826 31:0.004363 32:0.012905 33:0.004741 67 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.023495 2:0.002835 3:0.007429 4:0.139517 5:0.005005 6:0.027215 7:0.011867 8:0.09972 9:0.005465 10:0.003695 11:0.00709 12:0.026276 13:0.012041 14:0.056664 15:0.092193 16:0.027415 17:0.010359 18:0.009597 19:0.027715 20:0.044031 21:0.017635 22:0.009408 23:0.021471 24:0.009541 25:0.029819 26:0.05332 27:0.00532 28:0.044066 29:0.018692 30:0.010715 31:0.118154 32:0.009249 33:0.012986 68 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.002857 2:0.001009 3:0.002321 4:0.310629 5:0.001807 6:0.004987 7:0.002982 8:0.001649 9:0.001964 10:0.001043 11:0.002084 12:0.020235 13:0.014055 14:0.081524 15:0.059148 16:0.036344 17:0.015439 18:0.005287 19:0.007724 20:0.066781 21:0.00671 22:0.020086 23:0.01825 24:0.009368 25:0.017163 26:0.105452 27:0.00489 28:0.015322 29:0.010439 30:0.044693 31:0.062579 32:0.015176 33:0.030002 69 | -0.5 -0.3913246197698911 -0.5 0.5 0.3290792901869402 0.5 0.5 0.5 0.5 0.5 1:0.003559 2:0.001267 3:0.003373 4:0.308803 5:0.001808 6:0.003066 7:0.002577 8:0.002118 9:0.002553 10:0.001775 11:0.002434 12:0.000528 13:0.000398 14:0.000976 15:0.32836 16:0.000402 17:0.000479 18:0.000313 19:0.000476 20:0.000641 21:0.000429 22:0.000331 23:0.000163 24:0.000473 25:0.000365 26:0.330461 27:0.00036 28:0.000357 29:0.000157 30:0.000277 31:0.000288 32:0.000197 33:0.000236 70 | -0 -0 -0 0 0 0 0 0 0.09236938944229374 0 1:0.003278 2:0.001304 3:0.001899 4:0.311339 5:0.0012 6:0.002299 7:0.002578 8:0.003227 9:0.001526 10:0.002708 11:0.001975 12:0.000561 13:0.000303 14:0.000976 15:0.328407 16:0.000554 17:0.000562 18:0.000355 19:0.000293 20:0.000585 21:0.000361 22:0.000378 23:0.000211 24:0.000394 25:0.000355 26:0.330649 27:0.000487 28:9e-005 29:0.000251 30:0.000125 31:0.000148 32:0.000295 33:0.000328 71 | -0.5 -0 -0 0 0 0 0.1729062937990415 0 0 0 1:0.003756 2:0.001154 3:0.002315 4:0.311064 5:0.001584 6:0.002731 7:0.002469 8:0.002788 9:0.001677 10:0.001589 11:0.002208 12:0.000901 13:0.000494 14:0.000737 15:0.326866 16:0.000403 17:0.000534 18:0.000473 19:0.000532 20:0.000719 21:0.000795 22:0.000879 23:0.000227 24:0.00043 25:0.000318 26:0.330718 27:0.000262 28:0.000183 29:0.000186 30:0.000195 31:0.000248 32:0.000331 33:0.000234 72 | -0 -0 -0.1770741083740255 0.02116388410452694 0 0.2972828397744372 0 0 0 0 1:0.003009 2:0.001164 3:0.002493 4:0.310705 5:0.00154 6:0.003219 7:0.002898 8:0.00211 9:0.002183 10:0.00168 11:0.002333 12:0.000546 13:0.000288 14:0.000777 15:0.328404 16:0.000309 17:0.000527 18:0.000413 19:0.000338 20:0.000807 21:0.00039 22:0.000535 23:0.000166 24:0.000467 25:0.000358 26:0.330494 27:0.000382 28:0.000308 29:0.000176 30:0.000166 31:0.000219 32:0.000417 33:0.00018 73 | -0 -0 -0 0 0 0 0 0 0 0.4362616802548881 1:0.002502 2:0.001327 3:0.002084 4:0.310967 5:0.001215 6:0.003472 7:0.002337 8:0.001914 9:0.002772 10:0.001822 11:0.002922 12:0.000338 13:0.000474 14:0.000888 15:0.329054 16:0.000427 17:0.000282 18:0.000335 19:0.000375 20:0.0005 21:0.000302 22:0.000358 23:0.000136 24:0.00048 25:0.000308 26:0.33036 27:0.000302 28:0.000244 29:0.000476 30:0.000176 31:0.000133 32:0.000175 33:0.000542 74 | -0.1143913428414623 -0 -0 0 0 0 0 0.06376650957509282 0.5 0 1:0.002937 2:0.001726 3:0.001726 4:0.310437 5:0.000909 6:0.003205 7:0.002632 8:0.002229 9:0.002462 10:0.002891 11:0.002179 12:0.000426 13:0.000679 14:0.0008 15:0.327572 16:0.000443 17:0.000532 18:0.000576 19:0.000492 20:0.000861 21:0.000335 22:0.000619 23:0.000123 24:0.000376 25:0.000155 26:0.33132 27:0.000216 28:0.000306 29:0.000169 30:0.000109 31:0.000203 32:0.000192 33:0.000164 75 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.002216 2:0.000981 3:0.00173 4:0.29222 5:0.001396 6:0.002811 7:0.001643 8:0.026063 9:0.001408 10:0.00111 11:0.001756 12:0.000615 13:0.000379 14:0.000793 15:0.32726 16:0.0003 17:0.000649 18:0.000625 19:0.000556 20:0.000815 21:0.000953 22:0.000389 23:0.000174 24:0.000351 25:0.000147 26:0.331238 27:0.0002 28:0.000215 29:0.000107 30:0.000172 31:0.000256 32:0.000209 33:0.000264 76 | -0 -0 -0 0 0 0 0.5 0 0 0 1:0.00155 2:0.000888 3:0.001215 4:0.312555 5:0.000989 6:0.002179 7:0.001312 8:0.009099 9:0.001074 10:0.001225 11:0.001246 12:0.000988 13:0.000239 14:0.000184 15:0.329048 16:0.000155 17:0.000595 18:0.0003 19:0.0002 20:0.000169 21:0.001195 22:0.00026 23:9.4e-005 24:0.000422 25:0.0001 26:0.331307 27:0.000176 28:0.000188 29:0.0004 30:0.000177 31:4e-005 32:0.000184 33:0.000245 77 | -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.002129 2:0.000932 3:0.001476 4:0.28339 5:0.001223 6:0.029955 7:0.002051 8:0.006648 9:0.002887 10:0.000972 11:0.00167 12:0.000756 13:0.000802 14:0.000898 15:0.327088 16:0.000249 17:0.000619 18:0.000616 19:0.000862 20:0.000295 21:0.000828 22:0.000319 23:0.000117 24:0.000364 25:0.000249 26:0.331236 27:0.000238 28:0.000101 29:0.000247 30:0.00019 31:0.000218 32:0.000185 33:0.000189 78 | -0 -0 -0 0 0 0 0 0.5 0 0 1:0.001394 2:0.000891 3:0.001195 4:0.311774 5:0.000962 6:0.002629 7:0.001489 8:0.001915 9:0.00886 10:0.000938 11:0.001286 12:0.000623 13:0.000561 14:0.001073 15:0.327434 16:0.000429 17:0.000571 18:0.000373 19:0.000641 20:0.00048 21:0.000699 22:0.000451 23:0.000238 24:0.000347 25:0.000276 26:0.330564 27:0.000303 28:0.000151 29:0.000122 30:0.000317 31:0.000253 32:0.000366 33:0.000395 79 | -0 -0 -0 0 0.5 0 0 0 0 0 1:0.001761 2:0.000894 3:0.001674 4:0.311146 5:0.001373 6:0.007477 7:0.00207 8:0.001855 9:0.002383 10:0.000958 11:0.001743 12:0.000525 13:0.00058 14:0.001034 15:0.327675 16:0.00042 17:0.000416 18:0.000576 19:0.000548 20:0.00051 21:0.00039 22:0.000659 23:0.000226 24:0.000381 25:0.000264 26:0.330322 27:0.000258 28:0.000214 29:0.000194 30:0.000428 31:0.000257 32:0.000295 33:0.000495 80 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.003463 2:0.001299 3:0.005143 4:0.003681 5:0.305012 6:0.00317 7:0.002649 8:0.002093 9:0.002126 10:0.00131 11:0.003387 12:0.007782 13:0.014063 14:0.042041 15:0.01068 16:0.210687 17:0.005365 18:0.005262 19:0.009003 20:0.012926 21:0.006562 22:0.008963 23:0.003534 24:0.001063 25:0.050625 26:0.008621 27:0.254009 28:0.002006 29:0.002489 30:0.001102 31:0.00377 32:0.003164 33:0.002951 81 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.002797 2:0.001059 3:0.002689 4:0.00284 5:0.312651 6:0.002441 7:0.002078 8:0.001698 9:0.001637 10:0.001112 11:0.002331 12:0.012693 13:0.013532 14:0.08371 15:0.00903 16:0.129909 17:0.005877 18:0.008247 19:0.00918 20:0.041988 21:0.005064 22:0.014104 23:0.008148 24:0.002496 25:0.01288 26:0.013944 27:0.241688 28:0.003584 29:0.004589 30:0.00462 31:0.017811 32:0.006625 33:0.016948 82 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.004865 2:0.001419 3:0.005508 4:0.0046 5:0.29936 6:0.003805 7:0.003174 8:0.002513 9:0.002467 10:0.001536 11:0.004086 12:0.009783 13:0.009011 14:0.187331 15:0.005159 16:0.065023 17:0.004173 18:0.005594 19:0.004377 20:0.012132 21:0.004001 22:0.026749 23:0.00247 24:0.000873 25:0.008999 26:0.005106 27:0.306195 28:0.001985 29:0.000961 30:0.000677 31:0.001276 32:0.001676 33:0.003114 83 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.00323 2:0.00113 3:0.004476 4:0.00326 5:0.308254 6:0.002851 7:0.002349 8:0.001882 9:0.001904 10:0.001221 11:0.002777 12:0.009541 13:0.009993 14:0.0335 15:0.008184 16:0.199949 17:0.007699 18:0.012539 19:0.011171 20:0.015983 21:0.004725 22:0.020049 23:0.011694 24:0.004397 25:0.131228 26:0.029747 27:0.07291 28:0.008919 29:0.005768 30:0.004132 31:0.022341 32:0.016562 33:0.025635 84 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.013131 2:0.004919 3:0.01864 4:0.016505 5:0.202448 6:0.010865 7:0.011198 8:0.009286 9:0.007107 10:0.006596 11:0.032638 12:0.020905 13:0.011932 14:0.039467 15:0.010719 16:0.177335 17:0.006144 18:0.009172 19:0.008951 20:0.026285 21:0.008032 22:0.014391 23:0.02645 24:0.003389 25:0.091795 26:0.017062 27:0.029724 28:0.003769 29:0.006996 30:0.034918 31:0.023399 32:0.084036 33:0.011796 85 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.006131 2:0.001749 3:0.014484 4:0.006812 5:0.277071 6:0.005558 7:0.004628 8:0.003543 9:0.003939 10:0.001946 11:0.007472 12:0.014601 13:0.010593 14:0.043042 15:0.005919 16:0.209119 17:0.004547 18:0.006903 19:0.012491 20:0.012456 21:0.004196 22:0.009468 23:0.004391 24:0.001653 25:0.013724 26:0.009959 27:0.271398 28:0.003334 29:0.002054 30:0.001825 31:0.002958 32:0.002936 33:0.019102 86 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.003856 2:0.001399 3:0.005793 4:0.00449 5:0.300274 6:0.003949 7:0.003087 8:0.00249 9:0.002558 10:0.001425 11:0.004012 12:0.005252 13:0.006745 14:0.057622 15:0.006503 16:0.212706 17:0.003622 18:0.005445 19:0.005643 20:0.016138 21:0.003392 22:0.010265 23:0.004341 24:0.002306 25:0.009727 26:0.005041 27:0.285198 28:0.003916 29:0.00355 30:0.001996 31:0.006085 32:0.002183 33:0.008992 87 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.004855 2:0.001581 3:0.014976 4:0.005444 5:0.285623 6:0.004725 7:0.003643 8:0.002985 9:0.003055 10:0.001676 11:0.004769 12:0.00919 13:0.010097 14:0.067793 15:0.006272 16:0.188035 17:0.004421 18:0.00545 19:0.009588 20:0.017057 21:0.004582 22:0.010847 23:0.004274 24:0.002618 25:0.023395 26:0.014167 27:0.252986 28:0.003804 29:0.003257 30:0.003383 31:0.010881 32:0.008097 33:0.006473 88 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.006735 2:0.001896 3:0.03294 4:0.007011 5:0.257142 6:0.005845 7:0.004862 8:0.003799 9:0.003958 10:0.001937 11:0.007208 12:0.008205 13:0.011721 14:0.070666 15:0.008815 16:0.176052 17:0.00543 18:0.004799 19:0.012382 20:0.015706 21:0.007336 22:0.012221 23:0.007976 24:0.002078 25:0.009023 26:0.006509 27:0.280476 28:0.002889 29:0.002425 30:0.00131 31:0.008802 32:0.00306 33:0.008786 89 | -0.5 -0.274524848919301 -0.5 -0.5 0.5 0.5 0.5 0.3563882549957259 0.4228417465007034 0.3448703994859554 1:0.004941 2:0.001586 3:0.019519 4:0.005272 5:0.281637 6:0.004493 7:0.003523 8:0.002912 9:0.002931 10:0.001706 11:0.004812 12:0.002371 13:0.002767 14:0.003116 15:0.002086 16:0.310108 17:0.001788 18:0.001625 19:0.002299 20:0.002563 21:0.001733 22:0.002878 23:0.000514 24:0.000598 25:0.000643 26:0.000742 27:0.327717 28:0.000566 29:0.000469 30:0.000305 31:0.000454 32:0.000405 33:0.000921 90 | -0.3788794645353393 -0 -0 -0.5 0.07240317600166144 0.1302359181248217 0 0.5 0 0.5 1:0.005019 2:0.001542 3:0.015831 4:0.005619 5:0.282726 6:0.004818 7:0.0039 8:0.002947 9:0.003448 10:0.001662 11:0.00582 12:0.002502 13:0.002737 14:0.003282 15:0.002395 16:0.309136 17:0.002027 18:0.001488 19:0.002203 20:0.002766 21:0.001607 22:0.00319 23:0.000842 24:0.000493 25:0.000632 26:0.000452 27:0.327815 28:0.000483 29:0.000461 30:0.000306 31:0.0007 32:0.000303 33:0.000847 91 | -0 -0 -0.3185989047101716 -0.02116388410452694 0 0 0.4026091776601937 0 0.5 0 1:0.004599 2:0.002323 3:0.019495 4:0.005172 5:0.282099 6:0.003666 7:0.003903 8:0.003406 9:0.002285 10:0.003099 11:0.003287 12:0.002081 13:0.002491 14:0.002838 15:0.001962 16:0.310519 17:0.001873 18:0.001623 19:0.002274 20:0.003629 21:0.001573 22:0.002471 23:0.000527 24:0.000475 25:0.000786 26:0.00053 27:0.32797 28:0.000331 29:0.000421 30:0.000458 31:0.000389 32:0.000978 33:0.00047 92 | -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 0.5 1:0.004759 2:0.001529 3:0.034884 4:0.00517 5:0.266759 6:0.004293 7:0.003499 8:0.002902 9:0.002863 10:0.00165 11:0.005026 12:0.002345 13:0.002661 14:0.002953 15:0.001836 16:0.310546 17:0.001808 18:0.001944 19:0.001997 20:0.00255 21:0.001555 22:0.003138 23:0.000705 24:0.000526 25:0.000972 26:0.001098 27:0.326616 28:0.000529 29:0.000393 30:0.000322 31:0.000852 32:0.000364 33:0.000957 93 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.001717 2:0.0012 3:0.001973 4:0.005548 5:0.001526 6:0.304105 7:0.005839 8:0.00171 9:0.006126 10:0.001206 11:0.002382 12:0.010147 13:0.011121 14:0.028467 15:0.01302 16:0.008832 17:0.016455 18:0.004812 19:0.1349 20:0.020569 21:0.071722 22:0.013288 23:0.010753 24:0.002083 25:0.007922 26:0.093896 27:0.001246 28:0.157246 29:0.006416 30:0.004246 31:0.007918 32:0.028723 33:0.012883 94 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.001988 2:0.001225 3:0.001933 4:0.003435 5:0.001327 6:0.309787 7:0.003615 8:0.00189 9:0.004668 10:0.001444 11:0.002022 12:0.018874 13:0.027676 14:0.055481 15:0.015444 16:0.043056 17:0.039078 18:0.016864 19:0.022248 20:0.023363 21:0.055618 22:0.015632 23:0.006294 24:0.00212 25:0.012125 26:0.005888 27:0.001637 28:0.249902 29:0.012148 30:0.003388 31:0.024853 32:0.009817 33:0.005161 95 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.002012 2:0.001234 3:0.001991 4:0.003585 5:0.001377 6:0.308777 7:0.003503 8:0.002041 9:0.005196 10:0.001518 11:0.002099 12:0.018828 13:0.013742 14:0.053445 15:0.0085 16:0.037424 17:0.093044 18:0.012359 19:0.016735 20:0.033335 21:0.007371 22:0.038551 23:0.006128 24:0.001556 25:0.004326 26:0.006943 27:0.001834 28:0.270969 29:0.004347 30:0.002565 31:0.002014 32:0.023529 33:0.009123 96 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.002134 2:0.001179 3:0.002111 4:0.003882 5:0.00147 6:0.306647 7:0.003925 8:0.001994 9:0.006335 10:0.001428 11:0.002228 12:0.016807 13:0.012946 14:0.035978 15:0.015927 16:0.015805 17:0.136362 18:0.009553 19:0.031413 20:0.01841 21:0.015863 22:0.024268 23:0.002784 24:0.00121 25:0.004801 26:0.003479 27:0.001176 28:0.29796 29:0.004087 30:0.003145 31:0.005612 32:0.005838 33:0.003242 97 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.007695 2:0.002394 3:0.008686 4:0.022592 5:0.006105 6:0.239729 7:0.007034 8:0.007707 9:0.018783 10:0.003057 11:0.009551 12:0.024979 13:0.010419 14:0.01649 15:0.017731 16:0.024953 17:0.0917 18:0.012537 19:0.00771 20:0.016263 21:0.017148 22:0.093404 23:0.011572 24:0.008645 25:0.007401 26:0.008397 27:0.002528 28:0.220098 29:0.030982 30:0.003845 31:0.007814 32:0.005692 33:0.026359 98 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.009339 2:0.003026 3:0.006434 4:0.080028 5:0.00385 6:0.18855 7:0.008076 8:0.013707 9:0.009456 10:0.00415 11:0.006717 12:0.035495 13:0.013098 14:0.03415 15:0.02668 16:0.009087 17:0.112193 18:0.024929 19:0.025985 20:0.022256 21:0.010697 22:0.018763 23:0.040116 24:0.006358 25:0.015108 26:0.029916 27:0.002992 28:0.075981 29:0.020697 30:0.015523 31:0.054804 32:0.051798 33:0.020041 99 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.009196 2:0.002905 3:0.006536 4:0.063442 5:0.004508 6:0.145135 7:0.013451 8:0.070412 9:0.004919 10:0.006652 11:0.006178 12:0.01562 13:0.005939 14:0.003036 15:0.013279 16:0.000333 17:0.192685 18:0.004284 19:0.070186 20:0.003273 21:0.022413 22:0.002286 23:0.002799 24:0.009689 25:0.018788 26:0.015963 27:0.001323 28:0.251068 29:0.014395 30:0.0018 31:0.003326 32:0.011548 33:0.002634 100 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.00446 2:0.002578 3:0.002693 4:0.021316 5:0.001769 6:0.049558 7:0.237827 8:0.003928 9:0.003422 10:0.00291 11:0.002871 12:0.010923 13:0.002579 14:0.003586 15:0.021603 16:0.002429 17:0.029085 18:0.010185 19:0.036556 20:0.003846 21:0.209817 22:0.002724 23:0.010875 24:0.002315 25:0.005163 26:0.015363 27:0.001207 28:0.240364 29:0.010495 30:0.005121 31:0.00731 32:0.013123 33:0.021998 101 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.002845 2:0.001345 3:0.002886 4:0.009296 5:0.002182 6:0.295021 7:0.002771 8:0.003675 9:0.008379 10:0.00155 11:0.003383 12:0.037085 13:0.018868 14:0.05181 15:0.009081 16:0.014278 17:0.078083 18:0.010156 19:0.034302 20:0.024914 21:0.038682 22:0.016075 23:0.002811 24:0.001267 25:0.001686 26:0.005521 27:0.000921 28:0.30486 29:0.005034 30:0.000809 31:0.003687 32:0.001945 33:0.004792 102 | -0 -0 -0 -0 -0 0.4974940402496567 0 0 0 0 1:0.002395 2:0.00139 3:0.002466 4:0.005121 5:0.001712 6:0.30266 7:0.004974 8:0.002367 9:0.005938 10:0.001697 11:0.002613 12:0.000468 13:0.000222 14:0.000932 15:0.000309 16:0.000749 17:0.329024 18:0.000404 19:0.00026 20:0.000386 21:0.000223 22:0.000357 23:0.000284 24:0.000434 25:0.000477 26:0.000264 27:0.000317 28:0.329239 29:0.00037 30:0.000229 31:0.000321 32:0.000754 33:0.000643 103 | -0.08988435177488136 -0 -0 -0.3290792901869402 -0 0 0.2243488112293455 0.07870339168868937 0.309826374836998 0.01263790547380864 1:0.002752 2:0.001241 3:0.002979 4:0.00539 5:0.00218 6:0.301395 7:0.002787 8:0.002716 9:0.00719 10:0.001415 11:0.003288 12:0.000486 13:0.000416 14:0.000825 15:0.000392 16:0.000539 17:0.328804 18:0.000389 19:0.000299 20:0.000473 21:0.000331 22:0.000379 23:0.000146 24:0.00044 25:0.000288 26:0.000476 27:0.000304 28:0.329609 29:0.000421 30:0.000219 31:0.000391 32:0.000666 33:0.000372 104 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0 0.5 0.5 1:0.001961 2:0.001123 3:0.002027 4:0.01301 5:0.001594 6:0.297475 7:0.007442 8:0.002814 9:0.00266 10:0.001245 11:0.001981 12:0.000554 13:0.000176 14:0.00046 15:0.000258 16:0.000243 17:0.329754 18:0.000485 19:0.000633 20:0.000302 21:0.000147 22:0.000322 23:0.000166 24:0.000455 25:0.000302 26:0.001071 27:0.000319 28:0.329587 29:0.000242 30:0.000182 31:0.000274 32:0.000234 33:0.000502 105 | -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 0.5 1:0.003232 2:0.001361 3:0.002582 4:0.006351 5:0.001888 6:0.28573 7:0.021361 8:0.0022 9:0.004126 10:0.001565 11:0.002938 12:0.000652 13:0.000154 14:0.000202 15:0.000281 16:4.3e-005 17:0.330877 18:0.000367 19:0.000181 20:7.7e-005 21:0.000367 22:0.000132 23:0.00047 24:0.00047 25:0.000428 26:0.000279 27:0.000353 28:0.329092 29:0.000466 30:0.000683 31:0.000283 32:0.000609 33:0.0002 106 | -0.5 -0.03915619058248873 -0.2642635986038323 -0.5 -0.07240317600166144 0 0.5 0 0.5 0.5 1:0.002514 2:0.001224 3:0.00248 4:0.011576 5:0.001609 6:0.299245 7:0.002923 8:0.002149 9:0.005712 10:0.001466 11:0.002434 12:0.000902 13:0.000251 14:0.000365 15:0.000409 16:0.00016 17:0.329729 18:0.000237 19:0.000433 20:0.000186 21:0.000387 22:0.000272 23:0.000239 24:0.000376 25:0.00029 26:0.000268 27:0.000341 28:0.329767 29:0.000384 30:0.000308 31:0.000527 32:0.000425 33:0.000409 107 | -0 -0 -0 -0 -0 0 0 0.5 0 0 1:0.002037 2:0.001139 3:0.002105 4:0.005836 5:0.001645 6:0.299583 7:0.003375 8:0.002578 9:0.011344 10:0.001314 11:0.002377 12:0.000474 13:2.9e-005 14:2e-005 15:0.000293 16:1e-006 17:0.332022 18:5.9e-005 19:0.00015 20:1.2e-005 21:0.000228 22:4.5e-005 23:0.000319 24:0.000405 25:0.000495 26:0.000244 27:0.000257 28:0.33024 29:0.000194 30:0.00018 31:0.000409 32:0.000294 33:0.000296 108 | -0 -0 -0 -0 -0 0 0 0.5 0 0 1:0.002047 2:0.001195 3:0.00225 4:0.004222 5:0.001659 6:0.303487 7:0.003146 8:0.002086 9:0.009356 10:0.001385 11:0.002499 12:0.000396 13:0.000245 14:0.000987 15:0.000255 16:0.000565 17:0.32932 18:0.000271 19:0.000546 20:0.000306 21:0.000105 22:0.000336 23:0.000251 24:0.000418 25:0.00058 26:0.000544 27:0.00066 28:0.328932 29:0.000203 30:0.000385 31:0.000352 32:0.00039 33:0.000619 109 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.001194 2:0.001216 3:0.001175 4:0.001178 5:0.001174 6:0.003665 7:0.319469 8:0.001011 9:0.001232 10:0.000718 11:0.001302 12:0.017176 13:0.015404 14:0.123669 15:0.015484 16:0.030926 17:0.01763 18:0.050067 19:0.012411 20:0.03514 21:0.005747 22:0.009679 23:0.007623 24:0.033709 25:0.00891 26:0.013696 27:0.002239 28:0.015744 29:0.113945 30:0.003545 31:0.040355 32:0.006586 33:0.086981 110 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.003551 2:0.002171 3:0.00325 4:0.003947 5:0.002391 6:0.00457 7:0.300519 8:0.004189 9:0.00227 10:0.003162 11:0.003314 12:0.023994 13:0.0279 14:0.033547 15:0.014979 16:0.012693 17:0.018896 18:0.088108 19:0.059658 20:0.029784 21:0.01035 22:0.013425 23:0.013629 24:0.005841 25:0.024793 26:0.065319 27:0.00242 28:0.006313 29:0.150042 30:0.004526 31:0.01742 32:0.006755 33:0.036274 111 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.001526 2:0.001754 3:0.001273 4:0.00186 5:0.001008 6:0.002825 7:0.317842 8:0.001654 9:0.001162 10:0.001127 11:0.001303 12:0.010631 13:0.08082 14:0.070539 15:0.011426 16:0.017321 17:0.009928 18:0.04998 19:0.039521 20:0.01726 21:0.008842 22:0.017064 23:0.009218 24:0.011268 25:0.071929 26:0.037253 27:0.001588 28:0.030358 29:0.128339 30:0.002351 31:0.014101 32:0.01814 33:0.008788 112 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.002515 2:0.001693 3:0.001844 4:0.00192 5:0.001589 6:0.007395 7:0.309789 8:0.001789 9:0.00174 10:0.001178 11:0.00188 12:0.006919 13:0.018901 14:0.185127 15:0.013848 16:0.020215 17:0.009705 18:0.022529 19:0.015616 20:0.016082 21:0.009239 22:0.015152 23:0.021696 24:0.019922 25:0.02728 26:0.024713 27:0.003019 28:0.031531 29:0.154702 30:0.006215 31:0.008878 32:0.017488 33:0.01789 113 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.002914 2:0.001999 3:0.002768 4:0.003073 5:0.002125 6:0.005094 7:0.303918 8:0.002267 9:0.004227 10:0.001578 11:0.003372 12:0.024096 13:0.040968 14:0.065522 15:0.015759 16:0.038119 17:0.013694 18:0.027086 19:0.017751 20:0.023637 21:0.052039 22:0.014663 23:0.002448 24:0.004833 25:0.002344 26:0.002513 27:0.001223 28:0.038866 29:0.092588 30:0.000875 31:0.012872 32:0.003298 33:0.171473 114 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.003309 2:0.002337 3:0.002439 4:0.004334 5:0.002 6:0.011581 7:0.297547 8:0.002649 9:0.002657 10:0.001833 11:0.002646 12:0.011216 13:0.021333 14:0.00695 15:0.02307 16:0.001519 17:0.048966 18:0.186918 19:0.005636 20:0.005038 21:0.009381 22:0.013308 23:0.00567 24:0.008367 25:0.007129 26:0.007811 27:0.002239 28:0.028786 29:0.211641 30:0.001522 31:0.018916 32:0.004474 33:0.036779 115 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.001617 2:0.001473 3:0.001263 4:0.002171 5:0.001044 6:0.003652 7:0.316817 8:0.0015 9:0.001319 10:0.001061 11:0.001416 12:0.056913 13:0.00299 14:0.008412 15:0.108079 16:0.000576 17:0.040714 18:0.005955 19:0.010395 20:0.002839 21:0.087459 22:0.009002 23:0.004983 24:0.002274 25:0.004423 26:0.003092 27:0.000898 28:0.014774 29:0.279884 30:0.001549 31:0.008404 32:0.002063 33:0.010989 116 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.035138 2:0.007251 3:0.021234 4:0.029866 5:0.010094 6:0.037173 7:0.100927 8:0.015101 9:0.00982 10:0.051554 11:0.015176 12:0.011605 13:0.013367 14:0.072562 15:0.009142 16:0.028739 17:0.010917 18:0.056587 19:0.044282 20:0.039069 21:0.006604 22:0.040458 23:0.009269 24:0.00628 25:0.009266 26:0.02295 27:0.001209 28:0.001852 29:0.261448 30:0.004107 31:0.002472 32:0.008263 33:0.006216 117 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.004488 2:0.003252 3:0.002333 4:0.005628 5:0.001182 6:0.003655 7:0.299905 8:0.003472 9:0.002102 10:0.004481 11:0.002834 12:0.005857 13:0.017144 14:0.017435 15:0.01078 16:0.004472 17:0.006002 18:0.19778 19:0.059388 20:0.006872 21:0.003712 22:0.00389 23:0.007773 24:0.021332 25:0.030892 26:0.014349 27:0.002637 28:0.01608 29:0.20664 30:0.002798 31:0.006789 32:0.008397 33:0.015647 118 | -0.1514508171952226 -0 -0.3635046794631114 -0.2972828397744372 -0 -0 0.1920650000283249 0.04645762751326118 0.5 0 1:0.004417 2:0.003177 3:0.002649 4:0.004285 5:0.000837 6:0.002848 7:0.303644 8:0.003246 9:0.00158 10:0.004646 11:0.002002 12:0.000554 13:0.000773 14:0.001322 15:0.000532 16:0.001309 17:0.000937 18:0.324368 19:0.001144 20:0.001135 21:0.000405 22:0.000854 23:0.000481 24:0.000833 25:0.000565 26:0.000815 27:0.00048 28:0.000558 29:0.326835 30:0.000357 31:0.000663 32:0.00081 33:0.000937 119 | -0.5 -0.1813692843604132 -0.5 -0.5 -0.5 -0.4974940402496567 0.5 0.5 0.275959331176739 0.5 1:0.004027 2:0.002517 3:0.002456 4:0.004731 5:0.001373 6:0.004005 7:0.303122 8:0.003345 9:0.001927 10:0.003304 11:0.002526 12:0.000706 13:0.001317 14:0.001035 15:0.001301 16:0.000778 17:0.000967 18:0.324172 19:0.001046 20:0.000715 21:0.000646 22:0.000651 23:0.000663 24:0.001495 25:0.000808 26:0.000885 27:0.000421 28:0.000401 29:0.326824 30:0.000276 31:0.000805 32:0.000301 33:0.000453 120 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 0.5 1:0.004304 2:0.002931 3:0.002036 4:0.004408 5:0.001053 6:0.004152 7:0.30276 8:0.003348 9:0.001758 10:0.004264 11:0.002319 12:0.000843 13:0.001245 14:0.001464 15:0.000876 16:0.000639 17:0.001508 18:0.323218 19:0.001279 20:0.000899 21:0.000616 22:0.000746 23:0.000351 24:0.002142 25:0.000937 26:0.000657 27:0.000307 28:0.000589 29:0.32654 30:0.000242 31:0.000484 32:0.000227 33:0.000856 121 | -0.5 -0.5 -0 -0.5 -0.1302359181248217 -0.5 0.5 0.5 0.5 0.5 1:0.004169 2:0.003073 3:0.002017 4:0.004576 5:0.001045 6:0.003778 7:0.302799 8:0.003464 9:0.001808 10:0.004305 11:0.0023 12:0.000503 13:0.001715 14:0.00069 15:0.000796 16:0.000371 17:0.000643 18:0.325864 19:0.001098 20:0.000572 21:0.00055 22:0.000532 23:0.000357 24:0.002389 25:0.000598 26:0.000547 27:0.000314 28:0.000847 29:0.326136 30:0.000214 31:0.000436 32:0.000416 33:0.00108 122 | -0 -0 -0 -0 -0 -0 0 0 0 0.1226773488936606 1:0.003386 2:0.002036 3:0.002653 4:0.004442 5:0.001786 6:0.004884 7:0.303693 8:0.003265 9:0.002141 10:0.002319 11:0.002727 12:0.00072 13:0.001075 14:0.001431 15:0.000884 16:0.00048 17:0.000846 18:0.324623 19:0.00084 20:0.001052 21:0.000575 22:0.000807 23:0.000261 24:0.001345 25:0.000608 26:0.000828 27:0.000316 28:0.000507 29:0.327373 30:0.000247 31:0.000338 32:0.000373 33:0.001137 123 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.009679 2:0.001848 3:0.003731 4:0.025995 5:0.002699 6:0.015649 7:0.004327 8:0.258814 9:0.003151 10:0.00372 11:0.003721 12:0.025113 13:0.017898 14:0.126369 15:0.013971 16:0.030904 17:0.007547 18:0.004389 19:0.03223 20:0.051756 21:0.006849 22:0.016305 23:0.031082 24:0.003319 25:0.012137 26:0.010757 27:0.007759 28:0.016942 29:0.006276 30:0.211729 31:0.01411 32:0.010992 33:0.008231 124 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.011433 2:0.002382 3:0.006843 4:0.083602 5:0.005149 6:0.020294 7:0.010821 8:0.173254 9:0.005789 10:0.0072 11:0.006567 12:0.012649 13:0.036593 14:0.060437 15:0.018268 16:0.061573 17:0.011354 18:0.018148 19:0.051603 20:0.029682 21:0.008904 22:0.024122 23:0.012256 24:0.00233 25:0.009127 26:0.015588 27:0.00431 28:0.002016 29:0.005033 30:0.077672 31:0.019566 32:0.180985 33:0.004451 125 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.009513 2:0.002309 3:0.006697 4:0.134022 5:0.004924 6:0.023119 7:0.007496 8:0.128749 9:0.004944 10:0.005218 11:0.006341 12:0.020587 13:0.011762 14:0.20638 15:0.025808 16:0.005042 17:0.010877 18:0.004947 19:0.010458 20:0.019536 21:0.006067 22:0.01187 23:0.015998 24:0.001742 25:0.007833 26:0.013445 27:0.001557 28:0.014264 29:0.008541 30:0.229453 31:0.005922 32:0.029483 33:0.005096 126 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.002779 2:0.001203 3:0.002021 4:0.018879 5:0.001527 6:0.005829 7:0.001932 8:0.293924 9:0.001646 10:0.001513 11:0.00208 12:0.052593 13:0.017929 14:0.051594 15:0.021755 16:0.024415 17:0.02746 18:0.028623 19:0.013378 20:0.058338 21:0.027317 22:0.009931 23:0.043325 24:0.002135 25:0.007332 26:0.033511 27:0.006664 28:0.006323 29:0.005884 30:0.195978 31:0.0213 32:0.006951 33:0.003929 127 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.002106 2:0.001123 3:0.001638 4:0.010566 5:0.001236 6:0.002656 7:0.001696 8:0.307591 9:0.001367 10:0.001631 11:0.001723 12:0.019356 13:0.005412 14:0.046813 15:0.013668 16:0.003826 17:0.068569 18:0.01852 19:0.12505 20:0.0099 21:0.014895 22:0.007324 23:0.016651 24:0.002525 25:0.006972 26:0.014139 27:0.00219 28:0.025986 29:0.015395 30:0.063832 31:0.003613 32:0.177632 33:0.004398 128 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.003796 2:0.001189 3:0.001621 4:0.007808 5:0.001138 6:0.002461 7:0.001897 8:0.308707 9:0.001464 10:0.001509 11:0.001742 12:0.026035 13:0.031429 14:0.036099 15:0.028871 16:0.016299 17:0.016888 18:0.044909 19:0.062942 20:0.026076 21:0.028992 22:0.014794 23:0.067917 24:0.003528 25:0.071233 26:0.035904 27:0.003303 28:0.015569 29:0.012103 30:0.057028 31:0.015597 32:0.042384 33:0.008767 129 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.001444 2:0.000615 3:0.001092 4:0.002367 5:0.000979 6:0.001038 7:0.000972 8:0.322194 9:0.000827 10:0.000698 11:0.001107 12:0.025252 13:0.01192 14:0.050508 15:0.035626 16:0.021343 17:0.066325 18:0.010689 19:0.038117 20:0.020446 21:0.026073 22:0.027033 23:0.146901 24:0.002238 25:0.015702 26:0.017296 27:0.002107 28:0.007706 29:0.005364 30:0.082002 31:0.022073 32:0.028485 33:0.00346 130 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.00184 2:0.000935 3:0.001288 4:0.00185 5:0.000961 6:0.001567 7:0.001399 8:0.31972 9:0.001082 10:0.001344 11:0.001347 12:0.01864 13:0.02298 14:0.062873 15:0.013663 16:0.030821 17:0.049487 18:0.014519 19:0.027943 20:0.048626 21:0.018422 22:0.02536 23:0.033957 24:0.001896 25:0.014741 26:0.051707 27:0.006018 28:0.0092 29:0.007143 30:0.065503 31:0.015164 32:0.119057 33:0.008948 131 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.002683 2:0.001438 3:0.00181 4:0.003373 5:0.001284 6:0.002983 7:0.002054 8:0.312377 9:0.00152 10:0.00191 11:0.001902 12:0.01613 13:0.023609 14:0.0406 15:0.012732 16:0.054427 17:0.032971 18:0.008699 19:0.078584 20:0.026147 21:0.024452 22:0.014984 23:0.066037 24:0.003986 25:0.021241 26:0.037634 27:0.006766 28:0.008768 29:0.03958 30:0.086451 31:0.010825 32:0.042287 33:0.009757 132 | -0 -0 -0.0961825580740978 -0.1729062937990415 -0 -0.2243488112293455 -0 0.3070151840917393 0.1812051928875772 0 1:0.002582 2:0.001191 3:0.001898 4:0.003931 5:0.001349 6:0.002856 7:0.002395 8:0.310398 9:0.001488 10:0.003299 11:0.001947 12:0.000642 13:0.000575 14:0.000916 15:0.000578 16:0.000673 17:0.000544 18:0.000492 19:0.327135 20:0.000787 21:0.000512 22:0.00048 23:0.000344 24:0.000426 25:0.000923 26:0.000694 27:0.000632 28:0.00046 29:0.000442 30:0.328246 31:0.000491 32:0.000403 33:0.000274 133 | -0.4905401380388153 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.003377 2:0.001663 3:0.001881 4:0.003567 5:0.001144 6:0.002606 7:0.002549 8:0.308893 9:0.00147 10:0.004218 11:0.001965 12:0.000606 13:0.000856 14:0.000892 15:0.00048 16:0.000542 17:0.000497 18:0.000368 19:0.327572 20:0.000633 21:0.000459 22:0.000427 23:0.000526 24:0.000414 25:0.000715 26:0.000224 27:0.000697 28:0.000339 29:0.000231 30:0.328775 31:0.000506 32:0.000596 33:0.000309 134 | -0 -0 -0 -0 -0 -0 -0.1920650000283249 0 0.5 0.2328120695272445 1:0.003183 2:0.001635 3:0.00178 4:0.003732 5:0.001103 6:0.002556 7:0.002379 8:0.309594 9:0.00143 10:0.004025 11:0.001916 12:0.000896 13:0.000867 14:0.000941 15:0.000499 16:0.000296 17:0.000559 18:0.00068 19:0.326838 20:0.000662 21:0.000444 22:0.000651 23:0.000274 24:0.000499 25:0.000569 26:0.000206 27:0.00036 28:0.000324 29:0.000503 30:0.329722 31:0.000216 32:0.000447 33:0.000213 135 | -0.5 -0.3052021248131678 -0.5 -0.5 -0.4026091776601937 -0.5 -0.5 0.5 0.5 0.5 1:0.003675 2:0.001581 3:0.001821 4:0.003789 5:0.001139 6:0.002396 7:0.002388 8:0.309476 9:0.001449 10:0.003679 11:0.00194 12:0.001116 13:0.000593 14:0.00088 15:0.000509 16:0.000776 17:0.000562 18:0.000437 19:0.326574 20:0.000738 21:0.000582 22:0.000567 23:0.000395 24:0.000446 25:0.000602 26:0.00037 27:0.000341 28:0.000602 29:0.000331 30:0.328747 31:0.000559 32:0.000589 33:0.000351 136 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 0.5 1:0.003478 2:0.001566 3:0.001962 4:0.003855 5:0.001172 6:0.00262 7:0.002386 8:0.308964 9:0.001505 10:0.003799 11:0.002026 12:0.000718 13:0.000763 14:0.000861 15:0.00081 16:0.000439 17:0.000734 18:0.000678 19:0.326543 20:0.000836 21:0.000448 22:0.000501 23:0.000281 24:0.000421 25:0.000402 26:0.000436 27:0.000441 28:0.000272 29:0.000507 30:0.329242 31:0.000421 32:0.000484 33:0.000426 137 | -0.5 -0 -0 -0 -0 -0 -0 0 0 0 1:0.003444 2:0.001088 3:0.001618 4:0.003502 5:0.001255 6:0.002288 7:0.001926 8:0.313918 9:0.001362 10:0.001281 11:0.001651 12:0.000488 13:0.001029 14:0.000857 15:0.000469 16:0.000548 17:0.000491 18:0.000783 19:0.327164 20:0.000667 21:0.000431 22:0.000407 23:0.005912 24:0.000447 25:0.000614 26:0.000325 27:0.000441 28:0.000414 29:0.00036 30:0.321946 31:0.000454 32:0.002124 33:0.000297 138 | -0 -0 -0 -0.5 -0 -0 -0 0 0 0 1:0.001872 2:0.000975 3:0.00152 4:0.007369 5:0.001228 6:0.002271 7:0.001548 8:0.312612 9:0.001262 10:0.001112 11:0.001564 12:0.000681 13:0.000419 14:0.000718 15:0.000989 16:0.00033 17:0.000771 18:0.001008 19:0.32659 20:0.000552 21:0.000598 22:0.000678 23:0.000436 24:0.000427 25:0.00046 26:0.000707 27:0.000304 28:0.000561 29:0.000485 30:0.328465 31:0.000785 32:0.000304 33:0.0004 139 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.002819 2:0.001392 3:0.004322 4:0.005918 5:0.002609 6:0.005608 7:0.003547 8:0.002645 9:0.295326 10:0.001621 11:0.007525 12:0.012191 13:0.016262 14:0.105048 15:0.008015 16:0.022408 17:0.009002 18:0.011146 19:0.012775 20:0.110634 21:0.004075 22:0.021778 23:0.00873 24:0.001347 25:0.003123 26:0.004378 27:0.000789 28:0.003879 29:0.001053 30:0.001634 31:0.297067 32:0.003489 33:0.007844 140 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.00195 2:0.001069 3:0.002705 4:0.003428 5:0.001633 6:0.003317 7:0.002311 8:0.001863 9:0.309232 10:0.001247 11:0.004578 12:0.015992 13:0.006252 14:0.158805 15:0.007984 16:0.045946 17:0.007144 18:0.006427 19:0.011629 20:0.034935 21:0.004694 22:0.033526 23:0.002168 24:0.003785 25:0.016386 26:0.036201 27:0.001602 28:0.007247 29:0.00257 30:0.001402 31:0.256184 32:0.001971 33:0.003817 141 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.003552 2:0.001683 3:0.00519 4:0.008972 5:0.002982 6:0.006134 7:0.00421 8:0.003241 9:0.285744 10:0.002015 11:0.00961 12:0.010002 13:0.0375 14:0.137864 15:0.010946 16:0.022099 17:0.005344 18:0.011954 19:0.021674 20:0.04391 21:0.006223 22:0.025817 23:0.020424 24:0.002405 25:0.030786 26:0.019867 27:0.039438 28:0.008294 29:0.007988 30:0.019114 31:0.155217 32:0.01263 33:0.01717 142 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.002602 2:0.001365 3:0.003536 4:0.00588 5:0.002377 6:0.006591 7:0.003138 8:0.002518 9:0.29745 10:0.001623 11:0.006251 12:0.01647 13:0.014768 14:0.031676 15:0.022711 16:0.041184 17:0.00758 18:0.010909 19:0.044088 20:0.106723 21:0.004936 22:0.032288 23:0.021918 24:0.002838 25:0.038244 26:0.051244 27:0.006398 28:0.059823 29:0.010293 30:0.011418 31:0.102163 32:0.006926 33:0.022068 143 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.004017 2:0.00194 3:0.005989 4:0.007035 5:0.003358 6:0.004935 7:0.004668 8:0.003572 9:0.275336 10:0.002302 11:0.020181 12:0.016476 13:0.031207 14:0.155149 15:0.021581 16:0.008131 17:0.022312 18:0.005993 19:0.015335 20:0.034319 21:0.010653 22:0.012179 23:0.038138 24:0.003846 25:0.082485 26:0.037243 27:0.007069 28:0.015268 29:0.010985 30:0.007101 31:0.061463 32:0.010801 33:0.058935 144 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.005043 2:0.002346 3:0.006015 4:0.008979 5:0.00385 6:0.010995 7:0.009468 8:0.004644 9:0.266244 10:0.002836 11:0.012914 12:0.01412 13:0.022872 14:0.10346 15:0.012459 16:0.045134 17:0.007608 18:0.014189 19:0.021151 20:0.050457 21:0.007626 22:0.034258 23:0.13406 24:0.004721 25:0.049538 26:0.054537 27:0.011059 28:0.007448 29:0.010288 30:0.017957 31:0.021742 32:0.008286 33:0.013697 145 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.004216 2:0.002784 3:0.00229 4:0.00729 5:0.001375 6:0.004665 7:0.004111 8:0.005198 9:0.293008 10:0.005418 11:0.002978 12:0.002746 13:0.003923 14:0.026767 15:0.003827 16:0.012552 17:0.002878 18:0.003231 19:0.006755 20:0.265088 21:0.001466 22:0.0041 23:0.004043 24:0.001079 25:0.006129 26:0.013497 27:0.003492 28:0.009918 29:0.002706 30:0.006814 31:0.271058 32:0.011773 33:0.002824 146 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.003442 2:0.001682 3:0.00652 4:0.013188 5:0.003285 6:0.06636 7:0.004542 8:0.003091 9:0.223947 10:0.001969 11:0.005308 12:0.025357 13:0.010591 14:0.075967 15:0.033595 16:0.046922 17:0.03366 18:0.013094 19:0.027119 20:0.040383 21:0.01258 22:0.014065 23:0.025414 24:0.00147 25:0.022338 26:0.100766 27:0.012706 28:0.033988 29:0.038367 30:0.010291 31:0.061344 32:0.016373 33:0.010278 147 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.00308 2:0.001459 3:0.00499 4:0.009321 5:0.003107 6:0.055482 7:0.004022 8:0.002928 9:0.241866 10:0.001719 11:0.005359 12:0.00829 13:0.025931 14:0.076812 15:0.037311 16:0.009104 17:0.01959 18:0.007842 19:0.021074 20:0.079913 21:0.010289 22:0.037177 23:0.018541 24:0.001698 25:0.013962 26:0.025311 27:0.002775 28:0.013991 29:0.010153 30:0.003177 31:0.203212 32:0.007839 33:0.032672 148 | -0 -0 -0.1366513405489752 -0.06376650957509282 -0 -0 -0.04645762751326118 -0 0 0.3327794254304624 1:0.002918 2:0.00148 3:0.004264 4:0.005718 5:0.002769 6:0.006018 7:0.005934 8:0.002688 9:0.290778 10:0.001689 11:0.009076 12:0.00073 13:0.000771 14:0.001089 15:0.000829 16:0.000667 17:0.000437 18:0.000718 19:0.000484 20:0.326675 21:0.000464 22:0.00047 23:0.000306 24:0.000331 25:0.000294 26:0.000327 27:0.000263 28:0.00029 29:0.000399 30:0.000232 31:0.330365 32:0.000219 33:0.000307 149 | -0.3373819658913881 -0 -0 -0.5 -0 -0.07870339168868937 -0 -0.3070151840917393 0.3007500392512009 0 1:0.003641 2:0.001927 3:0.003116 4:0.006499 5:0.001929 6:0.006434 7:0.005624 8:0.003285 9:0.293035 10:0.002837 11:0.005008 12:0.001646 13:0.000844 14:0.001247 15:0.000896 16:0.001099 17:0.000842 18:0.000569 19:0.00126 20:0.323028 21:0.000868 22:0.001034 23:0.000294 24:0.000439 25:0.00048 26:0.000331 27:0.000249 28:0.000231 29:0.000374 30:0.000305 31:0.33002 32:0.00034 33:0.000271 150 | -0.5 -0.2119437026143853 -0.5 -0.5 -0.3563882549957259 -0.5 -0.5 -0.5 0.5 0.5 1:0.00239 2:0.001296 3:0.003536 4:0.008484 5:0.002421 6:0.034425 7:0.002962 8:0.002471 9:0.269764 10:0.001469 11:0.004115 12:0.000712 13:0.000683 14:0.00107 15:0.000881 16:0.000653 17:0.000732 18:0.000631 19:0.000598 20:0.326096 21:0.000611 22:0.000666 23:0.000258 24:0.000329 25:0.0002 26:0.000189 27:0.000211 28:0.000628 29:0.000313 30:0.000196 31:0.330723 32:0.000142 33:0.000142 151 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.002482 2:0.001316 3:0.004123 4:0.005263 5:0.002548 6:0.036311 7:0.003111 8:0.002455 9:0.269935 10:0.00151 11:0.00428 12:0.000949 13:0.000727 14:0.001485 15:0.001234 16:0.000473 17:0.001224 18:0.000966 19:0.001012 20:0.32338 21:0.001141 22:0.000742 23:0.000178 24:0.000334 25:0.000151 26:0.000274 27:0.000451 28:0.000548 29:0.000226 30:0.000143 31:0.330339 32:0.000345 33:0.000344 152 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 0.5 1:0.002808 2:0.001379 3:0.004576 4:0.026938 5:0.002417 6:0.032264 7:0.003557 8:0.002675 9:0.251219 10:0.001609 11:0.00389 12:0.000931 13:0.000632 14:0.001227 15:0.000808 16:0.000644 17:0.000688 18:0.000658 19:0.000707 20:0.325301 21:0.000705 22:0.001034 23:0.000264 24:0.000348 25:0.000201 26:0.000212 27:0.000246 28:0.000527 29:0.000294 30:0.000161 31:0.330546 32:0.000226 33:0.000308 153 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.003277 2:0.001188 3:0.001797 4:0.003024 5:0.000986 6:0.002064 7:0.001767 8:0.002138 9:0.001302 10:0.314209 11:0.00158 12:0.038726 13:0.013011 14:0.051505 15:0.014538 16:0.076758 17:0.024327 18:0.015107 19:0.035705 20:0.016263 21:0.040297 22:0.007096 23:0.105235 24:0.003336 25:0.053734 26:0.025194 27:0.005246 28:0.03925 29:0.006752 30:0.011901 31:0.015146 32:0.043584 33:0.023955 154 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.009915 2:0.002616 3:0.003658 4:0.008539 5:0.002178 6:0.005489 7:0.004578 8:0.0087 9:0.002614 10:0.281445 11:0.003602 12:0.036157 13:0.029265 14:0.03365 15:0.054257 16:0.003919 17:0.052751 18:0.011179 19:0.036758 20:0.036144 21:0.030348 22:0.008906 23:0.055202 24:0.003822 25:0.03605 26:0.007229 27:0.006332 28:0.009501 29:0.016071 30:0.014695 31:0.020597 32:0.146607 33:0.017227 155 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.00464 2:0.00155 3:0.0024 4:0.006414 5:0.001581 6:0.004325 7:0.00249 8:0.004522 9:0.002044 10:0.300926 11:0.002442 12:0.021396 13:0.027158 14:0.031866 15:0.014158 16:0.010695 17:0.016197 18:0.004328 19:0.104068 20:0.022 21:0.075531 22:0.005937 23:0.017006 24:0.004084 25:0.03461 26:0.05952 27:0.005314 28:0.019768 29:0.015721 30:0.103089 31:0.014075 32:0.043162 33:0.016984 156 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.01868 2:0.003931 3:0.008216 4:0.035576 5:0.00498 6:0.018299 7:0.010794 8:0.016057 9:0.006279 10:0.202426 11:0.008096 12:0.021428 13:0.023296 14:0.100857 15:0.031585 16:0.013951 17:0.01259 18:0.014686 19:0.031438 20:0.026092 21:0.047098 22:0.010313 23:0.057276 24:0.002585 25:0.012426 26:0.027236 27:0.014013 28:0.018499 29:0.09436 30:0.005733 31:0.012691 32:0.082916 33:0.005598 157 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.011305 2:0.003047 3:0.006752 4:0.017068 5:0.003798 6:0.010892 7:0.006468 8:0.022022 9:0.004433 10:0.241307 11:0.006242 12:0.072302 13:0.009387 14:0.01592 15:0.02375 16:0.009172 17:0.031735 18:0.012671 19:0.028362 20:0.075695 21:0.034864 22:0.019476 23:0.078935 24:0.006028 25:0.032004 26:0.037597 27:0.012909 28:0.048938 29:0.019411 30:0.038931 31:0.011812 32:0.036412 33:0.010358 158 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.016498 2:0.006135 3:0.004887 4:0.016085 5:0.001908 6:0.006606 7:0.008557 8:0.014224 9:0.003824 10:0.249355 11:0.005254 12:0.016691 13:0.022456 14:0.025215 15:0.043716 16:0.00704 17:0.009226 18:0.115592 19:0.042894 20:0.017234 21:0.025941 22:0.007327 23:0.025826 24:0.003566 25:0.024473 26:0.018682 27:0.010745 28:0.032522 29:0.012813 30:0.034039 31:0.015263 32:0.148167 33:0.007237 159 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.003938 2:0.002188 3:0.000911 4:0.002066 5:0.000374 6:0.001025 7:0.001468 8:0.001944 9:0.000802 10:0.317645 11:0.000973 12:0.014103 13:0.011233 14:0.015496 15:0.012975 16:0.002125 17:0.085353 18:0.053657 19:0.019378 20:0.004779 21:0.108294 22:0.005941 23:0.00629 24:0.002288 25:0.020958 26:0.006682 27:0.00131 28:0.018432 29:0.014645 30:0.003272 31:0.007498 32:0.248684 33:0.003273 160 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.010413 2:0.002477 3:0.007148 4:0.018988 5:0.005412 6:0.01392 7:0.005994 8:0.010226 9:0.005252 10:0.246668 11:0.006835 12:0.023972 13:0.008006 14:0.123299 15:0.014215 16:0.009662 17:0.04682 18:0.015797 19:0.022808 20:0.022382 21:0.020706 22:0.025666 23:0.069567 24:0.00371 25:0.008411 26:0.021774 27:0.011467 28:0.007986 29:0.007231 30:0.056154 31:0.017899 32:0.121681 33:0.007453 161 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.007419 2:0.003901 3:0.001306 4:0.003881 5:0.000523 6:0.001657 7:0.002791 8:0.004539 9:0.001195 10:0.304679 11:0.001444 12:0.035848 13:0.007273 14:0.010228 15:0.032716 16:0.002195 17:0.052987 18:0.012571 19:0.01464 20:0.024089 21:0.064757 22:0.076031 23:0.042238 24:0.005255 25:0.037053 26:0.069929 27:0.018698 28:0.006529 29:0.007582 30:0.04542 31:0.043169 32:0.040136 33:0.017326 162 | -0.5 -0.5 -0.5 -0.5 -0.4228417465007034 -0.5 -0.5 -0.5 -0.5 0.5 1:0.00424 2:0.00117 3:0.002734 4:0.00412 5:0.001619 6:0.003078 7:0.002189 8:0.00278 9:0.001748 10:0.307359 11:0.002296 12:0.000389 13:0.000219 14:0.00042 15:0.000611 16:0.000205 17:0.000507 18:0.000293 19:0.000602 20:0.000319 21:0.32949 22:0.000278 23:0.000324 24:0.000439 25:0.000351 26:0.000135 27:0.000282 28:0.000235 29:0.000215 30:0.000402 31:0.000283 32:0.330401 33:0.000266 163 | -0.004883308688503885 -0 -0 -0 -0 -0 -0.275959331176739 -0 -0 0 1:0.005113 2:0.001613 3:0.001987 4:0.003848 5:0.001066 6:0.002538 7:0.002495 8:0.00265 9:0.001558 10:0.30849 11:0.001977 12:0.000248 13:0.000561 14:0.00069 15:0.000519 16:0.000361 17:0.000336 18:0.000394 19:0.000374 20:0.000336 21:0.329164 22:0.000348 23:0.000183 24:0.000438 25:0.000449 26:0.000279 27:0.000242 28:0.000445 29:0.000355 30:0.000131 31:0.000215 32:0.330055 33:0.00054 164 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.003904 2:0.001284 3:0.001859 4:0.004041 5:0.001184 6:0.002904 7:0.00213 8:0.002421 9:0.001543 10:0.310199 11:0.001864 12:0.000433 13:0.000472 14:0.00063 15:0.000491 16:0.000318 17:0.000374 18:0.000255 19:0.000371 20:0.000616 21:0.328916 22:0.000455 23:0.001742 24:0.000541 25:0.000538 26:0.001112 27:0.000506 28:0.003087 29:0.001041 30:0.0002 31:0.002572 32:0.320938 33:0.001057 165 | -0 -0 -0.1577623079534603 -0.5 -0 -0.309826374836998 -0 -0.5 -0.3007500392512009 0.2819975784326619 1:0.004112 2:0.001009 3:0.002445 4:0.004039 5:0.001529 6:0.003097 7:0.002006 8:0.003228 9:0.001664 10:0.308148 11:0.002057 12:0.000361 13:0.000313 14:0.000669 15:0.00062 16:0.000612 17:0.000242 18:0.000255 19:0.000395 20:0.000415 21:0.329131 22:0.000321 23:0.000181 24:0.000372 25:0.000331 26:0.000326 27:0.00032 28:0.000414 29:0.000178 30:0.000337 31:0.000255 32:0.330107 33:0.000512 166 | -0 -0 -0 -0.09236938944229374 -0 -0 -0 -0.1812051928875772 -0 0 1:0.003904 2:0.000988 3:0.002275 4:0.004006 5:0.001445 6:0.003456 7:0.002062 8:0.003214 9:0.001615 10:0.3084 11:0.001967 12:0.000467 13:0.000342 14:0.000621 15:0.000596 16:0.000482 17:0.000403 18:0.000265 19:0.000315 20:0.000342 21:0.32911 22:0.00039 23:0.000248 24:0.000349 25:0.00044 26:0.000168 27:0.000535 28:0.000137 29:0.000117 30:0.000363 31:0.000144 32:0.33058 33:0.000253 167 | -0.5 -0 -0 -0 -0 -0 -0 -0 -0 0 1:0.005647 2:0.001561 3:0.002376 4:0.003701 5:0.001163 6:0.002547 7:0.002197 8:0.002421 9:0.001572 10:0.308165 11:0.001984 12:0.000334 13:0.000513 14:0.000728 15:0.000541 16:0.000456 17:0.000295 18:0.000392 19:0.000577 20:0.000431 21:0.328792 22:0.000274 23:0.000229 24:0.000326 25:0.000365 26:0.000116 27:0.000361 28:0.000104 29:0.000141 30:0.000362 31:0.000182 32:0.330962 33:0.000186 168 | -0.5 -0.3176095030431924 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 0.5 1:0.004541 2:0.001207 3:0.002656 4:0.00407 5:0.001477 6:0.002987 7:0.002371 8:0.002722 9:0.001731 10:0.307371 11:0.0022 12:0.000361 13:0.000427 14:0.000659 15:0.000516 16:0.000374 17:0.000217 18:0.00029 19:0.000309 20:0.000596 21:0.329193 22:0.000391 23:0.000237 24:0.000273 25:0.000426 26:0.000141 27:0.000468 28:0.000147 29:0.000142 30:0.000183 31:0.000152 32:0.330945 33:0.000218 169 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.003479 2:0.001805 3:0.004782 4:0.005852 5:0.002539 6:0.003827 7:0.00378 8:0.002983 9:0.003417 10:0.001797 11:0.299072 12:0.015753 13:0.03093 14:0.077059 15:0.01176 16:0.03921 17:0.012847 18:0.01435 19:0.017143 20:0.061571 21:0.006317 22:0.046392 23:0.018714 24:0.011448 25:0.036104 26:0.019376 27:0.005103 28:0.014536 29:0.009819 30:0.003862 31:0.066927 32:0.009753 33:0.137691 170 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.00612 2:0.002675 3:0.00742 4:0.011231 5:0.004106 6:0.007502 7:0.006742 8:0.005178 9:0.013672 10:0.002936 11:0.265752 12:0.008673 13:0.008555 14:0.112705 15:0.004813 16:0.045871 17:0.007204 18:0.003506 19:0.010164 20:0.008067 21:0.005757 22:0.118019 23:0.00527 24:0.005132 25:0.008723 26:0.004108 27:0.001352 28:0.010998 29:0.002981 30:0.006491 31:0.017362 32:0.00433 33:0.266587 171 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.004537 2:0.001979 3:0.004966 4:0.00707 5:0.002604 6:0.004564 7:0.004075 8:0.003663 9:0.00253 10:0.002459 11:0.294887 12:0.020729 13:0.032206 14:0.091066 15:0.010417 16:0.015974 17:0.016202 18:0.011986 19:0.011334 20:0.022634 21:0.007317 22:0.093469 23:0.001932 24:0.008466 25:0.171277 26:0.006207 27:0.003936 28:0.005731 29:0.010321 30:0.001111 31:0.015817 32:0.002306 33:0.106228 172 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.005175 2:0.002777 3:0.004169 4:0.006967 5:0.001957 6:0.003911 7:0.004111 8:0.004174 9:0.003142 10:0.003812 11:0.293138 12:0.009212 13:0.017094 14:0.073801 15:0.027437 16:0.023268 17:0.010898 18:0.010271 19:0.010353 20:0.031555 21:0.007548 22:0.111897 23:0.000668 24:0.001946 25:0.010826 26:0.000909 27:0.000359 28:0.004337 29:0.001049 30:0.000441 31:0.001187 32:0.001035 33:0.310577 173 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.004447 2:0.002021 3:0.006545 4:0.007302 5:0.003774 6:0.004998 7:0.005153 8:0.003564 9:0.003019 10:0.002092 11:0.290417 12:0.01247 13:0.008273 14:0.023526 15:0.010582 16:0.048524 17:0.018547 18:0.013861 19:0.011941 20:0.032514 21:0.004443 22:0.148652 23:0.00393 24:0.011799 25:0.013356 26:0.025094 27:0.002608 28:0.011609 29:0.008979 30:0.00148 31:0.046851 32:0.004862 33:0.202766 174 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.00411 2:0.001931 3:0.005959 4:0.006774 5:0.003178 6:0.004728 7:0.004084 8:0.00343 9:0.004809 10:0.00187 11:0.29246 12:0.010083 13:0.028253 14:0.042737 15:0.022197 16:0.097881 17:0.009276 18:0.013834 19:0.00705 20:0.024703 21:0.011002 22:0.066317 23:0.015941 24:0.017222 25:0.070349 26:0.022347 27:0.007497 28:0.031125 29:0.022895 30:0.003888 31:0.065712 32:0.019692 33:0.056666 175 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.004431 2:0.00255 3:0.003618 4:0.006334 5:0.001761 6:0.00373 7:0.003983 8:0.003637 9:0.002581 10:0.003164 11:0.297545 12:0.012859 13:0.021052 14:0.070782 15:0.01959 16:0.020458 17:0.01218 18:0.007069 19:0.012856 20:0.0586 21:0.015989 22:0.081899 23:0.004376 24:0.002461 25:0.01667 26:0.00929 27:0.002699 28:0.005106 29:0.00523 30:0.000986 31:0.042255 32:0.000903 33:0.243357 176 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.007415 2:0.003227 3:0.009471 4:0.018488 5:0.004883 6:0.011032 7:0.006976 8:0.006348 9:0.010688 10:0.003438 11:0.251366 12:0.013123 13:0.020392 14:0.115213 15:0.012966 16:0.036356 17:0.011221 18:0.009682 19:0.010293 20:0.051024 21:0.012525 22:0.040536 23:0.018915 24:0.004313 25:0.057182 26:0.043911 27:0.002684 28:0.01849 29:0.06138 30:0.004865 31:0.047447 32:0.025643 33:0.048501 177 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.007667 2:0.002903 3:0.01919 4:0.012918 5:0.010945 6:0.011044 7:0.00979 8:0.005511 9:0.005665 10:0.002615 11:0.245085 12:0.008029 13:0.021257 14:0.160275 15:0.013865 16:0.025856 17:0.012814 18:0.011789 19:0.014173 20:0.030694 21:0.004954 22:0.029627 23:0.002095 24:0.010564 25:0.222314 26:0.018084 27:0.003141 28:0.002085 29:0.002941 30:0.001348 31:0.027055 32:0.001809 33:0.041897 178 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.003451 2:0.00179 3:0.005044 4:0.005853 5:0.003053 6:0.003983 7:0.003757 8:0.003158 9:0.074572 10:0.001843 11:0.226829 12:0.000694 13:0.001422 14:0.001223 15:0.000826 16:0.000629 17:0.001081 18:0.000611 19:0.000952 20:0.001223 21:0.000709 22:0.323962 23:0.00023 24:0.000386 25:0.000452 26:0.000379 27:0.000222 28:0.000143 29:0.000362 30:0.000245 31:0.000329 32:0.000477 33:0.330109 179 | -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.00305 2:0.001583 3:0.00444 4:0.005226 5:0.002629 6:0.003732 7:0.003344 8:0.002695 9:0.022696 10:0.0015 11:0.282438 12:0.000674 13:0.000579 14:0.001241 15:0.000955 16:0.000907 17:0.000785 18:0.000634 19:0.000736 20:0.000855 21:0.000765 22:0.325203 23:0.000254 24:0.000492 25:0.000466 26:0.000378 27:0.000262 28:0.000395 29:0.000256 30:0.000244 31:0.000335 32:0.000254 33:0.329998 180 | -0.5 -0.2373713904597603 -0.5 -0.5 -0.3448703994859554 -0.5 -0.5 -0.5 -0.5 -0.5 1:0.004676 2:0.003031 3:0.005695 4:0.006507 5:0.002942 6:0.004048 7:0.003811 8:0.003622 9:0.00227 10:0.002721 11:0.29401 12:0.00109 13:0.000618 14:0.001109 15:0.000655 16:0.000805 17:0.000536 18:0.000448 19:0.000561 20:0.000829 21:0.000464 22:0.326218 23:0.000967 24:0.000799 25:0.001148 26:0.004692 27:0.000366 28:0.000692 29:0.003987 30:0.000337 31:0.001206 32:0.000833 33:0.318306 181 | -0.2446021435004448 -0 -0.1874870363625801 -0.4362616802548881 -0 -0.01263790547380864 -0.1226773488936606 -0.2328120695272445 -0.3327794254304624 -0.2819975784326619 1:0.004513 2:0.002518 3:0.006195 4:0.006214 5:0.004029 6:0.003835 7:0.003728 8:0.003555 9:0.002083 10:0.002757 11:0.293905 12:0.000565 13:0.000695 14:0.001126 15:0.000989 16:0.001236 17:0.000719 18:0.000772 19:0.000993 20:0.00091 21:0.000492 22:0.324836 23:0.000523 24:0.000535 25:0.000677 26:0.001511 27:0.000294 28:0.001016 29:0.000983 30:0.000301 31:0.001418 32:0.001285 33:0.324788 182 | -------------------------------------------------------------------------------- /LicensePreamble.txt: -------------------------------------------------------------------------------- 1 | /** 2 | * Software License Agreement (BSD License) 3 | * 4 | * 5 | * Copyright (c) 2013, Kester Duncan 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions 11 | * are met: 12 | * 13 | * * Redistributions of source code must retain the above copyright 14 | * notice, this list of conditions and the following disclaimer. 15 | * * Redistributions in binary form must reproduce the above 16 | * copyright notice, this list of conditions and the following 17 | * disclaimer in the documentation and/or other materials provided 18 | * with the distribution. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | * POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | * \file 34 | * \brief 35 | * \author Kester Duncan 36 | */ -------------------------------------------------------------------------------- /OCLCommon.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include "OCLCommon.h" 3 | 4 | namespace ocl { 5 | 6 | 7 | 8 | 9 | 10 | } -------------------------------------------------------------------------------- /OCLCommon.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Software License Agreement (BSD License) 3 | * 4 | * Object Classification 5 | * Copyright (c) 2013, Kester Duncan 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions 11 | * are met: 12 | * 13 | * * Redistributions of source code must retain the above copyright 14 | * notice, this list of conditions and the following disclaimer. 15 | * * Redistributions in binary form must reproduce the above 16 | * copyright notice, this list of conditions and the following 17 | * disclaimer in the documentation and/or other materials provided 18 | * with the distribution. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | * POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | * \file OCLCommon.h 34 | * \brief Object Classification Common Items 35 | * \author Kester Duncan 36 | */ 37 | #pragma once 38 | #ifndef OCL_COMMON_H_ 39 | #define OCL_COMMON_H_ 40 | 41 | 42 | namespace ocl { 43 | 44 | 45 | } 46 | 47 | 48 | #endif /* OCL_COMMON_H_ */ -------------------------------------------------------------------------------- /OCLMain.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | 7 | #include "ObjectDescription.h" 8 | #include "ObjectClassifier.h" 9 | 10 | 11 | using namespace std; 12 | 13 | static string getClassName(const size_t & idx) { 14 | string categories[11] = {"Bottle", "Bowl", "Box", "Can", "Carton", "Cup", "Mug", "Spray-Can", "Tin", "Tube", "Tub"}; 15 | 16 | if (idx >= 0 && idx < 11) { 17 | return categories[idx]; 18 | } else { 19 | return "Unknown"; 20 | } 21 | } 22 | 23 | 24 | /** 25 | * Main entry point for testing Object Classification Module 26 | */ 27 | int main(int argc, char *argv[]) { 28 | pcl::PointCloud loadedCloud; 29 | pcl::io::loadPLYFile(std::string("./MinuteMaid.ply"), loadedCloud); 30 | 31 | // Change these paths to reflect the layout of your machine 32 | ocl::ObjectDescription objDesc ("."); 33 | ocl::ObjectClassifier classifier("."); 34 | { 35 | boost::timer t; 36 | objDesc.extractFeatureDescriptors(loadedCloud); 37 | objDesc.assignBOWs(); 38 | classifier.classify(objDesc.getFPFHBow(), objDesc.getSIFTBow(), objDesc.getHOGBow()); 39 | cout << "After classification\n"; 40 | printf("Elapsed computation time: %g\n", t.elapsed()); 41 | } 42 | 43 | printf("Object class: %s\n", getClassName(classifier.objectCategory.categoryLabel - 1).c_str()); 44 | printf("Overall confidence value: %g\n", classifier.measureConfidence()); 45 | printf("\t Confidence scores:\n"); 46 | for (size_t j = 0; j < classifier.objectCategory.classConfidence.size(); j++) { 47 | printf("\t %02ld -> %g\n", j + 1, classifier.objectCategory.classConfidence[j]); 48 | } 49 | 50 | cin.get(); 51 | 52 | return EXIT_SUCCESS; 53 | } 54 | -------------------------------------------------------------------------------- /OCLPose3D.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include "OCLPose3D.h" 6 | 7 | 8 | using namespace cv; 9 | 10 | 11 | namespace ocl { 12 | 13 | 14 | /************************************************************************ 15 | * Definition of PrivatePose 16 | * - does all of the geometrical work 17 | ************************************************************************/ 18 | class Pose3D::PrivatePose3D 19 | { 20 | public: 21 | PrivatePose3D(Pose3D* iface) : iface(iface) {} 22 | PrivatePose3D& operator=(const PrivatePose3D& rhs) 23 | { 24 | camera_transform = rhs.camera_transform; 25 | inv_camera_transform = rhs.inv_camera_transform; 26 | intrinsics_transform = rhs.intrinsics_transform; 27 | project_transform = rhs.project_transform; 28 | inv_project_transform = rhs.inv_project_transform; 29 | return *this; 30 | } 31 | 32 | Pose3D* iface; 33 | 34 | Eigen::Isometry3d camera_transform; 35 | Eigen::Isometry3d inv_camera_transform; 36 | Eigen::Isometry3d intrinsics_transform; 37 | Eigen::Projective3d project_transform; 38 | Eigen::Projective3d inv_project_transform; 39 | 40 | Eigen::Isometry3d intrinsicsTransform() const 41 | { 42 | Eigen::Isometry3d m; m.setIdentity(); 43 | m(0,0) = iface->m_focal_x; 44 | m(0,2) = iface->m_image_center_x; 45 | m(1,1) = iface->m_focal_y; 46 | m(1,2) = iface->m_image_center_y; 47 | return m; 48 | } 49 | 50 | Eigen::Matrix3d eigenRotation() const 51 | { return camera_transform.rotation(); } 52 | 53 | 54 | Eigen::Vector3d eigenTranslation() const 55 | { return camera_transform.translation(); } 56 | 57 | 58 | Eigen::Isometry3d eigenRotationTransform() const 59 | { 60 | Eigen::Isometry3d r = Eigen::Isometry3d::Identity(); 61 | r.rotate(eigenRotation()); 62 | return r; 63 | } 64 | 65 | 66 | Eigen::Vector4d projectToImage(const Eigen::Vector4d& p) const 67 | { 68 | if (iface->m_has_camera_params == false) { 69 | printf("You need to set camera params first!"); 70 | } 71 | 72 | Eigen::Vector4d r = project_transform * p; 73 | r(0) /= r(2); 74 | r(1) /= r(2); 75 | 76 | return r; 77 | } 78 | 79 | 80 | void unprojectFromImage(const Eigen::Vector4d& p, Eigen::Vector4d& output) const 81 | { 82 | if (iface->m_has_camera_params == false) { 83 | printf("You need to set camera params first!"); 84 | } 85 | 86 | Eigen::Vector4d r (p(0)*p(2), p(1)*p(2), p(2), 1); 87 | output = inv_project_transform * r; 88 | } 89 | 90 | 91 | void unprojectFromKinectImage(const Eigen::Vector4d& p, Eigen::Vector4d& output) const 92 | { 93 | if (iface->m_has_camera_params == false) { 94 | printf("You need to set camera params first!"); 95 | } 96 | 97 | Eigen::Vector4d r (p(0)*p(2), p(1)*p(2), p(2), 1); 98 | output = inv_project_transform * r; 99 | 100 | } 101 | 102 | 103 | void applyTransformBefore(const Eigen::Isometry3d& transform) 104 | { 105 | camera_transform = camera_transform * transform; 106 | computeProjectiveTransform(); 107 | } 108 | 109 | 110 | void applyTransformAfter(const Eigen::Isometry3d& transform) 111 | { 112 | camera_transform = transform * camera_transform; 113 | computeProjectiveTransform(); 114 | } 115 | 116 | 117 | void computeProjectiveTransform() 118 | { 119 | // y points downward in the image, upward in real world. 120 | // same for z. 121 | Eigen::Isometry3d to_opencv = Eigen::Isometry3d::Identity(); 122 | to_opencv(1,1) = to_opencv(2,2) = -1; 123 | 124 | Eigen::Projective3d projection = Eigen::Projective3d::Identity(); 125 | 126 | Eigen::Isometry3d intrinsics = intrinsicsTransform(); 127 | inv_camera_transform = camera_transform.inverse(); 128 | 129 | project_transform = intrinsics * projection * to_opencv * camera_transform; 130 | inv_project_transform = project_transform.inverse(); 131 | } 132 | 133 | // http://eigen.tuxfamily.org/dox/StructHavingEigenMembers.html 134 | public: 135 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW 136 | 137 | private: 138 | PrivatePose3D(const PrivatePose3D&); 139 | }; 140 | 141 | 142 | 143 | Pose3D :: Pose3D() : 144 | impl(new PrivatePose3D(this)), 145 | m_focal_x(1), m_focal_y(1), 146 | m_image_center_x(0), m_image_center_y(0), 147 | m_has_camera_params(false) 148 | { 149 | impl->camera_transform.setIdentity(); 150 | impl->project_transform = impl->camera_transform; 151 | impl->inv_camera_transform = impl->camera_transform; 152 | impl->inv_project_transform = impl->project_transform.inverse(); 153 | } 154 | 155 | 156 | Pose3D :: ~Pose3D() 157 | { 158 | delete impl; 159 | impl = 0; 160 | } 161 | 162 | 163 | Pose3D :: Pose3D(const Pose3D& rhs) 164 | : impl(new PrivatePose3D(this)) 165 | { 166 | *this = rhs; 167 | } 168 | 169 | 170 | Pose3D& Pose3D :: operator=(const Pose3D& rhs) 171 | { 172 | m_focal_x = rhs.m_focal_x; 173 | m_focal_y = rhs.m_focal_y; 174 | m_image_center_x = rhs.m_image_center_x; 175 | m_image_center_y = rhs.m_image_center_y; 176 | m_has_camera_params = rhs.m_has_camera_params; 177 | *impl = *rhs.impl; 178 | return *this; 179 | } 180 | 181 | 182 | void Pose3D :: setCameraParametersFromOpencv(const cv::Mat1d& cv_matrix) 183 | { 184 | double fx = cv_matrix(0,0); 185 | double fy = cv_matrix(1,1); 186 | double cx = cv_matrix(0,2); 187 | double cy = cv_matrix(1,2); 188 | setCameraParameters(fx,fy,cx,cy); 189 | impl->computeProjectiveTransform(); 190 | } 191 | 192 | 193 | void Pose3D :: toLeftCamera(const cv::Mat1d& cv_matrix, 194 | const cv::Mat1d& R, 195 | const cv::Mat1d& T) 196 | { 197 | double fx = cv_matrix(0,0); 198 | double fy = cv_matrix(1,1); 199 | double cx = cv_matrix(0,2); 200 | double cy = cv_matrix(1,2); 201 | setCameraParameters(fx,fy,cx,cy); 202 | 203 | cv::Mat1d to_gl_base(3,3); setIdentity(to_gl_base); 204 | to_gl_base(1,1) = -1; 205 | to_gl_base(2,2) = -1; 206 | 207 | cv::Mat1d new_R = to_gl_base.inv() * R * to_gl_base; 208 | cv::Mat1d new_T = to_gl_base * (T); 209 | 210 | applyTransformBefore(toVec3d(new_T), new_R); 211 | } 212 | 213 | 214 | void Pose3D :: toRightCamera(const cv::Mat1d& cv_matrix, 215 | const cv::Mat1d& R, 216 | const cv::Mat1d& T) 217 | { 218 | double fx = cv_matrix(0,0); 219 | double fy = cv_matrix(1,1); 220 | double cx = cv_matrix(0,2); 221 | double cy = cv_matrix(1,2); 222 | setCameraParameters(fx,fy,cx,cy); 223 | 224 | // OpenCV coords has y down and z toward scene. 225 | // OpenGL classical 3d coords has y up and z backwards 226 | // This is the transform matrix. 227 | cv::Mat1d to_gl_base(3,3); setIdentity(to_gl_base); 228 | to_gl_base(1,1) = -1; 229 | to_gl_base(2,2) = -1; 230 | 231 | cv::Mat1d new_R = to_gl_base.inv() * R.inv() * to_gl_base; 232 | cv::Mat1d new_T = to_gl_base * (-T); 233 | 234 | applyTransformBefore(toVec3d(new_T), new_R); 235 | } 236 | 237 | 238 | void Pose3D :: setCameraParameters(double fx, double fy, double cx, double cy) 239 | { 240 | m_focal_x = fx; 241 | m_focal_y = fy; 242 | m_image_center_x = cx; 243 | m_image_center_y = cy; 244 | m_has_camera_params = true; 245 | impl->computeProjectiveTransform(); 246 | } 247 | 248 | 249 | void Pose3D :: resetCameraTransform() 250 | { 251 | impl->camera_transform.setIdentity(); 252 | impl->computeProjectiveTransform(); 253 | } 254 | 255 | 256 | void Pose3D :: setCameraTransform(const cv::Mat1d& tvec, const cv::Mat1d& rvec) 257 | { 258 | cv::Mat1d to_open_cv (4,4); 259 | setIdentity(to_open_cv); 260 | to_open_cv(1,1) = -1; 261 | to_open_cv(2,2) = -1; 262 | cv::Mat1d from_open_cv = to_open_cv.inv(); 263 | 264 | CvMat c_rvec = rvec; 265 | cv::Mat1d rot(3,3); CvMat c_rot = rot; 266 | 267 | cv::Mat1d H = cv::Mat1d(4,4); 268 | setIdentity(H); 269 | cv::Mat1d H_rot = H(Rect(0,0,3,3)); 270 | rot.copyTo(H_rot); 271 | H(0,3) = tvec(0,0); 272 | H(1,3) = tvec(1,0); 273 | H(2,3) = tvec(2,0); 274 | 275 | H = from_open_cv * H * to_open_cv; 276 | 277 | cv::Mat1f Hf(4,4); 278 | for_all_rc(Hf) 279 | Hf(r,c) = H(r,c); 280 | setCameraTransform(Hf); 281 | } 282 | 283 | 284 | void Pose3D :: setCameraTransform(const cv::Mat1f& H) 285 | { 286 | for_all_rc(H) 287 | impl->camera_transform(r,c) = H(r,c); 288 | impl->computeProjectiveTransform(); 289 | } 290 | 291 | 292 | void Pose3D :: setCameraTransform(const cv::Mat1d& H) 293 | { 294 | for_all_rc(H) 295 | impl->camera_transform(r,c) = H(r,c); 296 | impl->computeProjectiveTransform(); 297 | } 298 | 299 | 300 | cv::Point3f Pose3D :: cameraTransform(const cv::Point3f& p) const 301 | { 302 | Eigen::Vector3d ep; 303 | toEigen(p, ep); 304 | ep = impl->camera_transform * ep; 305 | return toVec3f(ep); 306 | } 307 | 308 | 309 | cv::Mat1f Pose3D :: cvInvCameraTransform() const 310 | { 311 | cv::Mat1f m(4,4); 312 | Eigen::Matrix4d eigen_m = impl->inv_camera_transform.matrix(); 313 | toOpencv(eigen_m, m); 314 | return m; 315 | } 316 | 317 | 318 | const cv::Vec3f Pose3D :: cvTranslation() const 319 | { 320 | return toVec3f((Eigen::Vector3d)impl->camera_transform.translation()); 321 | } 322 | 323 | 324 | const cv::Vec3f Pose3D :: cvEulerRotation() const 325 | { 326 | cv::Vec3f angles; 327 | Eigen::Matrix3d rotM = impl->camera_transform.rotation().matrix().transpose(); 328 | double xy = sqrt(double(sqr(rotM(0,0)) + sqr(rotM(0,1)))); 329 | if (xy > std::numeric_limits::epsilon() * 8.0) 330 | { 331 | angles(0) = atan2(double(rotM(1,2)), double(rotM(2,2))); 332 | angles(1) = atan2(double(-rotM(0,2)), double(xy)); 333 | angles(2) = atan2(double(rotM(0,1)), double(rotM(0,0))); 334 | } 335 | else 336 | { 337 | angles(0) = atan2(double(-rotM(2,1)), double(rotM(1,1))); 338 | angles(1) = atan2(double(-rotM(0,2)), double(xy)); 339 | angles(2) = 0; 340 | } 341 | return angles; 342 | // Eigen::Vector3d coeffs = impl->camera_transform.rotation().eulerAngles(0, 1, 2); 343 | // return toVec3f(coeffs); 344 | } 345 | 346 | 347 | const cv::Mat1f Pose3D :: cvCameraTransform() const 348 | { 349 | cv::Mat1f m(4,4); 350 | toOpencv(impl->camera_transform.matrix(), m); 351 | return m; 352 | } 353 | 354 | 355 | const cv::Mat1d Pose3D :: cvCameraTransformd() const 356 | { 357 | cv::Mat1d m(4,4); 358 | toOpencv(impl->camera_transform.matrix(), m); 359 | return m; 360 | } 361 | 362 | void Pose3D::cvRotationMatrixTranslation(cv::Mat1d& translation, cv::Mat1d& rotation) const 363 | { 364 | translation.create(3,1); 365 | rotation.create(3,3); 366 | cv::Mat1f H = cvCameraTransform(); 367 | for(int r = 0; r < 3; ++r) 368 | for(int c = 0; c < 3; ++c) 369 | rotation(r,c) = H(r,c); 370 | translation(0,0) = H(0,3); 371 | translation(1,0) = H(1,3); 372 | translation(2,0) = H(2,3); 373 | } 374 | 375 | 376 | cv::Mat1f Pose3D :: cvProjectionMatrix() const 377 | { 378 | cv::Mat1f m(4,4); 379 | toOpencv(impl->project_transform.matrix(), m); 380 | return m; 381 | } 382 | 383 | 384 | cv::Mat1f Pose3D :: cvInvProjectionMatrix() const 385 | { 386 | cv::Mat1f m(4,4); 387 | toOpencv(impl->inv_project_transform.matrix(), m); 388 | return m; 389 | } 390 | 391 | 392 | cv::Point3f Pose3D :: invCameraTransform(const cv::Point3f& p) const 393 | { 394 | Eigen::Vector3d ep; toEigen(p, ep); 395 | ep = impl->inv_camera_transform * ep; 396 | return toVec3f(ep); 397 | } 398 | 399 | 400 | cv::Vec4f Pose3D :: cvQuaternionRotation() const 401 | { 402 | Eigen::Quaterniond q(impl->camera_transform.rotation().matrix()); 403 | return Vec4f(q.x(), q.y(), q.z(), q.w()); 404 | } 405 | 406 | 407 | float Pose3D :: determinant() const 408 | { 409 | return impl->camera_transform.matrix().determinant(); 410 | } 411 | 412 | void Pose3D :: invert() 413 | { 414 | if(impl->camera_transform.matrix().determinant() > 1e-3) { 415 | printf("Matrix is not invertible!"); 416 | } 417 | impl->camera_transform = impl->camera_transform.inverse(); 418 | impl->computeProjectiveTransform(); 419 | } 420 | 421 | 422 | Pose3D Pose3D :: inverted() const 423 | { 424 | Pose3D p = *this; 425 | p.invert(); 426 | return p; 427 | } 428 | 429 | 430 | cv::Point3f Pose3D :: projectToImage(const cv::Point3f& p) const 431 | { 432 | Eigen::Vector4d ep; toEigen(p, ep); 433 | return toVec3f(impl->projectToImage(ep)); 434 | } 435 | 436 | 437 | void Pose3D :: projectToImage(const cv::Mat3f& voxels, const cv::Mat1b& mask, cv::Mat3f& pixels) const 438 | { 439 | Eigen::Vector4d epix; 440 | Eigen::Vector4d evox; 441 | evox(3) = 1; // w does not change. 442 | 443 | for (int r = 0; r < voxels.rows; ++r) 444 | { 445 | const Vec3f* voxels_data = voxels.ptr(r); 446 | const uchar* mask_data = mask.ptr(r); 447 | Vec3f* pixels_data = pixels.ptr(r); 448 | for (int c = 0; c < voxels.cols; ++c) 449 | { 450 | if (!mask_data[c]) 451 | continue; 452 | evox(0) = voxels_data[c][0]; 453 | evox(1) = voxels_data[c][1]; 454 | evox(2) = voxels_data[c][2]; 455 | epix = impl->project_transform * evox; 456 | pixels_data[c][0] = epix(0)/epix(2); 457 | pixels_data[c][1] = epix(1)/epix(2); 458 | pixels_data[c][2] = epix(2); 459 | } 460 | } 461 | } 462 | 463 | 464 | void Pose3D :: unprojectFromImage(const cv::Mat1f& pixels, const cv::Mat1b& mask, cv::Mat3f& voxels) const 465 | { 466 | Eigen::Vector4d epix; 467 | Eigen::Vector4d evox; 468 | 469 | epix(3) = 1; // w does not change. 470 | 471 | for (int r = 0; r < pixels.rows; ++r) 472 | { 473 | const float* pixels_data = pixels.ptr(r); 474 | const uchar* mask_data = mask.ptr(r); 475 | Vec3f* voxels_data = voxels.ptr(r); 476 | for (int c = 0; c < pixels.cols; ++c) 477 | { 478 | if (!mask_data[c]) 479 | continue; 480 | const float d = pixels_data[c]; 481 | epix(0) = c*d; 482 | epix(1) = r*d; 483 | epix(2) = d; 484 | evox = impl->inv_project_transform * epix; 485 | voxels_data[c][0] = evox(0); 486 | voxels_data[c][1] = evox(1); 487 | voxels_data[c][2] = evox(2); 488 | } 489 | } 490 | } 491 | 492 | 493 | cv::Point3f Pose3D :: unprojectFromImage(const cv::Point2f& p, double depth) const 494 | { 495 | Eigen::Vector4d ep (p.x, p.y, depth, 1); 496 | Eigen::Vector4d output; 497 | impl->unprojectFromImage(ep, output); 498 | return toVec3f(output); 499 | } 500 | 501 | 502 | /// KDuncan - Addition 503 | cv::Point3f Pose3D :: unprojectFromKinectImage(const cv::Point2f& p, double depth) const 504 | { 505 | Eigen::Vector4d ep (p.x, p.y, depth, 1); 506 | Eigen::Vector4d output; 507 | impl->unprojectFromKinectImage(ep, output); 508 | return toVec3f(output); 509 | } 510 | 511 | 512 | void Pose3D :: applyTransformBefore(const Pose3D& rhs_pose) 513 | { 514 | // impl->camera_transform = impl->camera_transform * rhs_pose.impl->camera_transform; 515 | // impl->computeProjectiveTransform(); 516 | 517 | // First extracting translation and rotation components to avoid the cumulation 518 | // of numerical errors, eventually leading to invalid transformation matrices, 519 | // e.g. with < 1 determinant. 520 | applyTransformBefore(rhs_pose.cvTranslation(), rhs_pose.cvEulerRotation()); 521 | } 522 | 523 | 524 | void Pose3D :: applyTransformAfter(const Pose3D& rhs_pose) 525 | { 526 | // impl->camera_transform = rhs_pose.impl->camera_transform * impl->camera_transform; 527 | // impl->computeProjectiveTransform(); 528 | 529 | // First extracting translation and rotation components to avoid the cumulation 530 | // of numerical errors, eventually leading to invalid transformation matrices, 531 | // e.g. with < 1 determinant. 532 | applyTransformAfter(rhs_pose.cvTranslation(), rhs_pose.cvEulerRotation()); 533 | } 534 | 535 | 536 | void Pose3D :: applyTransformAfter(const cv::Vec3f& translation, const cv::Mat1d& rotation_matrix) 537 | { 538 | Eigen::Matrix3d emat; toEigen(rotation_matrix, emat); 539 | impl->camera_transform.translate(toEigenVector3d(translation)); 540 | impl->camera_transform.rotate(emat); 541 | impl->computeProjectiveTransform(); 542 | } 543 | 544 | 545 | void Pose3D :: applyTransformBefore(const cv::Vec3f& translation, const cv::Mat1d& rotation_matrix) 546 | { 547 | Eigen::Matrix3d emat; toEigen(rotation_matrix, emat); 548 | impl->camera_transform.prerotate(emat); 549 | impl->camera_transform.pretranslate(toEigenVector3d(translation)); 550 | impl->computeProjectiveTransform(); 551 | } 552 | 553 | 554 | void Pose3D :: applyTransformBefore(const cv::Vec3f& translation, const cv::Vec3f& rotation_euler_angles) 555 | { 556 | impl->camera_transform.translate(toEigenVector3d(translation)); 557 | impl->camera_transform.rotate(Eigen::AngleAxisd(rotation_euler_angles[2], Eigen::Vector3d::UnitZ()) 558 | * Eigen::AngleAxisd(rotation_euler_angles[1], Eigen::Vector3d::UnitY()) 559 | * Eigen::AngleAxisd(rotation_euler_angles[0], Eigen::Vector3d::UnitX())); 560 | impl->computeProjectiveTransform(); 561 | } 562 | 563 | 564 | void Pose3D :: applyTransformAfter(const cv::Vec3f& translation, const cv::Vec3f& rotation_euler_angles) 565 | { 566 | impl->camera_transform.prerotate(Eigen::AngleAxisd(rotation_euler_angles[2], Eigen::Vector3d::UnitZ()) 567 | * Eigen::AngleAxisd(rotation_euler_angles[1], Eigen::Vector3d::UnitY()) 568 | * Eigen::AngleAxisd(rotation_euler_angles[0], Eigen::Vector3d::UnitX())); 569 | impl->camera_transform.pretranslate(toEigenVector3d(translation)); 570 | impl->computeProjectiveTransform(); 571 | } 572 | 573 | 574 | 575 | 576 | } /* ocl */ -------------------------------------------------------------------------------- /OCLPose3D.h: -------------------------------------------------------------------------------- 1 | #pragma once 2 | #ifndef OCL_POSE_3D_H_ 3 | #define OCL_POSE_3D_H_ 4 | 5 | #include 6 | 7 | namespace ocl { 8 | 9 | /** 10 | * Some utility functions 11 | */ 12 | 13 | # define for_all_rc(im) \ 14 | for (int r = 0; r < (im).rows; ++r) \ 15 | for (int c = 0; c < (im).cols; ++c) 16 | 17 | 18 | template 19 | inline cv::Vec3f toVec3f(const Eigen::Matrix& v) 20 | { 21 | return cv::Vec3f(v(0),v(1),v(2)); 22 | } 23 | 24 | 25 | template 26 | inline cv::Vec3f toVec3f(const Eigen::Matrix& v) 27 | { 28 | return cv::Vec3f(v(0),v(1),v(2)); 29 | } 30 | 31 | 32 | template 33 | inline void toEigen(const cv::Point3_& p, Eigen::Matrix& ep) 34 | { 35 | ep(0) = p.x; 36 | ep(1) = p.y; 37 | ep(2) = p.z; 38 | } 39 | 40 | 41 | template 42 | inline void toEigen(const cv::Vec& p, Eigen::Matrix& ep) 43 | { 44 | ep(0) = p[0]; 45 | ep(1) = p[1]; 46 | ep(2) = p[2]; 47 | } 48 | 49 | 50 | #ifdef _MSC_VER 51 | inline void toEigen(const cv::Mat1d& mat, Eigen::Matrix3d& ep) 52 | { 53 | for (int r = 0; r < 3; ++r) 54 | for (int c = 0; c < 3; ++c) 55 | ep(r,c) = mat(r,c); 56 | } 57 | #else 58 | template 59 | inline void toEigen(const cv::Mat_& mat, Eigen::Matrix& ep) 60 | { 61 | for (int r = 0; r < H; ++r) 62 | for (int c = 0; c < W; ++c) 63 | ep(r,c) = mat(r,c); 64 | } 65 | #endif 66 | 67 | 68 | inline void toOpencv(const Eigen::Matrix4d& ep, 69 | cv::Mat1f& mat) 70 | { 71 | for (int r = 0; r < 4; ++r) 72 | for (int c = 0; c < 4; ++c) 73 | mat(r,c) = ep(r,c); 74 | } 75 | 76 | 77 | inline void toOpencv(const Eigen::Matrix4d& ep, 78 | cv::Mat1d& mat) 79 | { 80 | for (int r = 0; r < 4; ++r) 81 | for (int c = 0; c < 4; ++c) 82 | mat(r,c) = ep(r,c); 83 | } 84 | 85 | 86 | template 87 | cv::Vec3d toVec3d(const cv::Mat_& m) 88 | { 89 | if (m.rows == 3 && m.cols == 1) { 90 | printf("m is not a vector."); 91 | } 92 | return cv::Vec3d(m(0,0), m(1,0), m(2,0)); 93 | } 94 | 95 | 96 | inline Eigen::Vector3d toEigenVector3d(const cv::Vec3f& v) 97 | { 98 | Eigen::Vector3d r; 99 | toEigen(v, r); 100 | return r; 101 | } 102 | 103 | 104 | template 105 | inline void toEigen(const cv::Point3_& p, Eigen::Matrix& ep) 106 | { 107 | ep(0) = p.x; 108 | ep(1) = p.y; 109 | ep(2) = p.z; 110 | ep(3) = 1; 111 | } 112 | 113 | 114 | inline float sqr(float x) { return x*x; } 115 | inline double sqr(double x) { return x*x; } 116 | 117 | 118 | 119 | /** 120 | * Represent transformations within a Pin-Hole camera model 121 | * Can be used both for 3D camera transforms and projections 122 | * on an image plane using perspective or othogonal model. 123 | * The default representation is OpenGL-like: 124 | * Y 125 | * |__ X 126 | * / 127 | * Z 128 | * 129 | * This code has been adopted from nestk's version of Pose3D 130 | */ 131 | class Pose3D 132 | { 133 | private: 134 | class PrivatePose3D; 135 | friend class PrivatePose3D; 136 | PrivatePose3D* impl; 137 | 138 | public: 139 | Pose3D(); 140 | ~Pose3D(); 141 | 142 | Pose3D(const Pose3D& rhs); 143 | Pose3D& operator=(const Pose3D& rhs); 144 | 145 | /*! Set parameters from intrinsics matrix. */ 146 | void setCameraParametersFromOpencv(const cv::Mat1d& cv_matrix); 147 | 148 | /*! Set parameters from intrinsics matrix. */ 149 | void setCameraParameters(double fx, double fy, double cx, double cy); 150 | 151 | /*! 152 | * Transform a right camera into a left camera using stereo parameters. 153 | * \param intrinsics_matrix intrinsics matrix of the left camera. 154 | * \param R extrinsics 3x3 rotation matrix. 155 | * \param T extrinsics 1x3 translation matrix. 156 | */ 157 | void toLeftCamera(const cv::Mat1d& intrinsics_matrix, 158 | const cv::Mat1d& R, 159 | const cv::Mat1d& T); 160 | 161 | /*! 162 | * Transform a left camera into a right camera using stereo parameters. 163 | * @see toLeftCamera 164 | */ 165 | void toRightCamera(const cv::Mat1d& cv_matrix, 166 | const cv::Mat1d& R, 167 | const cv::Mat1d& T); 168 | 169 | /*! Focal lenghts in pixels. */ 170 | double focalX() const { return m_focal_x; } 171 | double focalY() const { return m_focal_y; } 172 | 173 | /*! Image plane center. */ 174 | double imageCenterX() const { return m_image_center_x; } 175 | double imageCenterY() const { return m_image_center_y; } 176 | 177 | /*! Mean focal. */ 178 | double meanFocal() const { return (m_focal_x + m_focal_y)/2.0; } 179 | 180 | /*! Whether it can be used as a complete camera model. */ 181 | bool isValid() const { return m_has_camera_params; } 182 | 183 | /*! Return the determinant of the projection matrix. */ 184 | float determinant() const; 185 | 186 | 187 | public: 188 | /*! Returns the camera translation as OpenCV 3x3 matrix. */ 189 | const cv::Vec3f cvTranslation() const; 190 | 191 | /*! 192 | * Returns the camera rotation as OpenCV vector of euler angles. 193 | * First angle is around X, second around Y and third around Z. 194 | */ 195 | const cv::Vec3f cvEulerRotation() const; 196 | 197 | /*! Returns the rotation as a quaternion. */ 198 | cv::Vec4f cvQuaternionRotation() const; 199 | 200 | /*! Returns the camera transform as an OpenCV float 4x4 matrix. */ 201 | const cv::Mat1f cvCameraTransform() const; 202 | 203 | /*! Returns the camera transform as an OpenCV double 4x4 matrix. */ 204 | const cv::Mat1d cvCameraTransformd() const; 205 | 206 | /*! 207 | * Returns the camera transform as an OpenCV 3x3 rotation matrix 208 | * and a translation vector as a 3x1 matrix. 209 | * Useful to update calibration parameters. 210 | */ 211 | void cvRotationMatrixTranslation(cv::Mat1d& translation, cv::Mat1d& rotation) const; 212 | 213 | /*! Returns the inverse camera transform as an OpenCV 4x4 matrix. */ 214 | cv::Mat1f cvInvCameraTransform() const; 215 | 216 | /*! Returns the 4x4 projection matrix (intrinsics * camera) */ 217 | cv::Mat1f cvProjectionMatrix() const; 218 | 219 | /*! Returns the 4x4 inverse projection matrix from image to plane. */ 220 | cv::Mat1f cvInvProjectionMatrix() const; 221 | 222 | /*! Reset the camera transform to Identity. */ 223 | void resetCameraTransform(); 224 | 225 | /*! Invert the camera transform. */ 226 | void invert(); 227 | 228 | /*! Return the inverted transform. */ 229 | Pose3D inverted() const; 230 | 231 | /*! 232 | * Set the 3D camera transformation from OpenCV translation 233 | * and rodrigues vector. 234 | */ 235 | void setCameraTransform(const cv::Mat1d& tvec, const cv::Mat1d& rvec); 236 | 237 | /*! Set the 3D camera transform from 4x4 matrix. */ 238 | void setCameraTransform(const cv::Mat1f& H); 239 | 240 | /*! Set the 3D camera transform from 4x4 matrix. */ 241 | void setCameraTransform(const cv::Mat1d& H); 242 | 243 | /*! Set the 3D camera transform from 3x3 fundamental matrix. */ 244 | void setCameraTransformFromCvFundamentalMatrix(const cv::Mat1f& F); 245 | 246 | /*! Apply a camera transform on the right. */ 247 | void applyTransformBefore(const Pose3D& rhs_pose); 248 | void applyTransformBefore(const cv::Vec3f& cvTranslation, const cv::Vec3f& rotation_euler_angles); 249 | void applyTransformBefore(const cv::Vec3f& cvTranslation, const cv::Mat1d& rotation_matrix); 250 | 251 | /*! Apply a camera transform on the left. */ 252 | void applyTransformAfter(const Pose3D& rhs_pose); 253 | void applyTransformAfter(const cv::Vec3f& translation, const cv::Vec3f& rotation_euler_angles); 254 | void applyTransformAfter(const cv::Vec3f& translation, const cv::Mat1d& rotation_matrix); 255 | 256 | public: 257 | /*! Apply the camera transform on a given 3D point. */ 258 | cv::Point3f cameraTransform(const cv::Point3f& p) const; 259 | 260 | /*! Apply the inverse camera transform on a given 3D point. */ 261 | cv::Point3f invCameraTransform(const cv::Point3f& p) const; 262 | 263 | /*! Project a 3D point to image plane. */ 264 | cv::Point3f projectToImage(const cv::Point3f& p) const; 265 | 266 | /*! Project a set of 3D points onto image plane. */ 267 | void projectToImage(const cv::Mat3f& voxels, const cv::Mat1b& mask, cv::Mat3f& pixels) const; 268 | 269 | /*! Project a point from image plane to 3D using the given depth. */ 270 | cv::Point3f unprojectFromImage(const cv::Point2f& p, double depth) const; 271 | /*! KDuncan - additions */ 272 | cv::Point3f unprojectFromKinectImage(const cv::Point2f& p, double depth) const; 273 | 274 | cv::Point3f unprojectFromImage(const cv::Point3f& p) const 275 | { return unprojectFromImage(cv::Point2f(p.x,p.y), p.z); } 276 | 277 | /*! Project a set of image points to 3D. */ 278 | void unprojectFromImage(const cv::Mat1f& pixels, const cv::Mat1b& mask, cv::Mat3f& voxels) const; 279 | 280 | private: 281 | double m_focal_x; 282 | double m_focal_y; 283 | double m_image_center_x; 284 | double m_image_center_y; 285 | bool m_has_camera_params; 286 | }; 287 | 288 | 289 | 290 | } /* ocl */ 291 | 292 | 293 | #endif /* OCL_POSE_3D_H_ */ 294 | -------------------------------------------------------------------------------- /OCLUtils.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include "OCLUtils.h" 8 | #include "OCLPose3D.h" 9 | 10 | namespace ocl { 11 | 12 | void OCLUtils::pointCloudToIntensityImage(const pcl::PointCloud& cloud, cv::Mat3b& rgbImage) { 13 | ocl::Pose3D depthCameraPose; 14 | depthCameraPose.setCameraParameters(533.069, 533.069, 320, 240); 15 | depthCameraPose.resetCameraTransform(); 16 | depthCameraPose.applyTransformBefore(cv::Vec3f(0.f, 0.f, 0.f), cv::Vec3f(0.f, 0.f, 0.f)); 17 | 18 | cv::Mat3b tempMat; 19 | float minX = 999.0f; 20 | float maxX = -999.0f; 21 | float minY = 999.0f; 22 | float maxY = -999.0f; 23 | int width = 0, height = 0; 24 | pcl::PointCloud tempCloud; 25 | tempCloud.resize(cloud.size()); 26 | 27 | int count = 0; 28 | 29 | for (size_t i = 0; i < cloud.size(); ++i) { 30 | cv::Point3f origPt; 31 | pcl::PointXYZRGB pclPt; 32 | 33 | origPt.x = cloud.points[i].x; 34 | origPt.y = cloud.points[i].y; 35 | origPt.z = cloud.points[i].z; 36 | 37 | count++; 38 | 39 | if (boost::math::isnan(origPt.x) || boost::math::isinf(origPt.x) 40 | || boost::math::isnan(origPt.y) || boost::math::isinf(origPt.y) 41 | || boost::math::isnan(origPt.z) || boost::math::isinf(origPt.z)) { 42 | pclPt.x = 0; 43 | pclPt.y = 0; 44 | pclPt.z = 0; 45 | 46 | } else { 47 | cv::Point3f projPt = depthCameraPose.projectToImage(origPt); 48 | 49 | if (projPt.x < minX) minX = projPt.x; 50 | if (projPt.x > maxX) maxX = projPt.x; 51 | 52 | if (projPt.y < minY) minY = projPt.y; 53 | if (projPt.y > maxY) maxY = projPt.y; 54 | 55 | pclPt.x = projPt.x; 56 | pclPt.y = projPt.y; 57 | pclPt.z = projPt.z; 58 | } 59 | tempCloud.points[i] = pclPt; 60 | } 61 | 62 | width = static_cast(maxX - minX); 63 | height = static_cast(maxY - minY); 64 | tempMat = cv::Mat3b(height, width); 65 | 66 | for (int i = 0; i < tempMat.rows; i++) { 67 | for (int j= 0; j < tempMat.cols; j++) { 68 | tempMat(i, j) = cv::Vec3b(128, 128, 128); 69 | } 70 | } 71 | 72 | for (size_t k = 0; k < tempCloud.points.size(); k++) { 73 | int imgXLoc = static_cast(std::ceil(tempCloud.points[k].x - minX)); 74 | int imgYLoc = static_cast(std::ceil(tempCloud.points[k].y - minY)); 75 | 76 | if (imgXLoc >= width) imgXLoc = width - 1; 77 | if (imgXLoc < 0) imgXLoc = 0; 78 | 79 | if (imgYLoc >= height) imgYLoc = height - 1; 80 | if (imgYLoc < 0) imgYLoc = 0; 81 | 82 | cv::Vec3b color; 83 | color(0) = static_cast(cloud[k].b); 84 | color(1) = static_cast(cloud[k].g); 85 | color(2) = static_cast(cloud[k].r); 86 | tempMat(imgYLoc, imgXLoc) = color; 87 | } 88 | 89 | tempMat.copyTo(rgbImage); 90 | } 91 | 92 | 93 | 94 | } 95 | -------------------------------------------------------------------------------- /OCLUtils.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Software License Agreement (BSD License) 3 | * 4 | * Object Classification 5 | * Copyright (c) 2013, Kester Duncan 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions 11 | * are met: 12 | * 13 | * * Redistributions of source code must retain the above copyright 14 | * notice, this list of conditions and the following disclaimer. 15 | * * Redistributions in binary form must reproduce the above 16 | * copyright notice, this list of conditions and the following 17 | * disclaimer in the documentation and/or other materials provided 18 | * with the distribution. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | * POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | * \file OCLUtils.h 34 | * \brief Object Classification Utility functions 35 | * \author Kester Duncan 36 | */ 37 | #pragma once 38 | #ifndef OCL_UTILS_H_ 39 | #define OCL_UTILS_H_ 40 | 41 | /// Forward declarations to avoid unnecessary includes 42 | namespace pcl { 43 | template 44 | class PointCloud; 45 | struct PointXYZRGB; 46 | } 47 | 48 | 49 | namespace ocl { 50 | 51 | /** 52 | * \brief Object Classification Utility functions 53 | */ 54 | class OCLUtils { 55 | 56 | public: 57 | /// Constructs an RGB image from the segmented point cloud provided using the given pose 58 | static void 59 | pointCloudToIntensityImage(const pcl::PointCloud& cloud, cv::Mat3b& rgbImage); 60 | 61 | 62 | }; 63 | 64 | } // ocl 65 | 66 | #endif /* OCL_UTILS_H_ */ -------------------------------------------------------------------------------- /ObjectClassification.vcxproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | Win32 7 | 8 | 9 | Release 10 | Win32 11 | 12 | 13 | 14 | {7873A99D-36C9-4E95-AD45-B9D3F63F9933} 15 | ObjectClassification 16 | 17 | 18 | 19 | Application 20 | true 21 | MultiByte 22 | 23 | 24 | StaticLibrary 25 | false 26 | true 27 | MultiByte 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | $(SolutionDir)\libs 41 | 42 | 43 | 44 | Level3 45 | Disabled 46 | C:\Program Files %28x86%29\boost\boost_1_51;C:\Program Files %28x86%29\Eigen\include;C:\Program Files %28x86%29\OpenNI\Include;C:\Program Files %28x86%29\VTK 5.8.0\include\vtk-5.8;C:\Program Files %28x86%29\flann\include;C:\Program Files %28x86%29\PCL 1.6.0\include\pcl-1.6 47 | 48 | 49 | true 50 | C:\Program Files %28x86%29\boost\boost_1_51\lib;C:\Program Files %28x86%29\VTK 5.8.0\lib\vtk-5.8;C:\Program Files %28x86%29\OpenNI\Lib;C:\Program Files %28x86%29\PCL 1.6.0\lib;%(AdditionalLibraryDirectories) 51 | opengl32.lib;vtksys.lib;vtkjpeg.lib;vtkpng.lib;vtktiff.lib;vtkzlib.lib;vtkexpat.lib;vtkIO.lib;vtkCommon.lib;vtkFiltering.lib;vtkGraphics.lib;vtkImaging.lib;vtkHybrid.lib;vtkRendering.lib;pcl_common_release.lib;pcl_io_release.lib;pcl_visualization_release.lib;pcl_filters_release.lib;pcl_kdtree_release.lib;pcl_octree_release.lib;pcl_registration_release.lib;pcl_sample_consensus_release.lib;pcl_search_release.lib;pcl_segmentation_release.lib;pcl_features_release.lib;pcl_keypoints_release.lib;pcl_surface_release.lib;%(AdditionalDependencies) 52 | 53 | 54 | 55 | 56 | Level3 57 | MaxSpeed 58 | true 59 | true 60 | C:\Program Files %28x86%29\boost\boost_1_51;C:\Program Files %28x86%29\Eigen\include;C:\Program Files %28x86%29\OpenNI\Include;C:\Program Files %28x86%29\VTK 5.8.0\include\vtk-5.8;C:\Program Files %28x86%29\flann\include;C:\Program Files %28x86%29\PCL 1.6.0\include\pcl-1.6;C:\OpenCV2.3.1\include;C:\Users\kkduncan\Documents\Visual Studio 2010\Projects\Collab\nestk;C:\OpenCV2.3.1\include\opencv;C:\OpenCV2.3.1\modules\gpu\include;C:\OpenCV2.3.1\modules\objdetect\include;C:\OpenCV2.3.1\modules\features2d\include;C:\OpenCV2.3.1\modules\highgui\include;C:\OpenCV2.3.1\modules\imgproc\include;C:\OpenCV2.3.1\modules\core\include;C:\OpenCV2.3.1\modules\flann\include;C:\OpenCV2.3.1\modules\calib3d\include;C:\OpenCV2.3.1\modules\contrib\include;C:\OpenCV2.3.1\modules\legacy\include;C:\OpenCV2.3.1\modules\ml\include;C:\Qt\4.8.4\include;C:\Qt\4.8.4\include\QtCore;C:\Qt\4.8.4\include\QtXml;C:\Qt\4.8.4\include\QtSvg;C:\Qt\4.8.4\include\QtOpenGL;C:\Qt\4.8.4\include\QtGui;C:\Qt\4.8.4\include\QtNetwork 61 | 62 | 63 | true 64 | true 65 | true 66 | C:\Program Files %28x86%29\boost\boost_1_51\lib;C:\Program Files %28x86%29\VTK 5.8.0\lib\vtk-5.8;C:\Program Files %28x86%29\OpenNI\Lib;C:\OpenCV2.3.1\build\x86\vc10\lib;C:\Program Files %28x86%29\PCL 1.6.0\lib;C:\Qt\4.8.4\lib;C:\Users\kkduncan\Documents\Visual Studio 2010\Projects\Collab\libs;%(AdditionalLibraryDirectories) 67 | opengl32.lib;vtksys.lib;vtkjpeg.lib;vtkpng.lib;vtktiff.lib;vtkzlib.lib;vtkexpat.lib;vtkIO.lib;vtkCommon.lib;vtkFiltering.lib;vtkGraphics.lib;vtkImaging.lib;vtkHybrid.lib;vtkRendering.lib;boost_thread-vc100-mt-1_51.lib;pcl_common_release.lib;pcl_io_release.lib;pcl_visualization_release.lib;pcl_filters_release.lib;pcl_kdtree_release.lib;pcl_octree_release.lib;pcl_registration_release.lib;pcl_sample_consensus_release.lib;pcl_search_release.lib;pcl_segmentation_release.lib;pcl_features_release.lib;pcl_keypoints_release.lib;pcl_surface_release.lib;opencv_gpu231.lib;opencv_contrib231.lib;opencv_legacy231.lib;opencv_objdetect231.lib;opencv_calib3d231.lib;opencv_features2d231.lib;opencv_video231.lib;opencv_highgui231.lib;opencv_ml231.lib;opencv_imgproc231.lib;opencv_flann231.lib;opencv_core231.lib;QtOpenGL4.lib;QtSvg4.lib;QtXml4.lib;QtNetwork4.lib;QtGui4.lib;QVTK.lib;QtSql4.lib;QtCore4.lib;nestk.lib;%(AdditionalDependencies) 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /ObjectClassification.vcxproj.filters: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | {4FC737F1-C7A5-4376-A066-2A32D752A2FF} 6 | cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx 7 | 8 | 9 | {93995380-89BD-4b04-88EB-625FBE52EBFB} 10 | h;hpp;hxx;hm;inl;inc;xsd 11 | 12 | 13 | {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} 14 | rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms 15 | 16 | 17 | 18 | 19 | Header Files 20 | 21 | 22 | Header Files 23 | 24 | 25 | Header Files 26 | 27 | 28 | Header Files 29 | 30 | 31 | Header Files 32 | 33 | 34 | Header Files 35 | 36 | 37 | Header Files 38 | 39 | 40 | Header Files 41 | 42 | 43 | 44 | 45 | Source Files 46 | 47 | 48 | Source Files 49 | 50 | 51 | Source Files 52 | 53 | 54 | Source Files 55 | 56 | 57 | Source Files 58 | 59 | 60 | Source Files 61 | 62 | 63 | Source Files 64 | 65 | 66 | Source Files 67 | 68 | 69 | 70 | 71 | Resource Files 72 | 73 | 74 | -------------------------------------------------------------------------------- /ObjectClassification.vcxproj.user: -------------------------------------------------------------------------------- 1 |  2 | 3 | -------------------------------------------------------------------------------- /ObjectClassifier.cpp: -------------------------------------------------------------------------------- 1 | 2 | #include 3 | #include "ObjectClassifier.h" 4 | 5 | #define myLog2(x) std::log(x) / std::log(2.0) 6 | 7 | namespace ocl { 8 | 9 | 10 | #ifndef OCL_DEBUG 11 | #define OCL_DEBUG 0 12 | #endif 13 | 14 | 15 | ObjectClassifier::ObjectClassifier(const std::string& modelsDirPath) { 16 | setFPFHModelPath(modelsDirPath + "/FPFH.model"); 17 | setSIFTModelPath(modelsDirPath + "/SIFT.model"); 18 | setHOGModelPath(modelsDirPath + "/HOG.model"); 19 | setCombinedModelPath(modelsDirPath + "/Combined.model"); 20 | 21 | fpfhModel = SVMUtils::loadModel(fpfhModelPath.c_str()); 22 | siftModel = SVMUtils::loadModel(siftModelPath.c_str()); 23 | hogModel = SVMUtils::loadModel(hogModelPath.c_str()); 24 | combModel = SVMUtils::loadModel(combinedModelPath.c_str()); 25 | 26 | if (fpfhModel == NULL || siftModel == NULL || hogModel == NULL || combModel == NULL) { 27 | fprintf(stderr, "Error: SVM model loading error. Ensure that the file paths are correct!\n"); 28 | } 29 | 30 | } 31 | 32 | 33 | ObjectClassifier::~ObjectClassifier() { 34 | if (fpfhModel) free(fpfhModel); 35 | if (siftModel) free(siftModel); 36 | if (hogModel) free(hogModel); 37 | if (combModel) free(combModel); 38 | } 39 | 40 | 41 | void ObjectClassifier::convertBowIntoSVMData(const cv::Mat& bowVector, SVMData& svmData) { 42 | svmData.classNum = -1; 43 | 44 | for (int j = 0; j < bowVector.cols; j++) { 45 | SVMNode node; 46 | node.index = j + 1; 47 | node.value = static_cast(bowVector.at(0, j)); 48 | 49 | svmData.nodes.push_back(node); 50 | } 51 | } 52 | 53 | 54 | std::string getClassName(const size_t & idx) { 55 | std::string categories[11] = {"Bottle", "Bowl", "Box", "Can", "Carton", "Cup", "Mug", "Spray-Can", "Tin", "Tube", "Tub"}; 56 | std::string name; 57 | 58 | if (idx >= 0 && idx < 11) { 59 | name = categories[idx]; 60 | } else { 61 | name = "Unknown"; 62 | } 63 | 64 | return name; 65 | } 66 | 67 | 68 | void ObjectClassifier::classify(const cv::Mat& fpfhBow, const cv::Mat& siftBow, const cv::Mat& hogBow) { 69 | SVMData fpfhData, siftData, hogData, combData; 70 | SVMNodePtr fpfhDataArr, siftDataArr, hogDataArr, combDataArr; 71 | double *fpfhProbEstimates, *siftProbEstimates, *hogProbEstimates, *combProbEstimates; 72 | 73 | // TODO: ensure that matrices are not empty or invalid before proceeding 74 | convertBowIntoSVMData(fpfhBow, fpfhData); 75 | convertBowIntoSVMData(siftBow, siftData); 76 | convertBowIntoSVMData(hogBow, hogData); 77 | 78 | // TODO: ensure that model exists and is loaded 79 | int numClasses = svm_get_nr_class(fpfhModel); 80 | 81 | // TODO: ensure that numClasses > 0 82 | fpfhProbEstimates = (double*) malloc (numClasses * sizeof(double)); 83 | siftProbEstimates = (double*) malloc (numClasses * sizeof(double)); 84 | hogProbEstimates = (double*) malloc (numClasses * sizeof(double)); 85 | combProbEstimates = (double*) malloc (numClasses * sizeof(double)); 86 | 87 | fpfhDataArr = SVMUtils::convertNodeVectorToArray(fpfhData.nodes); 88 | siftDataArr = SVMUtils::convertNodeVectorToArray(siftData.nodes); 89 | hogDataArr = SVMUtils::convertNodeVectorToArray(hogData.nodes); 90 | 91 | int attrNum = 0; //< Combined data attribute number 92 | 93 | double fpfhClass = svm_predict_probability(fpfhModel, fpfhDataArr, fpfhProbEstimates); 94 | for (int i = 0; i < numClasses; i++) { 95 | SVMNode fpfhNode; 96 | fpfhNode.index = ++attrNum; 97 | fpfhNode.value = fpfhProbEstimates[i]; 98 | combData.nodes.push_back(fpfhNode); 99 | } 100 | 101 | if (OCL_DEBUG == 1) 102 | printf("FPFH class: %s\n", getClassName(static_cast(fpfhClass) - 1).c_str()); 103 | 104 | double siftClass = svm_predict_probability(siftModel, siftDataArr, siftProbEstimates); 105 | for (int i = 0; i < numClasses; i++) { 106 | SVMNode siftNode; 107 | siftNode.index = ++attrNum; 108 | siftNode.value = siftProbEstimates[i]; 109 | combData.nodes.push_back(siftNode); 110 | } 111 | 112 | if (OCL_DEBUG == 1) 113 | printf("SIFT class: %s\n", getClassName(static_cast(siftClass) - 1).c_str()); 114 | 115 | double hogClass = svm_predict_probability(hogModel, hogDataArr, hogProbEstimates); 116 | for (int i = 0; i < numClasses; i++) { 117 | SVMNode hogNode; 118 | hogNode.index = ++attrNum; 119 | hogNode.value = hogProbEstimates[i]; 120 | combData.nodes.push_back(hogNode); 121 | } 122 | 123 | if (OCL_DEBUG == 1) 124 | printf("HOG class: %s\n", getClassName(static_cast(hogClass) - 1).c_str()); 125 | 126 | double sum = 0.0; 127 | for (size_t j = 0; j < combData.nodes.size(); ++j) { 128 | sum += combData.nodes[j].value; 129 | } 130 | 131 | for (size_t j = 0; j < combData.nodes.size(); ++j) { 132 | combData.nodes[j].value /= sum; 133 | } 134 | 135 | combDataArr = SVMUtils::convertNodeVectorToArray(combData.nodes); 136 | objectCategory.categoryLabel = svm_predict_probability(combModel, combDataArr, combProbEstimates); 137 | for (int k = 0; k < numClasses; k++) { 138 | objectCategory.classConfidence.push_back(combProbEstimates[k]); 139 | } 140 | 141 | free(fpfhDataArr); 142 | free(siftDataArr); 143 | free(hogDataArr); 144 | free(combDataArr); 145 | free(fpfhProbEstimates); 146 | free(siftProbEstimates); 147 | free(hogProbEstimates); 148 | free(combProbEstimates); 149 | } 150 | 151 | 152 | double ObjectClassifier::measureConfidence() const { 153 | double sum = 0.; 154 | double renyiEntropy = 0.; 155 | double confidence = 0.; 156 | size_t length = objectCategory.classConfidence.size(); 157 | 158 | for (size_t i = 0; i < length; ++i) { 159 | sum += (objectCategory.classConfidence[i] * objectCategory.classConfidence[i]); 160 | } 161 | renyiEntropy = -1 * myLog2(sum); 162 | renyiEntropy /= myLog2(static_cast(length)); 163 | confidence = 1 - renyiEntropy; 164 | 165 | return confidence; 166 | } 167 | 168 | 169 | } /* ocl */ 170 | -------------------------------------------------------------------------------- /ObjectClassifier.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Software License Agreement (BSD License) 3 | * 4 | * Object Classification 5 | * Copyright (c) 2013, Kester Duncan 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions 11 | * are met: 12 | * 13 | * * Redistributions of source code must retain the above copyright 14 | * notice, this list of conditions and the following disclaimer. 15 | * * Redistributions in binary form must reproduce the above 16 | * copyright notice, this list of conditions and the following 17 | * disclaimer in the documentation and/or other materials provided 18 | * with the distribution. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | * POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | * \file ObjectClassifier.h 34 | * \brief Determines the class to which an object belongs 35 | * \author Kester Duncan 36 | */ 37 | #pragma once 38 | #ifndef OBJECT_CLASSIFIER_H_ 39 | #define OBJECT_CLASSIFIER_H_ 40 | 41 | #include 42 | #include 43 | #include "SVMUtils.hpp" 44 | 45 | // Forward declaration 46 | namespace cv { 47 | class Mat; 48 | } 49 | 50 | namespace ocl { 51 | 52 | 53 | /// Stores all information relevant to an object category 54 | struct ObjectCategory { 55 | double categoryLabel; 56 | std::string categoryName; 57 | std::vector classConfidence; 58 | 59 | ObjectCategory() : categoryLabel(-1.0), categoryName("Unknown") {} 60 | }; 61 | 62 | 63 | class ObjectClassifier 64 | { 65 | private: 66 | std::string fpfhModelPath; 67 | std::string siftModelPath; 68 | std::string hogModelPath; 69 | std::string combinedModelPath; 70 | SVMModelPtr fpfhModel; 71 | SVMModelPtr siftModel; 72 | SVMModelPtr hogModel; 73 | SVMModelPtr combModel; 74 | 75 | /// Converts a BoW vector into a format for use by LibSVM 76 | void convertBowIntoSVMData(const cv::Mat& bowVector, SVMData& svmData); 77 | 78 | public: 79 | /// Constructor 80 | ObjectClassifier(const std::string& modelsDirPath); 81 | 82 | /// Destructor 83 | virtual ~ObjectClassifier(); 84 | 85 | /** 86 | * \brief Sets the file path for FPFH SVM classifier model. 87 | * This function assumes that FPFH.model is present in the working directory 88 | */ 89 | void setFPFHModelPath(const std::string& modelPath = "./FPFH.model") { 90 | if (!modelPath.empty()) 91 | fpfhModelPath = modelPath; 92 | else 93 | fpfhModelPath = "./FPFH.model"; 94 | } 95 | 96 | /** 97 | * \brief Sets the file path for SIFT SVM classifier model. 98 | * This function assumes that SIFT.model is present in the working directory 99 | */ 100 | void setSIFTModelPath(const std::string& modelPath = "./SIFT.model") { 101 | if (!modelPath.empty()) 102 | siftModelPath = modelPath; 103 | else 104 | siftModelPath = "./SIFT.model"; 105 | } 106 | 107 | /** 108 | * \brief Sets the file path for HOG SVM classifier model. 109 | * This function assumes that HOG.model is present in the working directory 110 | */ 111 | void setHOGModelPath(const std::string& modelPath = "./HOG.model") { 112 | if (!modelPath.empty()) 113 | hogModelPath = modelPath; 114 | else 115 | hogModelPath = "./HOG.model"; 116 | } 117 | 118 | /** 119 | * \brief Sets the file path for Combined Ensemble SVM classifier model. 120 | * This function assumes that Combined.model is present in the working directory 121 | */ 122 | void setCombinedModelPath(const std::string& modelPath = "./Combined.model") { 123 | if (!modelPath.empty()) 124 | combinedModelPath = modelPath; 125 | else 126 | combinedModelPath = "./Combined.model"; 127 | } 128 | 129 | /// Determines the category to which an object belongs using its feature representation 130 | void classify(const cv::Mat& fpfhBow, const cv::Mat& siftBow, const cv::Mat& hogBow); 131 | 132 | /// Measures the confidence of the classification result using the Renyi entropy 133 | double measureConfidence() const; 134 | 135 | 136 | public: 137 | ObjectCategory objectCategory; 138 | 139 | }; 140 | 141 | } // ocl 142 | 143 | #endif /* OBJECT_CLASSIFIER_H_ */ 144 | 145 | -------------------------------------------------------------------------------- /ObjectDescription.cpp: -------------------------------------------------------------------------------- 1 | #include 2 | #include 3 | #include 4 | #include 5 | #include 6 | #include 7 | #include 8 | #include 9 | #include 10 | #include 11 | #include 12 | #include 13 | #include 14 | 15 | #include "OCLUtils.h" 16 | #include "ObjectDescription.h" 17 | 18 | 19 | namespace ocl { 20 | 21 | 22 | ObjectDescription::ObjectDescription(const std::string& pathToVocabs) { 23 | setFPFHVocabPath(pathToVocabs + "/FPFHVocab.dat"); 24 | setSIFTVocabPath(pathToVocabs + "/SIFTVocab.dat"); 25 | setHOGVocabPath(pathToVocabs + "/HOGVocab.dat"); 26 | 27 | setupBOWAssignment(); 28 | } 29 | 30 | 31 | ObjectDescription::~ObjectDescription() 32 | { 33 | } 34 | 35 | 36 | 37 | void ObjectDescription::extractFPFHDescriptors(const pcl::PointCloud::Ptr& cloud) { 38 | pcl::PointCloud::Ptr cloudPtr (new pcl::PointCloud); 39 | pcl::PointCloud::Ptr sampledCloudPtr (new pcl::PointCloud); 40 | pcl::PointCloud objectPtCloudSampled; 41 | 42 | *cloudPtr = *cloud; 43 | 44 | pcl::VoxelGrid grid; 45 | grid.setInputCloud (cloudPtr); 46 | grid.setLeafSize (0.002, 0.002, 0.002); 47 | grid.filter (objectPtCloudSampled); 48 | 49 | *sampledCloudPtr = objectPtCloudSampled; 50 | 51 | pcl::NormalEstimation ne; 52 | ne.setInputCloud (sampledCloudPtr); 53 | 54 | pcl::search::KdTree::Ptr normalsTree (new pcl::search::KdTree ()); 55 | ne.setSearchMethod (normalsTree); 56 | 57 | pcl::PointCloud::Ptr cloudNormals (new pcl::PointCloud); 58 | ne.setRadiusSearch (0.03); 59 | ne.compute (*cloudNormals); 60 | 61 | pcl::FPFHEstimation fpfh; 62 | fpfh.setInputCloud (sampledCloudPtr); 63 | fpfh.setInputNormals (cloudNormals); 64 | 65 | pcl::search::KdTree::Ptr fpfhTree (new pcl::search::KdTree ()); 66 | fpfh.setSearchMethod (fpfhTree); 67 | 68 | pcl::PointCloud::Ptr ptFeatHistograms (new pcl::PointCloud ()); 69 | fpfh.setRadiusSearch (0.05); 70 | fpfh.compute (*ptFeatHistograms); 71 | 72 | fpfhDescriptors = cv::Mat(ptFeatHistograms->size(), FPFH_LEN, CV_32F); 73 | for (size_t i = 0; i < ptFeatHistograms->size(); i++) { 74 | pcl::FPFHSignature33 feat = ptFeatHistograms->points[i]; 75 | float sum = 0.0; 76 | 77 | for(int j = 0; j < FPFH_LEN; j++ ) { 78 | fpfhDescriptors.at(i, j) = feat.histogram[j]; 79 | sum += feat.histogram[j]; 80 | } 81 | 82 | for(int j = 0; j < FPFH_LEN; j++ ) { 83 | fpfhDescriptors.at(i, j) /= sum; 84 | } 85 | } 86 | } 87 | 88 | 89 | void ObjectDescription::extractSIFTDescriptors(const pcl::PointCloud::Ptr& cloud) { 90 | cv::SiftDescriptorExtractor extractor; 91 | cv::SiftFeatureDetector detector(0, 10); 92 | 93 | std::vector keypoints; 94 | cv::Mat3b srcImg, tempImg; 95 | cv::Mat srcImgGray; 96 | int zoomFactor = 1; 97 | 98 | OCLUtils::pointCloudToIntensityImage(*cloud, tempImg); 99 | cv::resize(tempImg, srcImg, cv::Size(tempImg.cols * zoomFactor, tempImg.rows * zoomFactor)); 100 | cv::cvtColor(srcImg, srcImgGray, CV_BGR2GRAY); 101 | detector.detect(srcImgGray, keypoints); 102 | extractor.compute(srcImgGray, keypoints, siftDescriptors); 103 | 104 | for (size_t i = 0; i < static_cast(siftDescriptors.rows); i++) { 105 | float sum = 0.f; 106 | for (int j = 0; j < SIFT_LEN; j++) { 107 | sum += siftDescriptors.at(i, j); 108 | } 109 | 110 | for (int j = 0; j < SIFT_LEN; j++) { 111 | siftDescriptors.at(i, j) /= sum; 112 | } 113 | } 114 | } 115 | 116 | 117 | void ObjectDescription::extractHOGDescriptors(const pcl::PointCloud::Ptr& cloud) { 118 | //cv::Size winSize(64, 64); 119 | //cv::Size blockSize(16, 16); 120 | //cv::Size blockStride(48, 48); 121 | //cv::Size cellSize(8, 8); 122 | //int numBins = 9; 123 | 124 | //cv::HOGDescriptor hog(winSize, blockSize, blockStride, cellSize, numBins); 125 | cv::HOGDescriptor hog; 126 | 127 | std::vector descriptors; 128 | cv::Mat3b tempImg, srcImg; 129 | cv::Mat srcImgGray; 130 | 131 | OCLUtils::pointCloudToIntensityImage(*cloud, tempImg); 132 | cv::resize(tempImg, srcImg, cv::Size(64, 128)); 133 | cv::cvtColor(srcImg, srcImgGray, CV_BGR2GRAY); 134 | hog.compute(srcImgGray, descriptors); // was on srcImgGray 135 | 136 | /* 137 | int numDescriptors = 0; 138 | size_t descSize = hog.getDescriptorSize(); 139 | 140 | for (size_t j = 0; j < descriptors.size(); ++j) { 141 | if ((j + 1) % descSize == 0) { 142 | numDescriptors++; 143 | } 144 | } 145 | 146 | if (numDescriptors > 0) { 147 | hogDescriptors = cv::Mat(numDescriptors, HOG_LEN, CV_32F); 148 | } 149 | 150 | for (size_t i = 0; i < numDescriptors; ++i) { 151 | for (size_t j = 0; j < HOG_LEN; ++j) { 152 | int ij = (i * HOG_LEN) + j; 153 | hogDescriptors.at(i, j) = descriptors[ij]; 154 | } 155 | } 156 | */ 157 | 158 | /* 159 | * Separate the descriptor into the block histograms 160 | *(4 cells x 9-bin histogram) 161 | * 162 | * NOTE: 163 | * 164 | * For each of the 105 blocks used by the default HOG implementation, we define 165 | * our descriptor as the concatenation of the 4 9-binned histograms found in the 166 | * block. Therefore our descriptor has a dimension of 36 and there 105 of them 167 | */ 168 | hogDescriptors = cv::Mat(NUM_HOG_BLOCKS, HOG_LEN, CV_32F); 169 | for (size_t i = 0; i < static_cast(NUM_HOG_BLOCKS); ++i) { 170 | for (size_t j = 0; j < static_cast(HOG_LEN); ++j) { 171 | int ij = (i * HOG_LEN) + j; 172 | hogDescriptors.at(i, j) = descriptors[ij]; 173 | } 174 | } 175 | } 176 | 177 | 178 | void ObjectDescription::extractFeatureDescriptors(const pcl::PointCloud& cloud) { 179 | boost::thread_group workerThreads; 180 | boost::thread *siftWorker, *hogWorker, *fpfhWorker; 181 | 182 | pcl::PointCloud::Ptr cloudForSift (new pcl::PointCloud); 183 | pcl::PointCloud::Ptr cloudForHog (new pcl::PointCloud); 184 | pcl::PointCloud::Ptr cloudForFPFH (new pcl::PointCloud); 185 | 186 | pcl::copyPointCloud(cloud, *cloudForSift); 187 | siftWorker = new boost::thread(boost::bind(&ObjectDescription::extractSIFTDescriptors, this, cloudForSift)); 188 | workerThreads.add_thread(siftWorker); 189 | 190 | pcl::copyPointCloud(cloud, *cloudForHog); 191 | hogWorker = new boost::thread(boost::bind(&ObjectDescription::extractHOGDescriptors, this, cloudForHog)); 192 | workerThreads.add_thread(hogWorker); 193 | 194 | pcl::copyPointCloud(cloud, *cloudForFPFH); 195 | fpfhWorker = new boost::thread(boost::bind(&ObjectDescription::extractFPFHDescriptors, this, cloudForFPFH)); 196 | workerThreads.add_thread(fpfhWorker); 197 | 198 | workerThreads.join_all(); 199 | } 200 | 201 | 202 | void ObjectDescription::setupBOWAssignment() { 203 | // TODO: ensure that the files are valid here 204 | cv::FileStorage fpfhFS(fpfhVocabPath.c_str(), cv::FileStorage::READ); 205 | cv::Mat fpfhVocab; 206 | fpfhFS["vocab"] >> fpfhVocab; 207 | fpfhAssigner.setVocabulary(fpfhVocab); 208 | 209 | cv::FileStorage siftFS(siftVocabPath.c_str(), cv::FileStorage::READ); 210 | cv::Mat siftVocab; 211 | siftFS["vocab"] >> siftVocab; 212 | siftAssigner.setVocabulary(siftVocab); 213 | 214 | cv::FileStorage hogFS(hogVocabPath.c_str(), cv::FileStorage::READ); 215 | cv::Mat hogVocab; 216 | hogFS["vocab"] >> hogVocab; 217 | hogAssigner.setVocabulary(hogVocab); 218 | 219 | } 220 | 221 | 222 | void ObjectDescription::assignFPFHBOW() { 223 | // TODO: Ensure that the FPFH BoW assigner is set up 224 | fpfhAssigner.compute(fpfhDescriptors, fpfhBOW); 225 | } 226 | 227 | 228 | void ObjectDescription::assignSIFTBOW() { 229 | // TODO: Ensure that the SIFT BoW assigner is set up 230 | if (!siftDescriptors.empty()) { 231 | siftAssigner.compute(siftDescriptors, siftBOW); 232 | } else { 233 | fprintf(stderr, "Error: No SIFT descriptors!\n"); 234 | } 235 | } 236 | 237 | 238 | void ObjectDescription::assignHOGBOW() { 239 | // TODO: Ensure that the HOG BoW assigner is set up 240 | std::cout << "HOG Descriptors columns: " << hogDescriptors.cols << std::endl; 241 | std::cout << "HOG Vocabulary columns: " << hogAssigner.getVocabulary().cols << std::endl; 242 | 243 | hogAssigner.compute(hogDescriptors, hogBOW); 244 | 245 | } 246 | 247 | 248 | void ObjectDescription::assignBOWs() { 249 | // TODO: apply multi-threading here 250 | assignSIFTBOW(); 251 | assignHOGBOW(); 252 | assignFPFHBOW(); 253 | 254 | } 255 | 256 | 257 | } /* ocl */ 258 | -------------------------------------------------------------------------------- /ObjectDescription.h: -------------------------------------------------------------------------------- 1 | /* 2 | * Software License Agreement (BSD License) 3 | * 4 | * Object Classification 5 | * Copyright (c) 2013, Kester Duncan 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions 11 | * are met: 12 | * 13 | * * Redistributions of source code must retain the above copyright 14 | * notice, this list of conditions and the following disclaimer. 15 | * * Redistributions in binary form must reproduce the above 16 | * copyright notice, this list of conditions and the following 17 | * disclaimer in the documentation and/or other materials provided 18 | * with the distribution. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | * POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | * \file ObjectDescription.h 34 | * \brief Describes an object using 2D and 3D features 35 | * \author Kester Duncan 36 | */ 37 | #pragma once 38 | #ifndef OBJECT_DESCRIPTION_H_ 39 | #define OBJECT_DESCRIPTION_H_ 40 | 41 | 42 | #include 43 | #include "BOWAssigner.h" 44 | 45 | 46 | 47 | /// Forward declarations to avoid unnecessary includes 48 | namespace ntk { 49 | class Pose3D; 50 | } 51 | 52 | namespace pcl { 53 | template 54 | class PointCloud; 55 | struct PointXYZRGB; 56 | } 57 | 58 | 59 | /** 60 | * \brief Object Classfication namespace 61 | */ 62 | namespace ocl { 63 | 64 | 65 | /// Size of an FPFH descriptor 66 | const int FPFH_LEN = 33; 67 | 68 | /// Size of a SIFT descriptor 69 | const int SIFT_LEN = 128; 70 | 71 | /// Size of custom HoG descriptor 72 | const int HOG_LEN = 36; 73 | 74 | /// Number of blocks which make up a HoG descriptor 75 | const int NUM_HOG_BLOCKS = 105; 76 | 77 | 78 | /** 79 | * \brief Describes an object using FPFH, SIFT, HOG, and BoW descriptors 80 | */ 81 | class ObjectDescription 82 | { 83 | private: 84 | cv::Mat fpfhDescriptors; 85 | cv::Mat siftDescriptors; 86 | cv::Mat hogDescriptors; 87 | cv::Mat fpfhBOW; 88 | cv::Mat siftBOW; 89 | cv::Mat hogBOW; 90 | std::string fpfhVocabPath; 91 | std::string siftVocabPath; 92 | std::string hogVocabPath; 93 | BOWAssigner fpfhAssigner; 94 | BOWAssigner siftAssigner; 95 | BOWAssigner hogAssigner; 96 | 97 | /// Sets up the respective feature type vocabularies 98 | void setupBOWAssignment(); 99 | 100 | /// Assign the Bag of Words representation for a set of FPFH descriptors 101 | void assignFPFHBOW(); 102 | 103 | /// Assign the Bag of Words representation for a set of SIFT descriptors 104 | void assignSIFTBOW(); 105 | 106 | /// Assign the Bag of Words representation for a set of HOG descriptors 107 | void assignHOGBOW(); 108 | 109 | /// Get the Fast Point Feature Histogram representation for the given object point cloud 110 | void extractFPFHDescriptors(const pcl::PointCloud::Ptr& cloud); 111 | 112 | /// Get the Scale Invariant Feature Transform representation for the given object point cloud 113 | void extractSIFTDescriptors(const pcl::PointCloud::Ptr& cloud); 114 | 115 | /// Get the Histogram of Oriented Gradients representation for the given object point cloud 116 | void extractHOGDescriptors(const pcl::PointCloud::Ptr& cloud); 117 | 118 | 119 | public: 120 | ObjectDescription(const std::string& pathToVocabs = "."); 121 | virtual ~ObjectDescription(); 122 | 123 | /// Sets the path of the FPFH visual vocabulary 124 | inline void setFPFHVocabPath(const std::string& vocabPath) { 125 | if (!vocabPath.empty()) { 126 | this->fpfhVocabPath = vocabPath; 127 | } else { 128 | //TODO add error handling here 129 | } 130 | } 131 | 132 | /// Sets the path of the SIFT visual vocabulary 133 | inline void setSIFTVocabPath(const std::string& vocabPath) { 134 | if (!vocabPath.empty()) { 135 | this->siftVocabPath = vocabPath; 136 | } else { 137 | //TODO add error handling here 138 | } 139 | } 140 | 141 | /// Sets the path of the HOG visual vocabulary 142 | inline void setHOGVocabPath(const std::string& vocabPath) { 143 | if (!vocabPath.empty()) { 144 | this->hogVocabPath = vocabPath; 145 | } else { 146 | //TODO add error handling here 147 | } 148 | } 149 | 150 | /// Get this object's FPFH BoW representation 151 | inline cv::Mat getFPFHBow() const { 152 | return fpfhBOW; 153 | } 154 | 155 | /// Get this object's SIFT BoW representation 156 | inline cv::Mat getSIFTBow() const { 157 | return siftBOW; 158 | } 159 | 160 | /// Get this object's HOG BoW representation 161 | inline cv::Mat getHOGBow() const { 162 | return hogBOW; 163 | } 164 | 165 | /// Get a vector of all BoWs 166 | inline std::vector getAllBows() { 167 | std::vector allBows; 168 | 169 | allBows.push_back(getFPFHBow()); 170 | allBows.push_back(getSIFTBow()); 171 | allBows.push_back(getHOGBow()); 172 | 173 | return allBows; 174 | } 175 | 176 | /// Get the multi-modal feature descriptions for this object 177 | void extractFeatureDescriptors(const pcl::PointCloud& cloud); 178 | 179 | /// Assigns the BoWs representations to describe this object 180 | void assignBOWs(); 181 | 182 | 183 | 184 | 185 | 186 | }; 187 | 188 | } /* ocl */ 189 | 190 | #endif /* OBJECT_DESCRIPTION_H_ */ 191 | 192 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | RGBDObjectClassification 2 | ======================== 3 | 4 | Object classification using a combination of Support Vector Machines (SVM), Fast Point Feature Histograms (FPFH), Scale Invariant Feature Transform (SIFT), Histograms of Oriented Gradients (HOG), and Bags of Words (BOW). 5 | -------------------------------------------------------------------------------- /SVMUtils.hpp: -------------------------------------------------------------------------------- 1 | /* 2 | * Software License Agreement (BSD License) 3 | * 4 | * Object Classification 5 | * Copyright (c) 2013, Kester Duncan 6 | * 7 | * All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions 11 | * are met: 12 | * 13 | * * Redistributions of source code must retain the above copyright 14 | * notice, this list of conditions and the following disclaimer. 15 | * * Redistributions in binary form must reproduce the above 16 | * copyright notice, this list of conditions and the following 17 | * disclaimer in the documentation and/or other materials provided 18 | * with the distribution. 19 | * 20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23 | * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 24 | * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26 | * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 27 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 28 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 30 | * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 31 | * POSSIBILITY OF SUCH DAMAGE. 32 | * 33 | * \file SVMUtils.hpp 34 | * \brief Utility functions and types for use with LibSVM 35 | * \author Kester Duncan 36 | */ 37 | #pragma once 38 | #ifndef SVM_UTILS_H_ 39 | #define SVM_UTILS_H_ 40 | 41 | #include 42 | #include 43 | #include 44 | #include 45 | #include 46 | #include 47 | #include 48 | 49 | #include "svm.h" 50 | 51 | namespace ocl { 52 | 53 | /* Redefinitions to fit our style */ 54 | typedef svm_model SVMModel; 55 | typedef svm_model* SVMModelPtr; 56 | typedef svm_node SVMNode; 57 | typedef svm_node* SVMNodePtr; 58 | 59 | 60 | /** 61 | * Represents one row of LibSVM's input file 62 | */ 63 | struct SVMData { 64 | int classNum; 65 | std::vector nodes; 66 | }; 67 | 68 | 69 | /** 70 | * SVMData comparator to be used for sorting 71 | */ 72 | //static bool svmDataCompare(const SVMData& left, const SVMData& right){ 73 | // if (left.classNum < right.classNum) { 74 | // return true; 75 | // } else { 76 | // return false; 77 | // } 78 | //} 79 | 80 | 81 | /** 82 | * Wrapper for common LibSVM functions 83 | */ 84 | class SVMUtils { 85 | public: 86 | /** 87 | * Load an SVM model 88 | */ 89 | static SVMModelPtr loadModel(const char* modelFileName) { 90 | return svm_load_model(modelFileName); 91 | } 92 | 93 | 94 | /** 95 | * Read an SVM input data file and store the values in a vector 96 | */ 97 | static std::vector readSVMInputFile(const char* dataFileName) { 98 | std::vector data; 99 | 100 | if (dataFileName != NULL) { 101 | FILE *dataFile = fopen(dataFileName, "rb"); 102 | if (dataFile == NULL) { 103 | fprintf(stderr, "Error: Cannot open %s for reading.", dataFileName); 104 | std::cin.get(); 105 | exit(EXIT_FAILURE); 106 | } 107 | 108 | int total = 0; 109 | int max_nr_attr = 1200; 110 | int maxLineLen = 1024; 111 | char *line = (char *) malloc(maxLineLen * sizeof(char)); 112 | 113 | // Read file 114 | while ((line = readLine(dataFile, line)) != NULL) { 115 | SVMData svmData; 116 | int i = 0; 117 | double target_label; 118 | char *idx, *val, *label, *endptr; 119 | int inst_max_index = -1; 120 | 121 | label = strtok(line," \t\n"); 122 | if(label == NULL) { 123 | fprintf(stderr, "Error at line %d of file: %s\n", (total + 1), dataFileName); 124 | exit(EXIT_FAILURE); 125 | } 126 | 127 | target_label = strtod(label, &endptr); 128 | if(endptr == label || *endptr != '\0') { 129 | fprintf(stderr, "Error at line %d of file: %s\n", (total + 1), dataFileName); 130 | exit(EXIT_FAILURE); 131 | } 132 | 133 | svmData.classNum = (int) target_label; 134 | 135 | while(1) { 136 | SVMNode attributes; 137 | if(i >= max_nr_attr - 1) { 138 | max_nr_attr *= 2; 139 | } 140 | 141 | idx = strtok(NULL, ":"); 142 | val = strtok(NULL, " \t"); 143 | 144 | if(val == NULL) break; 145 | 146 | errno = 0; 147 | attributes.index = (int) strtol(idx, &endptr, 10); 148 | 149 | if(endptr == idx || errno != 0 || *endptr != '\0' || attributes.index <= inst_max_index) { 150 | fprintf(stderr, "Error at line %d of file: %s\n", (total + 1), dataFileName); 151 | exit(EXIT_FAILURE); 152 | } else { 153 | inst_max_index = attributes.index; 154 | } 155 | 156 | errno = 0; 157 | attributes.value = strtod(val, &endptr); 158 | if(endptr == val || errno != 0 || (*endptr != '\0' && !isspace(*endptr))) { 159 | fprintf(stderr, "Error at line %d of file: %s\n", (total + 1), dataFileName); 160 | exit(EXIT_FAILURE); 161 | } 162 | ++i; 163 | svmData.nodes.push_back(attributes); 164 | 165 | } // while (1) 166 | 167 | ++total; 168 | data.push_back(svmData); 169 | 170 | } // while (readLine) 171 | 172 | } else { 173 | fprintf(stderr, "Error: No filename provided for opening"); 174 | exit(EXIT_FAILURE); 175 | } 176 | 177 | return data; 178 | 179 | } 180 | 181 | 182 | static SVMNodePtr convertNodeVectorToArray(const std::vector& svmNode) { 183 | // +1 for the -1 to signify end of row for LibSVM 184 | SVMNodePtr svmNodeArr = (SVMNodePtr) malloc((svmNode.size() + 1) * sizeof(SVMNode)); 185 | 186 | size_t i = 0; 187 | for (; i < svmNode.size(); ++i) { 188 | svmNodeArr[i].index = svmNode[i].index; 189 | svmNodeArr[i].value = svmNode[i].value; 190 | } 191 | svmNodeArr[i].index = -1; 192 | 193 | return svmNodeArr; 194 | } 195 | 196 | private: 197 | static char* readLine(FILE *input, char* line) { 198 | int len; 199 | int maxLineLen = 1024; 200 | 201 | if (line == NULL) { 202 | fprintf(stderr, "Error: Null pointer provided for reading file line"); 203 | exit(EXIT_FAILURE); 204 | } 205 | 206 | if(fgets(line, maxLineLen, input) == NULL) return NULL; 207 | 208 | while(strrchr(line, '\n') == NULL) { 209 | maxLineLen *= 2; 210 | line = (char *) realloc(line, maxLineLen); 211 | len = (int) strlen(line); 212 | if(fgets(line + len, maxLineLen - len, input) == NULL) break; 213 | } 214 | return line; 215 | } 216 | 217 | }; 218 | 219 | 220 | } /* ocl */ 221 | 222 | #endif 223 | -------------------------------------------------------------------------------- /svm.h: -------------------------------------------------------------------------------- 1 | #ifndef _LIBSVM_H 2 | #define _LIBSVM_H 3 | 4 | #define LIBSVM_VERSION 317 5 | 6 | #ifdef __cplusplus 7 | extern "C" { 8 | #endif 9 | 10 | extern int libsvm_version; 11 | 12 | struct svm_node 13 | { 14 | int index; 15 | double value; 16 | }; 17 | 18 | struct svm_problem 19 | { 20 | int l; 21 | double *y; 22 | struct svm_node **x; 23 | }; 24 | 25 | enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR }; /* svm_type */ 26 | enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */ 27 | 28 | struct svm_parameter 29 | { 30 | int svm_type; 31 | int kernel_type; 32 | int degree; /* for poly */ 33 | double gamma; /* for poly/rbf/sigmoid */ 34 | double coef0; /* for poly/sigmoid */ 35 | 36 | /* these are for training only */ 37 | double cache_size; /* in MB */ 38 | double eps; /* stopping criteria */ 39 | double C; /* for C_SVC, EPSILON_SVR and NU_SVR */ 40 | int nr_weight; /* for C_SVC */ 41 | int *weight_label; /* for C_SVC */ 42 | double* weight; /* for C_SVC */ 43 | double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */ 44 | double p; /* for EPSILON_SVR */ 45 | int shrinking; /* use the shrinking heuristics */ 46 | int probability; /* do probability estimates */ 47 | }; 48 | 49 | // 50 | // svm_model 51 | // 52 | struct svm_model 53 | { 54 | struct svm_parameter param; /* parameter */ 55 | int nr_class; /* number of classes, = 2 in regression/one class svm */ 56 | int l; /* total #SV */ 57 | struct svm_node **SV; /* SVs (SV[l]) */ 58 | double **sv_coef; /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */ 59 | double *rho; /* constants in decision functions (rho[k*(k-1)/2]) */ 60 | double *probA; /* pariwise probability information */ 61 | double *probB; 62 | int *sv_indices; /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */ 63 | 64 | /* for classification only */ 65 | 66 | int *label; /* label of each class (label[k]) */ 67 | int *nSV; /* number of SVs for each class (nSV[k]) */ 68 | /* nSV[0] + nSV[1] + ... + nSV[k-1] = l */ 69 | /* XXX */ 70 | int free_sv; /* 1 if svm_model is created by svm_load_model*/ 71 | /* 0 if svm_model is created by svm_train */ 72 | }; 73 | 74 | struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param); 75 | void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter *param, int nr_fold, double *target); 76 | 77 | int svm_save_model(const char *model_file_name, const struct svm_model *model); 78 | struct svm_model *svm_load_model(const char *model_file_name); 79 | 80 | int svm_get_svm_type(const struct svm_model *model); 81 | int svm_get_nr_class(const struct svm_model *model); 82 | void svm_get_labels(const struct svm_model *model, int *label); 83 | void svm_get_sv_indices(const struct svm_model *model, int *sv_indices); 84 | int svm_get_nr_sv(const struct svm_model *model); 85 | double svm_get_svr_probability(const struct svm_model *model); 86 | 87 | double svm_predict_values(const struct svm_model *model, const struct svm_node *x, double* dec_values); 88 | double svm_predict(const struct svm_model *model, const struct svm_node *x); 89 | double svm_predict_probability(const struct svm_model *model, const struct svm_node *x, double* prob_estimates); 90 | 91 | void svm_free_model_content(struct svm_model *model_ptr); 92 | void svm_free_and_destroy_model(struct svm_model **model_ptr_ptr); 93 | void svm_destroy_param(struct svm_parameter *param); 94 | 95 | const char *svm_check_parameter(const struct svm_problem *prob, const struct svm_parameter *param); 96 | int svm_check_probability_model(const struct svm_model *model); 97 | 98 | void svm_set_print_string_function(void (*print_func)(const char *)); 99 | 100 | #ifdef __cplusplus 101 | } 102 | #endif 103 | 104 | #endif /* _LIBSVM_H */ 105 | --------------------------------------------------------------------------------