Merge branch 'daisy' of https://github.com/cbalint13/opencv_contrib into daisy
commit
89a2302685
11 changed files with 172 additions and 17 deletions
@ -0,0 +1,140 @@ |
|||||||
|
// This implementation of, and any deviation from, the original algorithm as
|
||||||
|
// proposed by Ziegler et al. is not endorsed by Ziegler et al. nor does it
|
||||||
|
// claim to represent their definition of locally uniform comparison image
|
||||||
|
// descriptor. The original LUCID algorithm as proposed by Ziegler et al. remains
|
||||||
|
// the property of its respective authors. This implementation is an adaptation of
|
||||||
|
// said algorithm and contributed to OpenCV by Str3iber.
|
||||||
|
|
||||||
|
// References:
|
||||||
|
// Ziegler, Andrew, Eric Christiansen, David Kriegman, and Serge J. Belongie.
|
||||||
|
// "Locally uniform comparison image descriptor." In Advances in Neural Information
|
||||||
|
// Processing Systems, pp. 1-9. 2012.
|
||||||
|
|
||||||
|
/*
|
||||||
|
By downloading, copying, installing or using the software you agree to this license. |
||||||
|
If you do not agree to this license, do not download, install, |
||||||
|
copy or use the software. |
||||||
|
|
||||||
|
|
||||||
|
License Agreement |
||||||
|
For Open Source Computer Vision Library |
||||||
|
(3-clause BSD License) |
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without modification, |
||||||
|
are permitted provided that the following conditions are met: |
||||||
|
|
||||||
|
* Redistributions of source code must retain the above copyright notice, |
||||||
|
this list of conditions and the following disclaimer. |
||||||
|
|
||||||
|
* Redistributions in binary form must reproduce the above copyright notice, |
||||||
|
this list of conditions and the following disclaimer in the documentation |
||||||
|
and/or other materials provided with the distribution. |
||||||
|
|
||||||
|
* Neither the names of the copyright holders nor the names of the contributors |
||||||
|
may be used to endorse or promote products derived from this software |
||||||
|
without specific prior written permission. |
||||||
|
|
||||||
|
This software is provided by the copyright holders and contributors "as is" and |
||||||
|
any express or implied warranties, including, but not limited to, the implied |
||||||
|
warranties of merchantability and fitness for a particular purpose are disclaimed. |
||||||
|
In no event shall copyright holders or contributors be liable for any direct, |
||||||
|
indirect, incidental, special, exemplary, or consequential damages |
||||||
|
(including, but not limited to, procurement of substitute goods or services; |
||||||
|
loss of use, data, or profits; or business interruption) however caused |
||||||
|
and on any theory of liability, whether in contract, strict liability, |
||||||
|
or tort (including negligence or otherwise) arising in any way out of |
||||||
|
the use of this software, even if advised of the possibility of such damage. |
||||||
|
*/ |
||||||
|
|
||||||
|
#include "precomp.hpp" |
||||||
|
|
||||||
|
namespace cv { |
||||||
|
namespace xfeatures2d { |
||||||
|
/*!
|
||||||
|
LUCID implementation |
||||||
|
*/ |
||||||
|
class LUCIDImpl : public LUCID { |
||||||
|
public: |
||||||
|
/** Constructor
|
||||||
|
* @param lucid_kernel kernel for descriptor construction, where 1=3x3, 2=5x5, 3=7x7 and so forth |
||||||
|
* @param blur_kernel kernel for blurring image prior to descriptor construction, where 1=3x3, 2=5x5, 3=7x7 and so forth |
||||||
|
*/ |
||||||
|
LUCIDImpl(const int lucid_kernel = 1, const int blur_kernel = 2); |
||||||
|
|
||||||
|
/** returns the descriptor length */ |
||||||
|
virtual int descriptorSize() const; |
||||||
|
|
||||||
|
/** returns the descriptor type */ |
||||||
|
virtual int descriptorType() const; |
||||||
|
|
||||||
|
/** returns the default norm type */ |
||||||
|
virtual int defaultNorm() const; |
||||||
|
|
||||||
|
virtual void compute(InputArray _src, std::vector<KeyPoint> &keypoints, OutputArray _desc); |
||||||
|
|
||||||
|
protected: |
||||||
|
int l_kernel, b_kernel; |
||||||
|
}; |
||||||
|
|
||||||
|
Ptr<LUCID> LUCID::create(const int lucid_kernel, const int blur_kernel) { |
||||||
|
return makePtr<LUCIDImpl>(lucid_kernel, blur_kernel); |
||||||
|
} |
||||||
|
|
||||||
|
LUCIDImpl::LUCIDImpl(const int lucid_kernel, const int blur_kernel) { |
||||||
|
l_kernel = lucid_kernel; |
||||||
|
b_kernel = blur_kernel*2+1; |
||||||
|
} |
||||||
|
|
||||||
|
int LUCIDImpl::descriptorSize() const { |
||||||
|
return (l_kernel*2+1)*(l_kernel*2+1)*3; |
||||||
|
} |
||||||
|
|
||||||
|
int LUCIDImpl::descriptorType() const { |
||||||
|
return CV_8UC1; |
||||||
|
} |
||||||
|
|
||||||
|
int LUCIDImpl::defaultNorm() const { |
||||||
|
return NORM_HAMMING; |
||||||
|
} |
||||||
|
|
||||||
|
// gliese581h suggested filling a cv::Mat with descriptors to enable BFmatcher compatibility
|
||||||
|
// speed-ups and enhancements by gliese581h
|
||||||
|
void LUCIDImpl::compute(InputArray _src, std::vector<KeyPoint> &keypoints, OutputArray _desc) { |
||||||
|
if (_src.getMat().empty()) |
||||||
|
return; |
||||||
|
|
||||||
|
Mat_<Vec3b> src; |
||||||
|
|
||||||
|
blur(_src.getMat(), src, cv::Size(b_kernel, b_kernel)); |
||||||
|
|
||||||
|
int x, y, j, d, p, m = (l_kernel*2+1)*(l_kernel*2+1)*3, width = src.cols, height = src.rows, r, c; |
||||||
|
|
||||||
|
Mat_<uchar> desc(static_cast<int>(keypoints.size()), m); |
||||||
|
|
||||||
|
for (std::size_t i = 0; i < keypoints.size(); ++i) { |
||||||
|
x = static_cast<int>(keypoints[i].pt.x)-l_kernel, y = static_cast<int>(keypoints[i].pt.y)-l_kernel, d = x+2*l_kernel, p = y+2*l_kernel, j = x, r = static_cast<int>(i), c = 0; |
||||||
|
|
||||||
|
while (x <= d) { |
||||||
|
Vec3b &pix = src((y < 0 ? height+y : y >= height ? y-height : y), (x < 0 ? width+x : x >= width ? x-width : x)); |
||||||
|
|
||||||
|
desc(r, c++) = pix[0]; |
||||||
|
desc(r, c++) = pix[1]; |
||||||
|
desc(r, c++) = pix[2]; |
||||||
|
|
||||||
|
++x; |
||||||
|
if (x > d) { |
||||||
|
if (y < p) { |
||||||
|
++y; |
||||||
|
x = j; |
||||||
|
} |
||||||
|
else |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
if (_desc.needed()) |
||||||
|
sort(desc, _desc, SORT_EVERY_ROW | SORT_ASCENDING); |
||||||
|
} |
||||||
|
} |
||||||
|
} // END NAMESPACE CV
|
Loading…
Reference in new issue