openCV library for Renesas RZ/A

Dependents:   RZ_A2M_Mbed_samples

Committer:
RyoheiHagimoto
Date:
Fri Jan 29 04:53:38 2021 +0000
Revision:
0:0e0631af0305
copied from https://github.com/d-kato/opencv-lib.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
RyoheiHagimoto 0:0e0631af0305 1 /***********************************************************************
RyoheiHagimoto 0:0e0631af0305 2 * Software License Agreement (BSD License)
RyoheiHagimoto 0:0e0631af0305 3 *
RyoheiHagimoto 0:0e0631af0305 4 * Copyright 2008-2009 Marius Muja (mariusm@cs.ubc.ca). All rights reserved.
RyoheiHagimoto 0:0e0631af0305 5 * Copyright 2008-2009 David G. Lowe (lowe@cs.ubc.ca). All rights reserved.
RyoheiHagimoto 0:0e0631af0305 6 *
RyoheiHagimoto 0:0e0631af0305 7 * THE BSD LICENSE
RyoheiHagimoto 0:0e0631af0305 8 *
RyoheiHagimoto 0:0e0631af0305 9 * Redistribution and use in source and binary forms, with or without
RyoheiHagimoto 0:0e0631af0305 10 * modification, are permitted provided that the following conditions
RyoheiHagimoto 0:0e0631af0305 11 * are met:
RyoheiHagimoto 0:0e0631af0305 12 *
RyoheiHagimoto 0:0e0631af0305 13 * 1. Redistributions of source code must retain the above copyright
RyoheiHagimoto 0:0e0631af0305 14 * notice, this list of conditions and the following disclaimer.
RyoheiHagimoto 0:0e0631af0305 15 * 2. Redistributions in binary form must reproduce the above copyright
RyoheiHagimoto 0:0e0631af0305 16 * notice, this list of conditions and the following disclaimer in the
RyoheiHagimoto 0:0e0631af0305 17 * documentation and/or other materials provided with the distribution.
RyoheiHagimoto 0:0e0631af0305 18 *
RyoheiHagimoto 0:0e0631af0305 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
RyoheiHagimoto 0:0e0631af0305 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
RyoheiHagimoto 0:0e0631af0305 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
RyoheiHagimoto 0:0e0631af0305 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
RyoheiHagimoto 0:0e0631af0305 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
RyoheiHagimoto 0:0e0631af0305 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
RyoheiHagimoto 0:0e0631af0305 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
RyoheiHagimoto 0:0e0631af0305 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
RyoheiHagimoto 0:0e0631af0305 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
RyoheiHagimoto 0:0e0631af0305 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
RyoheiHagimoto 0:0e0631af0305 29 *************************************************************************/
RyoheiHagimoto 0:0e0631af0305 30
RyoheiHagimoto 0:0e0631af0305 31 #ifndef OPENCV_FLANN_RANDOM_H
RyoheiHagimoto 0:0e0631af0305 32 #define OPENCV_FLANN_RANDOM_H
RyoheiHagimoto 0:0e0631af0305 33
RyoheiHagimoto 0:0e0631af0305 34 #include <algorithm>
RyoheiHagimoto 0:0e0631af0305 35 #include <cstdlib>
RyoheiHagimoto 0:0e0631af0305 36 #include <vector>
RyoheiHagimoto 0:0e0631af0305 37
RyoheiHagimoto 0:0e0631af0305 38 #include "general.h"
RyoheiHagimoto 0:0e0631af0305 39
RyoheiHagimoto 0:0e0631af0305 40 namespace cvflann
RyoheiHagimoto 0:0e0631af0305 41 {
RyoheiHagimoto 0:0e0631af0305 42
RyoheiHagimoto 0:0e0631af0305 43 /**
RyoheiHagimoto 0:0e0631af0305 44 * Seeds the random number generator
RyoheiHagimoto 0:0e0631af0305 45 * @param seed Random seed
RyoheiHagimoto 0:0e0631af0305 46 */
RyoheiHagimoto 0:0e0631af0305 47 inline void seed_random(unsigned int seed)
RyoheiHagimoto 0:0e0631af0305 48 {
RyoheiHagimoto 0:0e0631af0305 49 srand(seed);
RyoheiHagimoto 0:0e0631af0305 50 }
RyoheiHagimoto 0:0e0631af0305 51
RyoheiHagimoto 0:0e0631af0305 52 /*
RyoheiHagimoto 0:0e0631af0305 53 * Generates a random double value.
RyoheiHagimoto 0:0e0631af0305 54 */
RyoheiHagimoto 0:0e0631af0305 55 /**
RyoheiHagimoto 0:0e0631af0305 56 * Generates a random double value.
RyoheiHagimoto 0:0e0631af0305 57 * @param high Upper limit
RyoheiHagimoto 0:0e0631af0305 58 * @param low Lower limit
RyoheiHagimoto 0:0e0631af0305 59 * @return Random double value
RyoheiHagimoto 0:0e0631af0305 60 */
RyoheiHagimoto 0:0e0631af0305 61 inline double rand_double(double high = 1.0, double low = 0)
RyoheiHagimoto 0:0e0631af0305 62 {
RyoheiHagimoto 0:0e0631af0305 63 return low + ((high-low) * (std::rand() / (RAND_MAX + 1.0)));
RyoheiHagimoto 0:0e0631af0305 64 }
RyoheiHagimoto 0:0e0631af0305 65
RyoheiHagimoto 0:0e0631af0305 66 /**
RyoheiHagimoto 0:0e0631af0305 67 * Generates a random integer value.
RyoheiHagimoto 0:0e0631af0305 68 * @param high Upper limit
RyoheiHagimoto 0:0e0631af0305 69 * @param low Lower limit
RyoheiHagimoto 0:0e0631af0305 70 * @return Random integer value
RyoheiHagimoto 0:0e0631af0305 71 */
RyoheiHagimoto 0:0e0631af0305 72 inline int rand_int(int high = RAND_MAX, int low = 0)
RyoheiHagimoto 0:0e0631af0305 73 {
RyoheiHagimoto 0:0e0631af0305 74 return low + (int) ( double(high-low) * (std::rand() / (RAND_MAX + 1.0)));
RyoheiHagimoto 0:0e0631af0305 75 }
RyoheiHagimoto 0:0e0631af0305 76
RyoheiHagimoto 0:0e0631af0305 77 /**
RyoheiHagimoto 0:0e0631af0305 78 * Random number generator that returns a distinct number from
RyoheiHagimoto 0:0e0631af0305 79 * the [0,n) interval each time.
RyoheiHagimoto 0:0e0631af0305 80 */
RyoheiHagimoto 0:0e0631af0305 81 class UniqueRandom
RyoheiHagimoto 0:0e0631af0305 82 {
RyoheiHagimoto 0:0e0631af0305 83 std::vector<int> vals_;
RyoheiHagimoto 0:0e0631af0305 84 int size_;
RyoheiHagimoto 0:0e0631af0305 85 int counter_;
RyoheiHagimoto 0:0e0631af0305 86
RyoheiHagimoto 0:0e0631af0305 87 public:
RyoheiHagimoto 0:0e0631af0305 88 /**
RyoheiHagimoto 0:0e0631af0305 89 * Constructor.
RyoheiHagimoto 0:0e0631af0305 90 * @param n Size of the interval from which to generate
RyoheiHagimoto 0:0e0631af0305 91 * @return
RyoheiHagimoto 0:0e0631af0305 92 */
RyoheiHagimoto 0:0e0631af0305 93 UniqueRandom(int n)
RyoheiHagimoto 0:0e0631af0305 94 {
RyoheiHagimoto 0:0e0631af0305 95 init(n);
RyoheiHagimoto 0:0e0631af0305 96 }
RyoheiHagimoto 0:0e0631af0305 97
RyoheiHagimoto 0:0e0631af0305 98 /**
RyoheiHagimoto 0:0e0631af0305 99 * Initializes the number generator.
RyoheiHagimoto 0:0e0631af0305 100 * @param n the size of the interval from which to generate random numbers.
RyoheiHagimoto 0:0e0631af0305 101 */
RyoheiHagimoto 0:0e0631af0305 102 void init(int n)
RyoheiHagimoto 0:0e0631af0305 103 {
RyoheiHagimoto 0:0e0631af0305 104 // create and initialize an array of size n
RyoheiHagimoto 0:0e0631af0305 105 vals_.resize(n);
RyoheiHagimoto 0:0e0631af0305 106 size_ = n;
RyoheiHagimoto 0:0e0631af0305 107 for (int i = 0; i < size_; ++i) vals_[i] = i;
RyoheiHagimoto 0:0e0631af0305 108
RyoheiHagimoto 0:0e0631af0305 109 // shuffle the elements in the array
RyoheiHagimoto 0:0e0631af0305 110 std::random_shuffle(vals_.begin(), vals_.end());
RyoheiHagimoto 0:0e0631af0305 111
RyoheiHagimoto 0:0e0631af0305 112 counter_ = 0;
RyoheiHagimoto 0:0e0631af0305 113 }
RyoheiHagimoto 0:0e0631af0305 114
RyoheiHagimoto 0:0e0631af0305 115 /**
RyoheiHagimoto 0:0e0631af0305 116 * Return a distinct random integer in greater or equal to 0 and less
RyoheiHagimoto 0:0e0631af0305 117 * than 'n' on each call. It should be called maximum 'n' times.
RyoheiHagimoto 0:0e0631af0305 118 * Returns: a random integer
RyoheiHagimoto 0:0e0631af0305 119 */
RyoheiHagimoto 0:0e0631af0305 120 int next()
RyoheiHagimoto 0:0e0631af0305 121 {
RyoheiHagimoto 0:0e0631af0305 122 if (counter_ == size_) {
RyoheiHagimoto 0:0e0631af0305 123 return -1;
RyoheiHagimoto 0:0e0631af0305 124 }
RyoheiHagimoto 0:0e0631af0305 125 else {
RyoheiHagimoto 0:0e0631af0305 126 return vals_[counter_++];
RyoheiHagimoto 0:0e0631af0305 127 }
RyoheiHagimoto 0:0e0631af0305 128 }
RyoheiHagimoto 0:0e0631af0305 129 };
RyoheiHagimoto 0:0e0631af0305 130
RyoheiHagimoto 0:0e0631af0305 131 }
RyoheiHagimoto 0:0e0631af0305 132
RyoheiHagimoto 0:0e0631af0305 133 #endif //OPENCV_FLANN_RANDOM_H