Merge pull request #1263 from abidrahmank:pyCLAHE_24
[profile/ivi/opencv.git] / modules / objdetect / src / hog.cpp
1 /*M///////////////////////////////////////////////////////////////////////////////////////
2 //
3 //  IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
4 //
5 //  By downloading, copying, installing or using the software you agree to this license.
6 //  If you do not agree to this license, do not download, install,
7 //  copy or use the software.
8 //
9 //
10 //                           License Agreement
11 //                For Open Source Computer Vision Library
12 //
13 // Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
14 // Copyright (C) 2009, Willow Garage Inc., all rights reserved.
15 // Third party copyrights are property of their respective owners.
16 //
17 // Redistribution and use in source and binary forms, with or without modification,
18 // are permitted provided that the following conditions are met:
19 //
20 //   * Redistribution's of source code must retain the above copyright notice,
21 //     this list of conditions and the following disclaimer.
22 //
23 //   * Redistribution's in binary form must reproduce the above copyright notice,
24 //     this list of conditions and the following disclaimer in the documentation
25 //     and/or other materials provided with the distribution.
26 //
27 //   * The name of the copyright holders may not be used to endorse or promote products
28 //     derived from this software without specific prior written permission.
29 //
30 // This software is provided by the copyright holders and contributors "as is" and
31 // any express or implied warranties, including, but not limited to, the implied
32 // warranties of merchantability and fitness for a particular purpose are disclaimed.
33 // In no event shall the Intel Corporation or contributors be liable for any direct,
34 // indirect, incidental, special, exemplary, or consequential damages
35 // (including, but not limited to, procurement of substitute goods or services;
36 // loss of use, data, or profits; or business interruption) however caused
37 // and on any theory of liability, whether in contract, strict liability,
38 // or tort (including negligence or otherwise) arising in any way out of
39 // the use of this software, even if advised of the possibility of such damage.
40 //
41 //M*/
42 #include <stdio.h>
43 #include "precomp.hpp"
44 #include <iterator>
45 #ifdef HAVE_IPP
46 #include "ipp.h"
47 #endif
48 /****************************************************************************************\
49       The code below is implementation of HOG (Histogram-of-Oriented Gradients)
50       descriptor and object detection, introduced by Navneet Dalal and Bill Triggs.
51
52       The computed feature vectors are compatible with the
53       INRIA Object Detection and Localization Toolkit
54       (http://pascal.inrialpes.fr/soft/olt/)
55 \****************************************************************************************/
56
57 namespace cv
58 {
59
60 size_t HOGDescriptor::getDescriptorSize() const
61 {
62     CV_Assert(blockSize.width % cellSize.width == 0 &&
63         blockSize.height % cellSize.height == 0);
64     CV_Assert((winSize.width - blockSize.width) % blockStride.width == 0 &&
65         (winSize.height - blockSize.height) % blockStride.height == 0 );
66     return (size_t)nbins*
67         (blockSize.width/cellSize.width)*
68         (blockSize.height/cellSize.height)*
69         ((winSize.width - blockSize.width)/blockStride.width + 1)*
70         ((winSize.height - blockSize.height)/blockStride.height + 1);
71 }
72
73 double HOGDescriptor::getWinSigma() const
74 {
75     return winSigma >= 0 ? winSigma : (blockSize.width + blockSize.height)/8.;
76 }
77
78 bool HOGDescriptor::checkDetectorSize() const
79 {
80     size_t detectorSize = svmDetector.size(), descriptorSize = getDescriptorSize();
81     return detectorSize == 0 ||
82         detectorSize == descriptorSize ||
83         detectorSize == descriptorSize + 1;
84 }
85
86 void HOGDescriptor::setSVMDetector(InputArray _svmDetector)
87 {
88     _svmDetector.getMat().convertTo(svmDetector, CV_32F);
89     CV_Assert( checkDetectorSize() );
90 }
91
92 #define CV_TYPE_NAME_HOG_DESCRIPTOR "opencv-object-detector-hog"
93
94 bool HOGDescriptor::read(FileNode& obj)
95 {
96     if( !obj.isMap() )
97         return false;
98     FileNodeIterator it = obj["winSize"].begin();
99     it >> winSize.width >> winSize.height;
100     it = obj["blockSize"].begin();
101     it >> blockSize.width >> blockSize.height;
102     it = obj["blockStride"].begin();
103     it >> blockStride.width >> blockStride.height;
104     it = obj["cellSize"].begin();
105     it >> cellSize.width >> cellSize.height;
106     obj["nbins"] >> nbins;
107     obj["derivAperture"] >> derivAperture;
108     obj["winSigma"] >> winSigma;
109     obj["histogramNormType"] >> histogramNormType;
110     obj["L2HysThreshold"] >> L2HysThreshold;
111     obj["gammaCorrection"] >> gammaCorrection;
112     obj["nlevels"] >> nlevels;
113
114     FileNode vecNode = obj["SVMDetector"];
115     if( vecNode.isSeq() )
116     {
117         vecNode >> svmDetector;
118         CV_Assert(checkDetectorSize());
119     }
120     return true;
121 }
122
123 void HOGDescriptor::write(FileStorage& fs, const String& objName) const
124 {
125     if( !objName.empty() )
126         fs << objName;
127
128     fs << "{" CV_TYPE_NAME_HOG_DESCRIPTOR
129     << "winSize" << winSize
130     << "blockSize" << blockSize
131     << "blockStride" << blockStride
132     << "cellSize" << cellSize
133     << "nbins" << nbins
134     << "derivAperture" << derivAperture
135     << "winSigma" << getWinSigma()
136     << "histogramNormType" << histogramNormType
137     << "L2HysThreshold" << L2HysThreshold
138     << "gammaCorrection" << gammaCorrection
139     << "nlevels" << nlevels;
140     if( !svmDetector.empty() )
141         fs << "SVMDetector" << svmDetector;
142     fs << "}";
143 }
144
145 bool HOGDescriptor::load(const String& filename, const String& objname)
146 {
147     FileStorage fs(filename, FileStorage::READ);
148     FileNode obj = !objname.empty() ? fs[objname] : fs.getFirstTopLevelNode();
149     return read(obj);
150 }
151
152 void HOGDescriptor::save(const String& filename, const String& objName) const
153 {
154     FileStorage fs(filename, FileStorage::WRITE);
155     write(fs, !objName.empty() ? objName : FileStorage::getDefaultObjectName(filename));
156 }
157
158 void HOGDescriptor::copyTo(HOGDescriptor& c) const
159 {
160     c.winSize = winSize;
161     c.blockSize = blockSize;
162     c.blockStride = blockStride;
163     c.cellSize = cellSize;
164     c.nbins = nbins;
165     c.derivAperture = derivAperture;
166     c.winSigma = winSigma;
167     c.histogramNormType = histogramNormType;
168     c.L2HysThreshold = L2HysThreshold;
169     c.gammaCorrection = gammaCorrection;
170     c.svmDetector = svmDetector;
171     c.nlevels = nlevels;
172 }
173
174 void HOGDescriptor::computeGradient(const Mat& img, Mat& grad, Mat& qangle,
175                                     Size paddingTL, Size paddingBR) const
176 {
177     CV_Assert( img.type() == CV_8U || img.type() == CV_8UC3 );
178
179     Size gradsize(img.cols + paddingTL.width + paddingBR.width,
180                   img.rows + paddingTL.height + paddingBR.height);
181     grad.create(gradsize, CV_32FC2);  // <magnitude*(1-alpha), magnitude*alpha>
182     qangle.create(gradsize, CV_8UC2); // [0..nbins-1] - quantized gradient orientation
183     Size wholeSize;
184     Point roiofs;
185     img.locateROI(wholeSize, roiofs);
186
187     int i, x, y;
188     int cn = img.channels();
189
190     Mat_<float> _lut(1, 256);
191     const float* lut = &_lut(0,0);
192
193     if( gammaCorrection )
194         for( i = 0; i < 256; i++ )
195             _lut(0,i) = std::sqrt((float)i);
196     else
197         for( i = 0; i < 256; i++ )
198             _lut(0,i) = (float)i;
199
200     AutoBuffer<int> mapbuf(gradsize.width + gradsize.height + 4);
201     int* xmap = (int*)mapbuf + 1;
202     int* ymap = xmap + gradsize.width + 2;
203
204     const int borderType = (int)BORDER_REFLECT_101;
205
206     for( x = -1; x < gradsize.width + 1; x++ )
207         xmap[x] = borderInterpolate(x - paddingTL.width + roiofs.x,
208                         wholeSize.width, borderType) - roiofs.x;
209     for( y = -1; y < gradsize.height + 1; y++ )
210         ymap[y] = borderInterpolate(y - paddingTL.height + roiofs.y,
211                         wholeSize.height, borderType) - roiofs.y;
212
213     // x- & y- derivatives for the whole row
214     int width = gradsize.width;
215     AutoBuffer<float> _dbuf(width*4);
216     float* dbuf = _dbuf;
217     Mat Dx(1, width, CV_32F, dbuf);
218     Mat Dy(1, width, CV_32F, dbuf + width);
219     Mat Mag(1, width, CV_32F, dbuf + width*2);
220     Mat Angle(1, width, CV_32F, dbuf + width*3);
221
222     int _nbins = nbins;
223     float angleScale = (float)(_nbins/CV_PI);
224 #ifdef HAVE_IPP
225     Mat lutimg(img.rows,img.cols,CV_MAKETYPE(CV_32F,cn));
226     Mat hidxs(1, width, CV_32F);
227     Ipp32f* pHidxs  = (Ipp32f*)hidxs.data;
228     Ipp32f* pAngles = (Ipp32f*)Angle.data;
229
230     IppiSize roiSize;
231     roiSize.width = img.cols;
232     roiSize.height = img.rows;
233
234     for( y = 0; y < roiSize.height; y++ )
235     {
236        const uchar* imgPtr = img.data + y*img.step;
237        float* imglutPtr = (float*)(lutimg.data + y*lutimg.step);
238
239        for( x = 0; x < roiSize.width*cn; x++ )
240        {
241           imglutPtr[x] = lut[imgPtr[x]];
242        }
243     }
244
245 #endif
246     for( y = 0; y < gradsize.height; y++ )
247     {
248 #ifdef HAVE_IPP
249         const float* imgPtr  = (float*)(lutimg.data + lutimg.step*ymap[y]);
250         const float* prevPtr = (float*)(lutimg.data + lutimg.step*ymap[y-1]);
251         const float* nextPtr = (float*)(lutimg.data + lutimg.step*ymap[y+1]);
252 #else
253         const uchar* imgPtr  = img.data + img.step*ymap[y];
254         const uchar* prevPtr = img.data + img.step*ymap[y-1];
255         const uchar* nextPtr = img.data + img.step*ymap[y+1];
256 #endif
257         float* gradPtr = (float*)grad.ptr(y);
258         uchar* qanglePtr = (uchar*)qangle.ptr(y);
259
260         if( cn == 1 )
261         {
262             for( x = 0; x < width; x++ )
263             {
264                 int x1 = xmap[x];
265 #ifdef HAVE_IPP
266                 dbuf[x] = (float)(imgPtr[xmap[x+1]] - imgPtr[xmap[x-1]]);
267                 dbuf[width + x] = (float)(nextPtr[x1] - prevPtr[x1]);
268 #else
269                 dbuf[x] = (float)(lut[imgPtr[xmap[x+1]]] - lut[imgPtr[xmap[x-1]]]);
270                 dbuf[width + x] = (float)(lut[nextPtr[x1]] - lut[prevPtr[x1]]);
271 #endif
272             }
273         }
274         else
275         {
276             for( x = 0; x < width; x++ )
277             {
278                 int x1 = xmap[x]*3;
279                 float dx0, dy0, dx, dy, mag0, mag;
280 #ifdef HAVE_IPP
281                 const float* p2 = imgPtr + xmap[x+1]*3;
282                 const float* p0 = imgPtr + xmap[x-1]*3;
283
284                 dx0 = p2[2] - p0[2];
285                 dy0 = nextPtr[x1+2] - prevPtr[x1+2];
286                 mag0 = dx0*dx0 + dy0*dy0;
287
288                 dx = p2[1] - p0[1];
289                 dy = nextPtr[x1+1] - prevPtr[x1+1];
290                 mag = dx*dx + dy*dy;
291
292                 if( mag0 < mag )
293                 {
294                     dx0 = dx;
295                     dy0 = dy;
296                     mag0 = mag;
297                 }
298
299                 dx = p2[0] - p0[0];
300                 dy = nextPtr[x1] - prevPtr[x1];
301                 mag = dx*dx + dy*dy;
302 #else
303                 const uchar* p2 = imgPtr + xmap[x+1]*3;
304                 const uchar* p0 = imgPtr + xmap[x-1]*3;
305
306                 dx0 = lut[p2[2]] - lut[p0[2]];
307                 dy0 = lut[nextPtr[x1+2]] - lut[prevPtr[x1+2]];
308                 mag0 = dx0*dx0 + dy0*dy0;
309
310                 dx = lut[p2[1]] - lut[p0[1]];
311                 dy = lut[nextPtr[x1+1]] - lut[prevPtr[x1+1]];
312                 mag = dx*dx + dy*dy;
313
314                 if( mag0 < mag )
315                 {
316                     dx0 = dx;
317                     dy0 = dy;
318                     mag0 = mag;
319                 }
320
321                 dx = lut[p2[0]] - lut[p0[0]];
322                 dy = lut[nextPtr[x1]] - lut[prevPtr[x1]];
323                 mag = dx*dx + dy*dy;
324  #endif
325                 if( mag0 < mag )
326                 {
327                     dx0 = dx;
328                     dy0 = dy;
329                     mag0 = mag;
330                 }
331
332                 dbuf[x] = dx0;
333                 dbuf[x+width] = dy0;
334             }
335         }
336 #ifdef HAVE_IPP
337         ippsCartToPolar_32f((const Ipp32f*)Dx.data, (const Ipp32f*)Dy.data, (Ipp32f*)Mag.data, pAngles, width);
338         for( x = 0; x < width; x++ )
339         {
340            if(pAngles[x] < 0.f)
341              pAngles[x] += (Ipp32f)(CV_PI*2.);
342         }
343
344         ippsNormalize_32f(pAngles, pAngles, width, 0.5f/angleScale, 1.f/angleScale);
345         ippsFloor_32f(pAngles,(Ipp32f*)hidxs.data,width);
346         ippsSub_32f_I((Ipp32f*)hidxs.data,pAngles,width);
347         ippsMul_32f_I((Ipp32f*)Mag.data,pAngles,width);
348
349         ippsSub_32f_I(pAngles,(Ipp32f*)Mag.data,width);
350         ippsRealToCplx_32f((Ipp32f*)Mag.data,pAngles,(Ipp32fc*)gradPtr,width);
351 #else
352         cartToPolar( Dx, Dy, Mag, Angle, false );
353 #endif
354         for( x = 0; x < width; x++ )
355         {
356 #ifdef HAVE_IPP
357             int hidx = (int)pHidxs[x];
358 #else
359             float mag = dbuf[x+width*2], angle = dbuf[x+width*3]*angleScale - 0.5f;
360             int hidx = cvFloor(angle);
361             angle -= hidx;
362             gradPtr[x*2] = mag*(1.f - angle);
363             gradPtr[x*2+1] = mag*angle;
364 #endif
365             if( hidx < 0 )
366                 hidx += _nbins;
367             else if( hidx >= _nbins )
368                 hidx -= _nbins;
369             assert( (unsigned)hidx < (unsigned)_nbins );
370
371             qanglePtr[x*2] = (uchar)hidx;
372             hidx++;
373             hidx &= hidx < _nbins ? -1 : 0;
374             qanglePtr[x*2+1] = (uchar)hidx;
375         }
376     }
377 }
378
379
380 struct HOGCache
381 {
382     struct BlockData
383     {
384         BlockData() : histOfs(0), imgOffset() {}
385         int histOfs;
386         Point imgOffset;
387     };
388
389     struct PixData
390     {
391         size_t gradOfs, qangleOfs;
392         int histOfs[4];
393         float histWeights[4];
394         float gradWeight;
395     };
396
397     HOGCache();
398     HOGCache(const HOGDescriptor* descriptor,
399         const Mat& img, Size paddingTL, Size paddingBR,
400         bool useCache, Size cacheStride);
401     virtual ~HOGCache() {};
402     virtual void init(const HOGDescriptor* descriptor,
403         const Mat& img, Size paddingTL, Size paddingBR,
404         bool useCache, Size cacheStride);
405
406     Size windowsInImage(Size imageSize, Size winStride) const;
407     Rect getWindow(Size imageSize, Size winStride, int idx) const;
408
409     const float* getBlock(Point pt, float* buf);
410     virtual void normalizeBlockHistogram(float* histogram) const;
411
412     vector<PixData> pixData;
413     vector<BlockData> blockData;
414
415     bool useCache;
416     vector<int> ymaxCached;
417     Size winSize, cacheStride;
418     Size nblocks, ncells;
419     int blockHistogramSize;
420     int count1, count2, count4;
421     Point imgoffset;
422     Mat_<float> blockCache;
423     Mat_<uchar> blockCacheFlags;
424
425     Mat grad, qangle;
426     const HOGDescriptor* descriptor;
427 };
428
429
430 HOGCache::HOGCache()
431 {
432     useCache = false;
433     blockHistogramSize = count1 = count2 = count4 = 0;
434     descriptor = 0;
435 }
436
437 HOGCache::HOGCache(const HOGDescriptor* _descriptor,
438         const Mat& _img, Size _paddingTL, Size _paddingBR,
439         bool _useCache, Size _cacheStride)
440 {
441     init(_descriptor, _img, _paddingTL, _paddingBR, _useCache, _cacheStride);
442 }
443
444 void HOGCache::init(const HOGDescriptor* _descriptor,
445         const Mat& _img, Size _paddingTL, Size _paddingBR,
446         bool _useCache, Size _cacheStride)
447 {
448     descriptor = _descriptor;
449     cacheStride = _cacheStride;
450     useCache = _useCache;
451
452     descriptor->computeGradient(_img, grad, qangle, _paddingTL, _paddingBR);
453     imgoffset = _paddingTL;
454
455     winSize = descriptor->winSize;
456     Size blockSize = descriptor->blockSize;
457     Size blockStride = descriptor->blockStride;
458     Size cellSize = descriptor->cellSize;
459     int i, j, nbins = descriptor->nbins;
460     int rawBlockSize = blockSize.width*blockSize.height;
461
462     nblocks = Size((winSize.width - blockSize.width)/blockStride.width + 1,
463                    (winSize.height - blockSize.height)/blockStride.height + 1);
464     ncells = Size(blockSize.width/cellSize.width, blockSize.height/cellSize.height);
465     blockHistogramSize = ncells.width*ncells.height*nbins;
466
467     if( useCache )
468     {
469         Size cacheSize((grad.cols - blockSize.width)/cacheStride.width+1,
470                        (winSize.height/cacheStride.height)+1);
471         blockCache.create(cacheSize.height, cacheSize.width*blockHistogramSize);
472         blockCacheFlags.create(cacheSize);
473         size_t cacheRows = blockCache.rows;
474         ymaxCached.resize(cacheRows);
475         for(size_t ii = 0; ii < cacheRows; ii++ )
476             ymaxCached[ii] = -1;
477     }
478
479     Mat_<float> weights(blockSize);
480     float sigma = (float)descriptor->getWinSigma();
481     float scale = 1.f/(sigma*sigma*2);
482
483     for(i = 0; i < blockSize.height; i++)
484         for(j = 0; j < blockSize.width; j++)
485         {
486             float di = i - blockSize.height*0.5f;
487             float dj = j - blockSize.width*0.5f;
488             weights(i,j) = std::exp(-(di*di + dj*dj)*scale);
489         }
490
491     blockData.resize(nblocks.width*nblocks.height);
492     pixData.resize(rawBlockSize*3);
493
494     // Initialize 2 lookup tables, pixData & blockData.
495     // Here is why:
496     //
497     // The detection algorithm runs in 4 nested loops (at each pyramid layer):
498     //  loop over the windows within the input image
499     //    loop over the blocks within each window
500     //      loop over the cells within each block
501     //        loop over the pixels in each cell
502     //
503     // As each of the loops runs over a 2-dimensional array,
504     // we could get 8(!) nested loops in total, which is very-very slow.
505     //
506     // To speed the things up, we do the following:
507     //   1. loop over windows is unrolled in the HOGDescriptor::{compute|detect} methods;
508     //         inside we compute the current search window using getWindow() method.
509     //         Yes, it involves some overhead (function call + couple of divisions),
510     //         but it's tiny in fact.
511     //   2. loop over the blocks is also unrolled. Inside we use pre-computed blockData[j]
512     //         to set up gradient and histogram pointers.
513     //   3. loops over cells and pixels in each cell are merged
514     //       (since there is no overlap between cells, each pixel in the block is processed once)
515     //      and also unrolled. Inside we use PixData[k] to access the gradient values and
516     //      update the histogram
517     //
518     count1 = count2 = count4 = 0;
519     for( j = 0; j < blockSize.width; j++ )
520         for( i = 0; i < blockSize.height; i++ )
521         {
522             PixData* data = 0;
523             float cellX = (j+0.5f)/cellSize.width - 0.5f;
524             float cellY = (i+0.5f)/cellSize.height - 0.5f;
525             int icellX0 = cvFloor(cellX);
526             int icellY0 = cvFloor(cellY);
527             int icellX1 = icellX0 + 1, icellY1 = icellY0 + 1;
528             cellX -= icellX0;
529             cellY -= icellY0;
530
531             if( (unsigned)icellX0 < (unsigned)ncells.width &&
532                 (unsigned)icellX1 < (unsigned)ncells.width )
533             {
534                 if( (unsigned)icellY0 < (unsigned)ncells.height &&
535                     (unsigned)icellY1 < (unsigned)ncells.height )
536                 {
537                     data = &pixData[rawBlockSize*2 + (count4++)];
538                     data->histOfs[0] = (icellX0*ncells.height + icellY0)*nbins;
539                     data->histWeights[0] = (1.f - cellX)*(1.f - cellY);
540                     data->histOfs[1] = (icellX1*ncells.height + icellY0)*nbins;
541                     data->histWeights[1] = cellX*(1.f - cellY);
542                     data->histOfs[2] = (icellX0*ncells.height + icellY1)*nbins;
543                     data->histWeights[2] = (1.f - cellX)*cellY;
544                     data->histOfs[3] = (icellX1*ncells.height + icellY1)*nbins;
545                     data->histWeights[3] = cellX*cellY;
546                 }
547                 else
548                 {
549                     data = &pixData[rawBlockSize + (count2++)];
550                     if( (unsigned)icellY0 < (unsigned)ncells.height )
551                     {
552                         icellY1 = icellY0;
553                         cellY = 1.f - cellY;
554                     }
555                     data->histOfs[0] = (icellX0*ncells.height + icellY1)*nbins;
556                     data->histWeights[0] = (1.f - cellX)*cellY;
557                     data->histOfs[1] = (icellX1*ncells.height + icellY1)*nbins;
558                     data->histWeights[1] = cellX*cellY;
559                     data->histOfs[2] = data->histOfs[3] = 0;
560                     data->histWeights[2] = data->histWeights[3] = 0;
561                 }
562             }
563             else
564             {
565                 if( (unsigned)icellX0 < (unsigned)ncells.width )
566                 {
567                     icellX1 = icellX0;
568                     cellX = 1.f - cellX;
569                 }
570
571                 if( (unsigned)icellY0 < (unsigned)ncells.height &&
572                     (unsigned)icellY1 < (unsigned)ncells.height )
573                 {
574                     data = &pixData[rawBlockSize + (count2++)];
575                     data->histOfs[0] = (icellX1*ncells.height + icellY0)*nbins;
576                     data->histWeights[0] = cellX*(1.f - cellY);
577                     data->histOfs[1] = (icellX1*ncells.height + icellY1)*nbins;
578                     data->histWeights[1] = cellX*cellY;
579                     data->histOfs[2] = data->histOfs[3] = 0;
580                     data->histWeights[2] = data->histWeights[3] = 0;
581                 }
582                 else
583                 {
584                     data = &pixData[count1++];
585                     if( (unsigned)icellY0 < (unsigned)ncells.height )
586                     {
587                         icellY1 = icellY0;
588                         cellY = 1.f - cellY;
589                     }
590                     data->histOfs[0] = (icellX1*ncells.height + icellY1)*nbins;
591                     data->histWeights[0] = cellX*cellY;
592                     data->histOfs[1] = data->histOfs[2] = data->histOfs[3] = 0;
593                     data->histWeights[1] = data->histWeights[2] = data->histWeights[3] = 0;
594                 }
595             }
596             data->gradOfs = (grad.cols*i + j)*2;
597             data->qangleOfs = (qangle.cols*i + j)*2;
598             data->gradWeight = weights(i,j);
599         }
600
601     assert( count1 + count2 + count4 == rawBlockSize );
602     // defragment pixData
603     for( j = 0; j < count2; j++ )
604         pixData[j + count1] = pixData[j + rawBlockSize];
605     for( j = 0; j < count4; j++ )
606         pixData[j + count1 + count2] = pixData[j + rawBlockSize*2];
607     count2 += count1;
608     count4 += count2;
609
610     // initialize blockData
611     for( j = 0; j < nblocks.width; j++ )
612         for( i = 0; i < nblocks.height; i++ )
613         {
614             BlockData& data = blockData[j*nblocks.height + i];
615             data.histOfs = (j*nblocks.height + i)*blockHistogramSize;
616             data.imgOffset = Point(j*blockStride.width,i*blockStride.height);
617         }
618 }
619
620
621 const float* HOGCache::getBlock(Point pt, float* buf)
622 {
623     float* blockHist = buf;
624     assert(descriptor != 0);
625
626     Size blockSize = descriptor->blockSize;
627     pt += imgoffset;
628
629     CV_Assert( (unsigned)pt.x <= (unsigned)(grad.cols - blockSize.width) &&
630                (unsigned)pt.y <= (unsigned)(grad.rows - blockSize.height) );
631
632     if( useCache )
633     {
634         CV_Assert( pt.x % cacheStride.width == 0 &&
635                    pt.y % cacheStride.height == 0 );
636         Point cacheIdx(pt.x/cacheStride.width,
637                       (pt.y/cacheStride.height) % blockCache.rows);
638         if( pt.y != ymaxCached[cacheIdx.y] )
639         {
640             Mat_<uchar> cacheRow = blockCacheFlags.row(cacheIdx.y);
641             cacheRow = (uchar)0;
642             ymaxCached[cacheIdx.y] = pt.y;
643         }
644
645         blockHist = &blockCache[cacheIdx.y][cacheIdx.x*blockHistogramSize];
646         uchar& computedFlag = blockCacheFlags(cacheIdx.y, cacheIdx.x);
647         if( computedFlag != 0 )
648             return blockHist;
649         computedFlag = (uchar)1; // set it at once, before actual computing
650     }
651
652     int k, C1 = count1, C2 = count2, C4 = count4;
653     const float* gradPtr = (const float*)(grad.data + grad.step*pt.y) + pt.x*2;
654     const uchar* qanglePtr = qangle.data + qangle.step*pt.y + pt.x*2;
655
656     CV_Assert( blockHist != 0 );
657 #ifdef HAVE_IPP
658     ippsZero_32f(blockHist,blockHistogramSize);
659 #else
660     for( k = 0; k < blockHistogramSize; k++ )
661         blockHist[k] = 0.f;
662 #endif
663
664     const PixData* _pixData = &pixData[0];
665
666     for( k = 0; k < C1; k++ )
667     {
668         const PixData& pk = _pixData[k];
669         const float* a = gradPtr + pk.gradOfs;
670         float w = pk.gradWeight*pk.histWeights[0];
671         const uchar* h = qanglePtr + pk.qangleOfs;
672         int h0 = h[0], h1 = h[1];
673         float* hist = blockHist + pk.histOfs[0];
674         float t0 = hist[h0] + a[0]*w;
675         float t1 = hist[h1] + a[1]*w;
676         hist[h0] = t0; hist[h1] = t1;
677     }
678
679     for( ; k < C2; k++ )
680     {
681         const PixData& pk = _pixData[k];
682         const float* a = gradPtr + pk.gradOfs;
683         float w, t0, t1, a0 = a[0], a1 = a[1];
684         const uchar* h = qanglePtr + pk.qangleOfs;
685         int h0 = h[0], h1 = h[1];
686
687         float* hist = blockHist + pk.histOfs[0];
688         w = pk.gradWeight*pk.histWeights[0];
689         t0 = hist[h0] + a0*w;
690         t1 = hist[h1] + a1*w;
691         hist[h0] = t0; hist[h1] = t1;
692
693         hist = blockHist + pk.histOfs[1];
694         w = pk.gradWeight*pk.histWeights[1];
695         t0 = hist[h0] + a0*w;
696         t1 = hist[h1] + a1*w;
697         hist[h0] = t0; hist[h1] = t1;
698     }
699
700     for( ; k < C4; k++ )
701     {
702         const PixData& pk = _pixData[k];
703         const float* a = gradPtr + pk.gradOfs;
704         float w, t0, t1, a0 = a[0], a1 = a[1];
705         const uchar* h = qanglePtr + pk.qangleOfs;
706         int h0 = h[0], h1 = h[1];
707
708         float* hist = blockHist + pk.histOfs[0];
709         w = pk.gradWeight*pk.histWeights[0];
710         t0 = hist[h0] + a0*w;
711         t1 = hist[h1] + a1*w;
712         hist[h0] = t0; hist[h1] = t1;
713
714         hist = blockHist + pk.histOfs[1];
715         w = pk.gradWeight*pk.histWeights[1];
716         t0 = hist[h0] + a0*w;
717         t1 = hist[h1] + a1*w;
718         hist[h0] = t0; hist[h1] = t1;
719
720         hist = blockHist + pk.histOfs[2];
721         w = pk.gradWeight*pk.histWeights[2];
722         t0 = hist[h0] + a0*w;
723         t1 = hist[h1] + a1*w;
724         hist[h0] = t0; hist[h1] = t1;
725
726         hist = blockHist + pk.histOfs[3];
727         w = pk.gradWeight*pk.histWeights[3];
728         t0 = hist[h0] + a0*w;
729         t1 = hist[h1] + a1*w;
730         hist[h0] = t0; hist[h1] = t1;
731     }
732
733     normalizeBlockHistogram(blockHist);
734
735     return blockHist;
736 }
737
738
739 void HOGCache::normalizeBlockHistogram(float* _hist) const
740 {
741     float* hist = &_hist[0];
742 #ifdef HAVE_IPP
743     size_t sz = blockHistogramSize;
744 #else
745     size_t i, sz = blockHistogramSize;
746 #endif
747
748     float sum = 0;
749 #ifdef HAVE_IPP
750     ippsDotProd_32f(hist,hist,sz,&sum);
751 #else
752     for( i = 0; i < sz; i++ )
753         sum += hist[i]*hist[i];
754 #endif
755
756     float scale = 1.f/(std::sqrt(sum)+sz*0.1f), thresh = (float)descriptor->L2HysThreshold;
757 #ifdef HAVE_IPP
758     ippsMulC_32f_I(scale,hist,sz);
759     ippsThreshold_32f_I( hist, sz, thresh, ippCmpGreater );
760     ippsDotProd_32f(hist,hist,sz,&sum);
761 #else
762     for( i = 0, sum = 0; i < sz; i++ )
763     {
764         hist[i] = std::min(hist[i]*scale, thresh);
765         sum += hist[i]*hist[i];
766     }
767 #endif
768
769     scale = 1.f/(std::sqrt(sum)+1e-3f);
770 #ifdef HAVE_IPP
771     ippsMulC_32f_I(scale,hist,sz);
772 #else
773     for( i = 0; i < sz; i++ )
774         hist[i] *= scale;
775 #endif
776 }
777
778
779 Size HOGCache::windowsInImage(Size imageSize, Size winStride) const
780 {
781     return Size((imageSize.width - winSize.width)/winStride.width + 1,
782                 (imageSize.height - winSize.height)/winStride.height + 1);
783 }
784
785 Rect HOGCache::getWindow(Size imageSize, Size winStride, int idx) const
786 {
787     int nwindowsX = (imageSize.width - winSize.width)/winStride.width + 1;
788     int y = idx / nwindowsX;
789     int x = idx - nwindowsX*y;
790     return Rect( x*winStride.width, y*winStride.height, winSize.width, winSize.height );
791 }
792
793
794 void HOGDescriptor::compute(const Mat& img, vector<float>& descriptors,
795                             Size winStride, Size padding,
796                             const vector<Point>& locations) const
797 {
798     if( winStride == Size() )
799         winStride = cellSize;
800     Size cacheStride(gcd(winStride.width, blockStride.width),
801                      gcd(winStride.height, blockStride.height));
802     size_t nwindows = locations.size();
803     padding.width = (int)alignSize(std::max(padding.width, 0), cacheStride.width);
804     padding.height = (int)alignSize(std::max(padding.height, 0), cacheStride.height);
805     Size paddedImgSize(img.cols + padding.width*2, img.rows + padding.height*2);
806
807     HOGCache cache(this, img, padding, padding, nwindows == 0, cacheStride);
808
809     if( !nwindows )
810         nwindows = cache.windowsInImage(paddedImgSize, winStride).area();
811
812     const HOGCache::BlockData* blockData = &cache.blockData[0];
813
814     int nblocks = cache.nblocks.area();
815     int blockHistogramSize = cache.blockHistogramSize;
816     size_t dsize = getDescriptorSize();
817     descriptors.resize(dsize*nwindows);
818
819     for( size_t i = 0; i < nwindows; i++ )
820     {
821         float* descriptor = &descriptors[i*dsize];
822
823         Point pt0;
824         if( !locations.empty() )
825         {
826             pt0 = locations[i];
827             if( pt0.x < -padding.width || pt0.x > img.cols + padding.width - winSize.width ||
828                 pt0.y < -padding.height || pt0.y > img.rows + padding.height - winSize.height )
829                 continue;
830         }
831         else
832         {
833             pt0 = cache.getWindow(paddedImgSize, winStride, (int)i).tl() - Point(padding);
834             CV_Assert(pt0.x % cacheStride.width == 0 && pt0.y % cacheStride.height == 0);
835         }
836
837         for( int j = 0; j < nblocks; j++ )
838         {
839             const HOGCache::BlockData& bj = blockData[j];
840             Point pt = pt0 + bj.imgOffset;
841
842             float* dst = descriptor + bj.histOfs;
843             const float* src = cache.getBlock(pt, dst);
844             if( src != dst )
845 #ifdef HAVE_IPP
846                ippsCopy_32f(src,dst,blockHistogramSize);
847 #else
848                 for( int k = 0; k < blockHistogramSize; k++ )
849                     dst[k] = src[k];
850 #endif
851         }
852     }
853 }
854
855
856 void HOGDescriptor::detect(const Mat& img,
857     vector<Point>& hits, vector<double>& weights, double hitThreshold,
858     Size winStride, Size padding, const vector<Point>& locations) const
859 {
860     hits.clear();
861     if( svmDetector.empty() )
862         return;
863
864     if( winStride == Size() )
865         winStride = cellSize;
866     Size cacheStride(gcd(winStride.width, blockStride.width),
867                      gcd(winStride.height, blockStride.height));
868     size_t nwindows = locations.size();
869     padding.width = (int)alignSize(std::max(padding.width, 0), cacheStride.width);
870     padding.height = (int)alignSize(std::max(padding.height, 0), cacheStride.height);
871     Size paddedImgSize(img.cols + padding.width*2, img.rows + padding.height*2);
872
873     HOGCache cache(this, img, padding, padding, nwindows == 0, cacheStride);
874
875     if( !nwindows )
876         nwindows = cache.windowsInImage(paddedImgSize, winStride).area();
877
878     const HOGCache::BlockData* blockData = &cache.blockData[0];
879
880     int nblocks = cache.nblocks.area();
881     int blockHistogramSize = cache.blockHistogramSize;
882     size_t dsize = getDescriptorSize();
883
884     double rho = svmDetector.size() > dsize ? svmDetector[dsize] : 0;
885     vector<float> blockHist(blockHistogramSize);
886
887     for( size_t i = 0; i < nwindows; i++ )
888     {
889         Point pt0;
890         if( !locations.empty() )
891         {
892             pt0 = locations[i];
893             if( pt0.x < -padding.width || pt0.x > img.cols + padding.width - winSize.width ||
894                 pt0.y < -padding.height || pt0.y > img.rows + padding.height - winSize.height )
895                 continue;
896         }
897         else
898         {
899             pt0 = cache.getWindow(paddedImgSize, winStride, (int)i).tl() - Point(padding);
900             CV_Assert(pt0.x % cacheStride.width == 0 && pt0.y % cacheStride.height == 0);
901         }
902         double s = rho;
903         const float* svmVec = &svmDetector[0];
904 #ifdef HAVE_IPP
905         int j;
906 #else
907         int j, k;
908 #endif
909         for( j = 0; j < nblocks; j++, svmVec += blockHistogramSize )
910         {
911             const HOGCache::BlockData& bj = blockData[j];
912             Point pt = pt0 + bj.imgOffset;
913
914             const float* vec = cache.getBlock(pt, &blockHist[0]);
915 #ifdef HAVE_IPP
916             Ipp32f partSum;
917             ippsDotProd_32f(vec,svmVec,blockHistogramSize,&partSum);
918             s += (double)partSum;
919 #else
920             for( k = 0; k <= blockHistogramSize - 4; k += 4 )
921                 s += vec[k]*svmVec[k] + vec[k+1]*svmVec[k+1] +
922                     vec[k+2]*svmVec[k+2] + vec[k+3]*svmVec[k+3];
923             for( ; k < blockHistogramSize; k++ )
924                 s += vec[k]*svmVec[k];
925 #endif
926         }
927         if( s >= hitThreshold )
928         {
929             hits.push_back(pt0);
930             weights.push_back(s);
931         }
932     }
933 }
934
935 void HOGDescriptor::detect(const Mat& img, vector<Point>& hits, double hitThreshold,
936                            Size winStride, Size padding, const vector<Point>& locations) const
937 {
938     vector<double> weightsV;
939     detect(img, hits, weightsV, hitThreshold, winStride, padding, locations);
940 }
941
942 class HOGInvoker : public ParallelLoopBody
943 {
944 public:
945     HOGInvoker( const HOGDescriptor* _hog, const Mat& _img,
946                 double _hitThreshold, Size _winStride, Size _padding,
947                 const double* _levelScale, std::vector<Rect> * _vec, Mutex* _mtx,
948                 std::vector<double>* _weights=0, std::vector<double>* _scales=0 )
949     {
950         hog = _hog;
951         img = _img;
952         hitThreshold = _hitThreshold;
953         winStride = _winStride;
954         padding = _padding;
955         levelScale = _levelScale;
956         vec = _vec;
957         weights = _weights;
958         scales = _scales;
959         mtx = _mtx;
960     }
961
962     void operator()( const Range& range ) const
963     {
964         int i, i1 = range.start, i2 = range.end;
965         double minScale = i1 > 0 ? levelScale[i1] : i2 > 1 ? levelScale[i1+1] : std::max(img.cols, img.rows);
966         Size maxSz(cvCeil(img.cols/minScale), cvCeil(img.rows/minScale));
967         Mat smallerImgBuf(maxSz, img.type());
968         vector<Point> locations;
969         vector<double> hitsWeights;
970
971         for( i = i1; i < i2; i++ )
972         {
973             double scale = levelScale[i];
974             Size sz(cvRound(img.cols/scale), cvRound(img.rows/scale));
975             Mat smallerImg(sz, img.type(), smallerImgBuf.data);
976             if( sz == img.size() )
977                 smallerImg = Mat(sz, img.type(), img.data, img.step);
978             else
979                 resize(img, smallerImg, sz);
980             hog->detect(smallerImg, locations, hitsWeights, hitThreshold, winStride, padding);
981             Size scaledWinSize = Size(cvRound(hog->winSize.width*scale), cvRound(hog->winSize.height*scale));
982
983             mtx->lock();
984             for( size_t j = 0; j < locations.size(); j++ )
985             {
986                 vec->push_back(Rect(cvRound(locations[j].x*scale),
987                                     cvRound(locations[j].y*scale),
988                                     scaledWinSize.width, scaledWinSize.height));
989                 if (scales)
990                 {
991                     scales->push_back(scale);
992                 }
993             }
994             mtx->unlock();
995
996             if (weights && (!hitsWeights.empty()))
997             {
998                 mtx->lock();
999                 for (size_t j = 0; j < locations.size(); j++)
1000                 {
1001                     weights->push_back(hitsWeights[j]);
1002                 }
1003                 mtx->unlock();
1004             }
1005         }
1006     }
1007
1008     const HOGDescriptor* hog;
1009     Mat img;
1010     double hitThreshold;
1011     Size winStride;
1012     Size padding;
1013     const double* levelScale;
1014     std::vector<Rect>* vec;
1015     std::vector<double>* weights;
1016     std::vector<double>* scales;
1017     Mutex* mtx;
1018 };
1019
1020
1021 void HOGDescriptor::detectMultiScale(
1022     const Mat& img, vector<Rect>& foundLocations, vector<double>& foundWeights,
1023     double hitThreshold, Size winStride, Size padding,
1024     double scale0, double finalThreshold, bool useMeanshiftGrouping) const
1025 {
1026     double scale = 1.;
1027     int levels = 0;
1028
1029     vector<double> levelScale;
1030     for( levels = 0; levels < nlevels; levels++ )
1031     {
1032         levelScale.push_back(scale);
1033         if( cvRound(img.cols/scale) < winSize.width ||
1034             cvRound(img.rows/scale) < winSize.height ||
1035             scale0 <= 1 )
1036             break;
1037         scale *= scale0;
1038     }
1039     levels = std::max(levels, 1);
1040     levelScale.resize(levels);
1041
1042     std::vector<Rect> allCandidates;
1043     std::vector<double> tempScales;
1044     std::vector<double> tempWeights;
1045     std::vector<double> foundScales;
1046     Mutex mtx;
1047
1048     parallel_for_(Range(0, (int)levelScale.size()),
1049                  HOGInvoker(this, img, hitThreshold, winStride, padding, &levelScale[0], &allCandidates, &mtx, &tempWeights, &tempScales));
1050
1051     std::copy(tempScales.begin(), tempScales.end(), back_inserter(foundScales));
1052     foundLocations.clear();
1053     std::copy(allCandidates.begin(), allCandidates.end(), back_inserter(foundLocations));
1054     foundWeights.clear();
1055     std::copy(tempWeights.begin(), tempWeights.end(), back_inserter(foundWeights));
1056
1057     if ( useMeanshiftGrouping )
1058     {
1059         groupRectangles_meanshift(foundLocations, foundWeights, foundScales, finalThreshold, winSize);
1060     }
1061     else
1062     {
1063         groupRectangles(foundLocations, foundWeights, (int)finalThreshold, 0.2);
1064     }
1065 }
1066
1067 void HOGDescriptor::detectMultiScale(const Mat& img, vector<Rect>& foundLocations,
1068                                      double hitThreshold, Size winStride, Size padding,
1069                                      double scale0, double finalThreshold, bool useMeanshiftGrouping) const
1070 {
1071     vector<double> foundWeights;
1072     detectMultiScale(img, foundLocations, foundWeights, hitThreshold, winStride,
1073                      padding, scale0, finalThreshold, useMeanshiftGrouping);
1074 }
1075
1076 typedef RTTIImpl<HOGDescriptor> HOGRTTI;
1077
1078 CvType hog_type( CV_TYPE_NAME_HOG_DESCRIPTOR, HOGRTTI::isInstance,
1079                  HOGRTTI::release, HOGRTTI::read, HOGRTTI::write, HOGRTTI::clone);
1080
1081 vector<float> HOGDescriptor::getDefaultPeopleDetector()
1082 {
1083     static const float detector[] = {
1084        0.05359386f, -0.14721455f, -0.05532170f, 0.05077307f,
1085        0.11547081f, -0.04268804f, 0.04635834f, -0.05468199f, 0.08232084f,
1086        0.10424068f, -0.02294518f, 0.01108519f, 0.01378693f, 0.11193510f,
1087        0.01268418f, 0.08528346f, -0.06309239f, 0.13054633f, 0.08100729f,
1088        -0.05209739f, -0.04315529f, 0.09341384f, 0.11035026f, -0.07596218f,
1089        -0.05517511f, -0.04465296f, 0.02947334f, 0.04555536f,
1090        -3.55954492e-003f, 0.07818956f, 0.07730991f, 0.07890715f, 0.06222893f,
1091        0.09001380f, -0.03574381f, 0.03414327f, 0.05677258f, -0.04773581f,
1092        0.03746637f, -0.03521175f, 0.06955440f, -0.03849038f, 0.01052293f,
1093        0.01736112f, 0.10867710f, 0.08748853f, 3.29739624e-003f, 0.10907028f,
1094        0.07913758f, 0.10393070f, 0.02091867f, 0.11594022f, 0.13182420f,
1095        0.09879354f, 0.05362710f, -0.06745391f, -7.01260753e-003f,
1096        5.24702156e-003f, 0.03236255f, 0.01407916f, 0.02207983f, 0.02537322f,
1097        0.04547948f, 0.07200756f, 0.03129894f, -0.06274468f, 0.02107014f,
1098        0.06035208f, 0.08636236f, 4.53164103e-003f, 0.02193363f, 0.02309801f,
1099        0.05568166f, -0.02645093f, 0.04448695f, 0.02837519f, 0.08975694f,
1100        0.04461516f, 0.08975355f, 0.07514391f, 0.02306982f, 0.10410084f,
1101        0.06368385f, 0.05943464f, 4.58420580e-003f, 0.05220337f, 0.06675851f,
1102        0.08358569f, 0.06712101f, 0.06559004f, -0.03930482f, -9.15936660e-003f,
1103        -0.05897915f, 0.02816453f, 0.05032348f, 0.06780671f, 0.03377650f,
1104        -6.09417039e-004f, -0.01795146f, -0.03083684f, -0.01302475f,
1105        -0.02972313f, 7.88706727e-003f, -0.03525961f, -2.50397739e-003f,
1106        0.05245084f, 0.11791293f, -0.02167498f, 0.05299332f, 0.06640524f,
1107        0.05190265f, -8.27316567e-003f, 0.03033127f, 0.05842173f,
1108        -4.01050318e-003f, -6.25105947e-003f, 0.05862958f, -0.02465461f,
1109        0.05546781f, -0.08228195f, -0.07234028f, 0.04640540f, -0.01308254f,
1110        -0.02506191f, 0.03100746f, -0.04665651f, -0.04591486f, 0.02949927f,
1111        0.06035462f, 0.02244646f, -0.01698639f, 0.01040041f, 0.01131170f,
1112        0.05419579f, -0.02130277f, -0.04321722f, -0.03665198f, 0.01126490f,
1113        -0.02606488f, -0.02228328f, -0.02255680f, -0.03427236f,
1114        -7.75165204e-003f, -0.06195229f, 8.21638294e-003f, 0.09535975f,
1115        -0.03709979f, -0.06942501f, 0.14579427f, -0.05448192f, -0.02055904f,
1116        0.05747357f, 0.02781788f, -0.07077577f, -0.05178314f, -0.10429011f,
1117        -0.11235505f, 0.07529039f, -0.07559302f, -0.08786739f, 0.02983843f,
1118        0.02667585f, 0.01382199f, -0.01797496f, -0.03141199f, -0.02098101f,
1119        0.09029204f, 0.04955018f, 0.13718739f, 0.11379953f, 1.80019124e-003f,
1120        -0.04577610f, -1.11108483e-003f, -0.09470536f, -0.11596080f,
1121        0.04489342f, 0.01784211f, 3.06850672e-003f, 0.10781866f,
1122        3.36498418e-003f, -0.10842580f, -0.07436839f, -0.10535070f,
1123        -0.01866805f, 0.16057891f, -5.07316366e-003f, -0.04295658f,
1124        -5.90488780e-003f, 8.82003549e-003f, -0.01492646f, -0.05029279f,
1125        -0.12875880f, 8.78831954e-004f, -0.01297184f, -0.07592774f,
1126        -0.02668831f, -6.93787413e-004f, 0.02406698f, -0.01773298f,
1127        -0.03855745f, -0.05877856f, 0.03259695f, 0.12826584f, 0.06292590f,
1128        -4.10733931e-003f, 0.10996531f, 0.01332991f, 0.02088735f, 0.04037504f,
1129        -0.05210760f, 0.07760046f, 0.06399347f, -0.05751930f, -0.10053057f,
1130        0.07505023f, -0.02139782f, 0.01796176f, 2.34400877e-003f, -0.04208319f,
1131        0.07355055f, 0.05093350f, -0.02996780f, -0.02219072f, 0.03355330f,
1132        0.04418742f, -0.05580705f, -0.05037573f, -0.04548179f, 0.01379514f,
1133        0.02150671f, -0.02194211f, -0.13682702f, 0.05464972f, 0.01608082f,
1134        0.05309116f, 0.04701022f, 1.33690401e-003f, 0.07575664f, 0.09625306f,
1135        8.92647635e-003f, -0.02819123f, 0.10866830f, -0.03439325f,
1136        -0.07092371f, -0.06004780f, -0.02712298f, -7.07467366e-003f,
1137        -0.01637020f, 0.01336790f, -0.10313606f, 0.04906582f, -0.05732445f,
1138        -0.02731079f, 0.01042235f, -0.08340668f, 0.03686501f, 0.06108340f,
1139        0.01322748f, -0.07809529f, 0.03774724f, -0.03413248f, -0.06096525f,
1140        -0.04212124f, -0.07982176f, -1.25973229e-003f, -0.03045501f,
1141        -0.01236493f, -0.06312395f, 0.04789570f, -0.04602066f, 0.08576570f,
1142        0.02521080f, 0.02988098f, 0.10314583f, 0.07060035f, 0.04520544f,
1143        -0.04426654f, 0.13146530f, 0.08386490f, 0.02164590f, -2.12280243e-003f,
1144        -0.03686353f, -0.02074944f, -0.03829959f, -0.01530596f, 0.02689708f,
1145        0.11867401f, -0.06043470f, -0.02785023f, -0.04775074f, 0.04878745f,
1146        0.06350956f, 0.03494788f, 0.01467400f, 1.17890188e-003f, 0.04379614f,
1147        2.03681854e-003f, -0.03958609f, -0.01072688f, 6.43705716e-003f,
1148        0.02996500f, -0.03418507f, -0.01960307f, -0.01219154f,
1149        -4.37000440e-003f, -0.02549453f, 0.02646318f, -0.01632513f,
1150        6.46516960e-003f, -0.01929734f, 4.78711911e-003f, 0.04962371f,
1151        0.03809111f, 0.07265724f, 0.05758125f, -0.03741554f, 0.01648608f,
1152        -8.45285598e-003f, 0.03996826f, -0.08185477f, 0.02638875f,
1153        -0.04026615f, -0.02744674f, -0.04071517f, 1.05096330e-003f,
1154        -0.04741232f, -0.06733172f, 8.70434940e-003f, -0.02192543f,
1155        1.35350740e-003f, -0.03056974f, -0.02975521f, -0.02887780f,
1156        -0.01210713f, -0.04828526f, -0.09066251f, -0.09969629f, -0.03665164f,
1157        -8.88111943e-004f, -0.06826669f, -0.01866150f, -0.03627640f,
1158        -0.01408288f, 0.01874239f, -0.02075835f, 0.09145175f, -0.03547291f,
1159        0.05396780f, 0.04198981f, 0.01301925f, -0.03384354f, -0.12201976f,
1160        0.06830920f, -0.03715654f, 9.55848210e-003f, 5.05685573e-003f,
1161        0.05659294f, 3.90764466e-003f, 0.02808490f, -0.05518097f, -0.03711621f,
1162        -0.02835565f, -0.04420464f, -0.01031947f, 0.01883466f,
1163        -8.49525444e-003f, -0.09419250f, -0.01269387f, -0.02133371f,
1164        -0.10190815f, -0.07844430f, 2.43644323e-003f, -4.09610150e-003f,
1165        0.01202551f, -0.06452291f, -0.10593818f, -0.02464746f, -0.02199699f,
1166        -0.07401930f, 0.07285886f, 8.87513801e-004f, 9.97662079e-003f,
1167        8.46779719e-003f, 0.03730333f, -0.02905126f, 0.03573337f, -0.04393689f,
1168        -0.12014472f, 0.03176554f, -2.76015815e-003f, 0.10824566f, 0.05090732f,
1169        -3.30179278e-003f, -0.05123822f, 5.04784798e-003f, -0.05664124f,
1170        -5.99415926e-003f, -0.05341901f, -0.01221393f, 0.01291318f,
1171        9.91760660e-003f, -7.56987557e-003f, -0.06193124f, -2.24549137e-003f,
1172        0.01987562f, -0.02018840f, -0.06975540f, -0.06601523f, -0.03349112f,
1173        -0.08910118f, -0.03371435f, -0.07406893f, -0.02248047f, -0.06159951f,
1174        2.77751544e-003f, -0.05723337f, -0.04792468f, 0.07518548f,
1175        2.77279224e-003f, 0.04211938f, 0.03100502f, 0.05278448f, 0.03954679f,
1176        -0.03006846f, -0.03851741f, -0.02792403f, -0.02875333f, 0.01531280f,
1177        0.02186953f, -0.01989829f, 2.50679464e-003f, -0.10258728f,
1178        -0.04785743f, -0.02887216f, 3.85063468e-003f, 0.01112236f,
1179        8.29218887e-003f, -0.04822981f, -0.04503597f, -0.03713100f,
1180        -0.06988008f, -0.11002295f, -2.69209221e-003f, 1.85383670e-003f,
1181        -0.05921049f, -0.06105053f, -0.08458050f, -0.04527602f,
1182        8.90329306e-004f, -0.05875023f, -2.68602883e-003f, -0.01591195f,
1183        0.03631859f, 0.05493166f, 0.07300330f, 5.53333294e-003f, 0.06400407f,
1184        0.01847740f, -5.76280477e-003f, -0.03210877f, 4.25160583e-003f,
1185        0.01166520f, -1.44864211e-003f, 0.02253744f, -0.03367080f, 0.06983195f,
1186        -4.22323542e-003f, -8.89401045e-003f, -0.07943393f, 0.05199728f,
1187        0.06065201f, 0.04133492f, 1.44032843e-003f, -0.09585235f, -0.03964731f,
1188        0.04232114f, 0.01750465f, -0.04487902f, -7.59733608e-003f, 0.02011171f,
1189        0.04673622f, 0.09011173f, -0.07869188f, -0.04682482f, -0.05080139f,
1190        -3.99383716e-003f, -0.05346331f, 0.01085723f, -0.03599333f,
1191        -0.07097908f, 0.03551549f, 0.02680387f, 0.03471529f, 0.01790393f,
1192        0.05471273f, 9.62048303e-003f, -0.03180215f, 0.05864431f, 0.02330614f,
1193        0.01633144f, -0.05616681f, -0.10245429f, -0.08302189f, 0.07291322f,
1194        -0.01972590f, -0.02619633f, -0.02485327f, -0.04627592f,
1195        1.48853404e-003f, 0.05514185f, -0.01270860f, -0.01948900f, 0.06373586f,
1196        0.05002292f, -0.03009798f, 8.76216311e-003f, -0.02474238f,
1197        -0.05504891f, 1.74034527e-003f, -0.03333667f, 0.01524987f, 0.11663762f,
1198        -1.32344989e-003f, -0.06608453f, 0.05687166f, -6.89525274e-004f,
1199        -0.04402352f, 0.09450210f, -0.04222684f, -0.05360983f, 0.01779531f,
1200        0.02561388f, -0.11075410f, -8.77790991e-003f, -0.01099504f,
1201        -0.10380266f, 0.03103457f, -0.02105741f, -0.07371717f, 0.05146710f,
1202        0.10581432f, -0.08617968f, -0.02892107f, 0.01092199f, 0.14551543f,
1203        -2.24320893e-003f, -0.05818033f, -0.07390742f, 0.05701261f,
1204        0.12937020f, -0.04986651f, 0.10182415f, 0.05028650f, 0.12515625f,
1205        0.09175041f, 0.06404983f, 0.01523394f, 0.09460562f, 0.06106631f,
1206        -0.14266998f, -0.02926703f, 0.02762171f, 0.02164151f,
1207        -9.58488265e-004f, -0.04231362f, -0.09866509f, 0.04322244f,
1208        0.05872034f, -0.04838847f, 0.06319253f, 0.02443798f, -0.03606876f,
1209        9.38737206e-003f, 0.04289991f, -0.01027411f, 0.08156885f, 0.08751175f,
1210        -0.13191354f, 8.16054735e-003f, -0.01452161f, 0.02952677f, 0.03615945f,
1211        -2.09128903e-003f, 0.02246693f, 0.09623287f, 0.09412123f, -0.02924758f,
1212        -0.07815186f, -0.02203079f, -2.02566991e-003f, 0.01094733f,
1213        -0.01442332f, 0.02838561f, 0.11882371f, 7.28798332e-003f, -0.10345965f,
1214        0.07561217f, -0.02049661f, 4.44177445e-003f, 0.01609347f, -0.04893158f,
1215        -0.08758243f, -7.67420698e-003f, 0.08862378f, 0.06098121f, 0.06565887f,
1216        7.32981879e-003f, 0.03558407f, -0.03874352f, -0.02490055f,
1217        -0.06771075f, 0.09939223f, -0.01066077f, 0.01382995f, -0.07289080f,
1218        7.47184316e-003f, 0.10621431f, -0.02878659f, 0.02383525f, -0.03274646f,
1219        0.02137008f, 0.03837290f, 0.02450992f, -0.04296818f, -0.02895143f,
1220        0.05327370f, 0.01499020f, 0.04998732f, 0.12938657f, 0.09391870f,
1221        0.04292390f, -0.03359194f, -0.06809492f, 0.01125796f, 0.17290455f,
1222        -0.03430733f, -0.06255233f, -0.01813114f, 0.11726857f, -0.06127599f,
1223        -0.08677909f, -0.03429872f, 0.04684938f, 0.08161420f, 0.03538774f,
1224        0.01833884f, 0.11321855f, 0.03261845f, -0.04826299f, 0.01752407f,
1225        -0.01796414f, -0.10464549f, -3.30041884e-003f, 2.29343961e-004f,
1226        0.01457292f, -0.02132982f, -0.02602923f, -9.87351313e-003f,
1227        0.04273872f, -0.02103316f, -0.07994065f, 0.02614958f, -0.02111666f,
1228        -0.06964913f, -0.13453490f, -0.06861878f, -6.09341264e-003f,
1229        0.08251446f, 0.15612499f, 2.46531400e-003f, 8.88424646e-003f,
1230        -0.04152999f, 0.02054853f, 0.05277953f, -0.03087788f, 0.02817579f,
1231        0.13939077f, 0.07641046f, -0.03627627f, -0.03015098f, -0.04041540f,
1232        -0.01360690f, -0.06227205f, -0.02738223f, 0.13577610f, 0.15235767f,
1233        -0.05392922f, -0.11175954f, 0.02157129f, 0.01146481f, -0.05264937f,
1234        -0.06595174f, -0.02749175f, 0.11812254f, 0.17404149f, -0.06137035f,
1235        -0.11003478f, -0.01351621f, -0.01745916f, -0.08577441f, -0.04469909f,
1236        -0.06106115f, 0.10559758f, 0.20806813f, -0.09174948f, 7.09621934e-004f,
1237        0.03579374f, 0.07215115f, 0.02221742f, 0.01827742f, -7.90785067e-003f,
1238        0.01489554f, 0.14519960f, -0.06425831f, 0.02990399f, -1.80181325e-003f,
1239        -0.01401528f, -0.04171134f, -3.70530109e-003f, -0.09090481f,
1240        0.09520713f, 0.08845516f, -0.02651753f, -0.03016730f, 0.02562448f,
1241        0.03563816f, -0.03817881f, 0.01433385f, 0.02256983f, 0.02872120f,
1242        0.01001934f, -0.06332260f, 0.04338406f, 0.07001807f, -0.04705722f,
1243        -0.07318907f, 0.02630457f, 0.03106382f, 0.06648342f, 0.10913180f,
1244        -0.01630815f, 0.02910308f, 0.02895109f, 0.08040254f, 0.06969310f,
1245        0.06797734f, 6.08639978e-003f, 4.16588830e-003f, 0.08926726f,
1246        -0.03123648f, 0.02700146f, 0.01168734f, -0.01631594f, 4.61015804e-003f,
1247        8.51359498e-003f, -0.03544224f, 0.03571994f, 4.29766066e-003f,
1248        -0.01970077f, -8.79793242e-003f, 0.09607988f, 0.01544222f,
1249        -0.03923707f, 0.07308586f, 0.06061262f, 1.31683104e-004f,
1250        -7.98222050e-003f, 0.02399261f, -0.06084389f, -0.02743429f,
1251        -0.05475523f, -0.04131311f, 0.03559756f, 0.03055342f, 0.02981433f,
1252        0.14860515f, 0.01766787f, 0.02945257f, 0.04898238f, 0.01026922f,
1253        0.02811658f, 0.08267091f, 0.02732154f, -0.01237693f, 0.11760156f,
1254        0.03802063f, -0.03309754f, 5.24957618e-003f, -0.02460510f, 0.02691451f,
1255        0.05399988f, -0.10133506f, 0.06385437f, -0.01818005f, 0.02259503f,
1256        0.03573135f, 0.01042848f, -0.04153402f, -0.04043029f, 0.01643575f,
1257        0.08326677f, 4.61383024e-004f, -0.05308095f, -0.08536223f,
1258        -1.61011645e-003f, -0.02163720f, -0.01783352f, 0.03859637f,
1259        0.08498885f, -0.01725216f, 0.08625131f, 0.10995087f, 0.09177644f,
1260        0.08498347f, 0.07646490f, 0.05580502f, 0.02693516f, 0.09996913f,
1261        0.09070327f, 0.06667200f, 0.05873008f, -0.02247842f, 0.07772321f,
1262        0.12408436f, 0.12629253f, -8.41997913e-004f, 0.01477783f, 0.09165990f,
1263        -2.98401713e-003f, -0.06466447f, -0.07057302f, 2.09516948e-004f,
1264        0.02210209f, -0.02158809f, -0.08602506f, -0.02284836f,
1265        4.01876355e-003f, 9.56660323e-003f, -0.02073978f, -0.04635138f,
1266        -7.59423291e-003f, -0.01377393f, -0.04559359f, -0.13284740f,
1267        -0.08671406f, -0.03654395f, 0.01142869f, 0.03287891f, -0.04392983f,
1268        0.06142959f, 0.17710890f, 0.10385257f, 0.01329137f, 0.10067633f,
1269        0.12450829f, -0.04476709f, 0.09049144f, 0.04589312f, 0.11167907f,
1270        0.08587538f, 0.04767583f, 1.67188141e-003f, 0.02359802f, -0.03808852f,
1271        0.03126272f, -0.01919029f, -0.05698918f, -0.02365112f, -0.06519032f,
1272        -0.05599358f, -0.07097308f, -0.03301812f, -0.04719102f, -0.02566297f,
1273        0.01324074f, -0.09230672f, -0.05518232f, -0.04712864f, -0.03380903f,
1274        -0.06719479f, 0.01183908f, -0.09326738f, 0.01642865f, 0.03789867f,
1275        -6.61567831e-003f, 0.07796386f, 0.07246574f, 0.04706347f, -0.02523437f,
1276        -0.01696830f, -0.08068866f, 0.06030888f, 0.10527060f, -0.06611756f,
1277        0.02977346f, 0.02621830f, 0.01913855f, -0.08479366f, -0.06322418f,
1278        -0.13570616f, -0.07644490f, 9.31900274e-003f, -0.08095149f,
1279        -0.10197903f, -0.05204025f, 0.01413151f, -0.07800411f, -0.01885122f,
1280        -0.07509381f, -0.10136326f, -0.05212355f, -0.09944065f,
1281        -1.33606605e-003f, -0.06342617f, -0.04178550f, -0.12373723f,
1282        -0.02832736f, -0.06057501f, 0.05830070f, 0.07604282f, -0.06462587f,
1283        8.02447461e-003f, 0.11580125f, 0.12332212f, 0.01978462f,
1284        -2.72378162e-003f, 0.05850752f, -0.04674481f, 0.05148062f,
1285        -2.62542837e-003f, 0.11253355f, 0.09893716f, 0.09785093f, -0.04659257f,
1286        -0.01102429f, -0.07002308f, 0.03088913f, -0.02565549f, -0.07671449f,
1287        3.17443861e-003f, -0.10783514f, -0.02314270f, -0.11089555f,
1288        -0.01024768f, 0.03116021f, -0.04964825f, 0.02281825f, 5.50005678e-003f,
1289        -0.08427856f, -0.14685495f, -0.07719755f, -0.13342668f, -0.04525511f,
1290        -0.09914210f, 0.02588859f, 0.03469279f, 0.04664020f, 0.11688190f,
1291        0.09647275f, 0.10857815f, -0.01448726f, 0.04299758f, -0.06763151f,
1292        1.33257592e-003f, 0.14331576f, 0.07574340f, 0.09166205f, 0.05674926f,
1293        0.11325553f, -0.01106494f, 0.02062161f, -0.11484840f, -0.07492137f,
1294        -0.02864293f, -0.01275638f, -0.06946032f, -0.10101652f, -0.04113498f,
1295        -0.02214783f, -0.01273942f, -0.07480393f, -0.10556041f, -0.07622112f,
1296        -0.09988393f, -0.11453961f, -0.12073903f, -0.09412795f, -0.07146588f,
1297        -0.04054537f, -0.06127083f, 0.04221122f, 0.07688113f, 0.04099256f,
1298        0.12663734f, 0.14683802f, 0.21761774f, 0.12525328f, 0.18431792f,
1299        -1.66402373e-003f, 2.37777247e-003f, 0.01445475f, 0.03509416f,
1300        0.02654697f, 0.01716739f, 0.05374011f, 0.02944174f, 0.11323927f,
1301        -0.01485456f, -0.01611330f, -1.85554172e-003f, -0.01708549f,
1302        -0.05435753f, -0.05302101f, 0.05260378f, -0.03582945f,
1303        -3.42867890e-004f, 1.36076682e-003f, -0.04436073f, -0.04228432f,
1304        0.03281291f, -0.05480836f, -0.10197772f, -0.07206279f, -0.10741059f,
1305        -0.02366946f, 0.10278475f, -2.74783419e-003f, -0.03242477f,
1306        0.02308955f, 0.02835869f, 0.10348799f, 0.19580358f, 0.10252027f,
1307        0.08039929f, 0.05525554f, -0.13250865f, -0.14395352f, 3.13586881e-003f,
1308        -0.03387071f, 8.94669443e-003f, 0.05406157f, -4.97324532e-003f,
1309        -0.01189114f, 2.82919413e-004f, -0.03901557f, -0.04898705f,
1310        0.02164520f, -0.01382906f, -0.01850416f, 0.01869347f, -0.02450060f,
1311        0.02291678f, 0.08196463f, 0.03309153f, -0.10629974f, 0.02473924f,
1312        0.05344394f, -0.02404823f, -0.03243643f, -5.55244600e-003f,
1313        -0.08009996f, 0.02811539f, 0.04235742f, 0.01859004f, 0.04902123f,
1314        -0.01438252f, -0.01526853f, 0.02044195f, -0.05008660f, 0.04244113f,
1315        0.07611816f, 0.04950470f, -0.06020549f, -4.26026015e-003f, 0.13133512f,
1316        -0.01438738f, -0.01958807f, -0.04044152f, -0.12425045f,
1317        2.84353318e-003f, -0.05042776f, -0.09121484f, 7.34345755e-003f,
1318        0.09388847f, 0.11800314f, 4.72295098e-003f, 4.44378285e-003f,
1319        -0.07984917f, -0.03613737f, 0.04490915f, -0.02246483f, 0.04681071f,
1320        0.05240871f, 0.02157206f, -0.04603431f, -0.01197929f, -0.02748779f,
1321        0.13621049f, 0.08812155f, -0.07802048f, 4.86458559e-003f, -0.01598836f,
1322        0.01024450f, -0.03463517f, -0.02304239f, -0.08692665f, 0.06655128f,
1323        0.05785803f, -0.12640759f, 0.02307472f, 0.07337402f, 0.07525434f,
1324        0.04943763f, -0.02241034f, -0.09978238f, 0.14487994f, -0.06570521f,
1325        -0.07855482f, 0.02830222f, -5.29603509e-004f, -0.04669895f,
1326        -0.11822784f, -0.12246452f, -0.15365660f, -0.02969127f, 0.08078201f,
1327        0.13512598f, 0.11505685f, 0.04740673f, 0.01376022f, -0.05852978f,
1328        -0.01537809f, -0.05541119f, 0.02491065f, -0.02870786f, 0.02760978f,
1329        0.23836176f, 0.22347429f, 0.10306466f, -0.06919070f, -0.10132039f,
1330        -0.20198342f, -0.05040560f, 0.27163076f, 0.36987007f, 0.34540465f,
1331        0.29095781f, 0.05649706f, 0.04125737f, 0.07505883f, -0.02737836f,
1332        -8.43431335e-003f, 0.07368195f, 0.01653876f, -0.09402955f,
1333        -0.09574359f, 0.01474337f, -0.07128561f, -0.03460737f, 0.11438941f,
1334        0.13752601f, -0.06385452f, -0.06310338f, 8.19548313e-003f, 0.11622470f,
1335        5.05133113e-003f, -0.07602754f, 0.06695660f, 0.25723928f, 0.09037900f,
1336        0.28826267f, 0.13165380f, -0.05312614f, -0.02137198f, -0.03442232f,
1337        -0.06255679f, 0.03899667f, 0.18391028f, 0.26016650f, 0.03374462f,
1338        0.01860465f, 0.19077586f, 0.18160543f, 3.43634398e-003f, -0.03036782f,
1339        0.19683038f, 0.35378191f, 0.24968483f, -0.03222649f, 0.28972381f,
1340        0.43091634f, 0.30778357f, 0.02335266f, -0.09877399f, -6.85245218e-003f,
1341        0.08945240f, -0.08150686f, 0.02792493f, 0.24806842f, 0.17338486f,
1342        0.06231801f, -0.10432383f, -0.16653322f, -0.13197899f, -0.08531576f,
1343        -0.19271527f, -0.13536365f, 0.22240199f, 0.39219588f, 0.26597717f,
1344        -0.01231649f, 0.01016179f, 0.13379875f, 0.12018334f, -0.04852953f,
1345        -0.07915270f, 0.07036012f, 3.87723115e-003f, -0.06126805f,
1346        -0.15015170f, -0.11406515f, -0.08556531f, -0.07429333f, -0.16115491f,
1347        0.13214062f, 0.25691369f, 0.05697750f, 0.06861912f, -6.02903729e-003f,
1348        -7.94562511e-003f, 0.04799571f, 0.06695165f, -0.01926842f, 0.06206308f,
1349        0.13450983f, -0.06381495f, -2.98370165e-003f, -0.03482971f,
1350        7.53991678e-003f, 0.03895611f, 0.11464261f, 0.01669971f,
1351        8.27818643e-003f, -7.49160210e-003f, -0.11712562f, -0.10650621f,
1352        -0.10353880f, -0.04994106f, -7.65618810e-004f, 0.03023767f,
1353        -0.04759270f, -0.07302686f, -0.05825012f, -0.13156348f, -0.10639747f,
1354        -0.19393684f, -0.09973683f, -0.07918908f, 4.63177625e-004f,
1355        -6.61382044e-004f, 0.15853868f, 0.08561199f, -0.07660093f,
1356        -0.08015265f, -0.06164073f, 0.01882577f, -7.29908410e-004f,
1357        0.06840892f, 0.03843764f, 0.20274927f, 0.22028814f, -5.26101235e-003f,
1358        0.01452435f, -0.06331623f, 0.02865064f, 0.05673740f, 0.12171564f,
1359        0.03837196f, 0.03555467f, -0.02662914f, -0.10280123f, -0.06526285f,
1360        -0.11066351f, -0.08988424f, -0.10103678f, 8.10526591e-003f,
1361        5.95238712e-003f, 0.02617721f, -0.01705742f, -0.10897956f,
1362        -0.08004991f, -0.11271993f, -0.06185647f, -0.06103712f, 0.01597041f,
1363        -0.05923606f, 0.09410726f, 0.22858568f, 0.03263380f, 0.06772990f,
1364        -0.09003516f, 0.01017870f, 0.01931688f, 0.08628357f, -0.01430009f,
1365        0.10954945f, 0.16612452f, -0.02434544f, -0.03310068f, -0.04236627f,
1366        0.01212392f, -6.15046406e-003f, 0.06954194f, 0.03015283f, 0.01787957f,
1367        0.02781667f, -0.05561153f, -8.96244217e-003f, -0.04971489f,
1368        0.07510284f, 0.01775282f, 0.05889897f, -0.07981427f, 0.03647643f,
1369        -3.73833324e-003f, -0.08894575f, -0.06429435f, -0.08068276f,
1370        0.03567704f, -0.07131936f, -7.21910037e-003f, -0.09566668f,
1371        0.17886090f, 0.14911725f, 0.02070032f, -0.05017120f, -0.04992622f,
1372        0.01570143f, -0.09906903f, 0.06456193f, 0.15329507f, 0.18820767f,
1373        0.11689861f, -0.01178513f, -0.02225163f, -0.01905318f, 0.10271224f,
1374        -7.27029052e-003f, 0.11664233f, 0.14796902f, 0.07771893f, 0.02400013f,
1375        -0.05361797f, -0.01972888f, 0.01376177f, 0.06740040f, -0.06525395f,
1376        0.05726178f, -0.02404981f, -0.14018567f, -0.02074987f, -0.04621970f,
1377        -0.04688627f, -0.01842059f, 0.07722727f, -0.04852883f, 0.01529004f,
1378        -0.19639495f, 0.10817073f, 0.03795860f, -0.09435206f, -0.07984378f,
1379        -0.03383440f, 0.11081333f, 0.02237366f, 0.12703256f, 0.21613893f,
1380        0.02918790f, 4.66472283e-003f, -0.10274266f, -0.04854131f,
1381        -3.46305710e-003f, 0.08652268f, 0.02251546f, 0.09636052f, 0.17180754f,
1382        -0.09272388f, 4.59174305e-004f, -0.11723048f, -0.12210111f,
1383        -0.15547538f, 0.07218186f, -0.05297846f, 0.03779940f, 0.05150875f,
1384        -0.03802310f, 0.03870645f, -0.15250699f, -0.08696499f, -0.02021560f,
1385        0.04118926f, -0.15177974f, 0.01577647f, 0.10249301f, 7.50041893e-003f,
1386        0.01721806f, -0.06828983f, -0.02397596f, -0.06598977f, -0.04317593f,
1387        -0.08064980f, 6.66632550e-003f, 0.03333484f, 0.07093620f, 0.08231064f,
1388        -0.06577903f, -0.06698844f, -0.06984019f, -0.06508023f, -0.14145090f,
1389        -0.02393239f, 0.06485303f, 8.83263443e-003f, 0.09251080f, -0.07557579f,
1390        -0.05067699f, -0.09798748f, -0.06703258f, -0.14056294f, 0.03245994f,
1391        0.12554143f, 0.01761621f, 0.12980327f, -0.04081950f, -0.11906909f,
1392        -0.14813015f, -0.08376863f, -0.12200681f, 0.04988137f, 0.05424247f,
1393        -3.90952639e-003f, 0.03255733f, -0.12717837f, -0.07461493f,
1394        -0.05703964f, -0.01736189f, -0.08026433f, -0.05433894f, -0.01719359f,
1395        0.02886275f, 0.01772653f, -0.09163518f, 3.57789593e-003f, -0.10129993f,
1396        -0.02653764f, -0.08131415f, -0.03847986f, -7.62157550e-004f,
1397        0.06486648f, 0.19675669f, -0.04919156f, -0.07059129f, -0.04857785f,
1398        -0.01042383f, -0.08328653f, 0.03660302f, -0.03696846f, 0.04969259f,
1399        0.08241162f, -0.12514858f, -0.06122676f, -0.03750202f,
1400        6.52989605e-003f, -0.10247213f, 0.02568346f, 4.51781414e-003f,
1401        -0.03734229f, -0.01131264f, -0.05412074f, 8.89345480e-004f,
1402        -0.12388977f, -0.05959237f, -0.12418608f, -0.06151643f, -0.07310260f,
1403        0.02441575f, 0.07023528f, -0.07548289f, -7.57147965e-004f,
1404        -0.09061348f, -0.08112976f, -0.06920306f, 9.54394229e-003f,
1405        -0.01219902f, 1.21273217e-003f, -8.88989680e-003f, -0.08309301f,
1406        -0.04552661f, -0.10739882f, -0.05691034f, -0.13928030f, 0.09027749f,
1407        0.15123098f, 0.03175976f, 0.17763577f, 3.29913251e-004f, 0.05151888f,
1408        -0.09844074f, -0.09475287f, -0.08571247f, 0.16241577f, 0.19336018f,
1409        8.57454538e-003f, 0.11474732f, -0.01493934f, 0.03352379f, -0.08966240f,
1410        -0.02322310f, 0.02663568f, 0.05448750f, -0.03536883f, -0.07210463f,
1411        -0.06807277f, -0.03121621f, -0.05932408f, -0.17282860f, -0.15873498f,
1412        -0.04956378f, 0.01603377f, -0.12385946f, 0.13878587f, 0.21468069f,
1413        0.13510075f, 0.20992437f, 0.08845878f, 0.08104013f, 0.03754176f,
1414        0.12173114f, 0.11103114f, 0.10643122f, 0.13941477f, 0.11640384f,
1415        0.14786847f, 0.01218238f, 0.01160753f, 0.03547940f, 0.08794311f,
1416        -0.01695384f, -0.07692261f, -0.08236158f, 6.79194089e-003f,
1417        -0.02458403f, 0.13022894f, 0.10953187f, 0.09857773f, 0.04735930f,
1418        -0.04353498f, -0.15173385f, -0.17904443f, -0.10450364f, -0.13418166f,
1419        -0.06633098f, -0.03170381f, -0.06839000f, -0.11350126f, -0.06983913f,
1420        0.19083543f, 0.17604128f, 0.07730632f, 0.10022651f, 0.36428109f,
1421        0.28291923f, 0.12688625f, 0.15942036f, 0.14064661f, -0.11201853f,
1422        -0.13969108f, -0.09088077f, -0.14107047f, 0.05117374f,
1423        -2.63348082e-003f, -0.10794610f, -0.09715455f, -0.05284977f,
1424        0.01565668f, 0.05031200f, 0.07021113f, -0.02963028f, 0.01766960f,
1425        0.08333644f, -0.03211382f, 4.90096770e-003f, 0.05186674f, -0.05045737f,
1426        -0.09624767f, -0.02525997f, 0.06916669f, 0.01213916f, 0.05333899f,
1427        -0.03443280f, -0.10055527f, -0.06291115f, 5.42851724e-003f,
1428        -6.30360236e-003f, 0.02270257f, -0.01769792f, 0.03273688f, 0.07746078f,
1429        7.77099328e-003f, 0.05041346f, 0.01648103f, -0.02321534f, -0.09930186f,
1430        -0.02293853f, 0.02034990f, -0.08324204f, 0.08510064f, -0.03732836f,
1431        -0.06465405f, -0.06086946f, 0.13680504f, -0.11469388f, -0.03896406f,
1432        -0.07142810f, 2.67581246e-003f, -0.03639632f, -0.09849060f,
1433        -0.11014334f, 0.17489147f, 0.17610909f, -0.16091567f, -0.07248894f,
1434        0.01567141f, 0.23742996f, 0.07552249f, -0.06270349f, -0.07303379f,
1435        0.25442186f, 0.16903116f, -0.08168741f, -0.05913896f, -0.03954096f,
1436        6.81776879e-003f, -0.05615319f, -0.07303037f, -0.12176382f,
1437        0.12385108f, 0.22084464f, -0.05543206f, -0.03310431f, 0.05731593f,
1438        0.19481890f, 0.04016430f, -0.06480758f, -0.12353460f, 0.18733442f,
1439        -0.09631214f, -0.11192076f, 0.12404587f, 0.15671748f, 0.19256128f,
1440        0.10895617f, 0.03391477f, -0.13032004f, -0.05626907f, -0.09025607f,
1441        0.23485197f, 0.27812332f, 0.26725492f, 0.07255980f, 0.16565137f,
1442        0.22388470f, 0.07441066f, -0.21003133f, -0.08075339f, -0.15031935f,
1443        0.07023834f, 0.10872041f, 0.18156518f, 0.20037253f, 0.13571967f,
1444        -0.11915682f, -0.11131983f, -0.18878011f, 0.06074620f, 0.20578890f,
1445        0.12413109f, 0.03930207f, 0.29176015f, 0.29502738f, 0.27856228f,
1446        -0.01803601f, 0.16646385f, 0.19268319f, 0.01900682f, 0.06026287f,
1447        2.35868432e-003f, 0.01558199f, 0.02707230f, 0.11383014f, 0.12103992f,
1448        0.03907350f, 0.04637353f, 0.09020995f, 0.11919726f, -3.63007211e-003f,
1449        0.02220155f, 0.10336831f, 0.17351882f, 0.12259731f, 0.18983354f,
1450        0.15736865f, 0.01160725f, -0.01690723f, -9.69582412e-004f, 0.07213813f,
1451        0.01161613f, 0.17864859f, 0.24486147f, 0.18208991f, 0.20177495f,
1452        0.05972528f, -8.93934630e-003f, -0.02316955f, 0.14436610f, 0.14114498f,
1453        0.05520950f, 0.06353590f, -0.19124921f, 0.10174713f, 0.29414919f,
1454        0.26448128f, 0.09344960f, 0.15284036f, 0.19797507f, 0.11369792f,
1455        -0.12722753f, -0.21396367f, -0.02008235f, -0.06566695f, -0.01662150f,
1456        -0.03937003f, 0.04778343f, 0.05017274f, -0.02299062f, -0.20208496f,
1457        -0.06395898f, 0.13721776f, 0.22544557f, 0.14888357f, 0.08687132f,
1458        0.27088094f, 0.32206613f, 0.09782200f, -0.18523243f, -0.17232181f,
1459        -0.01041531f, 0.04008654f, 0.04199702f, -0.08081299f, -0.03755421f,
1460        -0.04809646f, -0.05222081f, -0.21709201f, -0.06622940f, 0.02945281f,
1461        -0.04600435f, -0.05256077f, -0.08432942f, 0.02848100f, 0.03490564f,
1462        8.28621630e-003f, -0.11051246f, -0.11210597f, -0.01998289f,
1463        -0.05369405f, -0.08869293f, -0.18799506f, -0.05436598f, -0.05011634f,
1464        -0.05419716f, -0.06151857f, -0.10827805f, 0.04346735f, 0.04016083f,
1465        0.01520820f, -0.12173316f, -0.04880285f, -0.01101406f, 0.03250847f,
1466        -0.06009551f, -0.03082932f, -0.02295134f, -0.06856834f, -0.08775249f,
1467        -0.23793389f, -0.09174541f, -0.05538322f, -0.04321031f, -0.11874759f,
1468        -0.04221844f, -0.06070468f, 0.01194489f, 0.02608565f, -0.03892140f,
1469        -0.01643151f, -0.02602034f, -0.01305472f, 0.03920100f, -0.06514261f,
1470        0.01126918f, -6.27710763e-003f, -0.02720047f, -0.11133634f,
1471        0.03300330f, 0.02398472f, 0.04079665f, -0.10564448f, 0.05966159f,
1472        0.01195221f, -0.03179441f, -0.01692590f, -0.06177841f, 0.01841576f,
1473        -5.51078189e-003f, -0.06821765f, -0.03191888f, -0.09545476f,
1474        0.03030550f, -0.04896152f, -0.02914624f, -0.13283344f, -0.04783419f,
1475        6.07836898e-003f, -0.01449538f, -0.13358212f, -0.09687774f,
1476        -0.02813793f, 0.01213498f, 0.06650011f, -0.02039067f, 0.13356198f,
1477        0.05986415f, -9.12760664e-003f, -0.18780160f, -0.11992817f,
1478        -0.06342237f, 0.01229534f, 0.07143231f, 0.10713009f, 0.11085765f,
1479        0.06569190f, -0.02956399f, -0.16288325f, -0.13993549f, -0.01292515f,
1480        0.03833013f, 0.09130384f, -0.05086257f, 0.05617329f, -0.03896667f,
1481        -0.06282311f, -0.11490010f, -0.14264110f, -0.04530499f, 0.01598189f,
1482        0.09167797f, 0.08663294f, 0.04885277f, -0.05741219f, -0.07565769f,
1483        -0.17136464f, -0.02619422f, -0.02477579f, 0.02679587f, 0.11621952f,
1484        0.08788391f, 0.15520640f, 0.04709549f, 0.04504483f, -0.10214074f,
1485        -0.12293372f, -0.04820546f, -0.05484834f, 0.05473754f, 0.07346445f,
1486        0.05577277f, -0.08209965f, 0.03462975f, -0.20962234f, -0.09324598f,
1487        3.79481679e-003f, 0.03617633f, 0.16742408f, 0.07058107f, 0.10204960f,
1488        -0.06795346f, 3.22807301e-003f, -0.12589309f, -0.17496960f,
1489        0.02078314f, -0.07694324f, 0.12184640f, 0.08997164f, 0.04793497f,
1490        -0.11383379f, -0.08046359f, -0.25716835f, -0.08080962f,
1491        6.80711539e-003f, -0.02930280f, -3.04938294e-003f, -0.11106286f,
1492        -0.04628860f, -0.07821649f, 7.70127494e-003f, -0.10247706f,
1493        1.21042714e-003f, 0.20573859f, -0.03241005f, 8.42972286e-003f,
1494        0.01946464f, -0.01197973f, -0.14579976f, 0.04233614f,
1495        -4.14096704e-003f, -0.06866436f, -0.02431862f, -0.13529138f,
1496        1.25891645e-003f, -0.11425111f, -0.04303651f, -0.01694815f,
1497        0.05720210f, -0.16040207f, 0.02772896f, 0.05498345f, -0.15010567f,
1498        0.01450866f, 0.02350303f, -0.04301004f, -0.04951802f, 0.21702233f,
1499        -0.03159155f, -0.01963303f, 0.18232647f, -0.03263875f,
1500        -2.88476888e-003f, 0.01587562f, -1.94303901e-003f, -0.07789494f,
1501        0.04674156f, -6.25576358e-003f, 0.08925962f, 0.21353747f, 0.01254677f,
1502        -0.06999976f, -0.05931328f, -0.01884327f, -0.04306272f, 0.11794136f,
1503        0.03842728f, -0.03907030f, 0.05636114f, -0.09766009f, -0.02104000f,
1504        8.72711372e-003f, -0.02736877f, -0.05112274f, 0.16996814f, 0.02955785f,
1505        0.02094014f, 0.08414304f, -0.03335762f, -0.03617457f, -0.05808248f,
1506        -0.08872101f, 0.02927705f, 0.27077839f, 0.06075108f, 0.07478261f,
1507        0.15282831f, -0.03908454f, -0.05101782f, -9.51998029e-003f,
1508        -0.03272416f, -0.08735625f, 0.07633440f, -0.07185312f, 0.13841286f,
1509        0.07812646f, -0.12901451f, -0.05488589f, -0.05644578f, -0.03290703f,
1510        -0.11184757f, 0.03751570f, -0.05978153f, -0.09155276f, 0.05657315f,
1511        -0.04328186f, -0.03047933f, -0.01413135f, -0.10181040f, -0.01384013f,
1512        0.20132534f, -0.01536873f, -0.07641169f, 0.05906778f, -0.07833145f,
1513        -0.01523801f, -0.07502609f, -0.09461885f, -0.15013233f, 0.16050665f,
1514        0.09021381f, 0.08473236f, 0.03386267f, -0.09147339f, -0.09170618f,
1515        -0.08498498f, -0.05119187f, -0.10431040f, 0.01041618f, -0.03064913f,
1516        0.09340212f, 0.06448522f, -0.03881054f, -0.04985436f, -0.14794017f,
1517        -0.05200112f, -0.02144495f, 0.04000821f, 0.12420804f, -0.01851651f,
1518        -0.04116732f, -0.11951703f, -0.04879033f, -0.08722515f, -0.08454733f,
1519        -0.10549165f, 0.11251976f, 0.10766345f, 0.19201984f, 0.06128913f,
1520        -0.02734615f, -0.08834923f, -0.16999826f, -0.03548348f,
1521        -5.36092324e-003f, 0.08297954f, 0.07226378f, 0.04194529f, 0.04668673f,
1522        8.73902347e-003f, 0.06980139f, 0.05652480f, 0.05879445f, 0.02477076f,
1523        0.02451423f, 0.12433673f, 0.05600227f, 0.06886370f, 0.03863076f,
1524        0.07459056f, 0.02264139f, 0.01495469f, 0.06344220f, 0.06945208f,
1525        0.02931899f, 0.11719371f, 0.04527427f, 0.03248192f, 2.08271481e-003f,
1526        0.02044626f, 0.11403449f, 0.04303892f, 0.06444661f, 0.04959024f,
1527        0.08174094f, 0.09240247f, 0.04894639f, 0.02252937f, -0.01652530f,
1528        0.07587013f, 0.06064249f, 0.13954395f, 0.02772832f, 0.07093039f,
1529        0.08501238f, 0.01701301f, 0.09055722f, 0.33421436f, 0.20163782f,
1530        0.09821030f, 0.07951369f, 0.08695120f, -0.12757730f, -0.13865978f,
1531        -0.06610068f, -0.10985506f, 0.03406816f, -0.01116336f, -0.07281768f,
1532        -0.13525715f, -0.12844718f, 0.08956250f, 0.09171610f, 0.10092317f,
1533        0.23385370f, 0.34489515f, 0.09901748f, 0.02002922f, 0.12335990f,
1534        0.07606190f, -0.14899330f, -0.15634622f, -0.06494618f, -0.01760547f,
1535        0.03404277f, -0.13208845f, -0.12101169f, -0.18294574f, -0.16560709f,
1536        0.02183887f, -0.02752613f, 0.01813638f, 0.02000757f, 0.01319924f,
1537        0.08030242f, 0.01220535f, 2.98233377e-003f, -0.01307070f, 0.05970297f,
1538        -0.05345284f, -0.03381982f, -9.87543724e-003f, -0.06869387f,
1539        0.03956730f, -0.03108176f, -0.05732809f, 0.02172386f, 0.04159765f,
1540        2.62783933e-003f, 0.04813229f, 0.09358983f, -8.18389002e-003f,
1541        0.01724574f, -0.02547474f, -0.04967288f, -0.02390376f, 0.06640504f,
1542        -0.06306566f, 0.01137518f, 0.05589378f, -0.08237787f, 0.02455001f,
1543        -0.03059422f, -0.08953978f, 0.06851497f, 0.07190268f, -0.07610799f,
1544        7.87237938e-003f, -7.85830803e-003f, 0.06006952f, -0.01126728f,
1545        -2.85743061e-003f, -0.04772895f, 0.01884944f, 0.15005857f,
1546        -0.06268821f, -0.01989072f, 0.01138399f, 0.08760451f, 0.03879007f,
1547        -9.66926850e-003f, -0.08012961f, 0.06414555f, -0.01362950f,
1548        -0.09135523f, 0.01755159f, 0.04459474f, 0.09650917f, 0.05219948f,
1549        -2.19440833e-003f, -0.07037939f, -0.01599054f, 0.13103317f,
1550        -0.02492603f, -0.01032540f, -0.02903307f, 0.04489160f, 0.05148086f,
1551        0.01858173f, -0.02919228f, 0.08299296f, -0.04590359f, -0.15745632f,
1552        -0.09068198f, -0.02972453f, 0.12985018f, 0.22320485f, 0.24261914f,
1553        0.03642650f, -0.05506422f, 2.67413049e-003f, -0.03834032f, 0.06449424f,
1554        0.03834866f, 0.03816991f, 0.25039271f, 0.34212017f, 0.32433882f,
1555        0.18824573f, -0.08599839f, -0.17599408f, -0.15317015f, -0.09913155f,
1556        -0.02856072f, -0.05304699f, -1.06437842e-003f, -0.06641813f,
1557        -0.07509298f, 0.01463361f, -0.07551918f, -0.04510373f,
1558        -8.44620075e-003f, 0.01772176f, 0.04068235f, 0.20295307f, 0.15719447f,
1559        0.05712103f, 0.26296997f, 0.14657754f, 0.01547317f, -0.05052776f,
1560        -0.03881342f, -0.01437883f, -0.04930177f, 0.11719568f, 0.24098417f,
1561        0.26468599f, 0.31698579f, 0.10103608f, -0.01096375f, -0.01367013f,
1562        0.17104232f, 0.20065314f, 2.67622480e-003f, -0.01190034f, 0.18301608f,
1563        0.09459770f, -0.06357619f, -0.06473801f, 0.01377906f, -0.10032775f,
1564        -0.06388740f, 3.80393048e-003f, 0.06206078f, 0.10349120f, 0.26804337f,
1565        8.17918684e-003f, -0.02314351f, 9.34422202e-003f, 0.09198381f,
1566        0.03681326f, -8.77339672e-003f, -0.09662418f, -0.02715708f,
1567        0.13503517f, 0.08962728f, -6.57071499e-003f, -0.03201199f, 0.28510824f,
1568        0.32095715f, 0.18512695f, -0.14230858f, -0.14048551f, -0.07181299f,
1569        -0.08575408f, -0.08661680f, -0.17416079f, 7.54326640e-004f,
1570        0.05601677f, 0.13585392f, -0.04960437f, -0.07708392f, 0.10676333f,
1571        -0.04407546f, -0.07209078f, 0.03663663f, 0.28949317f, 0.41127121f,
1572        0.27431169f, -0.06900328f, -0.21474190f, -0.15578632f, -0.19555484f,
1573        -0.15209621f, -0.11269179f, 0.07416003f, 0.18991330f, 0.26858172f,
1574        0.01952259f, 0.01017922f, 0.02159843f, -4.95165400e-003f, -0.04368168f,
1575        -0.12721671f, -0.06673957f, -0.11275250f, 0.04413409f, 0.05578312f,
1576        0.03896771f, 0.03566417f, -0.05871816f, -0.07388090f, -0.17965563f,
1577        -0.08570268f, -0.15273231f, -0.06022318f, -0.06999847f,
1578        -6.81510568e-003f, 0.06294262f, -6.54901436e-004f, -0.01128654f,
1579        -0.02289657f, 0.04849290f, 0.04140804f, 0.23681939f, 0.14545733f,
1580        0.01989965f, 0.12032662f, 3.87463090e-003f, -6.02597650e-003f,
1581        -0.05919775f, -0.03067224f, -0.07787777f, 0.10834727f, 0.02153730f,
1582        0.02765649f, 0.03975543f, -0.12182906f, -0.04900113f, -0.09940100f,
1583        -0.06453611f, -0.13757215f, -0.03721382f, 0.02827376f, -0.04351249f,
1584        0.01907038f, -0.10284120f, -0.05671160f, -0.10760647f, -0.09624009f,
1585        -0.09565596f, -0.01303654f, 0.03080539f, 0.01416511f, 0.05846142f,
1586        -5.42971538e-003f, 0.06221476f, -0.03320325f, -0.06791797f,
1587        -0.05791342f, 0.12851369f, 0.14990346f, 0.03634374f, 0.14262885f,
1588        0.04330391f, 0.05032569f, -0.05631914f, 0.01606137f, 0.04387223f,
1589        0.22344995f, 0.15722635f, -0.04693628f, 0.03006579f, -2.52882647e-003f,
1590        0.05717621f, -0.07529724f, -0.02848588f, -0.06868757f,
1591        -4.51729307e-003f, 0.06466042f, -0.05935378f, -0.04704857f,
1592        -0.07363959f, 0.04843248f, -0.13421375f, -0.09789340f, -0.10255270f,
1593        0.03509852f, 0.04751543f, -0.03822323f, 0.09740467f, 0.04762916f,
1594        0.03940146f, -0.08283259f, 0.09552965f, 0.05038739f, 0.21258622f,
1595        0.09646992f, 0.03241193f, 0.05167701f, 0.04614570f, 0.04330090f,
1596        -0.02671840f, -0.06259909f, -0.02301898f, 0.18829170f, 0.10522786f,
1597        0.04313190f, 0.01670948f, -0.08421925f, 0.05911417f, -0.10582602f,
1598        -0.04855484f, -0.08373898f, 0.07775915f, 0.03723533f, -0.12047344f,
1599        4.86345543e-003f, -0.10520902f, 0.06571782f, -0.07528137f,
1600        -0.03245651f, -0.09869066f, -0.02917477f, -0.18293270f, 0.14810945f,
1601        9.24033765e-003f, -0.04354914f, 0.02266885f, -0.11872729f,
1602        -0.04016589f, 0.02830229f, 0.22539048f, 0.20565644f, 0.16701797f,
1603        0.09019924f, 0.01300652f, 0.09760600f, -0.03675831f, -0.01935448f,
1604        -0.06894835f, 0.08077277f, 0.19047537f, 0.11312226f, 0.04106043f,
1605        -0.11187182f, 0.04312806f, -0.18548580f, -0.11287174f, -0.08794551f,
1606        0.02078281f, -0.15295486f, 0.11806386f, -0.01103218f, -0.15971117f,
1607        0.02153538f, -0.05232147f, -0.10835317f, -0.13910367f, 0.05920752f,
1608        -0.10122602f, 0.20174250f, 0.09105796f, -0.01881348f, 0.09559010f,
1609        -0.03725745f, -0.09442931f, -0.09763174f, 0.05854454f, 0.08287182f,
1610        0.12919849f, 0.08594352f, -2.49806582e-003f, 0.02398440f,
1611        5.67950122e-003f, -0.06296340f, -0.12993270f, 0.03855852f, 0.05186560f,
1612        0.10839908f, -0.03380463f, -0.12654832f, -0.05399339f, -0.07456800f,
1613        -0.04736232f, -0.10164231f, 0.07496139f, 0.08125214f, 0.07656177f,
1614        -0.04999603f, -0.12823077f, -0.07692395f, -0.11317524f, -0.09118655f,
1615        -0.05695669f, 0.10477209f, 0.07468581f, 0.01630048f, -8.00961629e-003f,
1616        -0.06582128f, -0.04019095f, -0.04682907f, -0.01907842f, -0.10997720f,
1617        0.04911406f, 0.02931030f, 0.04197735f, -0.05773980f, -0.09670641f,
1618        -0.03594951f, -0.03402121f, -0.07149299f, -0.10566200f, 0.10601286f,
1619        0.06340689f, -0.01518632f, -5.96402306e-003f, -0.07628012f,
1620        -3.52779147e-003f, -0.02683854f, -0.10265494f, -0.02680815f,
1621        0.16338381f, 0.03103515f, 0.02296976f, 0.01624348f, -0.10831620f,
1622        -0.02314233f, -0.04789969f, -0.05530700f, -0.06461314f, 0.10494506f,
1623        0.04642856f, -0.07592955f, -0.06197905f, -0.09042154f, -0.01445521f,
1624        -0.04297818f, -0.11262015f, -0.11430512f, 0.03174541f, -0.03677487f,
1625        -0.02963996f, -0.06610169f, -0.13292049f, -0.07059067f, -0.08444111f,
1626        -0.02640536f, -0.07136250f, 0.04559967f, 0.01459980f, 0.17989251f,
1627        0.04435328f, -0.12464730f, -0.02871115f, -0.10752209f, -0.03393742f,
1628        -0.03791408f, 0.02548251f, 0.01956050f, 0.19245651f, 0.13963254f,
1629        -0.05904696f, -0.07424626f, -0.10411884f, 1.54176133e-003f,
1630        0.01797429f, 0.13025844f, 0.04547642f, -0.05710349f, -0.10697161f,
1631        -0.13489437f, -0.06515755f, -0.06406886f, -4.08572936e-003f,
1632        -0.01336483f, 0.04368737f, -0.11259720f, -0.05701635f, -0.06469971f,
1633        -0.08346602f, -0.04166770f, -0.05795543f, -0.08247511f, -0.05742628f,
1634        0.08452254f, -0.03350224f, 0.13980860f, 0.13252275f, 0.07589617f,
1635        0.07539988f, 0.12155797f, 0.19087289f, 0.15050751f, 0.21250245f,
1636        0.14206800f, 0.01298489f, 0.07450245f, 0.06559097f, 0.01700557f,
1637        0.04512971f, 0.16950700f, 0.10261577f, 0.16389982f, 0.05505059f,
1638        -0.03453077f, 0.08622462f, 0.07935954f, 0.03976260f, 0.02036091f,
1639        3.95744899e-003f, 0.03267065f, 0.15235919f, 0.01297494f, -0.08109194f,
1640        0.01407558f, 4.40693414e-003f, -0.15157418f, -0.11390478f,
1641        -0.07487597f, -7.81322457e-003f, -0.02749545f, -0.10181408f,
1642        0.13755716f, 0.14007211f, 0.13482562f, 0.27517235f, 0.34251109f,
1643        0.07639657f, 0.07268607f, 0.19823882f, 0.16135791f, -0.04186463f,
1644        -0.12784107f, -0.09846287f, 0.03169041f, 0.10974082f, -0.15051922f,
1645        -0.08916726f, -0.07138767f, -0.04153349f, 6.25418453e-003f,
1646        0.01266654f, 0.10533249f, 0.12749144f, 0.15148053f, 0.01498513f,
1647        0.06305949f, -0.01247123f, -0.08778401f, -0.08551880f, -0.11955146f,
1648        -0.08493572f, -0.02901620f, -0.02394859f, -0.13427313f, -0.11053200f,
1649        -0.14413260f, -0.15203285f, 0.03972760f, -3.72127310e-004f,
1650        -0.04200919f, 0.06105104f, 0.01904975f, -0.01106191f,
1651        -7.27445772e-003f, -0.01520341f, 1.10228511e-003f, -0.04949187f,
1652        -0.08013099f, 5.72071038e-003f, 0.08415454f, -0.06523152f, 0.03664081f,
1653        -0.02673042f, -0.12066154f, -0.03702074f, 0.06006580f, 0.01628682f,
1654        -6.17772620e-003f, 0.08192339f, -3.41629819e-003f, 0.02870512f,
1655        0.05807141f, 0.04959986f, 0.04618251f, -0.04901629f, -0.10579574f,
1656        0.02274442f, 0.12070961f, 2.23597488e-003f, 0.09831765f, -0.03019848f,
1657        -0.11181970f, -0.04961075f, 0.02498928f, -0.03714991f, -0.01619653f,
1658        0.02643486f, -7.62964319e-003f, -0.02882290f, -0.06242594f,
1659        -0.08439861f, 0.07220893f, 0.07263952f, 0.01561574f, 0.03091968f,
1660        0.01708712f, -0.03797151f, -3.18561122e-003f, 0.01624021f,
1661        -0.02828573f, 0.11284444f, -1.32280716e-003f, -0.07784860f,
1662        -0.07209100f, 0.03372242f, 0.12154529f, 0.02278104f, -0.05275500f,
1663        -0.01918484f, 0.12989293f, 0.05424401f, 0.02333086f, 0.04029022f,
1664        0.12392918f, 0.09495489f, 0.09190340f, 0.07935889f, 8.76816828e-003f,
1665        0.17148446f, -8.51302687e-003f, -0.08011249f, -0.06796283f,
1666        0.04884845f, 0.01112272f, -0.07835306f, -1.14811445e-003f,
1667        -0.03440760f, 0.02845243f, 0.07695542f, -0.07069533f, -0.01151784f,
1668        -8.53884313e-003f, -0.01662786f, -0.04163864f, 0.05400505f,
1669        0.02859163f, 0.02921852f, 0.05003135f, -6.85718050e-003f, -0.01632611f,
1670        0.07780217f, 0.04042810f, -0.01216440f, 3.60914599e-003f, -0.06322435f,
1671        0.09516726f, 0.12877031f, -9.69162490e-003f, 0.01031179f, 0.05180895f,
1672        -9.34659224e-003f, -0.01644533f, -0.04849347f, -0.04343236f,
1673        0.10514783f, 0.08046635f, -0.04615205f, -0.03975486f, -0.01485525f,
1674        0.13096830f, -0.01517950f, -0.06571898f, -0.04016372f, 0.01849786f,
1675        0.02439670f, 0.08067258f, 1.74824719e-003f, 0.07053747f, 0.08819518f,
1676        -5.08352555e-003f, -0.06550863f, -0.08266170f, -0.07780605f,
1677        0.01453450f, -0.08756890f, 0.01096501f, -8.71319138e-003f, 0.10110464f,
1678        0.02420769f, -0.06708383f, 0.02007811f, 5.93133038e-003f, 0.05398923f,
1679        0.07538138f, 0.02049227f, 0.02242589f, 0.04011070f, -1.44875818e-003f,
1680        -4.19115182e-003f, 0.06367654f, 0.02506934f, 0.02434536f, 0.05879405f,
1681        -8.22952855e-003f, -0.01242441f, 0.04224926f, -0.01754923f,
1682        0.05958161f, 0.03818886f, -0.01830363f, -0.04308917f, -0.04422197f,
1683        -0.02432721f, 0.02264866f, 2.03751423e-003f, 0.01197031f, 0.04439203f,
1684        0.12169247f, 0.03602713f, -0.02599251f, -1.98226492e-003f, 0.02046336f,
1685        -0.02639058f, -1.91242550e-003f, -0.09334669f, -0.03595153f,
1686        -9.88179818e-003f, -0.06848445f, -0.04666303f, -0.09955736f,
1687        -0.04206430f, 0.02609075f, 9.09005292e-003f, -0.07138551f,
1688        -4.22313227e-004f, 0.01766645f, 0.02756404f, 0.01308276f, 0.04052891f,
1689        0.02387515f, 0.05337298f, 0.02500631f, -0.04970853f, -0.12467445f,
1690        0.17604403f, 0.12256411f, -0.07512254f, 8.70451052e-003f, -0.05697548f,
1691        -0.03626474f, -8.76623299e-003f, -0.01210897f, -0.09451522f,
1692        0.07490732f, -0.02008001f, -0.02681278f, -0.06463405f, -0.01517507f,
1693        7.33757764e-003f, 6.07147906e-003f, -0.09316964f, -0.04575328f,
1694        0.13261597f, 0.15424870f, -0.01655918f, -0.02772390f, -0.05243644f,
1695        -0.02356456f, -0.02351753f, -0.10211615f, -0.12873036f, 0.14549787f,
1696        0.12519856f, 4.38762689e-003f, 0.02795992f, 0.05170322f, 0.09223596f,
1697        0.05890015f, 0.02376701f, -0.02777346f, 0.09506908f, 0.02328936f,
1698        -0.02319928f, -0.03218696f, -0.01527841f, -0.01016694f, -0.02674719f,
1699        0.05137179f, 0.01980666f, 0.06544447f, -0.01746171f, 0.01026380f,
1700        0.01561806f, 7.97004555e-004f, 0.07601810f, 0.01907250f, -0.03083035f,
1701        -0.05987392f, 0.09242783f, 0.14555025f, 0.01035827f, 0.03092401f,
1702        -0.09562709f, -0.03802354f, 0.02531144f, 0.03079449f, -0.07100715f,
1703        0.03330721f, -2.69116857e-003f, 0.03167490f, 0.05744999f, 0.03259895f,
1704        1.91266940e-003f, 0.03194578f, 0.07389776f, 0.02198060f, 0.07633314f,
1705        0.03293105f, -0.09103648f, 0.04718142f, 0.06102672f, -0.01003063f,
1706        5.85481385e-003f, -0.01522574f, 0.02323526f, 0.10584345f,
1707        4.35879454e-003f, 0.06107873f, 0.05868603f, -0.03115531f, 0.01214679f,
1708        0.08567052f, 3.93926632e-003f, -0.02521488f, -1.88425183e-003f,
1709        0.02038053f, -6.26854831e-004f, 0.04897438f, -0.04280585f,
1710        -0.04819689f, -0.04812867f, -0.01451186f, 0.05101469f,
1711        -9.01125465e-003f, -0.03333859f, 0.03917955f, 0.04196448f, 0.04292135f,
1712        0.02809529f, 0.02999715f, 0.04081348f, 9.10039060e-003f, 0.09703232f,
1713        0.10379741f, 0.02348725f, -4.72756615e-003f, 0.01027325f, 0.10402658f,
1714        0.12071823f, 0.09817299f, -0.02612033f, 0.03638414f, 0.05896405f,
1715        0.04865025f, 0.04793910f, -0.03882321f, -0.02962117f, -0.01222268f,
1716        0.04071597f, 0.01922777f, -0.02287866f, 0.03328381f, 0.01859092f,
1717        0.09024994f, 0.03804455f, -0.01424510f, 0.01953739f, 0.02509617f,
1718        -0.03390914f, -0.05663941f, -0.01641979f, 0.05848591f, 0.04639670f,
1719        0.02092116f, 0.12911791f, 0.19918139f, 0.07739855f, -7.25806039e-003f,
1720        0.04074838f, 0.03183993f, 1.39251316e-003f, -0.01428625f, 0.01865480f,
1721        0.08529541f, 0.13547510f, 0.11189661f, 0.03998901f, 0.09575938f,
1722        -0.02631102f, -0.03458253f, -0.04749985f, -0.06070716f,
1723        4.71884012e-003f, 0.06445789f, -0.02450038f, -0.05483776f,
1724        -0.04657237f, -0.02030717f, -0.03480766f, -0.09397731f, -0.06399718f,
1725        -0.01804585f, 5.62348310e-003f, -6.64811488e-003f, -0.06517869f,
1726        6.96210237e-003f, -0.01860148f, -0.04245830f, -0.05850367f,
1727        -3.24417115e-003f, 0.07700698f, 0.11290991f, 0.09923030f, -0.02970599f,
1728        0.05592411f, 0.04813979f, -0.09811195f, -0.09357996f, -0.03276114f,
1729        0.05218338f, 0.04141375f, 3.92977800e-003f, -0.05047480f, 0.15960084f,
1730        0.04612800f, -0.03114098f, -0.04650044f, -0.03249795f, -0.02425641f,
1731        -0.04311355f, 0.04307659f, -0.09401883f, -0.04742785f, -0.01254499f,
1732        -0.06598741f, 3.41369561e-003f, -0.05620445f, -7.28127593e-003f,
1733        -0.05998361f, -0.03274450f, -0.07376868f, 3.19015374e-003f,
1734        -0.07733069f, 0.05815864f, -0.02471071f, 0.03850617f, 0.13838784f,
1735        0.15399861f, 0.01731321f, -0.01477586f, 0.10393341f, 0.05159833f,
1736        -0.01945555f, -0.03427503f, -0.04867341f, 0.09237480f, 0.10732719f,
1737        0.06071450f, -0.01355071f, 0.01844356f, -0.03480803f, -0.03796671f,
1738        2.15628621e-004f, -0.05440186f, 0.01889855f, -0.01443413f,
1739        -0.02607902f, -0.02938001f, 0.02720689f, -0.06228397f, -0.02970936f,
1740        -0.03426210f, -0.10280876f, -0.06739304f, -0.05227850f, 0.03360292f,
1741        -0.11278441f, -0.06966180f, -0.13937433f, 9.10932291e-003f,
1742        2.52020749e-004f, -4.07359656e-003f, 0.12310639f, 0.09343060f,
1743        0.07302511f, 0.03222093f, 0.07532879f, 0.03792387f, -0.04985180f,
1744        0.01804602f, 0.02694195f, 0.13481498f, 0.04601225f, 0.04106982f,
1745        0.08511057f, 0.12314661f, 0.01320830f, 0.05044121f, -5.52943908e-003f,
1746        -0.08992624f, -0.02249301f, -0.08181777f, 0.06165213f, -0.03256603f,
1747        -0.01068920f, -0.01323473f, -0.11970232f, -0.04616347f, -0.12088681f,
1748        -0.06762606f, -0.08676834f, -0.06434575f, 0.01772529f, 0.03469615f,
1749        -0.10926618f, 0.03013873f, 0.14030397f, 0.16130108f, 0.17985588f,
1750        0.11281928f, 0.10530639f, 0.08905948f, 0.07733764f, 0.06695238f,
1751        0.02142088f, 0.06438877f, 0.09794453f, 0.05745072f, 0.02788557f,
1752        0.02632830f, 0.07985807f, 4.24902979e-003f, 8.47890321e-003f,
1753        -0.02679466f, -5.28812688e-003f, -0.02162580f, -0.07490715f,
1754        -0.08251337f, -0.02056576f, -0.01026194f, -1.15492963e-003f,
1755        -5.75720915e-004f, -0.07210591f, -0.07320981f, -0.04883312f,
1756        -0.10897151f, -0.07477258f, -0.08867134f, -0.09222437f, -0.10924666f,
1757        -0.10430276f, 0.07953499f, 0.02767959f, 0.11393359f, 0.18779543f,
1758        0.03313421f, 0.02143700f, 0.05852016f, -2.12067598e-003f,
1759        -3.76984011e-003f, 0.02774167f, -0.03124610f, 0.01465141f, 0.01616004f,
1760        -0.01391913f, -0.04404102f, -0.05444227f, -0.14684731f, -0.15016587f,
1761        0.04509468f, 1.29563001e-003f, 0.01398350f, 0.05610404f, -0.04868806f,
1762        -0.04776716f, -8.16873740e-003f, -2.30126386e-003f, -0.02286313f,
1763        0.11983398f, -0.04703261f, -0.08814441f, -0.07585249f, -0.10799607f,
1764        -0.03232087f, 0.01509786f, -0.04843464f, -0.03967846f, 0.09589416f,
1765        0.01352560f, -0.01458119f, 0.01050829f, -0.03038946f, 0.01608388f,
1766        1.11975556e-003f, -0.01250656f, 2.86211423e-003f, 0.04333691f,
1767        -0.14603497f, -0.01946543f, -0.02327525f, -0.01973944f, 0.07944400f,
1768        -0.02224544f, -0.06701808f, 0.03476532f, 0.11505594f, -0.02712801f,
1769        -0.01665113f, 0.06315716f, -0.08205860f, 0.07431999f, 0.04915778f,
1770        -0.04468752f, -0.01490402f, 0.07400476f, -0.11650901f, 0.05102430f,
1771        0.04559118f, -0.05916039f, 0.08840760f, -0.01587902f, -0.14890194f,
1772        0.07857784f, 0.04710254f, -0.05381983f, -0.07331945f, -0.03604643f,
1773        0.15611970f, 0.07649943f, -0.05959348f, -0.02776607f, 0.11098688f,
1774        0.03758875f, -0.04446875f, 0.04933187f, 0.01345535f, 0.06921103f,
1775        0.07364785f, 0.05518956f, 0.02899585f, 0.09375840f, 0.10518434f,
1776        -0.04420241f, 0.01915282f, -3.56386811e-003f, 0.14586878f, 0.10286101f,
1777        -0.04360626f, -0.12723237f, 0.09076386f, 0.11119842f, -0.06035013f,
1778        0.09674817f, 0.08938243f, 0.07065924f, 0.02603180f, 5.84815582e-003f,
1779        -0.05922065f, 0.12360309f, 3.59695964e-003f, 2.99844006e-003f,
1780        0.03697936f, 0.02043072f, 0.04168725f, 0.01025975f, -0.01359980f,
1781        -0.01600920f, 0.02581056f, 0.02329250f, 2.98100687e-003f, 0.01629762f,
1782        0.06652115f, 0.05855627f, 0.01237463f, -0.01297135f, 0.01761587f,
1783        0.05090865f, 0.06549342f, -0.04425945f, 2.43203156e-003f,
1784        3.07327788e-003f, 0.06678630f, -0.04303836f, 0.01082393f, -0.06476044f,
1785        0.04077786f, 0.12441979f, 0.08237778f, 0.07424165f, 0.04065890f,
1786        0.06905543f, 0.09556347f, 0.12724875f, -0.02132082f, 0.08514154f,
1787        -0.04175328f, -0.02666954f, 0.01897836f, 0.03317382f, 9.45465732e-003f,
1788        -0.01238974f, -0.04242500f, -0.01419479f, -0.03545213f, -0.02440874f,
1789        0.08684119f, 0.04212951f, 0.02462858f, -0.01104825f, -5.01706870e-003f,
1790        0.02968982f, 0.02597476f, -0.01568939f, 0.04514892f, 0.06974549f,
1791        0.08670278f, 0.06828108f, 0.10238872f, 0.05405957f, 0.06548470f,
1792        -0.03763957f, 0.01366090f, 0.07069602f, 0.05363748f, 0.04798120f,
1793        0.11706422f, 0.05466456f, -0.01869259f, 0.06344382f, 0.03106543f,
1794        0.08432506f, -0.02061096f, 0.03821088f, -6.92190882e-003f,
1795        6.40467042e-003f, -0.01271779f, 6.89014705e-005f, 0.04541415f,
1796        -0.01899539f, -0.05020239f, 0.03000903f, 0.01090422f, 4.52452758e-003f,
1797        0.02573632f, -0.02388454f, -0.04200457f, 1.72783900e-003f,
1798        -0.05978370f, -0.02720562f, 0.06573715f, 0.01154317f, 0.01265615f,
1799        0.07375994f, -9.19828378e-003f, -0.04914120f, 0.02124831f, 0.06455322f,
1800        0.04372910f, -0.03310043f, 0.03605788f, -6.78055827e-003f,
1801        9.36202332e-003f, 0.01747596f, -0.06406314f, -0.06812935f, 0.08080816f,
1802        -0.02778088f, 0.02735260f, 0.06393493f, 0.06652229f, 0.05676993f,
1803        0.08640018f, -7.59188086e-003f, -0.02012847f, -0.04741159f,
1804        -0.01657069f, -0.01624399f, 0.05547778f, -2.33309763e-003f,
1805        0.01120033f, 0.06141156f, -0.06285004f, -0.08732341f, -0.09313398f,
1806        -0.04267832f, 5.57443965e-003f, 0.04809862f, 0.01773641f,
1807        5.37361018e-003f, 0.14842421f, -0.06298012f, -0.02935147f, 0.11443478f,
1808        -0.05034208f, 5.65494271e-003f, 0.02076526f, -0.04577984f,
1809        -0.04735741f, 0.02961071f, -0.09307127f, -0.04417921f, -0.04990027f,
1810        -0.03940028f, 0.01306016f, 0.06267900f, 0.03758737f, 0.08460117f,
1811        0.13858789f, 0.04862388f, -0.06319809f, -0.05655516f, 0.01885816f,
1812        -0.03285607f, 0.03371567f, -0.07040928f, -0.04514049f, 0.01392166f,
1813        0.08184422f, -0.07230316f, 0.02386871f, 0.02184591f, 0.02605764f,
1814        -0.01033954f, 9.29878280e-003f, 7.67351175e-003f, 0.15189242f,
1815        0.02069071f, -0.09738296f, -0.08894105f, -0.07768748f, 0.02332268f,
1816        -0.01778995f, -0.03258888f, -0.08180822f, -0.08492987f, 0.02290156f,
1817        -0.11368170f, -0.03554465f, -0.04533844f, -0.02861580f, 0.06782424f,
1818        0.01113123f, 0.02453644f, 0.12721945f, 0.08084814f, -0.03607795f,
1819        0.01109122f, 0.04803548f, -0.03489929f, 0.03399536f, -0.05682014f,
1820        8.59533902e-003f, -4.27904585e-003f, 0.03230887f, -0.01300198f,
1821        -0.01038137f, -0.07930113f, 8.33097473e-003f, 0.02296994f,
1822        -0.01306500f, -0.01881626f, 0.04413369f, 0.05729880f, -0.03761553f,
1823        0.01942326f, 1.64540811e-003f, -0.03811319f, 0.04190650f, -0.14978096f,
1824        -0.04514487f, 0.01209545f, -5.46460645e-003f, -0.01647195f,
1825        7.63064111e-003f, -0.07494587f, 0.08415288f, 0.10020141f, -0.01228561f,
1826        0.06553826f, 0.04554005f, 0.07890417f, 0.03041138f, 0.01752007f,
1827        0.09208256f, -3.74419295e-004f, 0.10549527f, 0.04686913f, 0.01894833f,
1828        -0.02651412f, -4.34682379e-003f, 5.44942822e-003f, 0.01444484f,
1829        0.05882156f, -0.03336544f, 0.04603891f, -0.10432546f, 0.01923928f,
1830        0.01842845f, -0.01712168f, -0.02222766f, 0.04693324f, -0.06202956f,
1831        -0.01422159f, 0.08732220f, -0.07706107f, 0.02661049f, -0.04300238f,
1832        -0.03092422f, -0.03552184f, -0.01886088f, -0.04979934f, 0.03906401f,
1833        0.04608644f, 0.04966111f, 0.04275464f, -0.04621769f, -0.02653212f,
1834        8.57011229e-003f, 0.03839684f, 0.05818764f, 0.03880796f,
1835        -2.76100676e-004f, 0.03076511f, -0.03266929f, -0.05374557f,
1836        0.04986527f, -9.45429131e-003f, 0.03582499f, -2.64564669e-003f,
1837        -1.07461517e-003f, 0.02962313f, -0.01483363f, 0.03060869f, 0.02448327f,
1838        0.01845641f, 0.03282966f, -0.03534438f, -0.01084059f, -0.01119136f,
1839        -1.85360224e-003f, -5.94652840e-004f, -0.04451817f, 2.98327743e-003f,
1840        0.06272484f, -0.02152076f, -3.05971340e-003f, -0.05070828f,
1841        0.01531762f, 0.01282815f, 0.05167150f, 9.46266949e-003f,
1842        -3.34558333e-003f, 0.11442288f, -0.03906701f, -2.67325155e-003f,
1843        0.03069184f, -0.01134165f, 0.02949462f, 0.02879886f, 0.03855566f,
1844        -0.03450781f, 0.09142872f, -0.02156654f, 0.06075062f, -0.06220816f,
1845        0.01944680f, 6.68372354e-003f, -0.06656796f, 8.70784000e-003f,
1846        0.03456013f, 0.02434320f, -0.13236357f, -0.04177035f, -0.02069627f,
1847        0.01068112f, 0.01505432f, -0.07517391f, -3.83571628e-003f,
1848        -0.06298508f, -0.02881260f, -0.13101046f, -0.07221562f,
1849        -5.79945277e-003f, -8.57300125e-003f, 0.03782469f, 0.02762164f,
1850        0.04942456f, -0.02936396f, 0.09597211f, 0.01921411f, 0.06101191f,
1851        -0.04787507f, -0.01379578f, -7.40224449e-003f, -0.02220136f,
1852        -0.01313756f, 7.77558051e-003f, 0.12296968f, 0.02939998f, 0.03594062f,
1853        -0.07788624f, -0.01133144f, 3.99316690e-004f, -0.06090347f,
1854        -0.01122066f, -4.68682544e-003f, 0.07633100f, -0.06748922f,
1855        -0.05640298f, -0.05265681f, -0.01139122f, -0.01624347f, -0.04715714f,
1856        -0.01099092f, 0.01048561f, 3.28499987e-003f, -0.05810167f,
1857        -0.07699911f, -0.03330683f, 0.04185145f, 0.03478536f, 0.02275165f,
1858        0.02304766f, 6.66040834e-003f, 0.10968148f, -5.93013782e-003f,
1859        -0.04858336f, -0.04203213f, -0.09316786f, -6.13074889e-003f,
1860        -0.02544625f, 0.01366201f, 9.18555818e-003f, -0.01846578f,
1861        -0.05622401f, -0.03989377f, -0.07810296f, 6.91275718e-003f,
1862        0.05957597f, -0.03901334f, 0.01572002f, -0.01193903f,
1863        -6.89400872e-003f, -0.03093356f, -0.04136098f, -0.01562869f,
1864        -0.04604580f, 0.02865234f, -0.08678447f, -0.03232484f, -0.05364593f,
1865        -0.01445016f, -0.07003860f, -0.08669746f, -0.04520775f, 0.04274122f,
1866        0.03117515f, 0.08175703f, 0.01081109f, 0.06379741f, 0.06199206f,
1867        0.02865988f, 0.02360346f, 0.06725410f, -0.03248780f, -9.37702879e-003f,
1868        0.08265898f, -0.02245839f, 0.05125763f, -0.01862395f, 0.01973453f,
1869        -0.01994494f, -0.10770868f, 0.03180375f, 3.23935156e-003f,
1870        -0.02142080f, -0.04256190f, 0.04760900f, 0.04282863f, 0.05635953f,
1871        -0.01870849f, 0.05540622f, -0.03042666f, 0.01455277f, -0.06630179f,
1872        -0.05843807f, -0.03739681f, -0.09739155f, -0.03220233f, -0.05620182f,
1873        -0.10381401f, 0.07400211f, 4.20676917e-003f, 0.03258535f,
1874        2.14308966e-003f, 0.05121966f, -0.01274337f, 0.02384761f, 0.06335578f,
1875        -0.07905591f, 0.08375625f, -0.07898903f, -0.06508528f, -0.02498444f,
1876        0.06535810f, 0.03970535f, 0.04895468f, -0.01169566f, -0.03980601f,
1877        0.05682293f, 0.05925463f, -0.01165808f, -0.07936699f, -0.04208954f,
1878        0.01333987f, 0.09051196f, 0.10098671f, -0.03974256f, 0.01238771f,
1879        -0.07501741f, -0.03655440f, -0.04301528f, 0.09216860f,
1880        4.63579083e-004f, 0.02851115f, 0.02142735f, 1.28244064e-004f,
1881        0.02879687f, -0.08554889f, -0.04838862f, 0.08135369f, -0.05756533f,
1882        0.01413900f, 0.03451880f, -0.06619488f, -0.03053130f, 0.02961676f,
1883        -0.07384635f, 0.01135692f, 0.05283910f, -0.07778034f, -0.02107482f,
1884        -0.05511716f, -0.13473752f, 0.03030157f, 0.06722020f, -0.06218817f,
1885        -0.05826827f, 0.06254654f, 0.02895772f, -0.01664000f, -0.03620280f,
1886        -0.01612278f, -1.46097376e-003f, 0.14013411f, -8.96181818e-003f,
1887        -0.03250246f, 3.38630192e-003f, 2.64779478e-003f, 0.03359732f,
1888        -0.02411991f, -0.04229729f, 0.10666174f, -6.66579151f };
1889     return vector<float>(detector, detector + sizeof(detector)/sizeof(detector[0]));
1890 }
1891 //This function renurn 1981 SVM coeffs obtained from daimler's base.
1892 //To use these coeffs the detection window size should be (48,96)
1893 vector<float> HOGDescriptor::getDaimlerPeopleDetector()
1894 {
1895     static const float detector[] = {
1896         0.294350f, -0.098796f, -0.129522f, 0.078753f,
1897         0.387527f, 0.261529f, 0.145939f, 0.061520f,
1898         0.328699f, 0.227148f, -0.066467f, -0.086723f,
1899         0.047559f, 0.106714f, 0.037897f, 0.111461f,
1900         -0.024406f, 0.304769f, 0.254676f, -0.069235f,
1901         0.082566f, 0.147260f, 0.326969f, 0.148888f,
1902         0.055270f, -0.087985f, 0.261720f, 0.143442f,
1903         0.026812f, 0.238212f, 0.194020f, 0.056341f,
1904         -0.025854f, -0.034444f, -0.156631f, 0.205174f,
1905         0.089008f, -0.139811f, -0.100147f, -0.037830f,
1906         -0.029230f, -0.055641f, 0.033248f, -0.016512f,
1907         0.155244f, 0.247315f, -0.124694f, -0.048414f,
1908         -0.062219f, 0.193683f, 0.004574f, 0.055089f,
1909         0.093565f, 0.167712f, 0.167581f, 0.018895f,
1910         0.215258f, 0.122609f, 0.090520f, -0.067219f,
1911         -0.049029f, -0.099615f, 0.241804f, -0.094893f,
1912         -0.176248f, 0.001727f, -0.134473f, 0.104442f,
1913         0.050942f, 0.081165f, 0.072156f, 0.121646f,
1914         0.002656f, -0.297974f, -0.133587f, -0.060121f,
1915         -0.092515f, -0.048974f, -0.084754f, -0.180111f,
1916         -0.038590f, 0.086283f, -0.134636f, -0.107249f,
1917         0.132890f, 0.141556f, 0.249425f, 0.130273f,
1918         -0.030031f, 0.073212f, -0.008155f, 0.019931f,
1919         0.071688f, 0.000300f, -0.019525f, -0.021725f,
1920         -0.040993f, -0.086841f, 0.070124f, 0.240033f,
1921         0.265350f, 0.043208f, 0.166754f, 0.091453f,
1922         0.060916f, -0.036972f, -0.091043f, 0.079873f,
1923         0.219781f, 0.158102f, -0.140618f, -0.043016f,
1924         0.124802f, 0.093668f, 0.103208f, 0.094872f,
1925         0.080541f, 0.137711f, 0.160566f, -0.169231f,
1926         0.013983f, 0.309508f, -0.004217f, -0.057200f,
1927         -0.064489f, 0.014066f, 0.361009f, 0.251328f,
1928         -0.080983f, -0.044183f, 0.061436f, -0.037381f,
1929         -0.078786f, 0.030993f, 0.066314f, 0.037683f,
1930         0.152325f, -0.091683f, 0.070203f, 0.217856f,
1931         0.036435f, -0.076462f, 0.006254f, -0.094431f,
1932         0.154829f, -0.023038f, -0.196961f, -0.024594f,
1933         0.178465f, -0.050139f, -0.045932f, -0.000965f,
1934         0.109112f, 0.046165f, -0.159373f, -0.008713f,
1935         0.041307f, 0.097129f, -0.057211f, -0.064599f,
1936         0.077165f, 0.176167f, 0.138322f, 0.065753f,
1937         -0.104950f, 0.017933f, 0.136255f, -0.011598f,
1938         0.047007f, 0.080550f, 0.068619f, 0.084661f,
1939         -0.035493f, -0.091314f, -0.041411f, 0.060971f,
1940         -0.101912f, -0.079870f, -0.085977f, -0.022686f,
1941         0.079788f, -0.098064f, -0.054603f, 0.040383f,
1942         0.300794f, 0.128603f, 0.094844f, 0.047407f,
1943         0.101825f, 0.061832f, -0.162160f, -0.204553f,
1944         -0.035165f, 0.101450f, -0.016641f, -0.027140f,
1945         -0.134392f, -0.008743f, 0.102331f, 0.114853f,
1946         0.009644f, 0.062823f, 0.237339f, 0.167843f,
1947         0.053066f, -0.012592f, 0.043158f, 0.002305f,
1948         0.065001f, -0.038929f, -0.020356f, 0.152343f,
1949         0.043469f, -0.029967f, -0.042948f, 0.032481f,
1950         0.068488f, -0.110840f, -0.111083f, 0.111980f,
1951         -0.002072f, -0.005562f, 0.082926f, 0.006635f,
1952         -0.108153f, 0.024242f, -0.086464f, -0.189884f,
1953         -0.017492f, 0.191456f, -0.007683f, -0.128769f,
1954         -0.038017f, -0.132380f, 0.091926f, 0.079696f,
1955         -0.106728f, -0.007656f, 0.172744f, 0.011576f,
1956         0.009883f, 0.083258f, -0.026516f, 0.145534f,
1957         0.153924f, -0.130290f, -0.108945f, 0.124490f,
1958         -0.003186f, -0.100485f, 0.015024f, -0.060512f,
1959         0.026288f, -0.086713f, -0.169012f, 0.076517f,
1960         0.215778f, 0.043701f, -0.131642f, -0.012585f,
1961         -0.045181f, -0.118183f, -0.241544f, -0.167293f,
1962         -0.020107f, -0.019917f, -0.101827f, -0.107096f,
1963         -0.010503f, 0.044938f, 0.189680f, 0.217119f,
1964         -0.046086f, 0.044508f, 0.199716f, -0.036004f,
1965         -0.148927f, 0.013355f, -0.078279f, 0.030451f,
1966         0.056301f, -0.024609f, 0.083224f, 0.099533f,
1967         -0.039432f, -0.138880f, 0.005482f, -0.024120f,
1968         -0.140468f, -0.066381f, -0.017057f, 0.009260f,
1969         -0.058004f, -0.028486f, -0.061610f, 0.007483f,
1970         -0.158309f, -0.150687f, -0.044595f, -0.105121f,
1971         -0.045763f, -0.006618f, -0.024419f, -0.117713f,
1972         -0.119366f, -0.175941f, -0.071542f, 0.119027f,
1973         0.111362f, 0.043080f, 0.034889f, 0.093003f,
1974         0.007842f, 0.057368f, -0.108834f, -0.079968f,
1975         0.230959f, 0.020205f, 0.011470f, 0.098877f,
1976         0.101310f, -0.030215f, -0.018018f, -0.059552f,
1977         -0.106157f, 0.021866f, -0.036471f, 0.080051f,
1978         0.041165f, -0.082101f, 0.117726f, 0.030961f,
1979         -0.054763f, -0.084102f, -0.185778f, -0.061305f,
1980         -0.038089f, -0.110728f, -0.264010f, 0.076675f,
1981         -0.077111f, -0.137644f, 0.036232f, 0.277995f,
1982         0.019116f, 0.107738f, 0.144003f, 0.080304f,
1983         0.215036f, 0.228897f, 0.072713f, 0.077773f,
1984         0.120168f, 0.075324f, 0.062730f, 0.122478f,
1985         -0.049008f, 0.164912f, 0.162450f, 0.041246f,
1986         0.009891f, -0.097827f, -0.038700f, -0.023027f,
1987         -0.120020f, 0.203364f, 0.248474f, 0.149810f,
1988         -0.036276f, -0.082814f, -0.090343f, -0.027143f,
1989         -0.075689f, -0.320310f, -0.000500f, -0.143334f,
1990         -0.065077f, -0.186936f, 0.129372f, 0.116431f,
1991         0.181699f, 0.170436f, 0.418854f, 0.460045f,
1992         0.333719f, 0.230515f, 0.047822f, -0.044954f,
1993         -0.068086f, 0.140179f, -0.044821f, 0.085550f,
1994         0.092483f, -0.107296f, -0.130670f, -0.206629f,
1995         0.114601f, -0.317869f, -0.076663f, 0.038680f,
1996         0.212753f, -0.016059f, -0.126526f, -0.163602f,
1997         0.210154f, 0.099887f, -0.126366f, 0.118453f,
1998         0.019309f, -0.021611f, -0.096499f, -0.111809f,
1999         -0.200489f, 0.142854f, 0.228840f, -0.353346f,
2000         -0.179151f, 0.116834f, 0.252389f, -0.031728f,
2001         -0.188135f, -0.158998f, 0.386523f, 0.122315f,
2002         0.209944f, 0.394023f, 0.359030f, 0.260717f,
2003         0.170335f, 0.013683f, -0.142596f, -0.026138f,
2004         -0.011878f, -0.150519f, 0.047159f, -0.107062f,
2005         -0.147347f, -0.187689f, -0.186027f, -0.208048f,
2006         0.058468f, -0.073026f, -0.236556f, -0.079788f,
2007         -0.146216f, -0.058563f, -0.101361f, -0.071294f,
2008         -0.071093f, 0.116919f, 0.234304f, 0.306781f,
2009         0.321866f, 0.240000f, 0.073261f, -0.012173f,
2010         0.026479f, 0.050173f, 0.166127f, 0.228955f,
2011         0.061905f, 0.156460f, 0.205990f, 0.120672f,
2012         0.037350f, 0.167884f, 0.290099f, 0.420900f,
2013         -0.012601f, 0.189839f, 0.306378f, 0.118383f,
2014         -0.095598f, -0.072360f, -0.132496f, -0.224259f,
2015         -0.126021f, 0.022714f, 0.284039f, 0.051369f,
2016         -0.000927f, -0.058735f, -0.083354f, -0.141254f,
2017         -0.187578f, -0.202669f, 0.048902f, 0.246597f,
2018         0.441863f, 0.342519f, 0.066979f, 0.215286f,
2019         0.188191f, -0.072240f, -0.208142f, -0.030196f,
2020         0.178141f, 0.136985f, -0.043374f, -0.181098f,
2021         0.091815f, 0.116177f, -0.126690f, -0.386625f,
2022         0.368165f, 0.269149f, -0.088042f, -0.028823f,
2023         0.092961f, 0.024099f, 0.046112f, 0.176756f,
2024         0.135849f, 0.124955f, 0.195467f, -0.037218f,
2025         0.167217f, 0.188938f, 0.053528f, -0.066561f,
2026         0.133721f, -0.070565f, 0.115898f, 0.152435f,
2027         -0.116993f, -0.110592f, -0.179005f, 0.026668f,
2028         0.080530f, 0.075084f, -0.070401f, 0.012497f,
2029         0.021849f, -0.139764f, -0.022020f, -0.096301f,
2030         -0.064954f, -0.127446f, -0.013806f, -0.108315f,
2031         0.156285f, 0.149867f, -0.011382f, 0.064532f,
2032         0.029168f, 0.027393f, 0.069716f, 0.153735f,
2033         0.038459f, 0.230714f, 0.253840f, 0.059522f,
2034         -0.045053f, 0.014083f, 0.071103f, 0.068747f,
2035         0.095887f, 0.005832f, 0.144887f, 0.026357f,
2036         -0.067359f, -0.044151f, -0.123283f, -0.019911f,
2037         0.005318f, 0.109208f, -0.003201f, -0.021734f,
2038         0.142025f, -0.066907f, -0.120070f, -0.188639f,
2039         0.012472f, -0.048704f, -0.012366f, -0.184828f,
2040         0.168591f, 0.267166f, 0.058208f, -0.044101f,
2041         0.033500f, 0.178558f, 0.104550f, 0.122418f,
2042         0.080177f, 0.173246f, 0.298537f, 0.064173f,
2043         0.053397f, 0.174341f, 0.230984f, 0.117025f,
2044         0.166242f, 0.227781f, 0.120623f, 0.176952f,
2045         -0.011393f, -0.086483f, -0.008270f, 0.051700f,
2046         -0.153369f, -0.058837f, -0.057639f, -0.060115f,
2047         0.026349f, -0.160745f, -0.037894f, -0.048575f,
2048         0.041052f, -0.022112f, 0.060365f, 0.051906f,
2049         0.162657f, 0.138519f, -0.050185f, -0.005938f,
2050         0.071301f, 0.127686f, 0.062342f, 0.144400f,
2051         0.072600f, 0.198436f, 0.246219f, -0.078185f,
2052         -0.036169f, 0.075934f, 0.047328f, -0.013601f,
2053         0.087205f, 0.019900f, 0.022606f, -0.015365f,
2054         -0.092506f, 0.075275f, -0.116375f, 0.050500f,
2055         0.045118f, 0.166567f, 0.072073f, 0.060371f,
2056         0.131747f, -0.169863f, -0.039352f, -0.047486f,
2057         -0.039797f, -0.204312f, 0.021710f, 0.129443f,
2058         -0.021173f, 0.173416f, -0.070794f, -0.063986f,
2059         0.069689f, -0.064099f, -0.123201f, -0.017372f,
2060         -0.206870f, 0.065863f, 0.113226f, 0.024707f,
2061         -0.071341f, -0.066964f, -0.098278f, -0.062927f,
2062         0.075840f, 0.014716f, 0.019378f, 0.132699f,
2063         -0.074191f, -0.089557f, -0.078446f, -0.197488f,
2064         -0.173665f, 0.052583f, 0.044361f, 0.113549f,
2065         0.098492f, 0.077379f, -0.011146f, -0.192593f,
2066         -0.164435f, 0.045568f, 0.205699f, 0.049187f,
2067         -0.082281f, 0.134874f, 0.185499f, 0.034968f,
2068         -0.119561f, -0.112372f, -0.115091f, -0.054042f,
2069         -0.183816f, -0.078100f, 0.190695f, 0.091617f,
2070         0.004257f, -0.041135f, -0.061453f, -0.141592f,
2071         -0.194809f, -0.120638f, 0.020168f, 0.109672f,
2072         0.067398f, -0.015238f, -0.239145f, -0.264671f,
2073         -0.185176f, 0.050472f, 0.020793f, 0.035678f,
2074         0.022839f, -0.052055f, -0.127968f, -0.113049f,
2075         -0.228416f, -0.258281f, -0.053437f, 0.076424f,
2076         0.061450f, 0.237478f, 0.003618f, -0.055865f,
2077         -0.108087f, -0.028937f, 0.045585f, 0.052829f,
2078         -0.001471f, 0.022826f, 0.059565f, -0.104430f,
2079         -0.077266f, -0.211882f, -0.212078f, 0.028074f,
2080         0.075846f, 0.016265f, 0.161879f, 0.134477f,
2081         0.008935f, -0.048041f, 0.074692f, 0.004928f,
2082         -0.025156f, 0.192874f, 0.074410f, 0.308732f,
2083         0.267400f, 0.094208f, -0.005251f, 0.042041f,
2084         -0.032148f, 0.015588f, 0.252869f, 0.175302f,
2085         0.022892f, 0.081673f, 0.063208f, 0.162626f,
2086         0.194426f, 0.233890f, 0.262292f, 0.186930f,
2087         0.084079f, -0.286388f, -0.213034f, -0.048867f,
2088         -0.207669f, -0.170050f, 0.011673f, -0.092958f,
2089         -0.192786f, -0.273536f, 0.230904f, 0.266732f,
2090         0.320519f, 0.297155f, 0.548169f, 0.304922f,
2091         0.132687f, 0.247333f, 0.212488f, -0.271472f,
2092         -0.142105f, -0.002627f, -0.119215f, 0.128383f,
2093         0.100079f, -0.057490f, -0.121902f, -0.228892f,
2094         0.202292f, -0.399795f, -0.371326f, -0.095836f,
2095         -0.063626f, -0.161375f, -0.311180f, -0.294797f,
2096         0.242122f, 0.011788f, 0.095573f, 0.322523f,
2097         0.511840f, 0.322880f, 0.313259f, 0.173331f,
2098         0.002542f, -0.029802f, 0.324766f, -0.326170f,
2099         -0.340547f, -0.138288f, -0.002963f, -0.114060f,
2100         -0.377312f, -0.442570f, 0.212446f, -0.007759f,
2101         -0.011576f, 0.169711f, 0.308689f, 0.317348f,
2102         0.539390f, 0.332845f, 0.057331f, -0.068180f,
2103         0.101994f, 0.266995f, 0.209570f, 0.355730f,
2104         0.091635f, 0.170238f, 0.125215f, 0.274154f,
2105         0.070223f, 0.025515f, 0.049946f, -0.000550f,
2106         0.043715f, -0.141843f, 0.020844f, 0.129871f,
2107         0.256588f, 0.105015f, 0.148339f, 0.170682f,
2108         0.028792f, 0.074037f, 0.160042f, 0.405137f,
2109         0.246187f, 0.352160f, 0.168951f, 0.222263f,
2110         0.264439f, 0.065945f, 0.021963f, -0.075084f,
2111         0.093105f, 0.027318f, 0.098864f, 0.057566f,
2112         -0.080282f, 0.185032f, 0.314419f, 0.333727f,
2113         0.125798f, 0.294919f, 0.386002f, 0.217619f,
2114         -0.183517f, -0.278622f, -0.002342f, -0.027821f,
2115         -0.134266f, -0.331843f, -0.008296f, 0.124564f,
2116         0.053712f, -0.369016f, -0.095036f, 0.209381f,
2117         0.423760f, 0.371760f, 0.106397f, 0.369408f,
2118         0.485608f, 0.231201f, -0.138685f, -0.349208f,
2119         -0.070083f, 0.028991f, -0.081630f, -0.395992f,
2120         -0.146791f, -0.027354f, 0.063396f, -0.272484f,
2121         0.058299f, 0.338207f, 0.110767f, -0.052642f,
2122         -0.233848f, -0.027448f, 0.030328f, 0.155572f,
2123         -0.093826f, 0.019331f, 0.120638f, 0.006292f,
2124         -0.106083f, -0.236290f, -0.140933f, -0.088067f,
2125         -0.025138f, -0.208395f, -0.025502f, 0.144192f,
2126         -0.048353f, -0.106144f, -0.305121f, -0.114147f,
2127         0.090963f, 0.327727f, 0.035606f, -0.093779f,
2128         0.002651f, -0.171081f, -0.188131f, -0.216571f,
2129         -0.209101f, -0.054402f, 0.157147f, -0.057127f,
2130         0.066584f, 0.008988f, 0.041191f, 0.034456f,
2131         -0.078255f, 0.052099f, -0.022239f, 0.066981f,
2132         -0.117520f, -0.072637f, 0.062512f, 0.037570f,
2133         -0.057544f, -0.312359f, 0.034357f, -0.031549f,
2134         0.002566f, -0.207375f, -0.070654f, -0.018786f,
2135         -0.044815f, -0.012814f, -0.076320f, 0.078183f,
2136         0.023877f, 0.117078f, 0.022292f, -0.205424f,
2137         -0.060430f, -0.017296f, -0.004827f, -0.321036f,
2138         -0.092155f, 0.038837f, 0.073190f, -0.067513f,
2139         0.026521f, 0.171945f, 0.087318f, 0.034495f,
2140         -0.034089f, 0.154410f, -0.061431f, 0.007435f,
2141         -0.111094f, -0.095976f, 0.014741f, -0.132324f,
2142         -0.029517f, -0.192160f, 0.098667f, 0.020762f,
2143         0.177050f, -0.064510f, -0.054437f, -0.058678f,
2144         -0.001858f, 0.167602f, 0.015735f, 0.054338f,
2145         0.016477f, 0.186381f, -0.010667f, 0.054692f,
2146         0.126742f, 0.013140f, 0.090353f, -0.133608f,
2147         -0.018017f, -0.152619f, 0.027600f, -0.138700f,
2148         -0.050274f, 0.045141f, -0.118731f, 0.094797f,
2149         -0.167605f, 0.097461f, -0.009131f, 0.199920f,
2150         -0.052976f, 0.158194f, 0.178568f, -0.107600f,
2151         0.009671f, -0.084072f, -0.040258f, -0.205673f,
2152         0.102891f, 0.223511f, 0.042699f, 0.118548f,
2153         -0.021274f, 0.110997f, -0.155121f, 0.027696f,
2154         -0.149968f, 0.051552f, -0.129219f, 0.173524f,
2155         0.073972f, -0.189045f, -0.034523f, -0.106655f,
2156         -0.011843f, -0.197381f, 0.219413f, 0.183197f,
2157         -0.054920f, 0.144955f, 0.036517f, -0.085412f,
2158         -0.229070f, -0.143710f, -0.049486f, 0.156634f,
2159         -0.008673f, -0.064778f, 0.082344f, 0.145673f,
2160         0.002912f, -0.210121f, -0.116564f, 0.078425f,
2161         0.220908f, -0.067594f, 0.048610f, 0.084912f,
2162         -0.066202f, -0.112515f, -0.217767f, -0.082640f,
2163         -0.017414f, 0.230265f, -0.070735f, 0.066073f,
2164         0.215256f, 0.071157f, -0.087220f, -0.202235f,
2165         -0.011918f, 0.099562f, 0.174716f, -0.063845f,
2166         -0.121055f, 0.014367f, 0.132709f, -0.005060f,
2167         -0.244606f, -0.179693f, -0.134690f, 0.023239f,
2168         -0.193116f, -0.076975f, -0.021164f, -0.001938f,
2169         -0.163799f, -0.111437f, -0.210362f, -0.166376f,
2170         0.034754f, 0.010036f, -0.021917f, 0.068014f,
2171         -0.086893f, -0.251746f, -0.267171f, 0.037383f,
2172         0.003966f, 0.033571f, -0.151506f, 0.025437f,
2173         -0.020626f, -0.308454f, -0.343143f, -0.092263f,
2174         -0.026261f, -0.028345f, 0.036036f, 0.035169f,
2175         0.129470f, 0.122205f, 0.015661f, -0.070612f,
2176         -0.094333f, -0.066055f, -0.041083f, 0.159146f,
2177         0.073184f, 0.110044f, 0.174471f, 0.078069f,
2178         -0.014881f, 0.008116f, 0.013209f, 0.075857f,
2179         0.195605f, 0.062714f, 0.067955f, 0.056544f,
2180         -0.153908f, -0.141749f, -0.072550f, 0.033523f,
2181         -0.024665f, 0.134487f, 0.079076f, 0.133562f,
2182         0.227130f, 0.018054f, 0.004928f, 0.169162f,
2183         0.065152f, 0.072160f, 0.131631f, 0.096303f,
2184         0.054288f, 0.106256f, 0.114632f, 0.119038f,
2185         0.515200f, 0.247429f, 0.199134f, 0.211957f,
2186         0.127558f, -0.294684f, -0.194890f, -0.049988f,
2187         -0.112247f, -0.008122f, -0.006176f, 0.037035f,
2188         -0.110881f, -0.249989f, 0.152434f, 0.234621f,
2189         0.153340f, 0.349283f, 0.683049f, 0.157174f,
2190         0.124844f, 0.099136f, 0.064407f, -0.248400f,
2191         -0.155323f, -0.026498f, -0.023450f, 0.049051f,
2192         -0.114187f, 0.007195f, -0.176825f, -0.376926f,
2193         0.366159f, -0.179938f, -0.148508f, 0.006043f,
2194         0.170048f, 0.097866f, -0.102658f, -0.260430f,
2195         0.248868f, 0.037019f, -0.118111f, 0.078176f,
2196         0.194171f, 0.211328f, 0.368612f, 0.361213f,
2197         0.130013f, 0.094650f, 0.227396f, -0.178058f,
2198         -0.114782f, -0.008093f, 0.231080f, -0.011843f,
2199         -0.097917f, -0.325788f, 0.141879f, 0.119738f,
2200         -0.230427f, -0.117419f, -0.114153f, 0.037903f,
2201         0.116383f, 0.218773f, -0.101884f, 0.059466f,
2202         0.119255f, 0.010874f, -0.031449f, 0.045996f,
2203         0.119931f, 0.273760f, 0.311700f, 0.261794f,
2204         0.194809f, 0.339829f, 0.239449f, 0.064140f,
2205         0.077597f, 0.098996f, 0.143534f, 0.184602f,
2206         0.037507f, 0.225494f, 0.096142f, -0.147370f,
2207         -0.207833f, -0.174742f, -0.086391f, -0.038942f,
2208         0.159577f, -0.088492f, -0.000989f, 0.108154f,
2209         -0.025890f, -0.072713f, 0.025997f, -0.006803f,
2210         -0.086879f, -0.011290f, -0.269200f, -0.103450f,
2211         -0.124910f, -0.116340f, 0.141459f, 0.208800f,
2212         0.042268f, 0.265034f, 0.516474f, 0.217591f,
2213         -0.018843f, -0.313328f, -0.168363f, 0.047129f,
2214         0.090480f, -0.109852f, -0.018761f, 0.210669f,
2215         0.281269f, -0.043591f, -0.034147f, -0.237772f,
2216         -0.134843f, -0.072481f, -0.103831f, 0.038355f,
2217         0.308619f, 0.148023f, -0.045867f, -0.123950f,
2218         -0.210860f, -0.064973f, -0.036308f, -0.046731f,
2219         -0.022099f, 0.095776f, 0.409423f, 0.060635f,
2220         -0.065196f, 0.051828f, 0.027981f, -0.009609f,
2221         -0.137681f, -0.095011f, -0.019045f, 0.177278f,
2222         0.009759f, -0.092119f, -0.016958f, -0.133860f,
2223         -0.118421f, -0.032039f, -0.006214f, -0.084541f,
2224         0.063971f, -0.073642f, 0.165676f, 0.110443f,
2225         0.044131f, 0.046568f, 0.053292f, -0.055466f,
2226         0.015512f, 0.371947f, 0.232102f, -0.016923f,
2227         0.103979f, -0.091758f, 0.005907f, 0.209100f,
2228         0.157433f, 0.030518f, 0.250366f, 0.062322f,
2229         0.036720f, 0.094676f, 0.017306f, -0.010328f,
2230         -0.079012f, 0.016781f, -0.112435f, 0.061795f,
2231         0.042543f, -0.126799f, -0.009975f, -0.056760f,
2232         0.046424f, -0.194712f, -0.139399f, -0.037731f,
2233         0.157989f, -0.016261f, 0.123345f, 0.230563f,
2234         0.083300f, -0.016392f, 0.059567f, -0.016035f,
2235         -0.064767f, 0.231945f, 0.156629f, 0.034602f,
2236         0.145628f, 0.041315f, 0.034535f, 0.019967f,
2237         -0.089188f, -0.012091f, 0.307857f, 0.211405f,
2238         -0.025091f, -0.148249f, -0.129384f, 0.063536f,
2239         -0.068603f, -0.067941f, -0.035104f, 0.210832f,
2240         0.063810f, 0.062764f, -0.089889f, -0.030554f,
2241         0.014791f, -0.053362f, -0.037818f, -0.196640f,
2242         0.008388f, -0.082654f, 0.143056f, 0.064221f,
2243         0.069795f, 0.191040f, 0.097321f, -0.028679f,
2244         0.075794f, 0.313154f, 0.086240f, 0.207643f,
2245         0.017809f, 0.122867f, 0.224586f, 0.167403f,
2246         -0.023884f, 0.047434f, 0.344091f, 0.187745f,
2247         0.136177f, 0.141738f, 0.063799f, 0.045233f,
2248         -0.077342f, -0.003525f, -0.165041f, -0.025616f,
2249         -0.073745f, 0.164439f, 0.011200f, -0.145896f,
2250         -0.027954f, -0.061987f, -0.039874f, -0.142775f,
2251         0.151042f, -0.038238f, 0.053152f, 0.078615f,
2252         0.086061f, 0.100593f, 0.128046f, -0.071006f,
2253         -0.116558f, 0.208445f, 0.051086f, 0.076843f,
2254         0.023191f, -0.084781f, -0.011790f, 0.147807f,
2255         -0.048554f, -0.113932f, 0.283322f, 0.190934f,
2256         0.092789f, 0.033018f, -0.142428f, -0.142480f,
2257         -0.099023f, -0.041020f, -0.042760f, 0.203295f,
2258         -0.053475f, 0.042424f, 0.222839f, -0.019167f,
2259         -0.133176f, -0.276216f, -0.031998f, 0.117290f,
2260         0.177827f, -0.059973f, -0.064744f, -0.117040f,
2261         -0.155482f, -0.099531f, 0.164121f, -0.026682f,
2262         -0.093810f, 0.238993f, -0.006506f, 0.007830f,
2263         0.065819f, -0.203643f, -0.100925f, -0.053652f,
2264         -0.130770f, 0.026277f, 0.131796f, 0.032742f,
2265         0.127186f, 0.116694f, -0.161122f, -0.279773f,
2266         -0.252515f, -0.002638f, 0.042812f, 0.096776f,
2267         -0.123280f, 0.064858f, -0.010455f, -0.219760f,
2268         -0.239331f, -0.104363f, -0.058022f, -0.053584f,
2269         0.025611f, 0.005129f, -0.100418f, -0.045712f,
2270         -0.194418f, -0.126366f, -0.030530f, 0.051168f,
2271         0.215959f, 0.172402f, -0.054700f, -0.185995f,
2272         -0.278360f, -0.193693f, -0.040309f, 0.003735f,
2273         -0.007770f, 0.123556f, 0.190179f, -0.077315f,
2274         0.117403f, 0.212942f, 0.012160f, 0.000113f,
2275         0.027331f, 0.040202f, 0.033293f, 0.219438f,
2276         0.184174f, 0.259349f, 0.311206f, 0.082547f,
2277         -0.047875f, -0.078417f, 0.010746f, 0.082620f,
2278         0.311931f, 0.307605f, 0.003863f, 0.021405f,
2279         -0.026388f, -0.019572f, 0.020582f, -0.059353f,
2280         0.025199f, 0.261319f, 0.086316f, 0.143614f,
2281         0.107780f, 0.003900f, -0.188397f, -0.038563f,
2282         -0.106045f, -0.125154f, -0.010509f, 0.054021f,
2283         0.242130f, 0.279152f, 0.215546f, 0.346995f,
2284         0.440856f, 0.237452f, 0.234154f, 0.301646f,
2285         0.168929f, -0.208358f, -0.126848f, 0.010260f,
2286         0.121018f, -0.062975f, -0.052848f, 0.050341f,
2287         -0.061103f, -0.266482f, 0.107186f, 0.140221f,
2288         0.280065f, 0.287889f, 0.373198f, 0.151596f,
2289         0.013593f, 0.115616f, 0.014616f, -0.281710f,
2290         -0.237597f, -0.117305f, -0.000034f, -0.136739f,
2291         -0.196275f, -0.095225f, -0.125310f, -0.250514f,
2292         0.236804f, -0.071805f, -0.037421f, 0.048230f,
2293         0.321596f, 0.063632f, 0.024039f, -0.029133f,
2294         0.230983f, 0.160593f, -0.154355f, -0.013086f,
2295         -0.079929f, 0.094692f, 0.160391f, 0.180239f,
2296         0.053895f, 0.100759f, 0.288631f, 0.038191f,
2297         0.181692f, 0.229682f, 0.440166f, 0.063401f,
2298         0.006273f, 0.020865f, 0.338695f, 0.256244f,
2299         -0.043927f, 0.115617f, 0.003296f, 0.173965f,
2300         0.021318f, -0.040936f, -0.118932f, 0.182380f,
2301         0.235922f, -0.053233f, -0.015053f, -0.101057f,
2302         0.095341f, 0.051111f, 0.161831f, 0.032614f,
2303         0.159496f, 0.072375f, 0.025089f, 0.023748f,
2304         0.029151f, 0.161284f, -0.117717f, -0.036191f,
2305         -0.176822f, -0.162006f, 0.226542f, -0.078329f,
2306         0.043079f, -0.119172f, 0.054614f, -0.101365f,
2307         -0.064541f, -0.115304f, 0.135170f, 0.298872f,
2308         0.098060f, 0.089428f, -0.007497f, 0.110391f,
2309         -0.028824f, 0.020835f, -0.036804f, 0.125411f,
2310         0.192105f, -0.048931f, 0.003086f, -0.010681f,
2311         0.074698f, -0.016263f, 0.096063f, 0.060267f,
2312         -0.007277f, 0.139139f, -0.080635f, 0.036628f,
2313         0.086058f, 0.131979f, 0.085707f, 0.025301f,
2314         0.226094f, 0.194759f, 0.042193f, -0.157846f,
2315         -0.068402f, -0.141450f, -0.112659f, -0.076305f,
2316         -0.069085f, -0.114332f, -0.102005f, 0.132193f,
2317         -0.067042f, 0.106643f, 0.198964f, 0.171616f,
2318         0.167237f, -0.033730f, -0.026755f, 0.083621f,
2319         0.149459f, -0.002799f, -0.000318f, 0.011753f,
2320         0.065889f, -0.089375f, -0.049610f, 0.224579f,
2321         0.216548f, -0.034908f, -0.017851f, -0.088144f,
2322         0.007530f, 0.240268f, 0.073270f, 0.013263f,
2323         0.175323f, 0.012082f, 0.093993f, 0.015282f,
2324         0.105854f, 0.107990f, 0.077798f, -0.096166f,
2325         -0.079607f, 0.177820f, 0.142392f, 0.033337f,
2326         -0.078100f, -0.081616f, -0.046993f, 0.139459f,
2327         0.020272f, -0.123161f, 0.175269f, 0.105217f,
2328         0.057328f, 0.080909f, -0.012612f, -0.097081f,
2329         0.082060f, -0.096716f, -0.063921f, 0.201884f,
2330         0.128166f, -0.035051f, -0.032227f, -0.068139f,
2331         -0.115915f, 0.095080f, -0.086007f, -0.067543f,
2332         0.030776f, 0.032712f, 0.088937f, 0.054336f,
2333         -0.039329f, -0.114022f, 0.171672f, -0.112321f,
2334         -0.217646f, 0.065186f, 0.060223f, 0.192174f,
2335         0.055580f, -0.131107f, -0.144338f, 0.056730f,
2336         -0.034707f, -0.081616f, -0.135298f, -0.000614f,
2337         0.087189f, 0.014614f, 0.067709f, 0.107689f,
2338         0.225780f, 0.084361f, -0.008544f, 0.051649f,
2339         -0.048369f, -0.037739f, -0.060710f, 0.002654f,
2340         0.016935f, 0.085563f, -0.015961f, -0.019265f,
2341         0.111788f, 0.062376f, 0.202019f, 0.047713f,
2342         0.042261f, 0.069716f, 0.242913f, 0.021052f,
2343         -0.072812f, -0.155920f, -0.026436f, 0.035621f,
2344         -0.079300f, -0.028787f, -0.048329f, 0.084718f,
2345         -0.060565f, -0.083750f, -0.164075f, -0.040742f,
2346         -0.086219f, 0.015271f, -0.005204f, -0.016038f,
2347         0.045816f, -0.050433f, -0.077652f, 0.117109f,
2348         0.009611f, -0.009045f, -0.008634f, -0.055373f,
2349         -0.085968f, 0.028527f, -0.054736f, -0.168089f,
2350         0.175839f, 0.071205f, -0.023603f, 0.037907f,
2351         -0.004561f, -0.022634f, 0.123831f, 0.094469f,
2352         -0.072920f, -0.133642f, -0.014032f, -0.142754f,
2353         -0.026999f, -0.199409f, 0.013268f, 0.226989f,
2354         0.048650f, -0.170988f, -0.050141f, 0.007880f,
2355         0.061880f, 0.019078f, -0.043578f, -0.038139f,
2356         0.134814f, 0.054097f, -0.081670f, 0.176838f,
2357         0.047920f, -0.038176f, 0.050406f, -0.107181f,
2358         -0.036279f, 0.027060f, 0.081594f, -0.002820f,
2359         0.090507f, -0.033338f, -0.059571f, 0.013404f,
2360         -0.099860f, 0.073371f, 0.342805f, 0.098305f,
2361         -0.150910f, -0.020822f, -0.056960f, 0.046262f,
2362         -0.043413f, -0.149405f, -0.129105f, -0.010899f,
2363         -0.014229f, -0.179949f, -0.113044f, -0.049468f,
2364         -0.065513f, 0.090269f, -0.011919f, 0.087846f,
2365         0.095796f, 0.146127f, 0.101599f, 0.078066f,
2366         -0.084348f, -0.100002f, -0.020134f, -0.050169f,
2367         0.062122f, 0.014640f, 0.019143f, 0.036543f,
2368         0.180924f, -0.013976f, -0.066768f, -0.001090f,
2369         -0.070419f, -0.004839f, -0.001504f, 0.034483f,
2370         -0.044954f, -0.050336f, -0.088638f, -0.174782f,
2371         -0.116082f, -0.205507f, 0.015587f, -0.042839f,
2372         -0.096879f, -0.144097f, -0.050268f, -0.196796f,
2373         0.109639f, 0.271411f, 0.173732f, 0.108070f,
2374         0.156437f, 0.124255f, 0.097242f, 0.238693f,
2375         0.083941f, 0.109105f, 0.223940f, 0.267188f,
2376         0.027385f, 0.025819f, 0.125070f, 0.093738f,
2377         0.040353f, 0.038645f, -0.012730f, 0.144063f,
2378         0.052931f, -0.009138f, 0.084193f, 0.160272f,
2379         -0.041366f, 0.011951f, -0.121446f, -0.106713f,
2380         -0.047566f, 0.047984f, -0.255224f, -0.076116f,
2381         0.098685f, -0.150845f, -0.171513f, -0.156590f,
2382         0.058331f, 0.187493f, 0.413018f, 0.554265f,
2383         0.372242f, 0.237943f, 0.124571f, 0.110829f,
2384         0.010322f, -0.174477f, -0.067627f, -0.001979f,
2385         0.142913f, 0.040597f, 0.019907f, 0.025963f,
2386         -0.043585f, -0.120732f, 0.099937f, 0.091059f,
2387         0.247307f, 0.204226f, -0.042753f, -0.068580f,
2388         -0.119002f, 0.026722f, 0.034853f, -0.060934f,
2389         -0.025054f, -0.093026f, -0.035372f, -0.233209f,
2390         -0.049869f, -0.039151f, -0.022279f, -0.065380f,
2391         -9.063785f};
2392         return vector<float>(detector, detector + sizeof(detector)/sizeof(detector[0]));
2393 }
2394
2395 class HOGConfInvoker : public ParallelLoopBody
2396 {
2397 public:
2398        HOGConfInvoker( const HOGDescriptor* _hog, const Mat& _img,
2399                                double _hitThreshold, Size _padding,
2400                                std::vector<DetectionROI>* locs,
2401                                std::vector<Rect>* _vec, Mutex* _mtx )
2402        {
2403                hog = _hog;
2404                img = _img;
2405                hitThreshold = _hitThreshold;
2406                padding = _padding;
2407                locations = locs;
2408                vec = _vec;
2409                mtx = _mtx;
2410        }
2411
2412        void operator()( const Range& range ) const
2413        {
2414                int i, i1 = range.start, i2 = range.end;
2415
2416                Size maxSz(cvCeil(img.cols/(*locations)[0].scale), cvCeil(img.rows/(*locations)[0].scale));
2417                Mat smallerImgBuf(maxSz, img.type());
2418                vector<Point> dets;
2419
2420                for( i = i1; i < i2; i++ )
2421                {
2422                        double scale = (*locations)[i].scale;
2423
2424                        Size sz(cvRound(img.cols / scale), cvRound(img.rows / scale));
2425                        Mat smallerImg(sz, img.type(), smallerImgBuf.data);
2426
2427                        if( sz == img.size() )
2428                                smallerImg = Mat(sz, img.type(), img.data, img.step);
2429                        else
2430                                resize(img, smallerImg, sz);
2431
2432                        hog->detectROI(smallerImg, (*locations)[i].locations, dets, (*locations)[i].confidences, hitThreshold, Size(), padding);
2433                        Size scaledWinSize = Size(cvRound(hog->winSize.width*scale), cvRound(hog->winSize.height*scale));
2434                        mtx->lock();
2435                        for( size_t j = 0; j < dets.size(); j++ )
2436                        {
2437                                vec->push_back(Rect(cvRound(dets[j].x*scale),
2438                                                                        cvRound(dets[j].y*scale),
2439                                                                        scaledWinSize.width, scaledWinSize.height));
2440                        }
2441                        mtx->unlock();
2442                }
2443        }
2444
2445        const HOGDescriptor* hog;
2446        Mat img;
2447        double hitThreshold;
2448        std::vector<DetectionROI>* locations;
2449        Size padding;
2450        std::vector<Rect>* vec;
2451        Mutex* mtx;
2452 };
2453
2454 void HOGDescriptor::detectROI(const cv::Mat& img, const vector<cv::Point> &locations,
2455                                        CV_OUT std::vector<cv::Point>& foundLocations, CV_OUT std::vector<double>& confidences,
2456                                        double hitThreshold, cv::Size winStride,
2457                                        cv::Size padding) const
2458 {
2459    foundLocations.clear();
2460
2461    confidences.clear();
2462
2463    if( svmDetector.empty() )
2464        return;
2465
2466    if( locations.empty() )
2467        return;
2468
2469    if( winStride == Size() )
2470        winStride = cellSize;
2471
2472    Size cacheStride(gcd(winStride.width, blockStride.width),
2473                                     gcd(winStride.height, blockStride.height));
2474
2475    size_t nwindows = locations.size();
2476    padding.width = (int)alignSize(std::max(padding.width, 0), cacheStride.width);
2477    padding.height = (int)alignSize(std::max(padding.height, 0), cacheStride.height);
2478    Size paddedImgSize(img.cols + padding.width*2, img.rows + padding.height*2);
2479
2480    // HOGCache cache(this, img, padding, padding, nwindows == 0, cacheStride);
2481    HOGCache cache(this, img, padding, padding, true, cacheStride);
2482    if( !nwindows )
2483            nwindows = cache.windowsInImage(paddedImgSize, winStride).area();
2484
2485    const HOGCache::BlockData* blockData = &cache.blockData[0];
2486
2487    int nblocks = cache.nblocks.area();
2488    int blockHistogramSize = cache.blockHistogramSize;
2489    size_t dsize = getDescriptorSize();
2490
2491    double rho = svmDetector.size() > dsize ? svmDetector[dsize] : 0;
2492    vector<float> blockHist(blockHistogramSize);
2493
2494    for( size_t i = 0; i < nwindows; i++ )
2495    {
2496            Point pt0;
2497            pt0 = locations[i];
2498            if( pt0.x < -padding.width || pt0.x > img.cols + padding.width - winSize.width ||
2499                    pt0.y < -padding.height || pt0.y > img.rows + padding.height - winSize.height )
2500            {
2501                // out of image
2502                confidences.push_back(-10.0);
2503                continue;
2504            }
2505
2506            double s = rho;
2507            const float* svmVec = &svmDetector[0];
2508            int j, k;
2509
2510            for( j = 0; j < nblocks; j++, svmVec += blockHistogramSize )
2511            {
2512                    const HOGCache::BlockData& bj = blockData[j];
2513                    Point pt = pt0 + bj.imgOffset;
2514                    // need to devide this into 4 parts!
2515                    const float* vec = cache.getBlock(pt, &blockHist[0]);
2516                    for( k = 0; k <= blockHistogramSize - 4; k += 4 )
2517                            s += vec[k]*svmVec[k] + vec[k+1]*svmVec[k+1] +
2518                                    vec[k+2]*svmVec[k+2] + vec[k+3]*svmVec[k+3];
2519                    for( ; k < blockHistogramSize; k++ )
2520                            s += vec[k]*svmVec[k];
2521            }
2522            // cv::waitKey();
2523            confidences.push_back(s);
2524
2525            if( s >= hitThreshold )
2526                    foundLocations.push_back(pt0);
2527    }
2528  }
2529
2530 void HOGDescriptor::detectMultiScaleROI(const cv::Mat& img,
2531                                                            CV_OUT std::vector<cv::Rect>& foundLocations,
2532                                                            std::vector<DetectionROI>& locations,
2533                                                            double hitThreshold,
2534                                                            int groupThreshold) const
2535 {
2536    std::vector<Rect> allCandidates;
2537    Mutex mtx;
2538
2539    parallel_for_(Range(0, (int)locations.size()),
2540                         HOGConfInvoker(this, img, hitThreshold, Size(8, 8), &locations, &allCandidates, &mtx));
2541
2542    foundLocations.resize(allCandidates.size());
2543    std::copy(allCandidates.begin(), allCandidates.end(), foundLocations.begin());
2544    cv::groupRectangles(foundLocations, groupThreshold, 0.2);
2545 }
2546
2547 void HOGDescriptor::readALTModel(std::string modelfile)
2548 {
2549    // read model from SVMlight format..
2550    FILE *modelfl;
2551    if ((modelfl = fopen(modelfile.c_str(), "rb")) == NULL)
2552    {
2553        std::string eerr("file not exist");
2554        std::string efile(__FILE__);
2555        std::string efunc(__FUNCTION__);
2556        throw Exception(CV_StsError, eerr, efile, efunc, __LINE__);
2557    }
2558    char version_buffer[10];
2559    if (!fread (&version_buffer,sizeof(char),10,modelfl))
2560    {
2561        std::string eerr("version?");
2562        std::string efile(__FILE__);
2563        std::string efunc(__FUNCTION__);
2564        throw Exception(CV_StsError, eerr, efile, efunc, __LINE__);
2565    }
2566    if(strcmp(version_buffer,"V6.01")) {
2567        std::string eerr("version doesnot match");
2568        std::string efile(__FILE__);
2569        std::string efunc(__FUNCTION__);
2570        throw Exception(CV_StsError, eerr, efile, efunc, __LINE__);
2571    }
2572    /* read version number */
2573    int version = 0;
2574    if (!fread (&version,sizeof(int),1,modelfl))
2575    { throw Exception(); }
2576    if (version < 200)
2577    {
2578        std::string eerr("version doesnot match");
2579        std::string efile(__FILE__);
2580        std::string efunc(__FUNCTION__);
2581        throw Exception();
2582    }
2583    int kernel_type;
2584    size_t nread;
2585    nread=fread(&(kernel_type),sizeof(int),1,modelfl);
2586
2587    {// ignore these
2588        int poly_degree;
2589        nread=fread(&(poly_degree),sizeof(int),1,modelfl);
2590
2591        double rbf_gamma;
2592        nread=fread(&(rbf_gamma),sizeof(double), 1, modelfl);
2593        double coef_lin;
2594        nread=fread(&(coef_lin),sizeof(double),1,modelfl);
2595        double coef_const;
2596        nread=fread(&(coef_const),sizeof(double),1,modelfl);
2597        int l;
2598        nread=fread(&l,sizeof(int),1,modelfl);
2599        char* custom = new char[l];
2600        nread=fread(custom,sizeof(char),l,modelfl);
2601        delete[] custom;
2602    }
2603    int totwords;
2604    nread=fread(&(totwords),sizeof(int),1,modelfl);
2605    {// ignore these
2606        int totdoc;
2607        nread=fread(&(totdoc),sizeof(int),1,modelfl);
2608        int sv_num;
2609        nread=fread(&(sv_num), sizeof(int),1,modelfl);
2610    }
2611
2612    double linearbias;
2613    nread=fread(&linearbias, sizeof(double), 1, modelfl);
2614
2615    std::vector<float> detector;
2616    detector.clear();
2617    if(kernel_type == 0) { /* linear kernel */
2618        /* save linear wts also */
2619        double *linearwt = new double[totwords+1];
2620        int length = totwords;
2621        nread = fread(linearwt, sizeof(double), totwords + 1, modelfl);
2622        if(nread != static_cast<size_t>(length) + 1)
2623            throw Exception();
2624
2625        for(int i = 0; i < length; i++)
2626            detector.push_back((float)linearwt[i]);
2627
2628        detector.push_back((float)-linearbias);
2629        setSVMDetector(detector);
2630        delete [] linearwt;
2631    } else {
2632        throw Exception();
2633    }
2634    fclose(modelfl);
2635 }
2636
2637 void HOGDescriptor::groupRectangles(vector<cv::Rect>& rectList, vector<double>& weights, int groupThreshold, double eps) const
2638 {
2639     if( groupThreshold <= 0 || rectList.empty() )
2640     {
2641         return;
2642     }
2643
2644     CV_Assert(rectList.size() == weights.size());
2645
2646     vector<int> labels;
2647     int nclasses = partition(rectList, labels, SimilarRects(eps));
2648
2649     vector<cv::Rect_<double> > rrects(nclasses);
2650     vector<int> numInClass(nclasses, 0);
2651     vector<double> foundWeights(nclasses, DBL_MIN);
2652     vector<double> totalFactorsPerClass(nclasses, 1);
2653     int i, j, nlabels = (int)labels.size();
2654
2655     for( i = 0; i < nlabels; i++ )
2656     {
2657         int cls = labels[i];
2658         rrects[cls].x += rectList[i].x;
2659         rrects[cls].y += rectList[i].y;
2660         rrects[cls].width += rectList[i].width;
2661         rrects[cls].height += rectList[i].height;
2662         foundWeights[cls] = max(foundWeights[cls], weights[i]);
2663         numInClass[cls]++;
2664     }
2665
2666     for( i = 0; i < nclasses; i++ )
2667     {
2668         // find the average of all ROI in the cluster
2669         cv::Rect_<double> r = rrects[i];
2670         double s = 1.0/numInClass[i];
2671         rrects[i] = cv::Rect_<double>(cv::saturate_cast<double>(r.x*s),
2672             cv::saturate_cast<double>(r.y*s),
2673             cv::saturate_cast<double>(r.width*s),
2674             cv::saturate_cast<double>(r.height*s));
2675     }
2676
2677     rectList.clear();
2678     weights.clear();
2679
2680     for( i = 0; i < nclasses; i++ )
2681     {
2682         cv::Rect r1 = rrects[i];
2683         int n1 = numInClass[i];
2684         double w1 = foundWeights[i];
2685         if( n1 <= groupThreshold )
2686             continue;
2687         // filter out small rectangles inside large rectangles
2688         for( j = 0; j < nclasses; j++ )
2689         {
2690             int n2 = numInClass[j];
2691
2692             if( j == i || n2 <= groupThreshold )
2693                 continue;
2694
2695             cv::Rect r2 = rrects[j];
2696
2697             int dx = cv::saturate_cast<int>( r2.width * eps );
2698             int dy = cv::saturate_cast<int>( r2.height * eps );
2699
2700             if( r1.x >= r2.x - dx &&
2701                 r1.y >= r2.y - dy &&
2702                 r1.x + r1.width <= r2.x + r2.width + dx &&
2703                 r1.y + r1.height <= r2.y + r2.height + dy &&
2704                 (n2 > std::max(3, n1) || n1 < 3) )
2705                 break;
2706         }
2707
2708         if( j == nclasses )
2709         {
2710             rectList.push_back(r1);
2711             weights.push_back(w1);
2712         }
2713     }
2714 }
2715 }