{"action":"created","comment":{"url":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/comments/30488849","id":30488849,"diff_hunk":"@@ -0,0 +1,2057 @@\n+/*********************************************************************\n+ * Software License Agreement (BSD License)\n+ *\n+ * Copyright (c) 2009\n+ * Engin Tola\n+ * web : http://www.engintola.com\n+ * email : engin.tola+libdaisy@gmail.com\n+ *\n+ *  Redistribution and use in source and binary forms, with or without\n+ *  modification, are permitted provided that the following conditions\n+ *  are met:\n+ *\n+ *   * Redistributions of source code must retain the above copyright\n+ *     notice, this list of conditions and the following disclaimer.\n+ *   * Redistributions in binary form must reproduce the above\n+ *     copyright notice, this list of conditions and the following\n+ *     disclaimer in the documentation and/or other materials provided\n+ *     with the distribution.\n+ *   * Neither the name of the Willow Garage nor the names of its\n+ *     contributors may be used to endorse or promote products derived\n+ *     from this software without specific prior written permission.\n+ *\n+ *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n+ *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n+ *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n+ *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n+ *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n+ *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n+ *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n+ *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n+ *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n+ *  POSSIBILITY OF SUCH DAMAGE.\n+ *********************************************************************/\n+\n+/*\n+ \"DAISY: An Efficient Dense Descriptor Applied to Wide Baseline Stereo\"\n+ by Engin Tola, Vincent Lepetit and Pascal Fua. IEEE Transactions on\n+ Pattern Analysis and achine Intelligence, 31 Mar. 2009.\n+ IEEE computer Society Digital Library. IEEE Computer Society,\n+ http:doi.ieeecomputersociety.org/10.1109/TPAMI.2009.77\n+\n+ \"A fast local descriptor for dense matching\" by Engin Tola, Vincent\n+ Lepetit, and Pascal Fua. Intl. Conf. on Computer Vision and Pattern\n+ Recognition, Alaska, USA, June 2008\n+\n+ OpenCV port by: Cristian Balint <cristian dot balint at gmail dot com>\n+ */\n+\n+#include \"precomp.hpp\"\n+#include \"opencv2/imgproc/imgproc_c.h\"\n+\n+#include <fstream>\n+#include <stdlib.h>\n+\n+namespace cv\n+{\n+namespace xfeatures2d\n+{\n+\n+// constants\n+const double g_sigma_0 = 1;\n+const double g_sigma_1 = sqrt(2.0);\n+const double g_sigma_2 = 8;\n+const double g_sigma_step = std::pow(2,1.0/2);\n+const int g_scale_st = int( (log(g_sigma_1/g_sigma_0)) / log(g_sigma_step) );\n+static int g_scale_en = 1;\n+\n+const double g_sigma_init = 1.6;\n+const static int g_grid_orientation_resolution = 360;\n+\n+static const int MAX_CUBE_NO = 64;\n+static const int MAX_NORMALIZATION_ITER = 5;\n+\n+int g_cube_number;\n+int g_selected_cubes[MAX_CUBE_NO]; // m_rad_q_no < MAX_CUBE_NO\n+\n+/*\n+ !DAISY implementation\n+ */\n+class DAISY_Impl : public DAISY\n+{\n+\n+public:\n+    /** Constructor\n+     * @param radius radius of the descriptor at the initial scale\n+     * @param q_radius amount of radial range divisions\n+     * @param q_theta amount of angular range divisions\n+     * @param q_hist amount of gradient orientations range divisions\n+     * @param mode computation of descriptors\n+     * @param norm normalization type\n+     * @param H optional 3x3 homography matrix used to warp the grid of daisy but sampling keypoints remains unwarped on image\n+     * @param interpolation switch to disable interpolation at minor costs of quality (default is true)\n+     * @param use_orientation sample patterns using keypoints orientation, disabled by default.\n+     */\n+    explicit DAISY_Impl(float radius=15, int q_radius=3, int q_theta=8, int q_hist=8,\n+        int mode = DAISY::ONLY_KEYS, int norm = DAISY::NRM_NONE, InputArray H = noArray(),\n+        bool interpolation = true, bool use_orientation = false);\n+\n+    virtual ~DAISY_Impl();\n+\n+    /** returns the descriptor length in bytes */\n+    virtual int descriptorSize() const {\n+        // +1 is for center pixel\n+        return ( (m_rad_q_no * m_th_q_no + 1) * m_hist_th_q_no );\n+    };\n+    /** returns the descriptor type */\n+    virtual int descriptorType() const { return CV_32F; }\n+    /** returns the default norm type */\n+    virtual int defaultNorm() const { return NORM_L2; }\n+\n+    // main compute routine\n+    virtual void compute( InputArray image, std::vector<KeyPoint>& keypoints, OutputArray descriptors );\n+\n+protected:\n+\n+    /*\n+     * DAISY parameters\n+     */\n+\n+    // operation mode\n+    int m_mode;\n+\n+    // maximum radius of the descriptor region.\n+    float m_rad;\n+\n+    // the number of quantizations of the radius.\n+    int m_rad_q_no;\n+\n+    // the number of quantizations of the angle.\n+    int m_th_q_no;\n+\n+    // the number of quantizations of the gradient orientations.\n+    int m_hist_th_q_no;\n+\n+    // holds the type of the normalization to apply; equals to NRM_PARTIAL by\n+    // default. change the value using set_normalization() function.\n+    int m_nrm_type;\n+\n+    // holds optional H matrix\n+    Mat m_h_matrix;\n+\n+    // input image.\n+    float* m_image;\n+\n+    // image height\n+    int m_h;\n+\n+    // image width\n+    int m_w;\n+\n+    // stores the descriptors : its size is [ m_w * m_h * m_descriptor_size ].\n+    float* m_dense_descriptors;\n+\n+    // stores the layered gradients in successively smoothed form: layer[n] =\n+    // m_gradient_layers * gaussian( sigma_n ); n>= 1; layer[0] is the layered_gradient\n+    float* m_smoothed_gradient_layers;\n+\n+    // if set to true, descriptors are scale invariant\n+    bool m_scale_invariant;\n+\n+    // if set to true, descriptors are rotation invariant\n+    bool m_rotation_invariant;\n+\n+    // number of bins in the histograms while computing orientation\n+    int m_orientation_resolution;\n+\n+    // hold the scales of the pixels\n+    float* m_scale_map;\n+\n+    // holds the orientaitons of the pixels\n+    int* m_orientation_map;\n+\n+    // Holds the oriented coordinates (y,x) of the grid points of the region.\n+    double** m_oriented_grid_points;\n+\n+    // holds the gaussian sigmas for radius quantizations for an incremental\n+    // application\n+    double* m_cube_sigmas;\n+\n+    bool m_descriptor_memory;\n+    bool m_workspace_memory;\n+\n+    // the number of grid locations\n+    int m_grid_point_number;\n+\n+    // the size of the descriptor vector\n+    int m_descriptor_size;\n+\n+    // holds the amount of shift that's required for histogram computation\n+    double m_orientation_shift_table[360];\n+\n+    // if enabled, descriptors are computed with casting non-integer locations\n+    // to integer positions otherwise we use interpolation.\n+    bool m_disable_interpolation;\n+\n+    // switch to enable sample by keypoints orientation\n+    bool m_use_orientation;\n+\n+    // size of m_hsz layers at a single sigma: m_hsz * m_layer_size\n+    int m_cube_size;\n+\n+    // size of the layer : m_h*m_w\n+    int m_layer_size;\n+\n+    /*\n+     * DAISY functions\n+     */\n+\n+    // computes the histogram at yx; the size of histogram is m_hist_th_q_no\n+    void compute_histogram( float* hcube, int y, int x, float* histogram );\n+\n+    // reorganizes the cube data so that histograms are sequential in memory.\n+    void compute_histograms();\n+\n+    // emulates the way sift is normalized.\n+    void normalize_sift_way( float* desc );\n+\n+    // normalizes the descriptor histogram by histogram\n+    void normalize_partial( float* desc );\n+\n+    // normalizes the full descriptor.\n+    void normalize_full( float* desc );\n+\n+    // initializes the class: computes gradient and structure-points\n+    void initialize();\n+\n+    void update_selected_cubes();\n+\n+    int quantize_radius( float rad );\n+\n+    int filter_size( double sigma );\n+\n+    // computes scales for every pixel and scales the structure grid so that the\n+    // resulting descriptors are scale invariant.  you must set\n+    // m_scale_invariant flag to 1 for the program to call this function\n+    void compute_scales();\n+\n+    // Return a number in the range [-0.5, 0.5] that represents the location of\n+    // the peak of a parabola passing through the 3 evenly spaced samples.  The\n+    // center value is assumed to be greater than or equal to the other values\n+    // if positive, or less than if negative.\n+    float interpolate_peak( float left, float center, float right );\n+\n+    // Smooth a histogram by using a [1/3 1/3 1/3] kernel.  Assume the histogram\n+    // is connected in a circular buffer.\n+    void smooth_histogram( float *hist, int bins );\n+\n+    // computes pixel orientations and rotates the structure grid so that\n+    // resulting descriptors are rotation invariant. If the scales is also\n+    // detected, then orientations are computed at the computed scales. you must\n+    // set m_rotation_invariant flag to 1 for the program to call this function\n+    void compute_orientations();\n+\n+    // the clipping threshold to use in normalization: values above this value\n+    // are clipped to this value for normalize_sift_way() function\n+    float m_descriptor_normalization_threshold;\n+\n+    // computes the sigma's of layers from descriptor parameters if the user did\n+    // not sets it. these define the size of the petals of the descriptor.\n+    void compute_cube_sigmas();\n+\n+    // Computes the locations of the unscaled unrotated points where the\n+    // histograms are going to be computed according to the given parameters.\n+    void compute_grid_points();\n+\n+    // Computes the locations of the unscaled rotated points where the\n+    // histograms are going to be computed according to the given parameters.\n+    void compute_oriented_grid_points();\n+\n+    // smooths each of the layers by a Gaussian having \"sigma\" standart\n+    // deviation.\n+    void smooth_layers( float*layers, int h, int w, int layer_number, float sigma );\n+\n+    // Holds the coordinates (y,x) of the grid points of the region.\n+    double** m_grid_points;\n+\n+    int get_hq() { return m_hist_th_q_no; }\n+    int get_thq() { return m_th_q_no; }\n+    int get_rq() { return m_rad_q_no; }\n+    float get_rad() { return m_rad; }\n+\n+    // sets the type of the normalization to apply out of {NRM_PARTIAL,\n+    // NRM_FULL, NRM_SIFT}. Call before using get_descriptor() if you want to\n+    // change the default normalization type.\n+    void set_normalization( int nrm_type ) { m_nrm_type = nrm_type; }\n+\n+    // applies one of the normalizations (partial,full,sift) to the desciptors.\n+    void normalize_descriptors( int nrm_type = DAISY::NRM_NONE );\n+\n+    // normalizes histograms individually\n+    void normalize_histograms();\n+\n+    // gets the histogram at y,x with 'orientation' from the r'th cube\n+    float* get_histogram( int y, int x, int r );\n+\n+    // if called, I don't use interpolation in the computation of\n+    // descriptors.\n+    void disable_interpolation() { m_disable_interpolation = true; }\n+\n+    // returns the region number.\n+    int grid_point_number() { return m_grid_point_number; }\n+\n+    // releases all the used memory; call this if you want to process\n+    // multiple images within a loop.\n+    void reset();\n+\n+    // releases unused memory after descriptor computation is completed.\n+    void release_auxilary();\n+\n+    // computes the descriptors for every pixel in the image.\n+    void compute_descriptors();\n+\n+    // returns all the descriptors.\n+    float* get_dense_descriptors();\n+\n+    // returns oriented grid points. default is 0 orientation.\n+    double* get_grid(int o=0);\n+\n+    // EXPERIMENTAL: DO NOT USE IF YOU ARE NOT ENGIN TOLA: tells to compute the\n+    // scales for every pixel so that the resulting descriptors are scale\n+    // invariant.\n+    void scale_invariant( bool state = true )\n+    {\n+         g_scale_en = (int)( (log(g_sigma_2/g_sigma_0)) / log(g_sigma_step) ) - g_scale_st;\n+         m_scale_invariant = state;\n+    }\n+\n+    // EXPERIMENTAL: DO NOT USE IF YOU ARE NOT ENGIN TOLA: tells to compute the\n+    // orientations for every pixel so that the resulting descriptors are\n+    // rotation invariant. orientation steps are 360/ori_resolution\n+    void rotation_invariant( int ori_resolution = 36, bool state = true )\n+    {\n+         m_rotation_invariant = state;\n+         m_orientation_resolution = ori_resolution;\n+    }\n+\n+    // sets the gaussian variances manually. must be called before\n+    // initialize() to be considered. must be exact sigma values -> f\n+    // converts to incremental format.\n+    void set_cube_gaussians( double* sigma_array, int sz );\n+\n+    int* get_orientation_map() { return m_orientation_map; }\n+\n+    // call compute_descriptor_memory to find the amount of memory to allocate\n+    void set_descriptor_memory( float* descriptor, long int d_size );\n+\n+    // call compute_workspace_memory to find the amount of memory to allocate\n+    void set_workspace_memory( float* workspace, long int w_size );\n+\n+    // returns the amount of memory needed for the compute_descriptors()\n+    // function. it is basically equal to imagesize x descriptor_size\n+    int compute_descriptor_memory() {\n+      if( m_h == 0 || m_descriptor_size == 0 ) {\n+          CV_Error( Error::StsInternal, \"Image and descriptor size is zero\" );\n+      }\n+      return m_w * m_h * m_descriptor_size;\n+    }\n+\n+    // returns the amount of memory needed for workspace. call before initialize()\n+    int compute_workspace_memory() {\n+      if( m_cube_size == 0 ) {\n+          CV_Error( Error::StsInternal, \"Cube size is zero\" );\n+      }\n+      return (g_cube_number+1)* m_cube_size;\n+    }\n+\n+    void normalize_descriptor( float* desc, int nrm_type = DAISY::NRM_NONE )\n+    {\n+      if( nrm_type == DAISY::NRM_NONE )      nrm_type = m_nrm_type;\n+      else if( nrm_type == DAISY::NRM_PARTIAL ) normalize_partial(desc);\n+      else if( nrm_type == DAISY::NRM_FULL    ) normalize_full(desc);\n+      else if( nrm_type == DAISY::NRM_SIFT    ) normalize_sift_way(desc);\n+      else\n+          CV_Error( Error::StsInternal, \"No such normalization\" );\n+    }\n+\n+    // transform a point via the homography\n+    void point_transform_via_homography( double* H, double x, double y, double &u, double &v )\n+    {\n+      double kxp = H[0]*x + H[1]*y + H[2];\n+      double kyp = H[3]*x + H[4]*y + H[5];\n+      double kp  = H[6]*x + H[7]*y + H[8];\n+      u = kxp / kp;\n+      v = kyp / kp;\n+    }\n+\n+private:\n+\n+    // returns the descriptor vector for the point (y, x) !!! use this for\n+    // precomputed operations meaning that you must call compute_descriptors()\n+    // before calling this function. if you want normalized descriptors, call\n+    // normalize_descriptors() before calling compute_descriptors()\n+    inline void get_descriptor( int y, int x, float* &descriptor );\n+\n+    // computes the descriptor and returns the result in 'descriptor' ( allocate\n+    // 'descriptor' memory first ie: float descriptor = new\n+    // float[m_descriptor_size]; -> the descriptor is normalized.\n+    inline void get_descriptor( double y, double x, int orientation, float* descriptor );\n+\n+    // computes the descriptor and returns the result in 'descriptor' ( allocate\n+    // 'descriptor' memory first ie: float descriptor = new\n+    // float[m_descriptor_size]; -> the descriptor is NOT normalized.\n+    inline void get_unnormalized_descriptor( double y, double x, int orientation, float* descriptor );\n+\n+    // computes the descriptor at homography-warped grid. (y,x) is not the\n+    // coordinates of this image but the coordinates of the original grid where\n+    // the homography will be applied. Meaning that the grid is somewhere else\n+    // and we warp this grid with H and compute the descriptor on this warped\n+    // grid; returns null/false if centers falls outside the image; allocate\n+    // 'descriptor' memory first. descriptor is normalized.\n+    inline bool get_descriptor( double y, double x, int orientation, double* H, float* descriptor);\n+\n+    // computes the descriptor at homography-warped grid. (y,x) is not the\n+    // coordinates of this image but the coordinates of the original grid where\n+    // the homography will be applied. Meaning that the grid is somewhere else\n+    // and we warp this grid with H and compute the descriptor on this warped\n+    // grid; returns null/false if centers falls outside the image; allocate\n+    // 'descriptor' memory first. descriptor is NOT normalized.\n+    inline bool get_unnormalized_descriptor( double y, double x, int orientation, double* H, float* descriptor );\n+\n+    // compute the smoothed gradient layers.\n+    inline void compute_smoothed_gradient_layers();\n+\n+    // does not use interpolation while computing the histogram.\n+    inline void ni_get_histogram( float* histogram, int y, int x, int shift, float* hcube );\n+\n+    // returns the interpolated histogram: picks either bi_get_histogram or\n+    // ti_get_histogram depending on 'shift'\n+    inline void i_get_histogram( float* histogram, double y, double x, double shift, float* cube );\n+\n+    // records the histogram that is computed by bilinear interpolation\n+    // regarding the shift in the spatial coordinates. hcube is the\n+    // histogram cube for a constant smoothness level.\n+    inline void bi_get_histogram( float* descriptor, double y, double x, int shift, float* hcube );\n+\n+    // records the histogram that is computed by trilinear interpolation\n+    // regarding the shift in layers and spatial coordinates. hcube is the\n+    // histogram cube for a constant smoothness level.\n+    inline void ti_get_histogram( float* descriptor, double y, double x, double shift, float* hcube );\n+\n+    // uses interpolation, for no interpolation call ni_get_descriptor. see also get_descriptor\n+    inline void i_get_descriptor( double y, double x, int orientation, float* descriptor );\n+\n+    // does not use interpolation. for w/interpolation, call i_get_descriptor. see also get_descriptor\n+    inline void ni_get_descriptor( double y, double x, int orientation, float* descriptor );\n+\n+    // uses interpolation for no interpolation call ni_get_descriptor. see also get_descriptor\n+    inline bool i_get_descriptor( double y, double x, int orientation, double* H, float* descriptor );\n+\n+    // does not use interpolation. for w/interpolation, call i_get_descriptor. see also get_descriptor\n+    inline bool ni_get_descriptor( double y, double x, int orientation, double* H, float* descriptor );\n+\n+    // creates a 1D gaussian filter with N(mean,sigma).\n+    inline void gaussian_1d( float* fltr, int fsz, float sigma, float mean )\n+    {\n+      CV_Assert(fltr != NULL);\n+      int sz = (fsz-1)/2;\n+      int counter=-1;\n+      float sum = 0.0;\n+      float v = 2*sigma*sigma;\n+      for( int x=-sz; x<=sz; x++ )\n+      {\n+         counter++;\n+         fltr[counter] = exp((-((float)x-mean)*((float)x-mean))/v);\n+         sum += fltr[counter];\n+      }\n+\n+      if( sum != 0 )\n+      {\n+         for( int x=0; x<fsz; x++ )\n+            fltr[x] /= sum;\n+      }\n+    }\n+\n+    inline void conv_horizontal( float* image, int h, int w, float* kernel, int ksize )\n+    {\n+      CvMat cvI; cvInitMatHeader(&cvI, h, w, CV_32FC1, (float*)image);","path":"modules/xfeatures2d/src/daisy.cpp","position":533,"original_position":479,"commit_id":"2d85137ef15d5309d26930fa82e2d0cbe911b6ee","original_commit_id":"0c32bce3fa3361ed8f135388db8fb09768c0299d","user":{"login":"cbalint13","id":3974360,"avatar_url":"https://avatars.githubusercontent.com/u/3974360?v=3","gravatar_id":"","url":"https://api.github.com/users/cbalint13","html_url":"https://github.com/cbalint13","followers_url":"https://api.github.com/users/cbalint13/followers","following_url":"https://api.github.com/users/cbalint13/following{/other_user}","gists_url":"https://api.github.com/users/cbalint13/gists{/gist_id}","starred_url":"https://api.github.com/users/cbalint13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cbalint13/subscriptions","organizations_url":"https://api.github.com/users/cbalint13/orgs","repos_url":"https://api.github.com/users/cbalint13/repos","events_url":"https://api.github.com/users/cbalint13/events{/privacy}","received_events_url":"https://api.github.com/users/cbalint13/received_events","type":"User","site_admin":false},"body":"[DONE]\r\n* I used now filter2D twice for H,V steps. Was not able to use the nice getGaussianKernel() because it differs in results at 10e-6 and daisy produced different results ! Also was not able to use sepFilter2D(), but filter2D worked perfect using BORDER_REPLIACATE and not default one. \r\n* Converted to opencv, and we still produce 1:1 at bit level same numerical results.\r\n","created_at":"2015-05-18T08:28:27Z","updated_at":"2015-05-18T08:28:27Z","html_url":"https://github.com/Itseez/opencv_contrib/pull/229#discussion_r30488849","pull_request_url":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229","_links":{"self":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/comments/30488849"},"html":{"href":"https://github.com/Itseez/opencv_contrib/pull/229#discussion_r30488849"},"pull_request":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229"}}},"pull_request":{"url":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229","id":35122871,"html_url":"https://github.com/Itseez/opencv_contrib/pull/229","diff_url":"https://github.com/Itseez/opencv_contrib/pull/229.diff","patch_url":"https://github.com/Itseez/opencv_contrib/pull/229.patch","issue_url":"https://api.github.com/repos/Itseez/opencv_contrib/issues/229","number":229,"state":"open","locked":false,"title":"Add DAISY descriptor for wide-baseline / keypoints.","user":{"login":"cbalint13","id":3974360,"avatar_url":"https://avatars.githubusercontent.com/u/3974360?v=3","gravatar_id":"","url":"https://api.github.com/users/cbalint13","html_url":"https://github.com/cbalint13","followers_url":"https://api.github.com/users/cbalint13/followers","following_url":"https://api.github.com/users/cbalint13/following{/other_user}","gists_url":"https://api.github.com/users/cbalint13/gists{/gist_id}","starred_url":"https://api.github.com/users/cbalint13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cbalint13/subscriptions","organizations_url":"https://api.github.com/users/cbalint13/orgs","repos_url":"https://api.github.com/users/cbalint13/repos","events_url":"https://api.github.com/users/cbalint13/events{/privacy}","received_events_url":"https://api.github.com/users/cbalint13/received_events","type":"User","site_admin":false},"body":"This PR add DAISY [1] descriptor specialized for dense stereo problems. It is very fast for  wide-baseline [2] but can be used just as normal keypoint descriptor generated by some detector, with quite superior performance among other descriptors.\r\n\r\nSome more infos:\r\n\r\n* Implementation here is properly cited in respect with authors.\r\n* Implementation is derived from latest author's original BSD licensed code available in public.\r\n* Implementation booth follows opencv's coding standard and author original code performance.\r\n* Implementation behave 1:1 numerically and by speed with original.\r\n* Implementation pass well QA with very good rotation invariance properties.\r\n* Implementation pass poorly QA for scale invariance (this is expected !)\r\n* Implementation pass with excellent results real SfM scenarios for dense stereo-matching.\r\n* Implementation is flexible its parameters are well documented and tested.\r\n\r\n[1] http://cvlab.epfl.ch/software/daisy/\r\n[2] http://cvlab.epfl.ch/research/surface/emvs/\r\n\r\nA cross PR for QA: https://github.com/Itseez/opencv_extra/pull/254","created_at":"2015-05-11T12:35:54Z","updated_at":"2015-05-18T08:28:27Z","closed_at":null,"merged_at":null,"merge_commit_sha":"6722d76e9c2976a325b0ea7a4dcaae250dbe7d22","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229/commits","review_comments_url":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229/comments","review_comment_url":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Itseez/opencv_contrib/issues/229/comments","statuses_url":"https://api.github.com/repos/Itseez/opencv_contrib/statuses/2d85137ef15d5309d26930fa82e2d0cbe911b6ee","head":{"label":"cbalint13:daisy","ref":"daisy","sha":"2d85137ef15d5309d26930fa82e2d0cbe911b6ee","user":{"login":"cbalint13","id":3974360,"avatar_url":"https://avatars.githubusercontent.com/u/3974360?v=3","gravatar_id":"","url":"https://api.github.com/users/cbalint13","html_url":"https://github.com/cbalint13","followers_url":"https://api.github.com/users/cbalint13/followers","following_url":"https://api.github.com/users/cbalint13/following{/other_user}","gists_url":"https://api.github.com/users/cbalint13/gists{/gist_id}","starred_url":"https://api.github.com/users/cbalint13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cbalint13/subscriptions","organizations_url":"https://api.github.com/users/cbalint13/orgs","repos_url":"https://api.github.com/users/cbalint13/repos","events_url":"https://api.github.com/users/cbalint13/events{/privacy}","received_events_url":"https://api.github.com/users/cbalint13/received_events","type":"User","site_admin":false},"repo":{"id":33500236,"name":"opencv_contrib","full_name":"cbalint13/opencv_contrib","owner":{"login":"cbalint13","id":3974360,"avatar_url":"https://avatars.githubusercontent.com/u/3974360?v=3","gravatar_id":"","url":"https://api.github.com/users/cbalint13","html_url":"https://github.com/cbalint13","followers_url":"https://api.github.com/users/cbalint13/followers","following_url":"https://api.github.com/users/cbalint13/following{/other_user}","gists_url":"https://api.github.com/users/cbalint13/gists{/gist_id}","starred_url":"https://api.github.com/users/cbalint13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cbalint13/subscriptions","organizations_url":"https://api.github.com/users/cbalint13/orgs","repos_url":"https://api.github.com/users/cbalint13/repos","events_url":"https://api.github.com/users/cbalint13/events{/privacy}","received_events_url":"https://api.github.com/users/cbalint13/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/cbalint13/opencv_contrib","description":"Repository for OpenCV's extra modules","fork":true,"url":"https://api.github.com/repos/cbalint13/opencv_contrib","forks_url":"https://api.github.com/repos/cbalint13/opencv_contrib/forks","keys_url":"https://api.github.com/repos/cbalint13/opencv_contrib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/cbalint13/opencv_contrib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/cbalint13/opencv_contrib/teams","hooks_url":"https://api.github.com/repos/cbalint13/opencv_contrib/hooks","issue_events_url":"https://api.github.com/repos/cbalint13/opencv_contrib/issues/events{/number}","events_url":"https://api.github.com/repos/cbalint13/opencv_contrib/events","assignees_url":"https://api.github.com/repos/cbalint13/opencv_contrib/assignees{/user}","branches_url":"https://api.github.com/repos/cbalint13/opencv_contrib/branches{/branch}","tags_url":"https://api.github.com/repos/cbalint13/opencv_contrib/tags","blobs_url":"https://api.github.com/repos/cbalint13/opencv_contrib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/cbalint13/opencv_contrib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/cbalint13/opencv_contrib/git/refs{/sha}","trees_url":"https://api.github.com/repos/cbalint13/opencv_contrib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/cbalint13/opencv_contrib/statuses/{sha}","languages_url":"https://api.github.com/repos/cbalint13/opencv_contrib/languages","stargazers_url":"https://api.github.com/repos/cbalint13/opencv_contrib/stargazers","contributors_url":"https://api.github.com/repos/cbalint13/opencv_contrib/contributors","subscribers_url":"https://api.github.com/repos/cbalint13/opencv_contrib/subscribers","subscription_url":"https://api.github.com/repos/cbalint13/opencv_contrib/subscription","commits_url":"https://api.github.com/repos/cbalint13/opencv_contrib/commits{/sha}","git_commits_url":"https://api.github.com/repos/cbalint13/opencv_contrib/git/commits{/sha}","comments_url":"https://api.github.com/repos/cbalint13/opencv_contrib/comments{/number}","issue_comment_url":"https://api.github.com/repos/cbalint13/opencv_contrib/issues/comments{/number}","contents_url":"https://api.github.com/repos/cbalint13/opencv_contrib/contents/{+path}","compare_url":"https://api.github.com/repos/cbalint13/opencv_contrib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/cbalint13/opencv_contrib/merges","archive_url":"https://api.github.com/repos/cbalint13/opencv_contrib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/cbalint13/opencv_contrib/downloads","issues_url":"https://api.github.com/repos/cbalint13/opencv_contrib/issues{/number}","pulls_url":"https://api.github.com/repos/cbalint13/opencv_contrib/pulls{/number}","milestones_url":"https://api.github.com/repos/cbalint13/opencv_contrib/milestones{/number}","notifications_url":"https://api.github.com/repos/cbalint13/opencv_contrib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/cbalint13/opencv_contrib/labels{/name}","releases_url":"https://api.github.com/repos/cbalint13/opencv_contrib/releases{/id}","created_at":"2015-04-06T19:13:18Z","updated_at":"2015-04-06T19:13:21Z","pushed_at":"2015-05-17T08:53:36Z","git_url":"git://github.com/cbalint13/opencv_contrib.git","ssh_url":"git@github.com:cbalint13/opencv_contrib.git","clone_url":"https://github.com/cbalint13/opencv_contrib.git","svn_url":"https://github.com/cbalint13/opencv_contrib","homepage":null,"size":74270,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Itseez:master","ref":"master","sha":"ea682d6f04a110bbbe614bf5268971a3de5ea2fe","user":{"login":"Itseez","id":1786446,"avatar_url":"https://avatars.githubusercontent.com/u/1786446?v=3","gravatar_id":"","url":"https://api.github.com/users/Itseez","html_url":"https://github.com/Itseez","followers_url":"https://api.github.com/users/Itseez/followers","following_url":"https://api.github.com/users/Itseez/following{/other_user}","gists_url":"https://api.github.com/users/Itseez/gists{/gist_id}","starred_url":"https://api.github.com/users/Itseez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Itseez/subscriptions","organizations_url":"https://api.github.com/users/Itseez/orgs","repos_url":"https://api.github.com/users/Itseez/repos","events_url":"https://api.github.com/users/Itseez/events{/privacy}","received_events_url":"https://api.github.com/users/Itseez/received_events","type":"Organization","site_admin":false},"repo":{"id":12756992,"name":"opencv_contrib","full_name":"Itseez/opencv_contrib","owner":{"login":"Itseez","id":1786446,"avatar_url":"https://avatars.githubusercontent.com/u/1786446?v=3","gravatar_id":"","url":"https://api.github.com/users/Itseez","html_url":"https://github.com/Itseez","followers_url":"https://api.github.com/users/Itseez/followers","following_url":"https://api.github.com/users/Itseez/following{/other_user}","gists_url":"https://api.github.com/users/Itseez/gists{/gist_id}","starred_url":"https://api.github.com/users/Itseez/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Itseez/subscriptions","organizations_url":"https://api.github.com/users/Itseez/orgs","repos_url":"https://api.github.com/users/Itseez/repos","events_url":"https://api.github.com/users/Itseez/events{/privacy}","received_events_url":"https://api.github.com/users/Itseez/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Itseez/opencv_contrib","description":"Repository for OpenCV's extra modules","fork":false,"url":"https://api.github.com/repos/Itseez/opencv_contrib","forks_url":"https://api.github.com/repos/Itseez/opencv_contrib/forks","keys_url":"https://api.github.com/repos/Itseez/opencv_contrib/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Itseez/opencv_contrib/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Itseez/opencv_contrib/teams","hooks_url":"https://api.github.com/repos/Itseez/opencv_contrib/hooks","issue_events_url":"https://api.github.com/repos/Itseez/opencv_contrib/issues/events{/number}","events_url":"https://api.github.com/repos/Itseez/opencv_contrib/events","assignees_url":"https://api.github.com/repos/Itseez/opencv_contrib/assignees{/user}","branches_url":"https://api.github.com/repos/Itseez/opencv_contrib/branches{/branch}","tags_url":"https://api.github.com/repos/Itseez/opencv_contrib/tags","blobs_url":"https://api.github.com/repos/Itseez/opencv_contrib/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Itseez/opencv_contrib/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Itseez/opencv_contrib/git/refs{/sha}","trees_url":"https://api.github.com/repos/Itseez/opencv_contrib/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Itseez/opencv_contrib/statuses/{sha}","languages_url":"https://api.github.com/repos/Itseez/opencv_contrib/languages","stargazers_url":"https://api.github.com/repos/Itseez/opencv_contrib/stargazers","contributors_url":"https://api.github.com/repos/Itseez/opencv_contrib/contributors","subscribers_url":"https://api.github.com/repos/Itseez/opencv_contrib/subscribers","subscription_url":"https://api.github.com/repos/Itseez/opencv_contrib/subscription","commits_url":"https://api.github.com/repos/Itseez/opencv_contrib/commits{/sha}","git_commits_url":"https://api.github.com/repos/Itseez/opencv_contrib/git/commits{/sha}","comments_url":"https://api.github.com/repos/Itseez/opencv_contrib/comments{/number}","issue_comment_url":"https://api.github.com/repos/Itseez/opencv_contrib/issues/comments{/number}","contents_url":"https://api.github.com/repos/Itseez/opencv_contrib/contents/{+path}","compare_url":"https://api.github.com/repos/Itseez/opencv_contrib/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Itseez/opencv_contrib/merges","archive_url":"https://api.github.com/repos/Itseez/opencv_contrib/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Itseez/opencv_contrib/downloads","issues_url":"https://api.github.com/repos/Itseez/opencv_contrib/issues{/number}","pulls_url":"https://api.github.com/repos/Itseez/opencv_contrib/pulls{/number}","milestones_url":"https://api.github.com/repos/Itseez/opencv_contrib/milestones{/number}","notifications_url":"https://api.github.com/repos/Itseez/opencv_contrib/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Itseez/opencv_contrib/labels{/name}","releases_url":"https://api.github.com/repos/Itseez/opencv_contrib/releases{/id}","created_at":"2013-09-11T13:28:04Z","updated_at":"2015-05-18T07:16:15Z","pushed_at":"2015-05-17T17:15:54Z","git_url":"git://github.com/Itseez/opencv_contrib.git","ssh_url":"git@github.com:Itseez/opencv_contrib.git","clone_url":"https://github.com/Itseez/opencv_contrib.git","svn_url":"https://github.com/Itseez/opencv_contrib","homepage":null,"size":101640,"stargazers_count":213,"watchers_count":213,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":351,"mirror_url":null,"open_issues_count":53,"forks":351,"open_issues":53,"watchers":213,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229"},"html":{"href":"https://github.com/Itseez/opencv_contrib/pull/229"},"issue":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/issues/229"},"comments":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/issues/229/comments"},"review_comments":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229/comments"},"review_comment":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/pulls/229/commits"},"statuses":{"href":"https://api.github.com/repos/Itseez/opencv_contrib/statuses/2d85137ef15d5309d26930fa82e2d0cbe911b6ee"}}}}