├── .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 |
35 |
36 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
95 |
96 |
97 |
98 |
99 |
100 |
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 |
--------------------------------------------------------------------------------