Merged with HEAD and removed C interface to rotatedRectangleIntersection
This commit is contained in:
@@ -14,4 +14,3 @@ double getCameraPropertyC(void* camera, int propIdx);
|
||||
void setCameraPropertyC(void* camera, int propIdx, double value);
|
||||
void applyCameraPropertiesC(void** camera);
|
||||
}
|
||||
|
||||
|
||||
@@ -44,4 +44,4 @@ private:
|
||||
int frameHeight;
|
||||
};
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -1,2 +1,2 @@
|
||||
set(the_description "Biologically inspired algorithms")
|
||||
ocv_define_module(bioinspired opencv_core OPTIONAL opencv_highgui)
|
||||
ocv_define_module(bioinspired opencv_core OPTIONAL opencv_highgui opencv_ocl)
|
||||
|
||||
@@ -304,7 +304,8 @@ public:
|
||||
CV_EXPORTS Ptr<Retina> createRetina(Size inputSize);
|
||||
CV_EXPORTS Ptr<Retina> createRetina(Size inputSize, const bool colorMode, int colorSamplingMethod=RETINA_COLOR_BAYER, const bool useRetinaLogSampling=false, const double reductionFactor=1.0, const double samplingStrenght=10.0);
|
||||
|
||||
|
||||
CV_EXPORTS Ptr<Retina> createRetina_OCL(Size inputSize);
|
||||
CV_EXPORTS Ptr<Retina> createRetina_OCL(Size inputSize, const bool colorMode, int colorSamplingMethod=RETINA_COLOR_BAYER, const bool useRetinaLogSampling=false, const double reductionFactor=1.0, const double samplingStrenght=10.0);
|
||||
}
|
||||
}
|
||||
#endif /* __OPENCV_BIOINSPIRED_RETINA_HPP__ */
|
||||
|
||||
753
modules/bioinspired/src/opencl/retina_kernel.cl
Normal file
753
modules/bioinspired/src/opencl/retina_kernel.cl
Normal file
@@ -0,0 +1,753 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2010-2013, Multicoreware, Inc., all rights reserved.
|
||||
// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// @Authors
|
||||
// Peng Xiao, pengxiao@multicorewareinc.com
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other oclMaterials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
//*******************************************************
|
||||
// basicretinafilter
|
||||
//////////////// _spatiotemporalLPfilter ////////////////
|
||||
//_horizontalCausalFilter_addInput
|
||||
kernel void horizontalCausalFilter_addInput(
|
||||
global const float * input,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int in_offset,
|
||||
const int out_offset,
|
||||
const float _tau,
|
||||
const float _a
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
global const float * iptr =
|
||||
input + mad24(gid, elements_per_row, in_offset / 4);
|
||||
global float * optr =
|
||||
output + mad24(gid, elements_per_row, out_offset / 4);
|
||||
|
||||
float res;
|
||||
float4 in_v4, out_v4, res_v4 = (float4)(0);
|
||||
//vectorize to increase throughput
|
||||
for(int i = 0; i < cols / 4; ++i, iptr += 4, optr += 4)
|
||||
{
|
||||
in_v4 = vload4(0, iptr);
|
||||
out_v4 = vload4(0, optr);
|
||||
|
||||
res_v4.x = in_v4.x + _tau * out_v4.x + _a * res_v4.w;
|
||||
res_v4.y = in_v4.y + _tau * out_v4.y + _a * res_v4.x;
|
||||
res_v4.z = in_v4.z + _tau * out_v4.z + _a * res_v4.y;
|
||||
res_v4.w = in_v4.w + _tau * out_v4.w + _a * res_v4.z;
|
||||
|
||||
vstore4(res_v4, 0, optr);
|
||||
}
|
||||
res = res_v4.w;
|
||||
// there may be left some
|
||||
for(int i = 0; i < cols % 4; ++i, ++iptr, ++optr)
|
||||
{
|
||||
res = *iptr + _tau * *optr + _a * res;
|
||||
*optr = res;
|
||||
}
|
||||
}
|
||||
|
||||
//_horizontalAnticausalFilter
|
||||
kernel void horizontalAnticausalFilter(
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int out_offset,
|
||||
const float _a
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
global float * optr = output +
|
||||
mad24(gid + 1, elements_per_row, - 1 + out_offset / 4);
|
||||
|
||||
float4 result = (float4)(0), out_v4;
|
||||
// we assume elements_per_row is multple of 4
|
||||
for(int i = 0; i < elements_per_row / 4; ++i, optr -= 4)
|
||||
{
|
||||
// shift left, `offset` is type `size_t` so it cannot be negative
|
||||
out_v4 = vload4(0, optr - 3);
|
||||
|
||||
result.w = out_v4.w + _a * result.x;
|
||||
result.z = out_v4.z + _a * result.w;
|
||||
result.y = out_v4.y + _a * result.z;
|
||||
result.x = out_v4.x + _a * result.y;
|
||||
|
||||
vstore4(result, 0, optr - 3);
|
||||
}
|
||||
}
|
||||
|
||||
//_verticalCausalFilter
|
||||
kernel void verticalCausalFilter(
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int out_offset,
|
||||
const float _a
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= cols)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
global float * optr = output + gid + out_offset / 4;
|
||||
float result = 0;
|
||||
for(int i = 0; i < rows; ++i, optr += elements_per_row)
|
||||
{
|
||||
result = *optr + _a * result;
|
||||
*optr = result;
|
||||
}
|
||||
}
|
||||
|
||||
//_verticalCausalFilter
|
||||
kernel void verticalAnticausalFilter_multGain(
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int out_offset,
|
||||
const float _a,
|
||||
const float _gain
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= cols)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
global float * optr = output + (rows - 1) * elements_per_row + gid + out_offset / 4;
|
||||
float result = 0;
|
||||
for(int i = 0; i < rows; ++i, optr -= elements_per_row)
|
||||
{
|
||||
result = *optr + _a * result;
|
||||
*optr = _gain * result;
|
||||
}
|
||||
}
|
||||
//
|
||||
// end of _spatiotemporalLPfilter
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
|
||||
//////////////// horizontalAnticausalFilter_Irregular ////////////////
|
||||
kernel void horizontalAnticausalFilter_Irregular(
|
||||
global float * output,
|
||||
global float * buffer,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int out_offset,
|
||||
const int buffer_offset
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
global float * optr =
|
||||
output + mad24(rows - gid, elements_per_row, -1 + out_offset / 4);
|
||||
global float * bptr =
|
||||
buffer + mad24(rows - gid, elements_per_row, -1 + buffer_offset / 4);
|
||||
|
||||
float4 buf_v4, out_v4, res_v4 = (float4)(0);
|
||||
|
||||
for(int i = 0; i < elements_per_row / 4; ++i, optr -= 4, bptr -= 4)
|
||||
{
|
||||
buf_v4 = vload4(0, bptr - 3);
|
||||
out_v4 = vload4(0, optr - 3);
|
||||
|
||||
res_v4.w = out_v4.w + buf_v4.w * res_v4.x;
|
||||
res_v4.z = out_v4.z + buf_v4.z * res_v4.w;
|
||||
res_v4.y = out_v4.y + buf_v4.y * res_v4.z;
|
||||
res_v4.x = out_v4.x + buf_v4.x * res_v4.y;
|
||||
|
||||
vstore4(res_v4, 0, optr - 3);
|
||||
}
|
||||
}
|
||||
|
||||
//////////////// verticalCausalFilter_Irregular ////////////////
|
||||
kernel void verticalCausalFilter_Irregular(
|
||||
global float * output,
|
||||
global float * buffer,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int out_offset,
|
||||
const int buffer_offset
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= cols)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
global float * optr = output + gid + out_offset / 4;
|
||||
global float * bptr = buffer + gid + buffer_offset / 4;
|
||||
float result = 0;
|
||||
for(int i = 0; i < rows; ++i, optr += elements_per_row, bptr += elements_per_row)
|
||||
{
|
||||
result = *optr + *bptr * result;
|
||||
*optr = result;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////// _adaptiveHorizontalCausalFilter_addInput ////////////////
|
||||
kernel void adaptiveHorizontalCausalFilter_addInput(
|
||||
global const float * input,
|
||||
global const float * gradient,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int in_offset,
|
||||
const int grad_offset,
|
||||
const int out_offset
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
global const float * iptr =
|
||||
input + mad24(gid, elements_per_row, in_offset / 4);
|
||||
global const float * gptr =
|
||||
gradient + mad24(gid, elements_per_row, grad_offset / 4);
|
||||
global float * optr =
|
||||
output + mad24(gid, elements_per_row, out_offset / 4);
|
||||
|
||||
float4 in_v4, grad_v4, out_v4, res_v4 = (float4)(0);
|
||||
for(int i = 0; i < cols / 4; ++i, iptr += 4, gptr += 4, optr += 4)
|
||||
{
|
||||
in_v4 = vload4(0, iptr);
|
||||
grad_v4 = vload4(0, gptr);
|
||||
|
||||
res_v4.x = in_v4.x + grad_v4.x * res_v4.w;
|
||||
res_v4.y = in_v4.y + grad_v4.y * res_v4.x;
|
||||
res_v4.z = in_v4.z + grad_v4.z * res_v4.y;
|
||||
res_v4.w = in_v4.w + grad_v4.w * res_v4.z;
|
||||
|
||||
vstore4(res_v4, 0, optr);
|
||||
}
|
||||
for(int i = 0; i < cols % 4; ++i, ++iptr, ++gptr, ++optr)
|
||||
{
|
||||
res_v4.w = *iptr + *gptr * res_v4.w;
|
||||
*optr = res_v4.w;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////// _adaptiveVerticalAnticausalFilter_multGain ////////////////
|
||||
kernel void adaptiveVerticalAnticausalFilter_multGain(
|
||||
global const float * gradient,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const int grad_offset,
|
||||
const int out_offset,
|
||||
const float gain
|
||||
)
|
||||
{
|
||||
int gid = get_global_id(0);
|
||||
if(gid >= cols)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int start_idx = mad24(rows - 1, elements_per_row, gid);
|
||||
|
||||
global const float * gptr = gradient + start_idx + grad_offset / 4;
|
||||
global float * optr = output + start_idx + out_offset / 4;
|
||||
|
||||
float result = 0;
|
||||
for(int i = 0; i < rows; ++i, gptr -= elements_per_row, optr -= elements_per_row)
|
||||
{
|
||||
result = *optr + *gptr * result;
|
||||
*optr = gain * result;
|
||||
}
|
||||
}
|
||||
|
||||
//////////////// _localLuminanceAdaptation ////////////////
|
||||
// FIXME:
|
||||
// This kernel seems to have precision problem on GPU
|
||||
kernel void localLuminanceAdaptation(
|
||||
global const float * luma,
|
||||
global const float * input,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float _localLuminanceAddon,
|
||||
const float _localLuminanceFactor,
|
||||
const float _maxInputValue
|
||||
)
|
||||
{
|
||||
int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int offset = mad24(gidy, elements_per_row, gidx);
|
||||
|
||||
float X0 = luma[offset] * _localLuminanceFactor + _localLuminanceAddon;
|
||||
float input_val = input[offset];
|
||||
// output of the following line may be different between GPU and CPU
|
||||
output[offset] = (_maxInputValue + X0) * input_val / (input_val + X0 + 0.00000000001f);
|
||||
}
|
||||
// end of basicretinafilter
|
||||
//*******************************************************
|
||||
/////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
//******************************************************
|
||||
// magno
|
||||
// TODO: this kernel has too many buffer accesses, better to make it
|
||||
// vector read/write for fetch efficiency
|
||||
kernel void amacrineCellsComputing(
|
||||
global const float * opl_on,
|
||||
global const float * opl_off,
|
||||
global float * prev_in_on,
|
||||
global float * prev_in_off,
|
||||
global float * out_on,
|
||||
global float * out_off,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float coeff
|
||||
)
|
||||
{
|
||||
int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int offset = mad24(gidy, elements_per_row, gidx);
|
||||
opl_on += offset;
|
||||
opl_off += offset;
|
||||
prev_in_on += offset;
|
||||
prev_in_off += offset;
|
||||
out_on += offset;
|
||||
out_off += offset;
|
||||
|
||||
float magnoXonPixelResult = coeff * (*out_on + *opl_on - *prev_in_on);
|
||||
*out_on = fmax(magnoXonPixelResult, 0);
|
||||
float magnoXoffPixelResult = coeff * (*out_off + *opl_off - *prev_in_off);
|
||||
*out_off = fmax(magnoXoffPixelResult, 0);
|
||||
|
||||
*prev_in_on = *opl_on;
|
||||
*prev_in_off = *opl_off;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
//******************************************************
|
||||
// parvo
|
||||
// TODO: this kernel has too many buffer accesses, needs optimization
|
||||
kernel void OPL_OnOffWaysComputing(
|
||||
global float4 * photo_out,
|
||||
global float4 * horiz_out,
|
||||
global float4 * bipol_on,
|
||||
global float4 * bipol_off,
|
||||
global float4 * parvo_on,
|
||||
global float4 * parvo_off,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row
|
||||
)
|
||||
{
|
||||
int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx * 4 >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// we assume elements_per_row must be multiples of 4
|
||||
int offset = mad24(gidy, elements_per_row >> 2, gidx);
|
||||
photo_out += offset;
|
||||
horiz_out += offset;
|
||||
bipol_on += offset;
|
||||
bipol_off += offset;
|
||||
parvo_on += offset;
|
||||
parvo_off += offset;
|
||||
|
||||
float4 diff = *photo_out - *horiz_out;
|
||||
float4 isPositive;// = convert_float4(diff > (float4)(0.0f, 0.0f, 0.0f, 0.0f));
|
||||
isPositive.x = diff.x > 0.0f;
|
||||
isPositive.y = diff.y > 0.0f;
|
||||
isPositive.z = diff.z > 0.0f;
|
||||
isPositive.w = diff.w > 0.0f;
|
||||
float4 res_on = isPositive * diff;
|
||||
float4 res_off = (isPositive - (float4)(1.0f)) * diff;
|
||||
|
||||
*bipol_on = res_on;
|
||||
*parvo_on = res_on;
|
||||
|
||||
*bipol_off = res_off;
|
||||
*parvo_off = res_off;
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////////
|
||||
//******************************************************
|
||||
// retinacolor
|
||||
inline int bayerSampleOffset(int step, int rows, int x, int y)
|
||||
{
|
||||
return mad24(y, step, x) +
|
||||
((y % 2) + (x % 2)) * rows * step;
|
||||
}
|
||||
|
||||
|
||||
/////// colorMultiplexing //////
|
||||
kernel void runColorMultiplexingBayer(
|
||||
global const float * input,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row
|
||||
)
|
||||
{
|
||||
int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int offset = mad24(gidy, elements_per_row, gidx);
|
||||
output[offset] = input[bayerSampleOffset(elements_per_row, rows, gidx, gidy)];
|
||||
}
|
||||
|
||||
kernel void runColorDemultiplexingBayer(
|
||||
global const float * input,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row
|
||||
)
|
||||
{
|
||||
int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int offset = mad24(gidy, elements_per_row, gidx);
|
||||
output[bayerSampleOffset(elements_per_row, rows, gidx, gidy)] = input[offset];
|
||||
}
|
||||
|
||||
kernel void demultiplexAssign(
|
||||
global const float * input,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row
|
||||
)
|
||||
{
|
||||
int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
int offset = bayerSampleOffset(elements_per_row, rows, gidx, gidy);
|
||||
output[offset] = input[offset];
|
||||
}
|
||||
|
||||
|
||||
//// normalizeGrayOutputCentredSigmoide
|
||||
kernel void normalizeGrayOutputCentredSigmoide(
|
||||
global const float * input,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float meanval,
|
||||
const float X0
|
||||
)
|
||||
|
||||
{
|
||||
int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int offset = mad24(gidy, elements_per_row, gidx);
|
||||
|
||||
float input_val = input[offset];
|
||||
output[offset] = meanval +
|
||||
(meanval + X0) * (input_val - meanval) / (fabs(input_val - meanval) + X0);
|
||||
}
|
||||
|
||||
//// normalize by photoreceptors density
|
||||
kernel void normalizePhotoDensity(
|
||||
global const float * chroma,
|
||||
global const float * colorDensity,
|
||||
global const float * multiplex,
|
||||
global float * luma,
|
||||
global float * demultiplex,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float pG
|
||||
)
|
||||
{
|
||||
const int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const int offset = mad24(gidy, elements_per_row, gidx);
|
||||
int index = offset;
|
||||
|
||||
float Cr = chroma[index] * colorDensity[index];
|
||||
index += elements_per_row * rows;
|
||||
float Cg = chroma[index] * colorDensity[index];
|
||||
index += elements_per_row * rows;
|
||||
float Cb = chroma[index] * colorDensity[index];
|
||||
|
||||
const float luma_res = (Cr + Cg + Cb) * pG;
|
||||
luma[offset] = luma_res;
|
||||
demultiplex[bayerSampleOffset(elements_per_row, rows, gidx, gidy)] =
|
||||
multiplex[offset] - luma_res;
|
||||
}
|
||||
|
||||
|
||||
|
||||
//////// computeGradient ///////
|
||||
// TODO:
|
||||
// this function maybe accelerated by image2d_t or lds
|
||||
kernel void computeGradient(
|
||||
global const float * luma,
|
||||
global float * gradient,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row
|
||||
)
|
||||
{
|
||||
int gidx = get_global_id(0) + 2, gidy = get_global_id(1) + 2;
|
||||
if(gidx >= cols - 2 || gidy >= rows - 2)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int offset = mad24(gidy, elements_per_row, gidx);
|
||||
luma += offset;
|
||||
|
||||
// horizontal and vertical local gradients
|
||||
const float v_grad = fabs(luma[elements_per_row] - luma[- elements_per_row]);
|
||||
const float h_grad = fabs(luma[1] - luma[-1]);
|
||||
|
||||
// neighborhood horizontal and vertical gradients
|
||||
const float cur_val = luma[0];
|
||||
const float v_grad_p = fabs(cur_val - luma[- 2 * elements_per_row]);
|
||||
const float h_grad_p = fabs(cur_val - luma[- 2]);
|
||||
const float v_grad_n = fabs(cur_val - luma[2 * elements_per_row]);
|
||||
const float h_grad_n = fabs(cur_val - luma[2]);
|
||||
|
||||
const float horiz_grad = 0.5f * h_grad + 0.25f * (h_grad_p + h_grad_n);
|
||||
const float verti_grad = 0.5f * v_grad + 0.25f * (v_grad_p + v_grad_n);
|
||||
const bool is_vertical_greater = horiz_grad < verti_grad;
|
||||
|
||||
gradient[offset + elements_per_row * rows] = is_vertical_greater ? 0.06f : 0.57f;
|
||||
gradient[offset ] = is_vertical_greater ? 0.57f : 0.06f;
|
||||
}
|
||||
|
||||
|
||||
/////// substractResidual ///////
|
||||
kernel void substractResidual(
|
||||
global float * input,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float pR,
|
||||
const float pG,
|
||||
const float pB
|
||||
)
|
||||
{
|
||||
const int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
int indices [3] =
|
||||
{
|
||||
mad24(gidy, elements_per_row, gidx),
|
||||
mad24(gidy + rows, elements_per_row, gidx),
|
||||
mad24(gidy + 2 * rows, elements_per_row, gidx)
|
||||
};
|
||||
float vals[3] = {input[indices[0]], input[indices[1]], input[indices[2]]};
|
||||
float residu = pR * vals[0] + pG * vals[1] + pB * vals[2];
|
||||
|
||||
input[indices[0]] = vals[0] - residu;
|
||||
input[indices[1]] = vals[1] - residu;
|
||||
input[indices[2]] = vals[2] - residu;
|
||||
}
|
||||
|
||||
///// clipRGBOutput_0_maxInputValue /////
|
||||
kernel void clipRGBOutput_0_maxInputValue(
|
||||
global float * input,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float maxVal
|
||||
)
|
||||
{
|
||||
const int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const int offset = mad24(gidy, elements_per_row, gidx);
|
||||
float val = input[offset];
|
||||
val = clamp(val, 0.0f, maxVal);
|
||||
input[offset] = val;
|
||||
}
|
||||
|
||||
//// normalizeGrayOutputNearZeroCentreredSigmoide ////
|
||||
kernel void normalizeGrayOutputNearZeroCentreredSigmoide(
|
||||
global float * input,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float maxVal,
|
||||
const float X0cube
|
||||
)
|
||||
{
|
||||
const int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const int offset = mad24(gidy, elements_per_row, gidx);
|
||||
float currentCubeLuminance = input[offset];
|
||||
currentCubeLuminance = currentCubeLuminance * currentCubeLuminance * currentCubeLuminance;
|
||||
output[offset] = currentCubeLuminance * X0cube / (X0cube + currentCubeLuminance);
|
||||
}
|
||||
|
||||
//// centerReductImageLuminance ////
|
||||
kernel void centerReductImageLuminance(
|
||||
global float * input,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row,
|
||||
const float mean,
|
||||
const float std_dev
|
||||
)
|
||||
{
|
||||
const int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const int offset = mad24(gidy, elements_per_row, gidx);
|
||||
|
||||
float val = input[offset];
|
||||
input[offset] = (val - mean) / std_dev;
|
||||
}
|
||||
|
||||
//// inverseValue ////
|
||||
kernel void inverseValue(
|
||||
global float * input,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int elements_per_row
|
||||
)
|
||||
{
|
||||
const int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const int offset = mad24(gidy, elements_per_row, gidx);
|
||||
input[offset] = 1.f / input[offset];
|
||||
}
|
||||
|
||||
#define CV_PI 3.1415926535897932384626433832795
|
||||
|
||||
//// _processRetinaParvoMagnoMapping ////
|
||||
kernel void processRetinaParvoMagnoMapping(
|
||||
global float * parvo,
|
||||
global float * magno,
|
||||
global float * output,
|
||||
const int cols,
|
||||
const int rows,
|
||||
const int halfCols,
|
||||
const int halfRows,
|
||||
const int elements_per_row,
|
||||
const float minDistance
|
||||
)
|
||||
{
|
||||
const int gidx = get_global_id(0), gidy = get_global_id(1);
|
||||
if(gidx >= cols || gidy >= rows)
|
||||
{
|
||||
return;
|
||||
}
|
||||
const int offset = mad24(gidy, elements_per_row, gidx);
|
||||
|
||||
float distanceToCenter =
|
||||
sqrt(((float)(gidy - halfRows) * (gidy - halfRows) + (gidx - halfCols) * (gidx - halfCols)));
|
||||
|
||||
float a = distanceToCenter < minDistance ?
|
||||
(0.5f + 0.5f * (float)cos(CV_PI * distanceToCenter / minDistance)) : 0;
|
||||
float b = 1.f - a;
|
||||
|
||||
output[offset] = parvo[offset] * a + magno[offset] * b;
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//
|
||||
// Intel License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000, Intel Corporation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of Intel Corporation may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
/* End of file. */
|
||||
@@ -43,11 +43,17 @@
|
||||
#ifndef __OPENCV_PRECOMP_H__
|
||||
#define __OPENCV_PRECOMP_H__
|
||||
|
||||
#include "opencv2/opencv_modules.hpp"
|
||||
#include "opencv2/bioinspired.hpp"
|
||||
#include "opencv2/core/utility.hpp"
|
||||
#include "opencv2/core/private.hpp"
|
||||
|
||||
#include <valarray>
|
||||
|
||||
#ifdef HAVE_OPENCV_OCL
|
||||
#include "opencv2/ocl/private/util.hpp"
|
||||
#endif
|
||||
|
||||
namespace cv
|
||||
{
|
||||
|
||||
|
||||
@@ -628,6 +628,7 @@ void RetinaImpl::_init(const cv::Size inputSz, const bool colorMode, int colorSa
|
||||
delete _retinaFilter;
|
||||
_retinaFilter = new RetinaFilter(inputSz.height, inputSz.width, colorMode, colorSamplingMethod, useRetinaLogSampling, reductionFactor, samplingStrenght);
|
||||
|
||||
_retinaParameters.OPLandIplParvo.colorMode = colorMode;
|
||||
// prepare the default parameter XML file with default setup
|
||||
setup(_retinaParameters);
|
||||
|
||||
|
||||
1651
modules/bioinspired/src/retina_ocl.cpp
Normal file
1651
modules/bioinspired/src/retina_ocl.cpp
Normal file
File diff suppressed because it is too large
Load Diff
633
modules/bioinspired/src/retina_ocl.hpp
Normal file
633
modules/bioinspired/src/retina_ocl.hpp
Normal file
@@ -0,0 +1,633 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2010-2013, Multicoreware, Inc., all rights reserved.
|
||||
// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// @Authors
|
||||
// Peng Xiao, pengxiao@multicorewareinc.com
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other oclMaterials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#ifndef __OCL_RETINA_HPP__
|
||||
#define __OCL_RETINA_HPP__
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
#ifdef HAVE_OPENCV_OCL
|
||||
|
||||
// please refer to c++ headers for API comments
|
||||
namespace cv
|
||||
{
|
||||
namespace bioinspired
|
||||
{
|
||||
namespace ocl
|
||||
{
|
||||
void normalizeGrayOutputCentredSigmoide(const float meanValue, const float sensitivity, cv::ocl::oclMat &in, cv::ocl::oclMat &out, const float maxValue = 255.f);
|
||||
void normalizeGrayOutput_0_maxOutputValue(cv::ocl::oclMat &inputOutputBuffer, const float maxOutputValue = 255.0);
|
||||
void normalizeGrayOutputNearZeroCentreredSigmoide(cv::ocl::oclMat &inputPicture, cv::ocl::oclMat &outputBuffer, const float sensitivity = 40, const float maxOutputValue = 255.0f);
|
||||
void centerReductImageLuminance(cv::ocl::oclMat &inputOutputBuffer);
|
||||
|
||||
class BasicRetinaFilter
|
||||
{
|
||||
public:
|
||||
BasicRetinaFilter(const unsigned int NBrows, const unsigned int NBcolumns, const unsigned int parametersListSize = 1, const bool useProgressiveFilter = false);
|
||||
~BasicRetinaFilter();
|
||||
inline void clearOutputBuffer()
|
||||
{
|
||||
_filterOutput = 0;
|
||||
};
|
||||
inline void clearSecondaryBuffer()
|
||||
{
|
||||
_localBuffer = 0;
|
||||
};
|
||||
inline void clearAllBuffers()
|
||||
{
|
||||
clearOutputBuffer();
|
||||
clearSecondaryBuffer();
|
||||
};
|
||||
void resize(const unsigned int NBrows, const unsigned int NBcolumns);
|
||||
const cv::ocl::oclMat &runFilter_LPfilter(const cv::ocl::oclMat &inputFrame, const unsigned int filterIndex = 0);
|
||||
void runFilter_LPfilter(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &outputFrame, const unsigned int filterIndex = 0);
|
||||
void runFilter_LPfilter_Autonomous(cv::ocl::oclMat &inputOutputFrame, const unsigned int filterIndex = 0);
|
||||
const cv::ocl::oclMat &runFilter_LocalAdapdation(const cv::ocl::oclMat &inputOutputFrame, const cv::ocl::oclMat &localLuminance);
|
||||
void runFilter_LocalAdapdation(const cv::ocl::oclMat &inputFrame, const cv::ocl::oclMat &localLuminance, cv::ocl::oclMat &outputFrame);
|
||||
const cv::ocl::oclMat &runFilter_LocalAdapdation_autonomous(const cv::ocl::oclMat &inputFrame);
|
||||
void runFilter_LocalAdapdation_autonomous(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &outputFrame);
|
||||
void setLPfilterParameters(const float beta, const float tau, const float k, const unsigned int filterIndex = 0);
|
||||
inline void setV0CompressionParameter(const float v0, const float maxInputValue, const float)
|
||||
{
|
||||
_v0 = v0 * maxInputValue;
|
||||
_localLuminanceFactor = v0;
|
||||
_localLuminanceAddon = maxInputValue * (1.0f - v0);
|
||||
_maxInputValue = maxInputValue;
|
||||
};
|
||||
inline void setV0CompressionParameter(const float v0, const float meanLuminance)
|
||||
{
|
||||
this->setV0CompressionParameter(v0, _maxInputValue, meanLuminance);
|
||||
};
|
||||
inline void setV0CompressionParameter(const float v0)
|
||||
{
|
||||
_v0 = v0 * _maxInputValue;
|
||||
_localLuminanceFactor = v0;
|
||||
_localLuminanceAddon = _maxInputValue * (1.0f - v0);
|
||||
};
|
||||
inline void setV0CompressionParameterToneMapping(const float v0, const float maxInputValue, const float meanLuminance = 128.0f)
|
||||
{
|
||||
_v0 = v0 * maxInputValue;
|
||||
_localLuminanceFactor = 1.0f;
|
||||
_localLuminanceAddon = meanLuminance * _v0;
|
||||
_maxInputValue = maxInputValue;
|
||||
};
|
||||
inline void updateCompressionParameter(const float meanLuminance)
|
||||
{
|
||||
_localLuminanceFactor = 1;
|
||||
_localLuminanceAddon = meanLuminance * _v0;
|
||||
};
|
||||
inline float getV0CompressionParameter()
|
||||
{
|
||||
return _v0 / _maxInputValue;
|
||||
};
|
||||
inline const cv::ocl::oclMat &getOutput() const
|
||||
{
|
||||
return _filterOutput;
|
||||
};
|
||||
inline unsigned int getNBrows()
|
||||
{
|
||||
return _filterOutput.rows;
|
||||
};
|
||||
inline unsigned int getNBcolumns()
|
||||
{
|
||||
return _filterOutput.cols;
|
||||
};
|
||||
inline unsigned int getNBpixels()
|
||||
{
|
||||
return _filterOutput.size().area();
|
||||
};
|
||||
inline void normalizeGrayOutput_0_maxOutputValue(const float maxValue)
|
||||
{
|
||||
ocl::normalizeGrayOutput_0_maxOutputValue(_filterOutput, maxValue);
|
||||
};
|
||||
inline void normalizeGrayOutputCentredSigmoide()
|
||||
{
|
||||
ocl::normalizeGrayOutputCentredSigmoide(0.0, 2.0, _filterOutput, _filterOutput);
|
||||
};
|
||||
inline void centerReductImageLuminance()
|
||||
{
|
||||
ocl::centerReductImageLuminance(_filterOutput);
|
||||
};
|
||||
inline float getMaxInputValue()
|
||||
{
|
||||
return this->_maxInputValue;
|
||||
};
|
||||
inline void setMaxInputValue(const float newMaxInputValue)
|
||||
{
|
||||
this->_maxInputValue = newMaxInputValue;
|
||||
};
|
||||
|
||||
protected:
|
||||
cv::ocl::oclMat _filterOutput;
|
||||
cv::ocl::oclMat _localBuffer;
|
||||
|
||||
int _NBrows;
|
||||
int _NBcols;
|
||||
unsigned int _halfNBrows;
|
||||
unsigned int _halfNBcolumns;
|
||||
|
||||
std::valarray <float>_filteringCoeficientsTable;
|
||||
float _v0;
|
||||
float _maxInputValue;
|
||||
float _meanInputValue;
|
||||
float _localLuminanceFactor;
|
||||
float _localLuminanceAddon;
|
||||
|
||||
float _a;
|
||||
float _tau;
|
||||
float _gain;
|
||||
|
||||
void _spatiotemporalLPfilter(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &LPfilterOutput, const unsigned int coefTableOffset = 0);
|
||||
float _squaringSpatiotemporalLPfilter(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &outputFrame, const unsigned int filterIndex = 0);
|
||||
void _spatiotemporalLPfilter_Irregular(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &outputFrame, const unsigned int filterIndex = 0);
|
||||
void _localSquaringSpatioTemporalLPfilter(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &LPfilterOutput, const unsigned int *integrationAreas, const unsigned int filterIndex = 0);
|
||||
void _localLuminanceAdaptation(const cv::ocl::oclMat &inputFrame, const cv::ocl::oclMat &localLuminance, cv::ocl::oclMat &outputFrame, const bool updateLuminanceMean = true);
|
||||
void _localLuminanceAdaptation(cv::ocl::oclMat &inputOutputFrame, const cv::ocl::oclMat &localLuminance);
|
||||
void _localLuminanceAdaptationPosNegValues(const cv::ocl::oclMat &inputFrame, const cv::ocl::oclMat &localLuminance, float *outputFrame);
|
||||
void _horizontalCausalFilter_addInput(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &outputFrame);
|
||||
void _horizontalAnticausalFilter(cv::ocl::oclMat &outputFrame);
|
||||
void _verticalCausalFilter(cv::ocl::oclMat &outputFrame);
|
||||
void _horizontalAnticausalFilter_Irregular(cv::ocl::oclMat &outputFrame, const cv::ocl::oclMat &spatialConstantBuffer);
|
||||
void _verticalCausalFilter_Irregular(cv::ocl::oclMat &outputFrame, const cv::ocl::oclMat &spatialConstantBuffer);
|
||||
void _verticalAnticausalFilter_multGain(cv::ocl::oclMat &outputFrame);
|
||||
};
|
||||
|
||||
class MagnoRetinaFilter: public BasicRetinaFilter
|
||||
{
|
||||
public:
|
||||
MagnoRetinaFilter(const unsigned int NBrows, const unsigned int NBcolumns);
|
||||
virtual ~MagnoRetinaFilter();
|
||||
void clearAllBuffers();
|
||||
void resize(const unsigned int NBrows, const unsigned int NBcolumns);
|
||||
void setCoefficientsTable(const float parasolCells_beta, const float parasolCells_tau, const float parasolCells_k, const float amacrinCellsTemporalCutFrequency, const float localAdaptIntegration_tau, const float localAdaptIntegration_k);
|
||||
|
||||
const cv::ocl::oclMat &runFilter(const cv::ocl::oclMat &OPL_ON, const cv::ocl::oclMat &OPL_OFF);
|
||||
|
||||
inline const cv::ocl::oclMat &getMagnoON() const
|
||||
{
|
||||
return _magnoXOutputON;
|
||||
};
|
||||
inline const cv::ocl::oclMat &getMagnoOFF() const
|
||||
{
|
||||
return _magnoXOutputOFF;
|
||||
};
|
||||
inline const cv::ocl::oclMat &getMagnoYsaturated() const
|
||||
{
|
||||
return _magnoYsaturated;
|
||||
};
|
||||
inline void normalizeGrayOutputNearZeroCentreredSigmoide()
|
||||
{
|
||||
ocl::normalizeGrayOutputNearZeroCentreredSigmoide(_magnoYOutput, _magnoYsaturated);
|
||||
};
|
||||
inline float getTemporalConstant()
|
||||
{
|
||||
return this->_filteringCoeficientsTable[2];
|
||||
};
|
||||
private:
|
||||
cv::ocl::oclMat _previousInput_ON;
|
||||
cv::ocl::oclMat _previousInput_OFF;
|
||||
cv::ocl::oclMat _amacrinCellsTempOutput_ON;
|
||||
cv::ocl::oclMat _amacrinCellsTempOutput_OFF;
|
||||
cv::ocl::oclMat _magnoXOutputON;
|
||||
cv::ocl::oclMat _magnoXOutputOFF;
|
||||
cv::ocl::oclMat _localProcessBufferON;
|
||||
cv::ocl::oclMat _localProcessBufferOFF;
|
||||
cv::ocl::oclMat _magnoYOutput;
|
||||
cv::ocl::oclMat _magnoYsaturated;
|
||||
|
||||
float _temporalCoefficient;
|
||||
void _amacrineCellsComputing(const cv::ocl::oclMat &OPL_ON, const cv::ocl::oclMat &OPL_OFF);
|
||||
};
|
||||
|
||||
class ParvoRetinaFilter: public BasicRetinaFilter
|
||||
{
|
||||
public:
|
||||
ParvoRetinaFilter(const unsigned int NBrows = 480, const unsigned int NBcolumns = 640);
|
||||
virtual ~ParvoRetinaFilter();
|
||||
void resize(const unsigned int NBrows, const unsigned int NBcolumns);
|
||||
void clearAllBuffers();
|
||||
void setOPLandParvoFiltersParameters(const float beta1, const float tau1, const float k1, const float beta2, const float tau2, const float k2);
|
||||
|
||||
inline void setGanglionCellsLocalAdaptationLPfilterParameters(const float tau, const float k)
|
||||
{
|
||||
BasicRetinaFilter::setLPfilterParameters(0, tau, k, 2);
|
||||
};
|
||||
const cv::ocl::oclMat &runFilter(const cv::ocl::oclMat &inputFrame, const bool useParvoOutput = true);
|
||||
|
||||
inline const cv::ocl::oclMat &getPhotoreceptorsLPfilteringOutput() const
|
||||
{
|
||||
return _photoreceptorsOutput;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getHorizontalCellsOutput() const
|
||||
{
|
||||
return _horizontalCellsOutput;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getParvoON() const
|
||||
{
|
||||
return _parvocellularOutputON;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getParvoOFF() const
|
||||
{
|
||||
return _parvocellularOutputOFF;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getBipolarCellsON() const
|
||||
{
|
||||
return _bipolarCellsOutputON;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getBipolarCellsOFF() const
|
||||
{
|
||||
return _bipolarCellsOutputOFF;
|
||||
};
|
||||
|
||||
inline float getPhotoreceptorsTemporalConstant()
|
||||
{
|
||||
return this->_filteringCoeficientsTable[2];
|
||||
};
|
||||
|
||||
inline float getHcellsTemporalConstant()
|
||||
{
|
||||
return this->_filteringCoeficientsTable[5];
|
||||
};
|
||||
private:
|
||||
cv::ocl::oclMat _photoreceptorsOutput;
|
||||
cv::ocl::oclMat _horizontalCellsOutput;
|
||||
cv::ocl::oclMat _parvocellularOutputON;
|
||||
cv::ocl::oclMat _parvocellularOutputOFF;
|
||||
cv::ocl::oclMat _bipolarCellsOutputON;
|
||||
cv::ocl::oclMat _bipolarCellsOutputOFF;
|
||||
cv::ocl::oclMat _localAdaptationOFF;
|
||||
cv::ocl::oclMat _localAdaptationON;
|
||||
cv::ocl::oclMat _parvocellularOutputONminusOFF;
|
||||
void _OPL_OnOffWaysComputing();
|
||||
};
|
||||
class RetinaColor: public BasicRetinaFilter
|
||||
{
|
||||
public:
|
||||
RetinaColor(const unsigned int NBrows, const unsigned int NBcolumns, const int samplingMethod = RETINA_COLOR_DIAGONAL);
|
||||
virtual ~RetinaColor();
|
||||
|
||||
void clearAllBuffers();
|
||||
void resize(const unsigned int NBrows, const unsigned int NBcolumns);
|
||||
inline void runColorMultiplexing(const cv::ocl::oclMat &inputRGBFrame)
|
||||
{
|
||||
runColorMultiplexing(inputRGBFrame, _multiplexedFrame);
|
||||
};
|
||||
void runColorMultiplexing(const cv::ocl::oclMat &demultiplexedInputFrame, cv::ocl::oclMat &multiplexedFrame);
|
||||
void runColorDemultiplexing(const cv::ocl::oclMat &multiplexedColorFrame, const bool adaptiveFiltering = false, const float maxInputValue = 255.0);
|
||||
|
||||
void setColorSaturation(const bool saturateColors = true, const float colorSaturationValue = 4.0)
|
||||
{
|
||||
_saturateColors = saturateColors;
|
||||
_colorSaturationValue = colorSaturationValue;
|
||||
};
|
||||
|
||||
void setChrominanceLPfilterParameters(const float beta, const float tau, const float k)
|
||||
{
|
||||
setLPfilterParameters(beta, tau, k);
|
||||
};
|
||||
|
||||
bool applyKrauskopfLMS2Acr1cr2Transform(cv::ocl::oclMat &result);
|
||||
bool applyLMS2LabTransform(cv::ocl::oclMat &result);
|
||||
inline const cv::ocl::oclMat &getMultiplexedFrame() const
|
||||
{
|
||||
return _multiplexedFrame;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getDemultiplexedColorFrame() const
|
||||
{
|
||||
return _demultiplexedColorFrame;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getLuminance() const
|
||||
{
|
||||
return _luminance;
|
||||
};
|
||||
inline const cv::ocl::oclMat &getChrominance() const
|
||||
{
|
||||
return _chrominance;
|
||||
};
|
||||
void clipRGBOutput_0_maxInputValue(cv::ocl::oclMat &inputOutputBuffer, const float maxOutputValue = 255.0);
|
||||
void normalizeRGBOutput_0_maxOutputValue(const float maxOutputValue = 255.0);
|
||||
inline void setDemultiplexedColorFrame(const cv::ocl::oclMat &demultiplexedImage)
|
||||
{
|
||||
_demultiplexedColorFrame = demultiplexedImage;
|
||||
};
|
||||
protected:
|
||||
inline unsigned int bayerSampleOffset(unsigned int index)
|
||||
{
|
||||
return index + ((index / getNBcolumns()) % 2) * getNBpixels() + ((index % getNBcolumns()) % 2) * getNBpixels();
|
||||
}
|
||||
inline Rect getROI(int idx)
|
||||
{
|
||||
return Rect(0, idx * _NBrows, _NBcols, _NBrows);
|
||||
}
|
||||
int _samplingMethod;
|
||||
bool _saturateColors;
|
||||
float _colorSaturationValue;
|
||||
cv::ocl::oclMat _luminance;
|
||||
cv::ocl::oclMat _multiplexedFrame;
|
||||
cv::ocl::oclMat _RGBmosaic;
|
||||
cv::ocl::oclMat _tempMultiplexedFrame;
|
||||
cv::ocl::oclMat _demultiplexedTempBuffer;
|
||||
cv::ocl::oclMat _demultiplexedColorFrame;
|
||||
cv::ocl::oclMat _chrominance;
|
||||
cv::ocl::oclMat _colorLocalDensity;
|
||||
cv::ocl::oclMat _imageGradient;
|
||||
|
||||
float _pR, _pG, _pB;
|
||||
bool _objectInit;
|
||||
|
||||
void _initColorSampling();
|
||||
void _adaptiveSpatialLPfilter(const cv::ocl::oclMat &inputFrame, const cv::ocl::oclMat &gradient, cv::ocl::oclMat &outputFrame);
|
||||
void _adaptiveHorizontalCausalFilter_addInput(const cv::ocl::oclMat &inputFrame, const cv::ocl::oclMat &gradient, cv::ocl::oclMat &outputFrame);
|
||||
void _adaptiveVerticalAnticausalFilter_multGain(const cv::ocl::oclMat &gradient, cv::ocl::oclMat &outputFrame);
|
||||
void _computeGradient(const cv::ocl::oclMat &luminance, cv::ocl::oclMat &gradient);
|
||||
void _normalizeOutputs_0_maxOutputValue(void);
|
||||
void _applyImageColorSpaceConversion(const cv::ocl::oclMat &inputFrame, cv::ocl::oclMat &outputFrame, const float *transformTable);
|
||||
};
|
||||
class RetinaFilter
|
||||
{
|
||||
public:
|
||||
RetinaFilter(const unsigned int sizeRows, const unsigned int sizeColumns, const bool colorMode = false, const int samplingMethod = RETINA_COLOR_BAYER, const bool useRetinaLogSampling = false, const double reductionFactor = 1.0, const double samplingStrenght = 10.0);
|
||||
~RetinaFilter();
|
||||
|
||||
void clearAllBuffers();
|
||||
void resize(const unsigned int NBrows, const unsigned int NBcolumns);
|
||||
bool checkInput(const cv::ocl::oclMat &input, const bool colorMode);
|
||||
bool runFilter(const cv::ocl::oclMat &imageInput, const bool useAdaptiveFiltering = true, const bool processRetinaParvoMagnoMapping = false, const bool useColorMode = false, const bool inputIsColorMultiplexed = false);
|
||||
|
||||
void setGlobalParameters(const float OPLspatialResponse1 = 0.7, const float OPLtemporalresponse1 = 1, const float OPLassymetryGain = 0, const float OPLspatialResponse2 = 5, const float OPLtemporalresponse2 = 1, const float LPfilterSpatialResponse = 5, const float LPfilterGain = 0, const float LPfilterTemporalresponse = 0, const float MovingContoursExtractorCoefficient = 5, const bool normalizeParvoOutput_0_maxOutputValue = false, const bool normalizeMagnoOutput_0_maxOutputValue = false, const float maxOutputValue = 255.0, const float maxInputValue = 255.0, const float meanValue = 128.0);
|
||||
|
||||
inline void setPhotoreceptorsLocalAdaptationSensitivity(const float V0CompressionParameter)
|
||||
{
|
||||
_photoreceptorsPrefilter.setV0CompressionParameter(1 - V0CompressionParameter);
|
||||
_setInitPeriodCount();
|
||||
};
|
||||
|
||||
inline void setParvoGanglionCellsLocalAdaptationSensitivity(const float V0CompressionParameter)
|
||||
{
|
||||
_ParvoRetinaFilter.setV0CompressionParameter(V0CompressionParameter);
|
||||
_setInitPeriodCount();
|
||||
};
|
||||
|
||||
inline void setGanglionCellsLocalAdaptationLPfilterParameters(const float spatialResponse, const float temporalResponse)
|
||||
{
|
||||
_ParvoRetinaFilter.setGanglionCellsLocalAdaptationLPfilterParameters(temporalResponse, spatialResponse);
|
||||
_setInitPeriodCount();
|
||||
};
|
||||
|
||||
inline void setMagnoGanglionCellsLocalAdaptationSensitivity(const float V0CompressionParameter)
|
||||
{
|
||||
_MagnoRetinaFilter.setV0CompressionParameter(V0CompressionParameter);
|
||||
_setInitPeriodCount();
|
||||
};
|
||||
|
||||
void setOPLandParvoParameters(const float beta1, const float tau1, const float k1, const float beta2, const float tau2, const float k2, const float V0CompressionParameter)
|
||||
{
|
||||
_ParvoRetinaFilter.setOPLandParvoFiltersParameters(beta1, tau1, k1, beta2, tau2, k2);
|
||||
_ParvoRetinaFilter.setV0CompressionParameter(V0CompressionParameter);
|
||||
_setInitPeriodCount();
|
||||
};
|
||||
|
||||
void setMagnoCoefficientsTable(const float parasolCells_beta, const float parasolCells_tau, const float parasolCells_k, const float amacrinCellsTemporalCutFrequency, const float V0CompressionParameter, const float localAdaptintegration_tau, const float localAdaptintegration_k)
|
||||
{
|
||||
_MagnoRetinaFilter.setCoefficientsTable(parasolCells_beta, parasolCells_tau, parasolCells_k, amacrinCellsTemporalCutFrequency, localAdaptintegration_tau, localAdaptintegration_k);
|
||||
_MagnoRetinaFilter.setV0CompressionParameter(V0CompressionParameter);
|
||||
_setInitPeriodCount();
|
||||
};
|
||||
|
||||
inline void activateNormalizeParvoOutput_0_maxOutputValue(const bool normalizeParvoOutput_0_maxOutputValue)
|
||||
{
|
||||
_normalizeParvoOutput_0_maxOutputValue = normalizeParvoOutput_0_maxOutputValue;
|
||||
};
|
||||
|
||||
inline void activateNormalizeMagnoOutput_0_maxOutputValue(const bool normalizeMagnoOutput_0_maxOutputValue)
|
||||
{
|
||||
_normalizeMagnoOutput_0_maxOutputValue = normalizeMagnoOutput_0_maxOutputValue;
|
||||
};
|
||||
|
||||
inline void setMaxOutputValue(const float maxOutputValue)
|
||||
{
|
||||
_maxOutputValue = maxOutputValue;
|
||||
};
|
||||
|
||||
void setColorMode(const bool desiredColorMode)
|
||||
{
|
||||
_useColorMode = desiredColorMode;
|
||||
};
|
||||
inline void setColorSaturation(const bool saturateColors = true, const float colorSaturationValue = 4.0)
|
||||
{
|
||||
_colorEngine.setColorSaturation(saturateColors, colorSaturationValue);
|
||||
};
|
||||
inline const cv::ocl::oclMat &getLocalAdaptation() const
|
||||
{
|
||||
return _photoreceptorsPrefilter.getOutput();
|
||||
};
|
||||
inline const cv::ocl::oclMat &getPhotoreceptors() const
|
||||
{
|
||||
return _ParvoRetinaFilter.getPhotoreceptorsLPfilteringOutput();
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getHorizontalCells() const
|
||||
{
|
||||
return _ParvoRetinaFilter.getHorizontalCellsOutput();
|
||||
};
|
||||
inline bool areContoursProcessed()
|
||||
{
|
||||
return _useParvoOutput;
|
||||
};
|
||||
bool getParvoFoveaResponse(cv::ocl::oclMat &parvoFovealResponse);
|
||||
inline void activateContoursProcessing(const bool useParvoOutput)
|
||||
{
|
||||
_useParvoOutput = useParvoOutput;
|
||||
};
|
||||
|
||||
const cv::ocl::oclMat &getContours();
|
||||
|
||||
inline const cv::ocl::oclMat &getContoursON() const
|
||||
{
|
||||
return _ParvoRetinaFilter.getParvoON();
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getContoursOFF() const
|
||||
{
|
||||
return _ParvoRetinaFilter.getParvoOFF();
|
||||
};
|
||||
|
||||
inline bool areMovingContoursProcessed()
|
||||
{
|
||||
return _useMagnoOutput;
|
||||
};
|
||||
|
||||
inline void activateMovingContoursProcessing(const bool useMagnoOutput)
|
||||
{
|
||||
_useMagnoOutput = useMagnoOutput;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getMovingContours() const
|
||||
{
|
||||
return _MagnoRetinaFilter.getOutput();
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getMovingContoursSaturated() const
|
||||
{
|
||||
return _MagnoRetinaFilter.getMagnoYsaturated();
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getMovingContoursON() const
|
||||
{
|
||||
return _MagnoRetinaFilter.getMagnoON();
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getMovingContoursOFF() const
|
||||
{
|
||||
return _MagnoRetinaFilter.getMagnoOFF();
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getRetinaParvoMagnoMappedOutput() const
|
||||
{
|
||||
return _retinaParvoMagnoMappedFrame;
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getParvoContoursChannel() const
|
||||
{
|
||||
return _colorEngine.getLuminance();
|
||||
};
|
||||
|
||||
inline const cv::ocl::oclMat &getParvoChrominance() const
|
||||
{
|
||||
return _colorEngine.getChrominance();
|
||||
};
|
||||
inline const cv::ocl::oclMat &getColorOutput() const
|
||||
{
|
||||
return _colorEngine.getDemultiplexedColorFrame();
|
||||
};
|
||||
|
||||
inline bool isColorMode()
|
||||
{
|
||||
return _useColorMode;
|
||||
};
|
||||
bool getColorMode()
|
||||
{
|
||||
return _useColorMode;
|
||||
};
|
||||
|
||||
inline bool isInitTransitionDone()
|
||||
{
|
||||
if (_ellapsedFramesSinceLastReset < _globalTemporalConstant)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
inline float getRetinaSamplingBackProjection(const float projectedRadiusLength)
|
||||
{
|
||||
return projectedRadiusLength;
|
||||
};
|
||||
|
||||
inline unsigned int getInputNBrows()
|
||||
{
|
||||
return _photoreceptorsPrefilter.getNBrows();
|
||||
};
|
||||
|
||||
inline unsigned int getInputNBcolumns()
|
||||
{
|
||||
return _photoreceptorsPrefilter.getNBcolumns();
|
||||
};
|
||||
|
||||
inline unsigned int getInputNBpixels()
|
||||
{
|
||||
return _photoreceptorsPrefilter.getNBpixels();
|
||||
};
|
||||
|
||||
inline unsigned int getOutputNBrows()
|
||||
{
|
||||
return _photoreceptorsPrefilter.getNBrows();
|
||||
};
|
||||
|
||||
inline unsigned int getOutputNBcolumns()
|
||||
{
|
||||
return _photoreceptorsPrefilter.getNBcolumns();
|
||||
};
|
||||
|
||||
inline unsigned int getOutputNBpixels()
|
||||
{
|
||||
return _photoreceptorsPrefilter.getNBpixels();
|
||||
};
|
||||
private:
|
||||
bool _useParvoOutput;
|
||||
bool _useMagnoOutput;
|
||||
|
||||
unsigned int _ellapsedFramesSinceLastReset;
|
||||
unsigned int _globalTemporalConstant;
|
||||
|
||||
cv::ocl::oclMat _retinaParvoMagnoMappedFrame;
|
||||
BasicRetinaFilter _photoreceptorsPrefilter;
|
||||
ParvoRetinaFilter _ParvoRetinaFilter;
|
||||
MagnoRetinaFilter _MagnoRetinaFilter;
|
||||
RetinaColor _colorEngine;
|
||||
|
||||
bool _useMinimalMemoryForToneMappingONLY;
|
||||
bool _normalizeParvoOutput_0_maxOutputValue;
|
||||
bool _normalizeMagnoOutput_0_maxOutputValue;
|
||||
float _maxOutputValue;
|
||||
bool _useColorMode;
|
||||
|
||||
void _setInitPeriodCount();
|
||||
void _processRetinaParvoMagnoMapping();
|
||||
void _runGrayToneMapping(const cv::ocl::oclMat &grayImageInput, cv::ocl::oclMat &grayImageOutput , const float PhotoreceptorsCompression = 0.6, const float ganglionCellsCompression = 0.6);
|
||||
};
|
||||
|
||||
} /* namespace ocl */
|
||||
} /* namespace bioinspired */
|
||||
} /* namespace cv */
|
||||
|
||||
#endif /* HAVE_OPENCV_OCL */
|
||||
#endif /* __OCL_RETINA_HPP__ */
|
||||
@@ -1 +0,0 @@
|
||||
#include "test_precomp.hpp"
|
||||
144
modules/bioinspired/test/test_retina_ocl.cpp
Normal file
144
modules/bioinspired/test/test_retina_ocl.cpp
Normal file
@@ -0,0 +1,144 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2010-2013, Multicoreware, Inc., all rights reserved.
|
||||
// Copyright (C) 2010-2013, Advanced Micro Devices, Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// @Authors
|
||||
// Peng Xiao, pengxiao@multicorewareinc.com
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other oclMaterials provided with the distribution.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
#include "opencv2/opencv_modules.hpp"
|
||||
#include "opencv2/bioinspired.hpp"
|
||||
#include "opencv2/imgproc.hpp"
|
||||
#include "opencv2/highgui.hpp"
|
||||
|
||||
#if defined(HAVE_OPENCV_OCL) && defined(HAVE_OPENCL)
|
||||
|
||||
#include "opencv2/ocl.hpp"
|
||||
#define RETINA_ITERATIONS 5
|
||||
|
||||
static double checkNear(const cv::Mat &m1, const cv::Mat &m2)
|
||||
{
|
||||
return cv::norm(m1, m2, cv::NORM_INF);
|
||||
}
|
||||
|
||||
#define PARAM_TEST_CASE(name, ...) struct name : testing::TestWithParam< std::tr1::tuple< __VA_ARGS__ > >
|
||||
#define GET_PARAM(k) std::tr1::get< k >(GetParam())
|
||||
|
||||
static int oclInit = false;
|
||||
|
||||
PARAM_TEST_CASE(Retina_OCL, bool, int, bool, double, double)
|
||||
{
|
||||
bool colorMode;
|
||||
int colorSamplingMethod;
|
||||
bool useLogSampling;
|
||||
double reductionFactor;
|
||||
double samplingStrength;
|
||||
|
||||
std::vector<cv::ocl::Info> infos;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
colorMode = GET_PARAM(0);
|
||||
colorSamplingMethod = GET_PARAM(1);
|
||||
useLogSampling = GET_PARAM(2);
|
||||
reductionFactor = GET_PARAM(3);
|
||||
samplingStrength = GET_PARAM(4);
|
||||
|
||||
if(!oclInit)
|
||||
{
|
||||
cv::ocl::getDevice(infos);
|
||||
std::cout << "Device name:" << infos[0].DeviceName[0] << std::endl;
|
||||
oclInit = true;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(Retina_OCL, Accuracy)
|
||||
{
|
||||
using namespace cv;
|
||||
Mat input = imread(cvtest::TS::ptr()->get_data_path() + "shared/lena.png", colorMode);
|
||||
CV_Assert(!input.empty());
|
||||
ocl::oclMat ocl_input(input);
|
||||
|
||||
Ptr<bioinspired::Retina> ocl_retina = bioinspired::createRetina_OCL(
|
||||
input.size(),
|
||||
colorMode,
|
||||
colorSamplingMethod,
|
||||
useLogSampling,
|
||||
reductionFactor,
|
||||
samplingStrength);
|
||||
|
||||
Ptr<bioinspired::Retina> gold_retina = bioinspired::createRetina(
|
||||
input.size(),
|
||||
colorMode,
|
||||
colorSamplingMethod,
|
||||
useLogSampling,
|
||||
reductionFactor,
|
||||
samplingStrength);
|
||||
|
||||
Mat gold_parvo;
|
||||
Mat gold_magno;
|
||||
ocl::oclMat ocl_parvo;
|
||||
ocl::oclMat ocl_magno;
|
||||
|
||||
for(int i = 0; i < RETINA_ITERATIONS; i ++)
|
||||
{
|
||||
ocl_retina->run(ocl_input);
|
||||
gold_retina->run(input);
|
||||
|
||||
gold_retina->getParvo(gold_parvo);
|
||||
gold_retina->getMagno(gold_magno);
|
||||
|
||||
ocl_retina->getParvo(ocl_parvo);
|
||||
ocl_retina->getMagno(ocl_magno);
|
||||
|
||||
EXPECT_LE(checkNear(gold_parvo, (Mat)ocl_parvo), 1.0);
|
||||
EXPECT_LE(checkNear(gold_magno, (Mat)ocl_magno), 1.0);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(Contrib, Retina_OCL, testing::Combine(
|
||||
testing::Values(false, true),
|
||||
testing::Values((int)cv::bioinspired::RETINA_COLOR_BAYER),
|
||||
testing::Values(false/*,true*/),
|
||||
testing::Values(1.0, 0.5),
|
||||
testing::Values(10.0, 5.0)));
|
||||
#endif
|
||||
@@ -6,4 +6,3 @@ calib3d. Camera Calibration and 3D Reconstruction
|
||||
:maxdepth: 2
|
||||
|
||||
camera_calibration_and_3d_reconstruction
|
||||
|
||||
|
||||
@@ -45,4 +45,4 @@
|
||||
#error this is a compatibility header which should not be used inside the OpenCV library
|
||||
#endif
|
||||
|
||||
#include "opencv2/calib3d.hpp"
|
||||
#include "opencv2/calib3d.hpp"
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#include "perf_precomp.hpp"
|
||||
@@ -47,7 +47,7 @@ using namespace cv;
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -428,4 +428,3 @@ CV_IMPL void cvConvertPointsHomogeneous( const CvMat* _src, CvMat* _dst )
|
||||
dst.convertTo(dst0, dst0.type());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -621,4 +621,3 @@ void epnp::qr_solve(CvMat * A, CvMat * b, CvMat * X)
|
||||
pX[i] = (pb[i] - sum) / A2[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -529,16 +529,16 @@ int cv::recoverPose( InputArray E, InputArray _points1, InputArray _points2, Out
|
||||
mask4 = (Q.row(2) > 0) & mask4;
|
||||
mask4 = (Q.row(2) < dist) & mask4;
|
||||
|
||||
mask1 = mask1.t();
|
||||
mask2 = mask2.t();
|
||||
mask3 = mask3.t();
|
||||
mask4 = mask4.t();
|
||||
mask1 = mask1.t();
|
||||
mask2 = mask2.t();
|
||||
mask3 = mask3.t();
|
||||
mask4 = mask4.t();
|
||||
|
||||
// If _mask is given, then use it to filter outliers.
|
||||
if (!_mask.empty())
|
||||
{
|
||||
Mat mask = _mask.getMat();
|
||||
CV_Assert(mask.size() == mask1.size());
|
||||
CV_Assert(mask.size() == mask1.size());
|
||||
bitwise_and(mask, mask1, mask1);
|
||||
bitwise_and(mask, mask2, mask2);
|
||||
bitwise_and(mask, mask3, mask3);
|
||||
@@ -546,7 +546,7 @@ int cv::recoverPose( InputArray E, InputArray _points1, InputArray _points2, Out
|
||||
}
|
||||
if (_mask.empty() && _mask.needed())
|
||||
{
|
||||
_mask.create(mask1.size(), CV_8U);
|
||||
_mask.create(mask1.size(), CV_8U);
|
||||
}
|
||||
|
||||
CV_Assert(_R.needed() && _t.needed());
|
||||
|
||||
@@ -259,6 +259,8 @@ public:
|
||||
Jptr[8] = Jptr[9] = Jptr[10] = 0.;
|
||||
Jptr[11] = Mx*ww; Jptr[12] = My*ww; Jptr[13] = ww;
|
||||
Jptr[14] = -Mx*ww*yi; Jptr[15] = -My*ww*yi;
|
||||
|
||||
Jptr += 16;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -47,30 +47,30 @@
|
||||
This is translation to C++ of the Matlab's LMSolve package by Miroslav Balda.
|
||||
Here is the original copyright:
|
||||
============================================================================
|
||||
|
||||
|
||||
Copyright (c) 2007, Miroslav Balda
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
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
|
||||
* 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
|
||||
* 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
|
||||
|
||||
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 THE COPYRIGHT OWNER 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
|
||||
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 THE COPYRIGHT OWNER 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.
|
||||
*/
|
||||
|
||||
@@ -112,7 +112,7 @@ public:
|
||||
gemm(J, r, 1, noArray(), 0, v, GEMM_1_T);
|
||||
|
||||
Mat D = A.diag().clone();
|
||||
|
||||
|
||||
const double Rlo = 0.25, Rhi = 0.75;
|
||||
double lambda = 1, lc = 0.75;
|
||||
int i, iter = 0;
|
||||
@@ -222,5 +222,5 @@ Ptr<LMSolver> createLMSolver(const Ptr<LMSolver::Callback>& cb, int maxIters)
|
||||
CV_Assert( !LMSolverImpl_info_auto.name().empty() );
|
||||
return new LMSolverImpl(cb, maxIters);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -411,4 +411,3 @@ bool p3p::jacobi_4x4(double * A, double * D, double * U)
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -59,4 +59,3 @@ class p3p
|
||||
};
|
||||
|
||||
#endif // P3P_H
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//
|
||||
// Intel License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000, Intel Corporation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of Intel Corporation may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
/* End of file. */
|
||||
@@ -534,4 +534,3 @@ int cv::estimateAffine3D(InputArray _from, InputArray _to,
|
||||
|
||||
return createRANSACPointSetRegistrator(new Affine3DEstimatorCallback, 4, param1, param2)->run(dFrom, dTo, _out, _inliers);
|
||||
}
|
||||
|
||||
|
||||
@@ -348,4 +348,3 @@ void cv::solvePnPRansac(InputArray _opoints, InputArray _ipoints,
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1169,4 +1169,3 @@ void cv::validateDisparity( InputOutputArray _disp, InputArray _cost, int minDis
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -52,30 +52,30 @@ TEST(Calib3d_Affine3f, accuracy)
|
||||
|
||||
cv::Mat expected;
|
||||
cv::Rodrigues(rvec, expected);
|
||||
|
||||
|
||||
|
||||
|
||||
ASSERT_EQ(0, norm(cv::Mat(affine.matrix, false).colRange(0, 3).rowRange(0, 3) != expected));
|
||||
ASSERT_EQ(0, norm(cv::Mat(affine.linear()) != expected));
|
||||
|
||||
|
||||
|
||||
|
||||
cv::Matx33d R = cv::Matx33d::eye();
|
||||
|
||||
|
||||
double angle = 50;
|
||||
R.val[0] = R.val[4] = std::cos(CV_PI*angle/180.0);
|
||||
R.val[3] = std::sin(CV_PI*angle/180.0);
|
||||
R.val[1] = -R.val[3];
|
||||
|
||||
|
||||
|
||||
|
||||
cv::Affine3d affine1(cv::Mat(cv::Vec3d(0.2, 0.5, 0.3)).reshape(1, 1), cv::Vec3d(4, 5, 6));
|
||||
cv::Affine3d affine2(R, cv::Vec3d(1, 1, 0.4));
|
||||
|
||||
|
||||
cv::Affine3d result = affine1.inv() * affine2;
|
||||
|
||||
|
||||
expected = cv::Mat(affine1.matrix.inv(cv::DECOMP_SVD)) * cv::Mat(affine2.matrix, false);
|
||||
|
||||
|
||||
|
||||
cv::Mat diff;
|
||||
cv::absdiff(expected, result.matrix, diff);
|
||||
|
||||
|
||||
ASSERT_LT(cv::norm(diff, cv::NORM_INF), 1e-15);
|
||||
}
|
||||
|
||||
@@ -195,4 +195,3 @@ void CV_Affine3D_EstTest::run( int /* start_from */)
|
||||
}
|
||||
|
||||
TEST(Calib3d_EstimateAffineTransform, accuracy) { CV_Affine3D_EstTest test; test.safe_run(); }
|
||||
|
||||
|
||||
@@ -735,5 +735,3 @@ protected:
|
||||
TEST(Calib3d_CalibrateCamera_C, badarg) { CV_CameraCalibrationBadArgTest test; test.safe_run(); }
|
||||
TEST(Calib3d_Rodrigues_C, badarg) { CV_Rodrigues2BadArgTest test; test.safe_run(); }
|
||||
TEST(Calib3d_ProjectPoints_C, badarg) { CV_ProjectPoints2BadArgTest test; test.safe_run(); }
|
||||
|
||||
|
||||
|
||||
@@ -329,4 +329,3 @@ Mat cv::ChessBoardGenerator::operator ()(const Mat& bg, const Mat& camMat, const
|
||||
return generateChessBoard(bg, camMat, distCoeffs, zero, pb1, pb2,
|
||||
squareSize.width, squareSize.height, pts3d, corners);
|
||||
}
|
||||
|
||||
|
||||
@@ -212,4 +212,3 @@ protected:
|
||||
};
|
||||
|
||||
TEST(Calib3d_ComposeRT, accuracy) { CV_composeRT_Test test; test.safe_run(); }
|
||||
|
||||
|
||||
@@ -229,4 +229,3 @@ void CV_ModelEstimator2_Test::run_func()
|
||||
TEST(Calib3d_ModelEstimator2, accuracy) { CV_ModelEstimator2_Test test; test.safe_run(); }
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#include "test_precomp.hpp"
|
||||
@@ -21,4 +21,3 @@ namespace cvtest
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -173,4 +173,3 @@ protected:
|
||||
};
|
||||
|
||||
TEST(Calib3d_ReprojectImageTo3D, accuracy) { CV_ReprojectImageTo3DTest test; test.safe_run(); }
|
||||
|
||||
|
||||
@@ -306,4 +306,4 @@ TEST(DISABLED_Calib3d_SolvePnPRansac, concurrency)
|
||||
EXPECT_LT(tnorm, 1e-6);
|
||||
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
@@ -94,4 +94,4 @@ void CV_UndistortTest::run(int /* start_from */)
|
||||
}
|
||||
}
|
||||
|
||||
TEST(Calib3d_Undistort, accuracy) { CV_UndistortTest test; test.safe_run(); }
|
||||
TEST(Calib3d_Undistort, accuracy) { CV_UndistortTest test; test.safe_run(); }
|
||||
|
||||
@@ -626,5 +626,3 @@ CSV for the AT&T Facedatabase
|
||||
.. literalinclude:: etc/at.txt
|
||||
:language: none
|
||||
:linenos:
|
||||
|
||||
|
||||
|
||||
@@ -30,4 +30,3 @@ Indices and tables
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
|
||||
|
||||
@@ -23,4 +23,3 @@ target_link_libraries(facerec_fisherfaces opencv_contrib opencv_core opencv_imgp
|
||||
|
||||
add_executable(facerec_lbph facerec_lbph.cpp)
|
||||
target_link_libraries(facerec_lbph opencv_contrib opencv_core opencv_imgproc opencv_highgui)
|
||||
|
||||
|
||||
@@ -231,5 +231,3 @@ Here are some examples:
|
||||
+---------------------------------+----------------------------------------------------------------------------+
|
||||
| 0.2 (20%), 0.2 (20%), (70,70) | .. image:: ../img/tutorial/gender_classification/arnie_20_20_70_70.jpg |
|
||||
+---------------------------------+----------------------------------------------------------------------------+
|
||||
|
||||
|
||||
|
||||
@@ -44,4 +44,3 @@ And here is the Reconstruction, which is the same as the original:
|
||||
|
||||
.. image:: ../img/eigenface_reconstruction_opencv.png
|
||||
:align: center
|
||||
|
||||
|
||||
@@ -205,5 +205,3 @@ Here are some examples:
|
||||
+---------------------------------+----------------------------------------------------------------------------+
|
||||
| 0.2 (20%), 0.2 (20%), (70,70) | .. image:: ../img/tutorial/gender_classification/arnie_20_20_70_70.jpg |
|
||||
+---------------------------------+----------------------------------------------------------------------------+
|
||||
|
||||
|
||||
|
||||
@@ -113,5 +113,3 @@ The method executes the variational algorithm on a rectified stereo pair. See ``
|
||||
**Note**:
|
||||
|
||||
The method is not constant, so you should not use the same ``StereoVar`` instance from different threads simultaneously.
|
||||
|
||||
|
||||
|
||||
@@ -286,5 +286,3 @@ void CvAdaptiveSkinDetector::Histogram::mergeWith(CvAdaptiveSkinDetector::Histog
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -136,4 +136,3 @@ Mat BOWMSCTrainer::cluster(const Mat& _descriptors) const {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -287,4 +287,3 @@ bool ChowLiuTree::reduceEdgesToMinSpan(std::list<info>& edges) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -132,5 +132,3 @@ Point2f CvMeanShiftTracker::getTrackingCenter()
|
||||
{
|
||||
return prev_center;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -41,4 +41,3 @@
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
|
||||
@@ -892,4 +892,3 @@ const cv::DetectionBasedTracker::Parameters& DetectionBasedTracker::getParameter
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -221,4 +221,3 @@ Point2f CvFeatureTracker::getTrackingCenter()
|
||||
center.y = (float)(prev_center.y + prev_trackwindow.height/2.0);
|
||||
return center;
|
||||
}
|
||||
|
||||
|
||||
@@ -721,4 +721,3 @@ void CvFuzzyMeanShiftTracker::track(IplImage *maskImage, IplImage *depthMap, int
|
||||
searchMode = tsTracking;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -233,4 +233,3 @@ void CvHybridTracker::updateTrackerWithLowPassFilter(Mat) {
|
||||
Rect CvHybridTracker::getTrackingWindow() {
|
||||
return prev_window;
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
namespace cv
|
||||
{
|
||||
std::vector<String> Directory::GetListFiles( const String& path, const String & exten, bool addPath )
|
||||
std::vector<String> Directory::GetListFiles( const String& path, const String & exten, bool addPath )
|
||||
{
|
||||
std::vector<String> list;
|
||||
list.clear();
|
||||
@@ -24,10 +24,9 @@ namespace cv
|
||||
HANDLE hFind;
|
||||
|
||||
#ifdef HAVE_WINRT
|
||||
size_t size = mbstowcs(NULL, path_f.c_str(), path_f.size());
|
||||
Ptr<wchar_t> wpath = new wchar_t[size+1];
|
||||
wpath[size] = 0;
|
||||
mbstowcs(wpath, path_f.c_str(), path_f.size());
|
||||
wchar_t wpath[MAX_PATH];
|
||||
size_t copied = mbstowcs(wpath, path_f.c_str(), MAX_PATH);
|
||||
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
|
||||
hFind = FindFirstFileExW(wpath, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
|
||||
#else
|
||||
hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
|
||||
@@ -46,12 +45,12 @@ namespace cv
|
||||
FindFileData.dwFileAttributes == FILE_ATTRIBUTE_SYSTEM ||
|
||||
FindFileData.dwFileAttributes == FILE_ATTRIBUTE_READONLY)
|
||||
{
|
||||
cv::Ptr<char> fname;
|
||||
char* fname;
|
||||
#ifdef HAVE_WINRT
|
||||
size_t asize = wcstombs(NULL, FindFileData.cFileName, 0);
|
||||
fname = new char[asize+1];
|
||||
fname[asize] = 0;
|
||||
wcstombs(fname, FindFileData.cFileName, asize);
|
||||
char fname_tmp[MAX_PATH] = {0};
|
||||
size_t copied = wcstombs(fname_tmp, FindFileData.cFileName, MAX_PATH);
|
||||
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
|
||||
fname = fname_tmp;
|
||||
#else
|
||||
fname = FindFileData.cFileName;
|
||||
#endif
|
||||
@@ -108,10 +107,10 @@ namespace cv
|
||||
HANDLE hFind;
|
||||
|
||||
#ifdef HAVE_WINRT
|
||||
size_t size = mbstowcs(NULL, path_f.c_str(), path_f.size());
|
||||
Ptr<wchar_t> wpath = new wchar_t[size+1];
|
||||
wpath[size] = 0;
|
||||
mbstowcs(wpath, path_f.c_str(), path_f.size());
|
||||
wchar_t wpath [MAX_PATH];
|
||||
size_t copied = mbstowcs(wpath, path_f.c_str(), path_f.size());
|
||||
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
|
||||
|
||||
hFind = FindFirstFileExW(wpath, FindExInfoStandard, &FindFileData, FindExSearchNameMatch, NULL, 0);
|
||||
#else
|
||||
hFind = FindFirstFileA((LPCSTR)path_f.c_str(), &FindFileData);
|
||||
@@ -134,12 +133,12 @@ namespace cv
|
||||
strcmp(FindFileData.cFileName, "..") != 0)
|
||||
#endif
|
||||
{
|
||||
cv::Ptr<char> fname;
|
||||
char* fname;
|
||||
#ifdef HAVE_WINRT
|
||||
size_t asize = wcstombs(NULL, FindFileData.cFileName, 0);
|
||||
fname = new char[asize+1];
|
||||
fname[asize] = 0;
|
||||
wcstombs(fname, FindFileData.cFileName, asize);
|
||||
char fname_tmp[MAX_PATH];
|
||||
size_t copied = wcstombs(fname_tmp, FindFileData.cFileName, MAX_PATH);
|
||||
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
|
||||
fname = fname_tmp;
|
||||
#else
|
||||
fname = FindFileData.cFileName;
|
||||
#endif
|
||||
|
||||
@@ -1106,4 +1106,3 @@ Mat LDA::reconstruct(InputArray src) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -649,4 +649,3 @@ LogPolar_Adjacent::~LogPolar_Adjacent()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
//
|
||||
// Intel License Agreement
|
||||
// For Open Source Computer Vision Library
|
||||
//
|
||||
// Copyright (C) 2000, Intel Corporation, all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of Intel Corporation may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
/* End of file. */
|
||||
@@ -408,4 +408,4 @@ void StereoVar::operator ()( const Mat& left, const Mat& right, Mat& disp )
|
||||
|
||||
u.release();
|
||||
}
|
||||
} // namespace
|
||||
} // namespace
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#include "test_precomp.hpp"
|
||||
@@ -14,4 +14,3 @@
|
||||
#include <iostream>
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
set(the_description "The Core Functionality")
|
||||
ocv_add_module(core ${ZLIB_LIBRARIES} OPTIONAL opencv_cudev)
|
||||
ocv_module_include_directories(${ZLIB_INCLUDE_DIR})
|
||||
ocv_module_include_directories(${ZLIB_INCLUDE_DIRS})
|
||||
|
||||
if (HAVE_WINRT)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /ZW /GS /Gm- /AI\"${WINDOWS_SDK_PATH}/References/CommonConfiguration/Neutral\" /AI\"${VISUAL_STUDIO_PATH}/vcpackages\"")
|
||||
|
||||
@@ -49,6 +49,43 @@ Point\_
|
||||
-------
|
||||
.. ocv:class:: Point_
|
||||
|
||||
::
|
||||
|
||||
template<typename _Tp> class CV_EXPORTS Point_
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
// various constructors
|
||||
Point_();
|
||||
Point_(_Tp _x, _Tp _y);
|
||||
Point_(const Point_& pt);
|
||||
Point_(const CvPoint& pt);
|
||||
Point_(const CvPoint2D32f& pt);
|
||||
Point_(const Size_<_Tp>& sz);
|
||||
Point_(const Vec<_Tp, 2>& v);
|
||||
|
||||
Point_& operator = (const Point_& pt);
|
||||
//! conversion to another data type
|
||||
template<typename _Tp2> operator Point_<_Tp2>() const;
|
||||
|
||||
//! conversion to the old-style C structures
|
||||
operator CvPoint() const;
|
||||
operator CvPoint2D32f() const;
|
||||
operator Vec<_Tp, 2>() const;
|
||||
|
||||
//! dot product
|
||||
_Tp dot(const Point_& pt) const;
|
||||
//! dot product computed in double-precision arithmetics
|
||||
double ddot(const Point_& pt) const;
|
||||
//! cross-product
|
||||
double cross(const Point_& pt) const;
|
||||
//! checks whether the point is inside the specified rectangle
|
||||
bool inside(const Rect_<_Tp>& r) const;
|
||||
|
||||
_Tp x, y; //< the point coordinates
|
||||
};
|
||||
|
||||
Template class for 2D points specified by its coordinates
|
||||
:math:`x` and
|
||||
:math:`y` .
|
||||
@@ -84,6 +121,39 @@ Point3\_
|
||||
--------
|
||||
.. ocv:class:: Point3_
|
||||
|
||||
::
|
||||
|
||||
template<typename _Tp> class CV_EXPORTS Point3_
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
// various constructors
|
||||
Point3_();
|
||||
Point3_(_Tp _x, _Tp _y, _Tp _z);
|
||||
Point3_(const Point3_& pt);
|
||||
explicit Point3_(const Point_<_Tp>& pt);
|
||||
Point3_(const CvPoint3D32f& pt);
|
||||
Point3_(const Vec<_Tp, 3>& v);
|
||||
|
||||
Point3_& operator = (const Point3_& pt);
|
||||
//! conversion to another data type
|
||||
template<typename _Tp2> operator Point3_<_Tp2>() const;
|
||||
//! conversion to the old-style CvPoint...
|
||||
operator CvPoint3D32f() const;
|
||||
//! conversion to cv::Vec<>
|
||||
operator Vec<_Tp, 3>() const;
|
||||
|
||||
//! dot product
|
||||
_Tp dot(const Point3_& pt) const;
|
||||
//! dot product computed in double-precision arithmetics
|
||||
double ddot(const Point3_& pt) const;
|
||||
//! cross product of the 2 3D points
|
||||
Point3_ cross(const Point3_& pt) const;
|
||||
|
||||
_Tp x, y, z; //< the point coordinates
|
||||
};
|
||||
|
||||
Template class for 3D points specified by its coordinates
|
||||
:math:`x`,
|
||||
:math:`y` and
|
||||
@@ -100,6 +170,35 @@ Size\_
|
||||
------
|
||||
.. ocv:class:: Size_
|
||||
|
||||
::
|
||||
|
||||
template<typename _Tp> class CV_EXPORTS Size_
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
//! various constructors
|
||||
Size_();
|
||||
Size_(_Tp _width, _Tp _height);
|
||||
Size_(const Size_& sz);
|
||||
Size_(const CvSize& sz);
|
||||
Size_(const CvSize2D32f& sz);
|
||||
Size_(const Point_<_Tp>& pt);
|
||||
|
||||
Size_& operator = (const Size_& sz);
|
||||
//! the area (width*height)
|
||||
_Tp area() const;
|
||||
|
||||
//! conversion of another data type.
|
||||
template<typename _Tp2> operator Size_<_Tp2>() const;
|
||||
|
||||
//! conversion to the old-style OpenCV types
|
||||
operator CvSize() const;
|
||||
operator CvSize2D32f() const;
|
||||
|
||||
_Tp width, height; // the width and the height
|
||||
};
|
||||
|
||||
Template class for specifying the size of an image or rectangle. The class includes two members called ``width`` and ``height``. The structure can be converted to and from the old OpenCV structures
|
||||
``CvSize`` and ``CvSize2D32f`` . The same set of arithmetic and comparison operations as for ``Point_`` is available.
|
||||
|
||||
@@ -113,6 +212,43 @@ Rect\_
|
||||
------
|
||||
.. ocv:class:: Rect_
|
||||
|
||||
::
|
||||
|
||||
template<typename _Tp> class CV_EXPORTS Rect_
|
||||
{
|
||||
public:
|
||||
typedef _Tp value_type;
|
||||
|
||||
//! various constructors
|
||||
Rect_();
|
||||
Rect_(_Tp _x, _Tp _y, _Tp _width, _Tp _height);
|
||||
Rect_(const Rect_& r);
|
||||
Rect_(const CvRect& r);
|
||||
Rect_(const Point_<_Tp>& org, const Size_<_Tp>& sz);
|
||||
Rect_(const Point_<_Tp>& pt1, const Point_<_Tp>& pt2);
|
||||
|
||||
Rect_& operator = ( const Rect_& r );
|
||||
//! the top-left corner
|
||||
Point_<_Tp> tl() const;
|
||||
//! the bottom-right corner
|
||||
Point_<_Tp> br() const;
|
||||
|
||||
//! size (width, height) of the rectangle
|
||||
Size_<_Tp> size() const;
|
||||
//! area (width*height) of the rectangle
|
||||
_Tp area() const;
|
||||
|
||||
//! conversion to another data type
|
||||
template<typename _Tp2> operator Rect_<_Tp2>() const;
|
||||
//! conversion to the old-style CvRect
|
||||
operator CvRect() const;
|
||||
|
||||
//! checks whether the rectangle contains the point
|
||||
bool contains(const Point_<_Tp>& pt) const;
|
||||
|
||||
_Tp x, y, width, height; //< the top-left corner, as well as width and height of the rectangle
|
||||
};
|
||||
|
||||
Template class for 2D rectangles, described by the following parameters:
|
||||
|
||||
* Coordinates of the top-left corner. This is a default interpretation of ``Rect_::x`` and ``Rect_::y`` in OpenCV. Though, in your algorithms you may count ``x`` and ``y`` from the bottom-left corner.
|
||||
@@ -171,6 +307,28 @@ RotatedRect
|
||||
-----------
|
||||
.. ocv:class:: RotatedRect
|
||||
|
||||
::
|
||||
|
||||
class CV_EXPORTS RotatedRect
|
||||
{
|
||||
public:
|
||||
//! various constructors
|
||||
RotatedRect();
|
||||
RotatedRect(const Point2f& center, const Size2f& size, float angle);
|
||||
RotatedRect(const CvBox2D& box);
|
||||
|
||||
//! returns 4 vertices of the rectangle
|
||||
void points(Point2f pts[]) const;
|
||||
//! returns the minimal up-right rectangle containing the rotated rectangle
|
||||
Rect boundingRect() const;
|
||||
//! conversion to the old-style CvBox2D structure
|
||||
operator CvBox2D() const;
|
||||
|
||||
Point2f center; //< the rectangle mass center
|
||||
Size2f size; //< width and height of the rectangle
|
||||
float angle; //< the rotation angle. When the angle is 0, 90, 180, 270 etc., the rectangle becomes an up-right rectangle.
|
||||
};
|
||||
|
||||
The class represents rotated (i.e. not up-right) rectangles on a plane. Each rectangle is specified by the center point (mass center), length of each side (represented by cv::Size2f structure) and the rotation angle in degrees.
|
||||
|
||||
.. ocv:function:: RotatedRect::RotatedRect()
|
||||
@@ -217,7 +375,33 @@ TermCriteria
|
||||
------------
|
||||
.. ocv:class:: TermCriteria
|
||||
|
||||
The class defining termination criteria for iterative algorithms. You can initialize it by default constructor and then override any parameters, or the structure may be fully initialized using the advanced variant of the constructor.
|
||||
::
|
||||
|
||||
class CV_EXPORTS TermCriteria
|
||||
{
|
||||
public:
|
||||
enum
|
||||
{
|
||||
COUNT=1, //!< the maximum number of iterations or elements to compute
|
||||
MAX_ITER=COUNT, //!< ditto
|
||||
EPS=2 //!< the desired accuracy or change in parameters at which the iterative algorithm stops
|
||||
};
|
||||
|
||||
//! default constructor
|
||||
TermCriteria();
|
||||
//! full constructor
|
||||
TermCriteria(int type, int maxCount, double epsilon);
|
||||
//! conversion from CvTermCriteria
|
||||
TermCriteria(const CvTermCriteria& criteria);
|
||||
//! conversion to CvTermCriteria
|
||||
operator CvTermCriteria() const;
|
||||
|
||||
int type; //!< the type of termination criteria: COUNT, EPS or COUNT + EPS
|
||||
int maxCount; // the maximum number of iterations/elements
|
||||
double epsilon; // the desired accuracy
|
||||
};
|
||||
|
||||
The class defining termination criteria for iterative algorithms. You can initialize it by default constructor and then override any parameters, or the structure may be fully initialized using the advanced variant of the constructor.
|
||||
|
||||
TermCriteria::TermCriteria
|
||||
--------------------------
|
||||
@@ -321,9 +505,36 @@ Scalar\_
|
||||
--------
|
||||
.. ocv:class:: Scalar_
|
||||
|
||||
Template class for a 4-element vector derived from Vec. ::
|
||||
Template class for a 4-element vector derived from Vec.
|
||||
|
||||
template<typename _Tp> class Scalar_ : public Vec<_Tp, 4> { ... };
|
||||
::
|
||||
|
||||
template<typename _Tp> class CV_EXPORTS Scalar_ : public Vec<_Tp, 4>
|
||||
{
|
||||
public:
|
||||
//! various constructors
|
||||
Scalar_();
|
||||
Scalar_(_Tp v0, _Tp v1, _Tp v2=0, _Tp v3=0);
|
||||
Scalar_(const CvScalar& s);
|
||||
Scalar_(_Tp v0);
|
||||
|
||||
//! returns a scalar with all elements set to v0
|
||||
static Scalar_<_Tp> all(_Tp v0);
|
||||
//! conversion to the old-style CvScalar
|
||||
operator CvScalar() const;
|
||||
|
||||
//! conversion to another data type
|
||||
template<typename T2> operator Scalar_<T2>() const;
|
||||
|
||||
//! per-element product
|
||||
Scalar_<_Tp> mul(const Scalar_<_Tp>& t, double scale=1 ) const;
|
||||
|
||||
// returns (v0, -v1, -v2, -v3)
|
||||
Scalar_<_Tp> conj() const;
|
||||
|
||||
// returns true iff v1 == v2 == v3 == 0
|
||||
bool isReal() const;
|
||||
};
|
||||
|
||||
typedef Scalar_<double> Scalar;
|
||||
|
||||
@@ -333,12 +544,21 @@ Range
|
||||
-----
|
||||
.. ocv:class:: Range
|
||||
|
||||
Template class specifying a continuous subsequence (slice) of a sequence. ::
|
||||
Template class specifying a continuous subsequence (slice) of a sequence.
|
||||
|
||||
class Range
|
||||
::
|
||||
|
||||
class CV_EXPORTS Range
|
||||
{
|
||||
public:
|
||||
...
|
||||
Range();
|
||||
Range(int _start, int _end);
|
||||
Range(const CvSlice& slice);
|
||||
int size() const;
|
||||
bool empty() const;
|
||||
static Range all();
|
||||
operator CvSlice() const;
|
||||
|
||||
int start, end;
|
||||
};
|
||||
|
||||
@@ -418,6 +638,48 @@ The keypoint constructors
|
||||
:param _class_id: object id
|
||||
|
||||
|
||||
KeyPoint::convert
|
||||
--------------------
|
||||
|
||||
This method converts vector of keypoints to vector of points or the reverse, where each keypoint is assigned the same size and the same orientation.
|
||||
|
||||
.. ocv:function:: void KeyPoint::convert(const std::vector<KeyPoint>& keypoints, std::vector<Point2f>& points2f, const std::vector<int>& keypointIndexes=std::vector<int>())
|
||||
|
||||
.. ocv:function:: void KeyPoint::convert(const std::vector<Point2f>& points2f, std::vector<KeyPoint>& keypoints, float size=1, float response=1, int octave=0, int class_id=-1)
|
||||
|
||||
.. ocv:pyfunction:: cv2.KeyPoint_convert(keypoints[, keypointIndexes]) -> points2f
|
||||
|
||||
.. ocv:pyfunction:: cv2.KeyPoint_convert(points2f[, size[, response[, octave[, class_id]]]]) -> keypoints
|
||||
|
||||
:param keypoints: Keypoints obtained from any feature detection algorithm like SIFT/SURF/ORB
|
||||
|
||||
:param points2f: Array of (x,y) coordinates of each keypoint
|
||||
|
||||
:param keypointIndexes: Array of indexes of keypoints to be converted to points. (Acts like a mask to convert only specified keypoints)
|
||||
|
||||
:param _size: keypoint diameter
|
||||
|
||||
:param _response: keypoint detector response on the keypoint (that is, strength of the keypoint)
|
||||
|
||||
:param _octave: pyramid octave in which the keypoint has been detected
|
||||
|
||||
:param _class_id: object id
|
||||
|
||||
|
||||
KeyPoint::overlap
|
||||
--------------------
|
||||
|
||||
This method computes overlap for pair of keypoints. Overlap is the ratio between area of keypoint regions' intersection and area of keypoint regions' union (considering keypoint region as circle). If they don't overlap, we get zero. If they coincide at same location with same size, we get 1.
|
||||
|
||||
.. ocv:function:: float KeyPoint::overlap(const KeyPoint& kp1, const KeyPoint& kp2)
|
||||
|
||||
.. ocv:pyfunction:: cv2.KeyPoint_overlap(kp1, kp2) -> retval
|
||||
|
||||
:param kp1: First keypoint
|
||||
|
||||
:param kp2: Second keypoint
|
||||
|
||||
|
||||
DMatch
|
||||
------
|
||||
.. ocv:class:: DMatch
|
||||
@@ -617,8 +879,8 @@ Ptr::operator ->
|
||||
----------------
|
||||
Provide access to the object fields and methods.
|
||||
|
||||
.. ocv:function:: template<typename _Tp> _Tp* Ptr::operator -> ()
|
||||
.. ocv:function:: template<typename _Tp> const _Tp* Ptr::operator -> () const
|
||||
.. ocv:function:: template<typename _Tp> _Tp* Ptr::operator -> ()
|
||||
.. ocv:function:: template<typename _Tp> const _Tp* Ptr::operator -> () const
|
||||
|
||||
|
||||
Ptr::operator _Tp*
|
||||
@@ -626,15 +888,16 @@ Ptr::operator _Tp*
|
||||
Returns the underlying object pointer. Thanks to the methods, the ``Ptr<_Tp>`` can be used instead
|
||||
of ``_Tp*``.
|
||||
|
||||
.. ocv:function:: template<typename _Tp> Ptr::operator _Tp* ()
|
||||
.. ocv:function:: template<typename _Tp> Ptr::operator const _Tp*() const
|
||||
.. ocv:function:: template<typename _Tp> Ptr::operator _Tp* ()
|
||||
.. ocv:function:: template<typename _Tp> Ptr::operator const _Tp*() const
|
||||
|
||||
|
||||
Mat
|
||||
---
|
||||
.. ocv:class:: Mat
|
||||
|
||||
OpenCV C++ n-dimensional dense array class ::
|
||||
OpenCV C++ n-dimensional dense array class
|
||||
::
|
||||
|
||||
class CV_EXPORTS Mat
|
||||
{
|
||||
@@ -664,7 +927,6 @@ OpenCV C++ n-dimensional dense array class ::
|
||||
...
|
||||
};
|
||||
|
||||
|
||||
The class ``Mat`` represents an n-dimensional dense numerical single-channel or multi-channel array. It can be used to store real or complex-valued vectors and matrices, grayscale or color images, voxel volumes, vector fields, point clouds, tensors, histograms (though, very high-dimensional histograms may be better stored in a ``SparseMat`` ). The data layout of the array
|
||||
:math:`M` is defined by the array ``M.step[]``, so that the address of element
|
||||
:math:`(i_0,...,i_{M.dims-1})`, where
|
||||
@@ -1149,7 +1411,7 @@ The method makes a new header for the specified row span of the matrix. Similarl
|
||||
|
||||
Mat::colRange
|
||||
-------------
|
||||
Creates a matrix header for the specified row span.
|
||||
Creates a matrix header for the specified column span.
|
||||
|
||||
.. ocv:function:: Mat Mat::colRange(int startcol, int endcol) const
|
||||
|
||||
@@ -2491,6 +2753,82 @@ Algorithm
|
||||
---------
|
||||
.. ocv:class:: Algorithm
|
||||
|
||||
::
|
||||
|
||||
class CV_EXPORTS_W Algorithm
|
||||
{
|
||||
public:
|
||||
Algorithm();
|
||||
virtual ~Algorithm();
|
||||
string name() const;
|
||||
|
||||
template<typename _Tp> typename ParamType<_Tp>::member_type get(const string& name) const;
|
||||
template<typename _Tp> typename ParamType<_Tp>::member_type get(const char* name) const;
|
||||
|
||||
CV_WRAP int getInt(const string& name) const;
|
||||
CV_WRAP double getDouble(const string& name) const;
|
||||
CV_WRAP bool getBool(const string& name) const;
|
||||
CV_WRAP string getString(const string& name) const;
|
||||
CV_WRAP Mat getMat(const string& name) const;
|
||||
CV_WRAP vector<Mat> getMatVector(const string& name) const;
|
||||
CV_WRAP Ptr<Algorithm> getAlgorithm(const string& name) const;
|
||||
|
||||
void set(const string& name, int value);
|
||||
void set(const string& name, double value);
|
||||
void set(const string& name, bool value);
|
||||
void set(const string& name, const string& value);
|
||||
void set(const string& name, const Mat& value);
|
||||
void set(const string& name, const vector<Mat>& value);
|
||||
void set(const string& name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void set(const string& name, const Ptr<_Tp>& value);
|
||||
|
||||
CV_WRAP void setInt(const string& name, int value);
|
||||
CV_WRAP void setDouble(const string& name, double value);
|
||||
CV_WRAP void setBool(const string& name, bool value);
|
||||
CV_WRAP void setString(const string& name, const string& value);
|
||||
CV_WRAP void setMat(const string& name, const Mat& value);
|
||||
CV_WRAP void setMatVector(const string& name, const vector<Mat>& value);
|
||||
CV_WRAP void setAlgorithm(const string& name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void setAlgorithm(const string& name, const Ptr<_Tp>& value);
|
||||
|
||||
void set(const char* name, int value);
|
||||
void set(const char* name, double value);
|
||||
void set(const char* name, bool value);
|
||||
void set(const char* name, const string& value);
|
||||
void set(const char* name, const Mat& value);
|
||||
void set(const char* name, const vector<Mat>& value);
|
||||
void set(const char* name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void set(const char* name, const Ptr<_Tp>& value);
|
||||
|
||||
void setInt(const char* name, int value);
|
||||
void setDouble(const char* name, double value);
|
||||
void setBool(const char* name, bool value);
|
||||
void setString(const char* name, const string& value);
|
||||
void setMat(const char* name, const Mat& value);
|
||||
void setMatVector(const char* name, const vector<Mat>& value);
|
||||
void setAlgorithm(const char* name, const Ptr<Algorithm>& value);
|
||||
template<typename _Tp> void setAlgorithm(const char* name, const Ptr<_Tp>& value);
|
||||
|
||||
CV_WRAP string paramHelp(const string& name) const;
|
||||
int paramType(const char* name) const;
|
||||
CV_WRAP int paramType(const string& name) const;
|
||||
CV_WRAP void getParams(CV_OUT vector<string>& names) const;
|
||||
|
||||
|
||||
virtual void write(FileStorage& fs) const;
|
||||
virtual void read(const FileNode& fn);
|
||||
|
||||
typedef Algorithm* (*Constructor)(void);
|
||||
typedef int (Algorithm::*Getter)() const;
|
||||
typedef void (Algorithm::*Setter)(int);
|
||||
|
||||
CV_WRAP static void getList(CV_OUT vector<string>& algorithms);
|
||||
CV_WRAP static Ptr<Algorithm> _create(const string& name);
|
||||
template<typename _Tp> static Ptr<_Tp> create(const string& name);
|
||||
|
||||
virtual AlgorithmInfo* info() const /* TODO: make it = 0;*/ { return 0; }
|
||||
};
|
||||
|
||||
This is a base class for all more or less complex algorithms in OpenCV, especially for classes of algorithms, for which there can be multiple implementations. The examples are stereo correspondence (for which there are algorithms like block matching, semi-global block matching, graph-cut etc.), background subtraction (which can be done using mixture-of-gaussians models, codebook-based algorithm etc.), optical flow (block matching, Lucas-Kanade, Horn-Schunck etc.).
|
||||
|
||||
The class provides the following features for all derived classes:
|
||||
@@ -2645,4 +2983,3 @@ The above methods are usually enough for users. If you want to make your own alg
|
||||
* Add public virtual method ``AlgorithmInfo* info() const;`` to your class.
|
||||
* Add constructor function, ``AlgorithmInfo`` instance and implement the ``info()`` method. The simplest way is to take http://code.opencv.org/projects/opencv/repository/revisions/master/entry/modules/ml/src/ml_init.cpp as the reference and modify it according to the list of your parameters.
|
||||
* Add some public function (e.g. ``initModule_<mymodule>()``) that calls info() of your algorithm and put it into the same source file as ``info()`` implementation. This is to force C++ linker to include this object file into the target application. See ``Algorithm::create()`` for details.
|
||||
|
||||
|
||||
@@ -98,4 +98,3 @@ Use:
|
||||
# ./app -fps=aaa
|
||||
ERRORS:
|
||||
Exception: can not convert: [aaa] to [double]
|
||||
|
||||
|
||||
@@ -16,4 +16,3 @@ core. The Core Functionality
|
||||
clustering
|
||||
utility_and_system_functions_and_macros
|
||||
opengl_interop
|
||||
|
||||
|
||||
@@ -1580,4 +1580,3 @@ Gathers all node pointers to a single sequence.
|
||||
:param storage: Container for the sequence
|
||||
|
||||
The function puts pointers of all nodes reachable from ``first`` into a single sequence. The pointers are written sequentially in the depth-first order.
|
||||
|
||||
|
||||
@@ -1677,4 +1677,3 @@ For example, `NumPy <http://numpy.scipy.org/>`_ arrays support the array interfa
|
||||
(480, 640, 3) 1
|
||||
|
||||
.. note:: In the new Python wrappers (**cv2** module) the function is not needed, since cv2 can process Numpy arrays (and this is the only supported array type).
|
||||
|
||||
|
||||
@@ -670,6 +670,10 @@ public:
|
||||
//! reconstructs the original vector from the projection
|
||||
void backProject(InputArray vec, OutputArray result) const;
|
||||
|
||||
//! write and load PCA matrix
|
||||
void write(FileStorage& fs ) const;
|
||||
void read(const FileNode& fs);
|
||||
|
||||
Mat eigenvectors; //!< eigenvectors of the covariation matrix
|
||||
Mat eigenvalues; //!< eigenvalues of the covariation matrix
|
||||
Mat mean; //!< mean value subtracted before the projection and added after the back projection
|
||||
|
||||
@@ -430,5 +430,3 @@ cv::Affine3<T>::operator Eigen::Transform<T, 3, Eigen::Affine>() const
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* __OPENCV_CORE_AFFINE3_HPP__ */
|
||||
|
||||
|
||||
|
||||
@@ -107,25 +107,25 @@ namespace cv { namespace gpu { namespace cudev
|
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2GRAY_TRAITS
|
||||
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv, 3, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv, 4, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv4, 3, 4, 0)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv4, 4, 4, 0)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv, 3, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv, 4, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv4, 3, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv4, 4, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv, 3, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv, 4, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgb_to_yuv4, 3, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(rgba_to_yuv4, 4, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv, 3, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv, 4, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgr_to_yuv4, 3, 4, 0)
|
||||
OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS(bgra_to_yuv4, 4, 4, 0)
|
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_RGB2YUV_TRAITS
|
||||
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgb, 3, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgba, 3, 4, 0)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgb, 4, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgba, 4, 4, 0)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgr, 3, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgra, 3, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgr, 4, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgra, 4, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgb, 3, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_rgba, 3, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgb, 4, 3, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_rgba, 4, 4, 2)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgr, 3, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv_to_bgra, 3, 4, 0)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgr, 4, 3, 0)
|
||||
OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS(yuv4_to_bgra, 4, 4, 0)
|
||||
|
||||
#undef OPENCV_GPU_IMPLEMENT_YUV2RGB_TRAITS
|
||||
|
||||
|
||||
@@ -247,4 +247,4 @@ std::ostream& operator << (std::ostream& out, const Rect_<_Tp>& rect)
|
||||
#endif // OPENCV_NOSTL
|
||||
} // cv
|
||||
|
||||
#endif // __OPENCV_CORE_CVSTDINL_HPP__
|
||||
#endif // __OPENCV_CORE_CVSTDINL_HPP__
|
||||
|
||||
@@ -406,6 +406,59 @@ CV_EXPORTS void read(const FileNode& node, Mat& mat, const Mat& default_mat = Ma
|
||||
CV_EXPORTS void read(const FileNode& node, SparseMat& mat, const SparseMat& default_mat = SparseMat() );
|
||||
CV_EXPORTS void read(const FileNode& node, std::vector<KeyPoint>& keypoints);
|
||||
|
||||
template<typename _Tp> static inline void read(const FileNode& node, Point_<_Tp>& value, const Point_<_Tp>& default_value)
|
||||
{
|
||||
std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp;
|
||||
value = temp.size() != 2 ? default_value : Point_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]));
|
||||
}
|
||||
|
||||
template<typename _Tp> static inline void read(const FileNode& node, Point3_<_Tp>& value, const Point3_<_Tp>& default_value)
|
||||
{
|
||||
std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp;
|
||||
value = temp.size() != 3 ? default_value : Point3_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]),
|
||||
saturate_cast<_Tp>(temp[2]));
|
||||
}
|
||||
|
||||
template<typename _Tp> static inline void read(const FileNode& node, Size_<_Tp>& value, const Size_<_Tp>& default_value)
|
||||
{
|
||||
std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp;
|
||||
value = temp.size() != 2 ? default_value : Size_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]));
|
||||
}
|
||||
|
||||
template<typename _Tp> static inline void read(const FileNode& node, Complex<_Tp>& value, const Complex<_Tp>& default_value)
|
||||
{
|
||||
std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp;
|
||||
value = temp.size() != 2 ? default_value : Complex<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]));
|
||||
}
|
||||
|
||||
template<typename _Tp> static inline void read(const FileNode& node, Rect_<_Tp>& value, const Rect_<_Tp>& default_value)
|
||||
{
|
||||
std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp;
|
||||
value = temp.size() != 4 ? default_value : Rect_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]),
|
||||
saturate_cast<_Tp>(temp[2]), saturate_cast<_Tp>(temp[3]));
|
||||
}
|
||||
|
||||
template<typename _Tp, int cn> static inline void read(const FileNode& node, Vec<_Tp, cn>& value, const Vec<_Tp, cn>& default_value)
|
||||
{
|
||||
std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp;
|
||||
value = temp.size() != cn ? default_value : Vec<_Tp, cn>(&temp[0]);
|
||||
}
|
||||
|
||||
template<typename _Tp> static inline void read(const FileNode& node, Scalar_<_Tp>& value, const Scalar_<_Tp>& default_value)
|
||||
{
|
||||
std::vector<_Tp> temp; FileNodeIterator it = node.begin(); it >> temp;
|
||||
value = temp.size() != 4 ? default_value : Scalar_<_Tp>(saturate_cast<_Tp>(temp[0]), saturate_cast<_Tp>(temp[1]),
|
||||
saturate_cast<_Tp>(temp[2]), saturate_cast<_Tp>(temp[3]));
|
||||
}
|
||||
|
||||
static inline void read(const FileNode& node, Range& value, const Range& default_value)
|
||||
{
|
||||
Point2i temp(value.start, value.end); const Point2i default_temp = Point2i(default_value.start, default_value.end);
|
||||
read(node, temp, default_temp);
|
||||
value.start = temp.x; value.end = temp.y;
|
||||
}
|
||||
|
||||
|
||||
CV_EXPORTS FileStorage& operator << (FileStorage& fs, const String& str);
|
||||
|
||||
|
||||
|
||||
@@ -551,18 +551,18 @@ public:
|
||||
size_t hash() const;
|
||||
|
||||
//! converts vector of keypoints to vector of points
|
||||
static void convert(const std::vector<KeyPoint>& keypoints,
|
||||
CV_OUT std::vector<Point2f>& points2f,
|
||||
const std::vector<int>& keypointIndexes=std::vector<int>());
|
||||
CV_WRAP static void convert(const std::vector<KeyPoint>& keypoints,
|
||||
CV_OUT std::vector<Point2f>& points2f,
|
||||
const std::vector<int>& keypointIndexes=std::vector<int>());
|
||||
//! converts vector of points to the vector of keypoints, where each keypoint is assigned the same size and the same orientation
|
||||
static void convert(const std::vector<Point2f>& points2f,
|
||||
CV_OUT std::vector<KeyPoint>& keypoints,
|
||||
float size=1, float response=1, int octave=0, int class_id=-1);
|
||||
CV_WRAP static void convert(const std::vector<Point2f>& points2f,
|
||||
CV_OUT std::vector<KeyPoint>& keypoints,
|
||||
float size=1, float response=1, int octave=0, int class_id=-1);
|
||||
|
||||
//! computes overlap for pair of keypoints;
|
||||
//! overlap is a ratio between area of keypoint regions intersection and
|
||||
//! area of keypoint regions union (now keypoint region is circle)
|
||||
static float overlap(const KeyPoint& kp1, const KeyPoint& kp2);
|
||||
CV_WRAP static float overlap(const KeyPoint& kp1, const KeyPoint& kp2);
|
||||
|
||||
CV_PROP_RW Point2f pt; //!< coordinates of the keypoints
|
||||
CV_PROP_RW float size; //!< diameter of the meaningful keypoint neighborhood
|
||||
@@ -1922,4 +1922,4 @@ TermCriteria::TermCriteria(int _type, int _maxCount, double _epsilon)
|
||||
|
||||
} // cv
|
||||
|
||||
#endif //__OPENCV_CORE_TYPES_HPP__
|
||||
#endif //__OPENCV_CORE_TYPES_HPP__
|
||||
|
||||
@@ -116,8 +116,8 @@ protected:
|
||||
_Tp* ptr;
|
||||
//! size of the real buffer
|
||||
size_t sz;
|
||||
//! pre-allocated buffer
|
||||
_Tp buf[fixed_size];
|
||||
//! pre-allocated buffer. At least 1 element to confirm C++ standard reqirements
|
||||
_Tp buf[(fixed_size > 0) ? fixed_size : 1];
|
||||
};
|
||||
|
||||
//! Sets/resets the break-on-error mode.
|
||||
|
||||
@@ -56,6 +56,9 @@
|
||||
#define CVAUX_STR_EXP(__A) #__A
|
||||
#define CVAUX_STR(__A) CVAUX_STR_EXP(__A)
|
||||
|
||||
#define CVAUX_STRW_EXP(__A) L#__A
|
||||
#define CVAUX_STRW(__A) CVAUX_STRW_EXP(__A)
|
||||
|
||||
#if CV_VERSION_REVISION
|
||||
# define CV_VERSION CVAUX_STR(CV_VERSION_EPOCH) "." CVAUX_STR(CV_VERSION_MAJOR) "." CVAUX_STR(CV_VERSION_MINOR) "." CVAUX_STR(CV_VERSION_REVISION)
|
||||
#else
|
||||
|
||||
@@ -24,4 +24,3 @@ PERF_TEST_P(Size_MatType, abs, TYPICAL_MATS_ABS)
|
||||
|
||||
SANITY_CHECK(c);
|
||||
}
|
||||
|
||||
|
||||
@@ -73,4 +73,3 @@ PERF_TEST_P(Size_MatType, bitwise_xor, TYPICAL_MATS_BITW_ARITHM)
|
||||
|
||||
SANITY_CHECK(c);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
#include "perf_precomp.hpp"
|
||||
#ifdef _MSC_VER
|
||||
# if _MSC_VER >= 1700
|
||||
# pragma warning(disable:4447) // Disable warning 'main' signature found without threading model
|
||||
# endif
|
||||
#endif
|
||||
|
||||
CV_PERF_TEST_MAIN(core)
|
||||
|
||||
@@ -34,4 +34,4 @@ PERF_TEST_P( Size_SrcDepth_DstChannels, merge,
|
||||
TEST_CYCLE_MULTIRUN(runs) merge( (vector<Mat> &)mv, dst );
|
||||
|
||||
SANITY_CHECK(dst, 1e-12);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#include "perf_precomp.hpp"
|
||||
@@ -83,8 +83,8 @@ PERF_TEST_P(Size_MatType, meanStdDev_mask, TYPICAL_MATS)
|
||||
|
||||
TEST_CYCLE() meanStdDev(src, mean, dev, mask);
|
||||
|
||||
SANITY_CHECK(mean, 1e-6);
|
||||
SANITY_CHECK(dev, 1e-6);
|
||||
SANITY_CHECK(mean, 1e-5);
|
||||
SANITY_CHECK(dev, 1e-5);
|
||||
}
|
||||
|
||||
PERF_TEST_P(Size_MatType, countNonZero, testing::Combine( testing::Values( TYPICAL_MAT_SIZES ), testing::Values( CV_8UC1, CV_8SC1, CV_16UC1, CV_16SC1, CV_32SC1, CV_32FC1, CV_64FC1 ) ))
|
||||
|
||||
@@ -1131,23 +1131,33 @@ static void binary_op(InputArray _src1, InputArray _src2, OutputArray _dst,
|
||||
}
|
||||
}
|
||||
|
||||
static BinaryFunc maxTab[] =
|
||||
static BinaryFunc* getMaxTab()
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(max8u), (BinaryFunc)GET_OPTIMIZED(max8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(max16u), (BinaryFunc)GET_OPTIMIZED(max16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(max32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(max32f), (BinaryFunc)max64f,
|
||||
0
|
||||
};
|
||||
static BinaryFunc maxTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(max8u), (BinaryFunc)GET_OPTIMIZED(max8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(max16u), (BinaryFunc)GET_OPTIMIZED(max16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(max32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(max32f), (BinaryFunc)max64f,
|
||||
0
|
||||
};
|
||||
|
||||
static BinaryFunc minTab[] =
|
||||
return maxTab;
|
||||
}
|
||||
|
||||
static BinaryFunc* getMinTab()
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(min8u), (BinaryFunc)GET_OPTIMIZED(min8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(min16u), (BinaryFunc)GET_OPTIMIZED(min16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(min32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(min32f), (BinaryFunc)min64f,
|
||||
0
|
||||
};
|
||||
static BinaryFunc minTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(min8u), (BinaryFunc)GET_OPTIMIZED(min8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(min16u), (BinaryFunc)GET_OPTIMIZED(min16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(min32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(min32f), (BinaryFunc)min64f,
|
||||
0
|
||||
};
|
||||
|
||||
return minTab;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1177,24 +1187,24 @@ void cv::bitwise_not(InputArray a, OutputArray c, InputArray mask)
|
||||
|
||||
void cv::max( InputArray src1, InputArray src2, OutputArray dst )
|
||||
{
|
||||
binary_op(src1, src2, dst, noArray(), maxTab, false );
|
||||
binary_op(src1, src2, dst, noArray(), getMaxTab(), false );
|
||||
}
|
||||
|
||||
void cv::min( InputArray src1, InputArray src2, OutputArray dst )
|
||||
{
|
||||
binary_op(src1, src2, dst, noArray(), minTab, false );
|
||||
binary_op(src1, src2, dst, noArray(), getMinTab(), false );
|
||||
}
|
||||
|
||||
void cv::max(const Mat& src1, const Mat& src2, Mat& dst)
|
||||
{
|
||||
OutputArray _dst(dst);
|
||||
binary_op(src1, src2, _dst, noArray(), maxTab, false );
|
||||
binary_op(src1, src2, _dst, noArray(), getMaxTab(), false );
|
||||
}
|
||||
|
||||
void cv::min(const Mat& src1, const Mat& src2, Mat& dst)
|
||||
{
|
||||
OutputArray _dst(dst);
|
||||
binary_op(src1, src2, _dst, noArray(), minTab, false );
|
||||
binary_op(src1, src2, _dst, noArray(), getMinTab(), false );
|
||||
}
|
||||
|
||||
|
||||
@@ -1482,39 +1492,54 @@ static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
|
||||
}
|
||||
}
|
||||
|
||||
static BinaryFunc addTab[] =
|
||||
static BinaryFunc* getAddTab()
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(add8u), (BinaryFunc)GET_OPTIMIZED(add8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(add16u), (BinaryFunc)GET_OPTIMIZED(add16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(add32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(add32f), (BinaryFunc)add64f,
|
||||
0
|
||||
};
|
||||
static BinaryFunc addTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(add8u), (BinaryFunc)GET_OPTIMIZED(add8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(add16u), (BinaryFunc)GET_OPTIMIZED(add16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(add32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(add32f), (BinaryFunc)add64f,
|
||||
0
|
||||
};
|
||||
|
||||
static BinaryFunc subTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(sub8u), (BinaryFunc)GET_OPTIMIZED(sub8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(sub16u), (BinaryFunc)GET_OPTIMIZED(sub16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(sub32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(sub32f), (BinaryFunc)sub64f,
|
||||
0
|
||||
};
|
||||
return addTab;
|
||||
}
|
||||
|
||||
static BinaryFunc absdiffTab[] =
|
||||
static BinaryFunc* getSubTab()
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff8u), (BinaryFunc)GET_OPTIMIZED(absdiff8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff16u), (BinaryFunc)GET_OPTIMIZED(absdiff16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff32f), (BinaryFunc)absdiff64f,
|
||||
0
|
||||
};
|
||||
static BinaryFunc subTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(sub8u), (BinaryFunc)GET_OPTIMIZED(sub8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(sub16u), (BinaryFunc)GET_OPTIMIZED(sub16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(sub32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(sub32f), (BinaryFunc)sub64f,
|
||||
0
|
||||
};
|
||||
|
||||
return subTab;
|
||||
}
|
||||
|
||||
static BinaryFunc* getAbsDiffTab()
|
||||
{
|
||||
static BinaryFunc absDiffTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff8u), (BinaryFunc)GET_OPTIMIZED(absdiff8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff16u), (BinaryFunc)GET_OPTIMIZED(absdiff16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(absdiff32f), (BinaryFunc)absdiff64f,
|
||||
0
|
||||
};
|
||||
|
||||
return absDiffTab;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cv::add( InputArray src1, InputArray src2, OutputArray dst,
|
||||
InputArray mask, int dtype )
|
||||
{
|
||||
arithm_op(src1, src2, dst, mask, dtype, addTab );
|
||||
arithm_op(src1, src2, dst, mask, dtype, getAddTab() );
|
||||
}
|
||||
|
||||
void cv::subtract( InputArray src1, InputArray src2, OutputArray dst,
|
||||
@@ -1549,12 +1574,12 @@ void cv::subtract( InputArray src1, InputArray src2, OutputArray dst,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
arithm_op(src1, src2, dst, mask, dtype, subTab );
|
||||
arithm_op(src1, src2, dst, mask, dtype, getSubTab() );
|
||||
}
|
||||
|
||||
void cv::absdiff( InputArray src1, InputArray src2, OutputArray dst )
|
||||
{
|
||||
arithm_op(src1, src2, dst, noArray(), -1, absdiffTab);
|
||||
arithm_op(src1, src2, dst, noArray(), -1, getAbsDiffTab());
|
||||
}
|
||||
|
||||
/****************************************************************************************\
|
||||
@@ -1844,46 +1869,60 @@ static void recip64f( const double* src1, size_t step1, const double* src2, size
|
||||
}
|
||||
|
||||
|
||||
static BinaryFunc mulTab[] =
|
||||
static BinaryFunc* getMulTab()
|
||||
{
|
||||
(BinaryFunc)mul8u, (BinaryFunc)mul8s, (BinaryFunc)mul16u,
|
||||
(BinaryFunc)mul16s, (BinaryFunc)mul32s, (BinaryFunc)mul32f,
|
||||
(BinaryFunc)mul64f, 0
|
||||
};
|
||||
static BinaryFunc mulTab[] =
|
||||
{
|
||||
(BinaryFunc)mul8u, (BinaryFunc)mul8s, (BinaryFunc)mul16u,
|
||||
(BinaryFunc)mul16s, (BinaryFunc)mul32s, (BinaryFunc)mul32f,
|
||||
(BinaryFunc)mul64f, 0
|
||||
};
|
||||
|
||||
static BinaryFunc divTab[] =
|
||||
return mulTab;
|
||||
}
|
||||
|
||||
static BinaryFunc* getDivTab()
|
||||
{
|
||||
(BinaryFunc)div8u, (BinaryFunc)div8s, (BinaryFunc)div16u,
|
||||
(BinaryFunc)div16s, (BinaryFunc)div32s, (BinaryFunc)div32f,
|
||||
(BinaryFunc)div64f, 0
|
||||
};
|
||||
static BinaryFunc divTab[] =
|
||||
{
|
||||
(BinaryFunc)div8u, (BinaryFunc)div8s, (BinaryFunc)div16u,
|
||||
(BinaryFunc)div16s, (BinaryFunc)div32s, (BinaryFunc)div32f,
|
||||
(BinaryFunc)div64f, 0
|
||||
};
|
||||
|
||||
static BinaryFunc recipTab[] =
|
||||
return divTab;
|
||||
}
|
||||
|
||||
static BinaryFunc* getRecipTab()
|
||||
{
|
||||
(BinaryFunc)recip8u, (BinaryFunc)recip8s, (BinaryFunc)recip16u,
|
||||
(BinaryFunc)recip16s, (BinaryFunc)recip32s, (BinaryFunc)recip32f,
|
||||
(BinaryFunc)recip64f, 0
|
||||
};
|
||||
static BinaryFunc recipTab[] =
|
||||
{
|
||||
(BinaryFunc)recip8u, (BinaryFunc)recip8s, (BinaryFunc)recip16u,
|
||||
(BinaryFunc)recip16s, (BinaryFunc)recip32s, (BinaryFunc)recip32f,
|
||||
(BinaryFunc)recip64f, 0
|
||||
};
|
||||
|
||||
return recipTab;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void cv::multiply(InputArray src1, InputArray src2,
|
||||
OutputArray dst, double scale, int dtype)
|
||||
{
|
||||
arithm_op(src1, src2, dst, noArray(), dtype, mulTab, true, &scale);
|
||||
arithm_op(src1, src2, dst, noArray(), dtype, getMulTab(), true, &scale);
|
||||
}
|
||||
|
||||
void cv::divide(InputArray src1, InputArray src2,
|
||||
OutputArray dst, double scale, int dtype)
|
||||
{
|
||||
arithm_op(src1, src2, dst, noArray(), dtype, divTab, true, &scale);
|
||||
arithm_op(src1, src2, dst, noArray(), dtype, getDivTab(), true, &scale);
|
||||
}
|
||||
|
||||
void cv::divide(double scale, InputArray src2,
|
||||
OutputArray dst, int dtype)
|
||||
{
|
||||
arithm_op(src2, src2, dst, noArray(), dtype, recipTab, true, &scale);
|
||||
arithm_op(src2, src2, dst, noArray(), dtype, getRecipTab(), true, &scale);
|
||||
}
|
||||
|
||||
/****************************************************************************************\
|
||||
@@ -2026,12 +2065,17 @@ static void addWeighted64f( const double* src1, size_t step1, const double* src2
|
||||
addWeighted_<double, double>(src1, step1, src2, step2, dst, step, sz, scalars);
|
||||
}
|
||||
|
||||
static BinaryFunc addWeightedTab[] =
|
||||
static BinaryFunc* getAddWeightedTab()
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(addWeighted8u), (BinaryFunc)GET_OPTIMIZED(addWeighted8s), (BinaryFunc)GET_OPTIMIZED(addWeighted16u),
|
||||
(BinaryFunc)GET_OPTIMIZED(addWeighted16s), (BinaryFunc)GET_OPTIMIZED(addWeighted32s), (BinaryFunc)addWeighted32f,
|
||||
(BinaryFunc)addWeighted64f, 0
|
||||
};
|
||||
static BinaryFunc addWeightedTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(addWeighted8u), (BinaryFunc)GET_OPTIMIZED(addWeighted8s), (BinaryFunc)GET_OPTIMIZED(addWeighted16u),
|
||||
(BinaryFunc)GET_OPTIMIZED(addWeighted16s), (BinaryFunc)GET_OPTIMIZED(addWeighted32s), (BinaryFunc)addWeighted32f,
|
||||
(BinaryFunc)addWeighted64f, 0
|
||||
};
|
||||
|
||||
return addWeightedTab;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2039,7 +2083,7 @@ void cv::addWeighted( InputArray src1, double alpha, InputArray src2,
|
||||
double beta, double gamma, OutputArray dst, int dtype )
|
||||
{
|
||||
double scalars[] = {alpha, beta, gamma};
|
||||
arithm_op(src1, src2, dst, noArray(), dtype, addWeightedTab, true, scalars);
|
||||
arithm_op(src1, src2, dst, noArray(), dtype, getAddWeightedTab(), true, scalars);
|
||||
}
|
||||
|
||||
|
||||
@@ -2109,10 +2153,30 @@ cmp_(const T* src1, size_t step1, const T* src2, size_t step2,
|
||||
}
|
||||
}
|
||||
|
||||
#if ARITHM_USE_IPP
|
||||
inline static IppCmpOp convert_cmp(int _cmpop)
|
||||
{
|
||||
return _cmpop == CMP_EQ ? ippCmpEq :
|
||||
_cmpop == CMP_GT ? ippCmpGreater :
|
||||
_cmpop == CMP_GE ? ippCmpGreaterEq :
|
||||
_cmpop == CMP_LT ? ippCmpLess :
|
||||
_cmpop == CMP_LE ? ippCmpLessEq :
|
||||
(IppCmpOp)-1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void cmp8u(const uchar* src1, size_t step1, const uchar* src2, size_t step2,
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if( ippiCompare_8u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, (IppiSize&)size, op) >= 0 )
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
//vz optimized cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
int code = *(int*)_cmpop;
|
||||
step1 /= sizeof(src1[0]);
|
||||
@@ -2187,12 +2251,30 @@ static void cmp8s(const schar* src1, size_t step1, const schar* src2, size_t ste
|
||||
static void cmp16u(const ushort* src1, size_t step1, const ushort* src2, size_t step2,
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if( ippiCompare_16u_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, (IppiSize&)size, op) >= 0 )
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
}
|
||||
|
||||
static void cmp16s(const short* src1, size_t step1, const short* src2, size_t step2,
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op > 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if( ippiCompare_16s_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, (IppiSize&)size, op) >= 0 )
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
//vz optimized cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
|
||||
int code = *(int*)_cmpop;
|
||||
@@ -2290,6 +2372,15 @@ static void cmp32s(const int* src1, size_t step1, const int* src2, size_t step2,
|
||||
static void cmp32f(const float* src1, size_t step1, const float* src2, size_t step2,
|
||||
uchar* dst, size_t step, Size size, void* _cmpop)
|
||||
{
|
||||
#if ARITHM_USE_IPP
|
||||
IppCmpOp op = convert_cmp(*(int *)_cmpop);
|
||||
if( op >= 0 )
|
||||
{
|
||||
fixSteps(size, sizeof(dst[0]), step1, step2, step);
|
||||
if( ippiCompare_32f_C1R(src1, (int)step1, src2, (int)step2, dst, (int)step, (IppiSize&)size, op) >= 0 )
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
}
|
||||
|
||||
@@ -2299,15 +2390,19 @@ static void cmp64f(const double* src1, size_t step1, const double* src2, size_t
|
||||
cmp_(src1, step1, src2, step2, dst, step, size, *(int*)_cmpop);
|
||||
}
|
||||
|
||||
static BinaryFunc cmpTab[] =
|
||||
static BinaryFunc getCmpFunc(int depth)
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp8u), (BinaryFunc)GET_OPTIMIZED(cmp8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp16u), (BinaryFunc)GET_OPTIMIZED(cmp16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp32f), (BinaryFunc)cmp64f,
|
||||
0
|
||||
};
|
||||
static BinaryFunc cmpTab[] =
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp8u), (BinaryFunc)GET_OPTIMIZED(cmp8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp16u), (BinaryFunc)GET_OPTIMIZED(cmp16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cmp32f), (BinaryFunc)cmp64f,
|
||||
0
|
||||
};
|
||||
|
||||
return cmpTab[depth];
|
||||
}
|
||||
|
||||
static double getMinVal(int depth)
|
||||
{
|
||||
@@ -2337,7 +2432,7 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
|
||||
_dst.create(src1.size(), CV_8UC(cn));
|
||||
Mat dst = _dst.getMat();
|
||||
Size sz = getContinuousSize(src1, src2, dst, src1.channels());
|
||||
cmpTab[src1.depth()](src1.data, src1.step, src2.data, src2.step, dst.data, dst.step, sz, &op);
|
||||
getCmpFunc(src1.depth())(src1.data, src1.step, src2.data, src2.step, dst.data, dst.step, sz, &op);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2369,7 +2464,7 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
|
||||
|
||||
size_t esz = src1.elemSize();
|
||||
size_t blocksize0 = (size_t)(BLOCK_SIZE + esz-1)/esz;
|
||||
BinaryFunc func = cmpTab[depth1];
|
||||
BinaryFunc func = getCmpFunc(depth1);
|
||||
|
||||
if( !haveScalar )
|
||||
{
|
||||
@@ -2546,12 +2641,17 @@ static void inRangeReduce(const uchar* src, uchar* dst, size_t len, int cn)
|
||||
typedef void (*InRangeFunc)( const uchar* src1, size_t step1, const uchar* src2, size_t step2,
|
||||
const uchar* src3, size_t step3, uchar* dst, size_t step, Size sz );
|
||||
|
||||
static InRangeFunc inRangeTab[] =
|
||||
static InRangeFunc getInRangeFunc(int depth)
|
||||
{
|
||||
(InRangeFunc)GET_OPTIMIZED(inRange8u), (InRangeFunc)GET_OPTIMIZED(inRange8s), (InRangeFunc)GET_OPTIMIZED(inRange16u),
|
||||
(InRangeFunc)GET_OPTIMIZED(inRange16s), (InRangeFunc)GET_OPTIMIZED(inRange32s), (InRangeFunc)GET_OPTIMIZED(inRange32f),
|
||||
(InRangeFunc)inRange64f, 0
|
||||
};
|
||||
static InRangeFunc inRangeTab[] =
|
||||
{
|
||||
(InRangeFunc)GET_OPTIMIZED(inRange8u), (InRangeFunc)GET_OPTIMIZED(inRange8s), (InRangeFunc)GET_OPTIMIZED(inRange16u),
|
||||
(InRangeFunc)GET_OPTIMIZED(inRange16s), (InRangeFunc)GET_OPTIMIZED(inRange32s), (InRangeFunc)GET_OPTIMIZED(inRange32f),
|
||||
(InRangeFunc)inRange64f, 0
|
||||
};
|
||||
|
||||
return inRangeTab[depth];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -2590,7 +2690,7 @@ void cv::inRange(InputArray _src, InputArray _lowerb,
|
||||
|
||||
_dst.create(src.dims, src.size, CV_8U);
|
||||
Mat dst = _dst.getMat();
|
||||
InRangeFunc func = inRangeTab[depth];
|
||||
InRangeFunc func = getInRangeFunc(depth);
|
||||
|
||||
const Mat* arrays_sc[] = { &src, &dst, 0 };
|
||||
const Mat* arrays_nosc[] = { &src, &dst, &lb, &ub, 0 };
|
||||
|
||||
@@ -194,17 +194,27 @@ static void merge64s(const int64** src, int64* dst, int len, int cn )
|
||||
typedef void (*SplitFunc)(const uchar* src, uchar** dst, int len, int cn);
|
||||
typedef void (*MergeFunc)(const uchar** src, uchar* dst, int len, int cn);
|
||||
|
||||
static SplitFunc splitTab[] =
|
||||
static SplitFunc getSplitFunc(int depth)
|
||||
{
|
||||
(SplitFunc)GET_OPTIMIZED(split8u), (SplitFunc)GET_OPTIMIZED(split8u), (SplitFunc)GET_OPTIMIZED(split16u), (SplitFunc)GET_OPTIMIZED(split16u),
|
||||
(SplitFunc)GET_OPTIMIZED(split32s), (SplitFunc)GET_OPTIMIZED(split32s), (SplitFunc)GET_OPTIMIZED(split64s), 0
|
||||
};
|
||||
static SplitFunc splitTab[] =
|
||||
{
|
||||
(SplitFunc)GET_OPTIMIZED(split8u), (SplitFunc)GET_OPTIMIZED(split8u), (SplitFunc)GET_OPTIMIZED(split16u), (SplitFunc)GET_OPTIMIZED(split16u),
|
||||
(SplitFunc)GET_OPTIMIZED(split32s), (SplitFunc)GET_OPTIMIZED(split32s), (SplitFunc)GET_OPTIMIZED(split64s), 0
|
||||
};
|
||||
|
||||
static MergeFunc mergeTab[] =
|
||||
return splitTab[depth];
|
||||
}
|
||||
|
||||
static MergeFunc getMergeFunc(int depth)
|
||||
{
|
||||
(MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge16u), (MergeFunc)GET_OPTIMIZED(merge16u),
|
||||
(MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge64s), 0
|
||||
};
|
||||
static MergeFunc mergeTab[] =
|
||||
{
|
||||
(MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge8u), (MergeFunc)GET_OPTIMIZED(merge16u), (MergeFunc)GET_OPTIMIZED(merge16u),
|
||||
(MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge32s), (MergeFunc)GET_OPTIMIZED(merge64s), 0
|
||||
};
|
||||
|
||||
return mergeTab[depth];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -217,7 +227,7 @@ void cv::split(const Mat& src, Mat* mv)
|
||||
return;
|
||||
}
|
||||
|
||||
SplitFunc func = splitTab[depth];
|
||||
SplitFunc func = getSplitFunc(depth);
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
int esz = (int)src.elemSize(), esz1 = (int)src.elemSize1();
|
||||
@@ -323,7 +333,7 @@ void cv::merge(const Mat* mv, size_t n, OutputArray _dst)
|
||||
|
||||
NAryMatIterator it(arrays, ptrs, cn+1);
|
||||
int total = (int)it.size, blocksize = cn <= 4 ? total : std::min(total, blocksize0);
|
||||
MergeFunc func = mergeTab[depth];
|
||||
MergeFunc func = getMergeFunc(depth);
|
||||
|
||||
for( i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
@@ -419,12 +429,17 @@ static void mixChannels64s( const int64** src, const int* sdelta,
|
||||
typedef void (*MixChannelsFunc)( const uchar** src, const int* sdelta,
|
||||
uchar** dst, const int* ddelta, int len, int npairs );
|
||||
|
||||
static MixChannelsFunc mixchTab[] =
|
||||
static MixChannelsFunc getMixchFunc(int depth)
|
||||
{
|
||||
(MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels16u,
|
||||
(MixChannelsFunc)mixChannels16u, (MixChannelsFunc)mixChannels32s, (MixChannelsFunc)mixChannels32s,
|
||||
(MixChannelsFunc)mixChannels64s, 0
|
||||
};
|
||||
static MixChannelsFunc mixchTab[] =
|
||||
{
|
||||
(MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels16u,
|
||||
(MixChannelsFunc)mixChannels16u, (MixChannelsFunc)mixChannels32s, (MixChannelsFunc)mixChannels32s,
|
||||
(MixChannelsFunc)mixChannels64s, 0
|
||||
};
|
||||
|
||||
return mixchTab[depth];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -479,7 +494,7 @@ void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, cons
|
||||
|
||||
NAryMatIterator it(arrays, ptrs, (int)(nsrcs + ndsts));
|
||||
int total = (int)it.size, blocksize = std::min(total, (int)((BLOCK_SIZE + esz1-1)/esz1));
|
||||
MixChannelsFunc func = mixchTab[depth];
|
||||
MixChannelsFunc func = getMixchFunc(depth);
|
||||
|
||||
for( i = 0; i < it.nplanes; i++, ++it )
|
||||
{
|
||||
@@ -947,104 +962,109 @@ DEF_CVT_FUNC(32s64f, int, double);
|
||||
DEF_CVT_FUNC(32f64f, float, double);
|
||||
DEF_CPY_FUNC(64s, int64);
|
||||
|
||||
static BinaryFunc cvtScaleAbsTab[] =
|
||||
static BinaryFunc getCvtScaleAbsFunc(int depth)
|
||||
{
|
||||
(BinaryFunc)cvtScaleAbs8u, (BinaryFunc)cvtScaleAbs8s8u, (BinaryFunc)cvtScaleAbs16u8u,
|
||||
(BinaryFunc)cvtScaleAbs16s8u, (BinaryFunc)cvtScaleAbs32s8u, (BinaryFunc)cvtScaleAbs32f8u,
|
||||
(BinaryFunc)cvtScaleAbs64f8u, 0
|
||||
};
|
||||
static BinaryFunc cvtScaleAbsTab[] =
|
||||
{
|
||||
(BinaryFunc)cvtScaleAbs8u, (BinaryFunc)cvtScaleAbs8s8u, (BinaryFunc)cvtScaleAbs16u8u,
|
||||
(BinaryFunc)cvtScaleAbs16s8u, (BinaryFunc)cvtScaleAbs32s8u, (BinaryFunc)cvtScaleAbs32f8u,
|
||||
(BinaryFunc)cvtScaleAbs64f8u, 0
|
||||
};
|
||||
|
||||
static BinaryFunc cvtScaleTab[][8] =
|
||||
{
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u), (BinaryFunc)GET_OPTIMIZED(cvtScale8s8u), (BinaryFunc)GET_OPTIMIZED(cvtScale16u8u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s8u), (BinaryFunc)GET_OPTIMIZED(cvtScale32s8u), (BinaryFunc)GET_OPTIMIZED(cvtScale32f8u),
|
||||
(BinaryFunc)cvtScale64f8u, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u8s), (BinaryFunc)GET_OPTIMIZED(cvtScale8s), (BinaryFunc)GET_OPTIMIZED(cvtScale16u8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s8s), (BinaryFunc)GET_OPTIMIZED(cvtScale32s8s), (BinaryFunc)GET_OPTIMIZED(cvtScale32f8s),
|
||||
(BinaryFunc)cvtScale64f8s, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u16u), (BinaryFunc)GET_OPTIMIZED(cvtScale8s16u), (BinaryFunc)GET_OPTIMIZED(cvtScale16u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s16u), (BinaryFunc)GET_OPTIMIZED(cvtScale32s16u), (BinaryFunc)GET_OPTIMIZED(cvtScale32f16u),
|
||||
(BinaryFunc)cvtScale64f16u, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u16s), (BinaryFunc)GET_OPTIMIZED(cvtScale8s16s), (BinaryFunc)GET_OPTIMIZED(cvtScale16u16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s), (BinaryFunc)GET_OPTIMIZED(cvtScale32s16s), (BinaryFunc)GET_OPTIMIZED(cvtScale32f16s),
|
||||
(BinaryFunc)cvtScale64f16s, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u32s), (BinaryFunc)GET_OPTIMIZED(cvtScale8s32s), (BinaryFunc)GET_OPTIMIZED(cvtScale16u32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s32s), (BinaryFunc)GET_OPTIMIZED(cvtScale32s), (BinaryFunc)GET_OPTIMIZED(cvtScale32f32s),
|
||||
(BinaryFunc)cvtScale64f32s, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u32f), (BinaryFunc)GET_OPTIMIZED(cvtScale8s32f), (BinaryFunc)GET_OPTIMIZED(cvtScale16u32f),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s32f), (BinaryFunc)GET_OPTIMIZED(cvtScale32s32f), (BinaryFunc)GET_OPTIMIZED(cvtScale32f),
|
||||
(BinaryFunc)cvtScale64f32f, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)cvtScale8u64f, (BinaryFunc)cvtScale8s64f, (BinaryFunc)cvtScale16u64f,
|
||||
(BinaryFunc)cvtScale16s64f, (BinaryFunc)cvtScale32s64f, (BinaryFunc)cvtScale32f64f,
|
||||
(BinaryFunc)cvtScale64f, 0
|
||||
},
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
};
|
||||
|
||||
static BinaryFunc cvtTab[][8] =
|
||||
{
|
||||
{
|
||||
(BinaryFunc)(cvt8u), (BinaryFunc)GET_OPTIMIZED(cvt8s8u), (BinaryFunc)GET_OPTIMIZED(cvt16u8u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s8u), (BinaryFunc)GET_OPTIMIZED(cvt32s8u), (BinaryFunc)GET_OPTIMIZED(cvt32f8u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f8u), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u8s), (BinaryFunc)cvt8u, (BinaryFunc)GET_OPTIMIZED(cvt16u8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s8s), (BinaryFunc)GET_OPTIMIZED(cvt32s8s), (BinaryFunc)GET_OPTIMIZED(cvt32f8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f8s), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u16u), (BinaryFunc)GET_OPTIMIZED(cvt8s16u), (BinaryFunc)cvt16u,
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s16u), (BinaryFunc)GET_OPTIMIZED(cvt32s16u), (BinaryFunc)GET_OPTIMIZED(cvt32f16u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f16u), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u16s), (BinaryFunc)GET_OPTIMIZED(cvt8s16s), (BinaryFunc)GET_OPTIMIZED(cvt16u16s),
|
||||
(BinaryFunc)cvt16u, (BinaryFunc)GET_OPTIMIZED(cvt32s16s), (BinaryFunc)GET_OPTIMIZED(cvt32f16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f16s), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u32s), (BinaryFunc)GET_OPTIMIZED(cvt8s32s), (BinaryFunc)GET_OPTIMIZED(cvt16u32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s32s), (BinaryFunc)cvt32s, (BinaryFunc)GET_OPTIMIZED(cvt32f32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f32s), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u32f), (BinaryFunc)GET_OPTIMIZED(cvt8s32f), (BinaryFunc)GET_OPTIMIZED(cvt16u32f),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s32f), (BinaryFunc)GET_OPTIMIZED(cvt32s32f), (BinaryFunc)cvt32s,
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f32f), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u64f), (BinaryFunc)GET_OPTIMIZED(cvt8s64f), (BinaryFunc)GET_OPTIMIZED(cvt16u64f),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s64f), (BinaryFunc)GET_OPTIMIZED(cvt32s64f), (BinaryFunc)GET_OPTIMIZED(cvt32f64f),
|
||||
(BinaryFunc)(cvt64s), 0
|
||||
},
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
};
|
||||
return cvtScaleAbsTab[depth];
|
||||
}
|
||||
|
||||
BinaryFunc getConvertFunc(int sdepth, int ddepth)
|
||||
{
|
||||
static BinaryFunc cvtTab[][8] =
|
||||
{
|
||||
{
|
||||
(BinaryFunc)(cvt8u), (BinaryFunc)GET_OPTIMIZED(cvt8s8u), (BinaryFunc)GET_OPTIMIZED(cvt16u8u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s8u), (BinaryFunc)GET_OPTIMIZED(cvt32s8u), (BinaryFunc)GET_OPTIMIZED(cvt32f8u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f8u), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u8s), (BinaryFunc)cvt8u, (BinaryFunc)GET_OPTIMIZED(cvt16u8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s8s), (BinaryFunc)GET_OPTIMIZED(cvt32s8s), (BinaryFunc)GET_OPTIMIZED(cvt32f8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f8s), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u16u), (BinaryFunc)GET_OPTIMIZED(cvt8s16u), (BinaryFunc)cvt16u,
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s16u), (BinaryFunc)GET_OPTIMIZED(cvt32s16u), (BinaryFunc)GET_OPTIMIZED(cvt32f16u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f16u), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u16s), (BinaryFunc)GET_OPTIMIZED(cvt8s16s), (BinaryFunc)GET_OPTIMIZED(cvt16u16s),
|
||||
(BinaryFunc)cvt16u, (BinaryFunc)GET_OPTIMIZED(cvt32s16s), (BinaryFunc)GET_OPTIMIZED(cvt32f16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f16s), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u32s), (BinaryFunc)GET_OPTIMIZED(cvt8s32s), (BinaryFunc)GET_OPTIMIZED(cvt16u32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s32s), (BinaryFunc)cvt32s, (BinaryFunc)GET_OPTIMIZED(cvt32f32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f32s), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u32f), (BinaryFunc)GET_OPTIMIZED(cvt8s32f), (BinaryFunc)GET_OPTIMIZED(cvt16u32f),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s32f), (BinaryFunc)GET_OPTIMIZED(cvt32s32f), (BinaryFunc)cvt32s,
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt64f32f), 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt8u64f), (BinaryFunc)GET_OPTIMIZED(cvt8s64f), (BinaryFunc)GET_OPTIMIZED(cvt16u64f),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvt16s64f), (BinaryFunc)GET_OPTIMIZED(cvt32s64f), (BinaryFunc)GET_OPTIMIZED(cvt32f64f),
|
||||
(BinaryFunc)(cvt64s), 0
|
||||
},
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
};
|
||||
|
||||
return cvtTab[CV_MAT_DEPTH(ddepth)][CV_MAT_DEPTH(sdepth)];
|
||||
}
|
||||
|
||||
static BinaryFunc getConvertScaleFunc(int sdepth, int ddepth)
|
||||
{
|
||||
static BinaryFunc cvtScaleTab[][8] =
|
||||
{
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u), (BinaryFunc)GET_OPTIMIZED(cvtScale8s8u), (BinaryFunc)GET_OPTIMIZED(cvtScale16u8u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s8u), (BinaryFunc)GET_OPTIMIZED(cvtScale32s8u), (BinaryFunc)GET_OPTIMIZED(cvtScale32f8u),
|
||||
(BinaryFunc)cvtScale64f8u, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u8s), (BinaryFunc)GET_OPTIMIZED(cvtScale8s), (BinaryFunc)GET_OPTIMIZED(cvtScale16u8s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s8s), (BinaryFunc)GET_OPTIMIZED(cvtScale32s8s), (BinaryFunc)GET_OPTIMIZED(cvtScale32f8s),
|
||||
(BinaryFunc)cvtScale64f8s, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u16u), (BinaryFunc)GET_OPTIMIZED(cvtScale8s16u), (BinaryFunc)GET_OPTIMIZED(cvtScale16u),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s16u), (BinaryFunc)GET_OPTIMIZED(cvtScale32s16u), (BinaryFunc)GET_OPTIMIZED(cvtScale32f16u),
|
||||
(BinaryFunc)cvtScale64f16u, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u16s), (BinaryFunc)GET_OPTIMIZED(cvtScale8s16s), (BinaryFunc)GET_OPTIMIZED(cvtScale16u16s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s), (BinaryFunc)GET_OPTIMIZED(cvtScale32s16s), (BinaryFunc)GET_OPTIMIZED(cvtScale32f16s),
|
||||
(BinaryFunc)cvtScale64f16s, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u32s), (BinaryFunc)GET_OPTIMIZED(cvtScale8s32s), (BinaryFunc)GET_OPTIMIZED(cvtScale16u32s),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s32s), (BinaryFunc)GET_OPTIMIZED(cvtScale32s), (BinaryFunc)GET_OPTIMIZED(cvtScale32f32s),
|
||||
(BinaryFunc)cvtScale64f32s, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale8u32f), (BinaryFunc)GET_OPTIMIZED(cvtScale8s32f), (BinaryFunc)GET_OPTIMIZED(cvtScale16u32f),
|
||||
(BinaryFunc)GET_OPTIMIZED(cvtScale16s32f), (BinaryFunc)GET_OPTIMIZED(cvtScale32s32f), (BinaryFunc)GET_OPTIMIZED(cvtScale32f),
|
||||
(BinaryFunc)cvtScale64f32f, 0
|
||||
},
|
||||
{
|
||||
(BinaryFunc)cvtScale8u64f, (BinaryFunc)cvtScale8s64f, (BinaryFunc)cvtScale16u64f,
|
||||
(BinaryFunc)cvtScale16s64f, (BinaryFunc)cvtScale32s64f, (BinaryFunc)cvtScale32f64f,
|
||||
(BinaryFunc)cvtScale64f, 0
|
||||
},
|
||||
{
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
}
|
||||
};
|
||||
|
||||
return cvtScaleTab[CV_MAT_DEPTH(ddepth)][CV_MAT_DEPTH(sdepth)];
|
||||
}
|
||||
|
||||
@@ -1057,7 +1077,7 @@ void cv::convertScaleAbs( InputArray _src, OutputArray _dst, double alpha, doubl
|
||||
double scale[] = {alpha, beta};
|
||||
_dst.create( src.dims, src.size, CV_8UC(cn) );
|
||||
Mat dst = _dst.getMat();
|
||||
BinaryFunc func = cvtScaleAbsTab[src.depth()];
|
||||
BinaryFunc func = getCvtScaleAbsFunc(src.depth());
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
if( src.dims <= 2 )
|
||||
@@ -1376,4 +1396,4 @@ CV_IMPL void cvNormalize( const CvArr* srcarr, CvArr* dstarr,
|
||||
cv::normalize( src, dst, a, b, norm_type, dst.type(), mask );
|
||||
}
|
||||
|
||||
/* End of file. */
|
||||
/* End of file. */
|
||||
|
||||
@@ -50,6 +50,13 @@ namespace cv
|
||||
# pragma warning(disable: 4748)
|
||||
#endif
|
||||
|
||||
#if defined HAVE_IPP && IPP_VERSION_MAJOR >= 7
|
||||
#define USE_IPP_DFT 1
|
||||
#else
|
||||
#undef USE_IPP_DFT
|
||||
#endif
|
||||
|
||||
|
||||
/****************************************************************************************\
|
||||
Discrete Fourier Transform
|
||||
\****************************************************************************************/
|
||||
@@ -455,7 +462,7 @@ template<> struct DFT_VecR4<float>
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
static void ippsDFTFwd_CToC( const Complex<float>* src, Complex<float>* dst,
|
||||
const void* spec, uchar* buf)
|
||||
{
|
||||
@@ -517,7 +524,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
int nf, const int* factors, const int* itab,
|
||||
const Complex<T>* wave, int tab_size,
|
||||
const void*
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
spec
|
||||
#endif
|
||||
, Complex<T>* buf,
|
||||
@@ -537,7 +544,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
T scale = (T)_scale;
|
||||
int tab_step;
|
||||
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
if( spec )
|
||||
{
|
||||
if( !inv )
|
||||
@@ -957,7 +964,7 @@ DFT( const Complex<T>* src, Complex<T>* dst, int n,
|
||||
template<typename T> static void
|
||||
RealDFT( const T* src, T* dst, int n, int nf, int* factors, const int* itab,
|
||||
const Complex<T>* wave, int tab_size, const void*
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
spec
|
||||
#endif
|
||||
,
|
||||
@@ -968,11 +975,18 @@ RealDFT( const T* src, T* dst, int n, int nf, int* factors, const int* itab,
|
||||
int j, n2 = n >> 1;
|
||||
dst += complex_output;
|
||||
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
if( spec )
|
||||
{
|
||||
ippsDFTFwd_RToPack( src, dst, spec, (uchar*)buf );
|
||||
goto finalize;
|
||||
if( complex_output )
|
||||
{
|
||||
dst[-1] = dst[0];
|
||||
dst[0] = 0;
|
||||
if( (n & 1) == 0 )
|
||||
dst[n] = 0;
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
assert( tab_size == n );
|
||||
@@ -1056,15 +1070,11 @@ RealDFT( const T* src, T* dst, int n, int nf, int* factors, const int* itab,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_IPP
|
||||
finalize:
|
||||
#endif
|
||||
if( complex_output && (n & 1) == 0 )
|
||||
{
|
||||
dst[-1] = dst[0];
|
||||
dst[0] = 0;
|
||||
if( (n & 1) == 0 )
|
||||
dst[n] = 0;
|
||||
dst[n] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1076,7 +1086,7 @@ template<typename T> static void
|
||||
CCSIDFT( const T* src, T* dst, int n, int nf, int* factors, const int* itab,
|
||||
const Complex<T>* wave, int tab_size,
|
||||
const void*
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
spec
|
||||
#endif
|
||||
, Complex<T>* buf,
|
||||
@@ -1097,7 +1107,7 @@ CCSIDFT( const T* src, T* dst, int n, int nf, int* factors, const int* itab,
|
||||
((T*)src)[1] = src[0];
|
||||
src++;
|
||||
}
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
if( spec )
|
||||
{
|
||||
ippsDFTInv_PackToR( src, dst, spec, (uchar*)buf );
|
||||
@@ -1225,7 +1235,7 @@ CCSIDFT( const T* src, T* dst, int n, int nf, int* factors, const int* itab,
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
finalize:
|
||||
#endif
|
||||
if( complex_input )
|
||||
@@ -1458,7 +1468,7 @@ static void CCSIDFT_64f( const double* src, double* dst, int n, int nf, int* fac
|
||||
|
||||
}
|
||||
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
typedef IppStatus (CV_STDCALL* IppDFTGetSizeFunc)(int, int, IppHintAlgorithm, int*, int*, int*);
|
||||
typedef IppStatus (CV_STDCALL* IppDFTInitFunc)(int, int, IppHintAlgorithm, void*, uchar*);
|
||||
#endif
|
||||
@@ -1486,7 +1496,7 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
int elem_size = (int)src.elemSize1(), complex_elem_size = elem_size*2;
|
||||
int factors[34];
|
||||
bool inplace_transform = false;
|
||||
#ifdef HAVE_IPP
|
||||
#ifdef USE_IPP_DFT
|
||||
AutoBuffer<uchar> ippbuf;
|
||||
int ipp_norm_flag = !(flags & DFT_SCALE) ? 8 : inv ? 2 : 1;
|
||||
#endif
|
||||
@@ -1546,12 +1556,8 @@ void cv::dft( InputArray _src0, OutputArray _dst, int flags, int nonzero_rows )
|
||||
}
|
||||
|
||||
spec = 0;
|
||||
#ifdef HAVE_IPP
|
||||
if(
|
||||
#if IPP_VERSION_MAJOR >= 7
|
||||
depth == CV_32F && // IPP 7.x and 8.0 have bug somewhere in double-precision DFT
|
||||
#endif
|
||||
len*count >= 64 ) // use IPP DFT if available
|
||||
#ifdef USE_IPP_DFT
|
||||
if( len*count >= 64 ) // use IPP DFT if available
|
||||
{
|
||||
int specsize=0, initsize=0, worksize=0;
|
||||
IppDFTGetSizeFunc getSizeFunc = 0;
|
||||
|
||||
@@ -79,10 +79,9 @@ namespace
|
||||
dir->ent.d_name = 0;
|
||||
#ifdef HAVE_WINRT
|
||||
cv::String full_path = cv::String(path) + "\\*";
|
||||
size_t size = mbstowcs(NULL, full_path.c_str(), full_path.size());
|
||||
cv::Ptr<wchar_t> wfull_path = new wchar_t[size+1];
|
||||
wfull_path[size] = 0;
|
||||
mbstowcs(wfull_path, full_path.c_str(), full_path.size());
|
||||
wchar_t wfull_path[MAX_PATH];
|
||||
size_t copied = mbstowcs(wfull_path, full_path.c_str(), MAX_PATH);
|
||||
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
|
||||
dir->handle = ::FindFirstFileExW(wfull_path, FindExInfoStandard,
|
||||
&dir->data, FindExSearchNameMatch, NULL, 0);
|
||||
#else
|
||||
@@ -92,6 +91,7 @@ namespace
|
||||
if(dir->handle == INVALID_HANDLE_VALUE)
|
||||
{
|
||||
/*closedir will do all cleanup*/
|
||||
delete dir;
|
||||
return 0;
|
||||
}
|
||||
return dir;
|
||||
@@ -106,6 +106,7 @@ namespace
|
||||
return 0;
|
||||
}
|
||||
size_t asize = wcstombs(NULL, dir->data.cFileName, 0);
|
||||
CV_Assert((asize != 0) && (asize != (size_t)-1));
|
||||
char* aname = new char[asize+1];
|
||||
aname[asize] = 0;
|
||||
wcstombs(aname, dir->data.cFileName, asize);
|
||||
@@ -140,24 +141,24 @@ static bool isDir(const cv::String& path, DIR* dir)
|
||||
{
|
||||
#if defined WIN32 || defined _WIN32 || defined WINCE
|
||||
DWORD attributes;
|
||||
BOOL status = TRUE;
|
||||
if (dir)
|
||||
attributes = dir->data.dwFileAttributes;
|
||||
else
|
||||
{
|
||||
WIN32_FILE_ATTRIBUTE_DATA all_attrs;
|
||||
#ifdef HAVE_WINRT
|
||||
size_t size = mbstowcs(NULL, path.c_str(), path.size());
|
||||
cv::Ptr<wchar_t> wpath = new wchar_t[size+1];
|
||||
wpath[size] = 0;
|
||||
mbstowcs(wpath, path.c_str(), path.size());
|
||||
::GetFileAttributesExW(wpath, GetFileExInfoStandard, &all_attrs);
|
||||
wchar_t wpath[MAX_PATH];
|
||||
size_t copied = mbstowcs(wpath, path.c_str(), MAX_PATH);
|
||||
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
|
||||
status = ::GetFileAttributesExW(wpath, GetFileExInfoStandard, &all_attrs);
|
||||
#else
|
||||
::GetFileAttributesExA(path.c_str(), GetFileExInfoStandard, &all_attrs);
|
||||
status = ::GetFileAttributesExA(path.c_str(), GetFileExInfoStandard, &all_attrs);
|
||||
#endif
|
||||
attributes = all_attrs.dwFileAttributes;
|
||||
}
|
||||
|
||||
return (attributes != INVALID_FILE_ATTRIBUTES) && ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0);
|
||||
return status && ((attributes & FILE_ATTRIBUTE_DIRECTORY) != 0);
|
||||
#else
|
||||
(void)dir;
|
||||
struct stat stat_buf;
|
||||
|
||||
@@ -1823,4 +1823,4 @@ cvSVBkSb( const CvArr* warr, const CvArr* uarr,
|
||||
|
||||
cv::SVD::backSubst(w, u, v, rhs, dst);
|
||||
CV_Assert( dst.data == dst0.data );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1725,19 +1725,29 @@ diagtransform_64f(const double* src, double* dst, const double* m, int len, int
|
||||
|
||||
typedef void (*TransformFunc)( const uchar* src, uchar* dst, const uchar* m, int, int, int );
|
||||
|
||||
static TransformFunc transformTab[] =
|
||||
static TransformFunc getTransformFunc(int depth)
|
||||
{
|
||||
(TransformFunc)transform_8u, (TransformFunc)transform_8s, (TransformFunc)transform_16u,
|
||||
(TransformFunc)transform_16s, (TransformFunc)transform_32s, (TransformFunc)transform_32f,
|
||||
(TransformFunc)transform_64f, 0
|
||||
};
|
||||
static TransformFunc transformTab[] =
|
||||
{
|
||||
(TransformFunc)transform_8u, (TransformFunc)transform_8s, (TransformFunc)transform_16u,
|
||||
(TransformFunc)transform_16s, (TransformFunc)transform_32s, (TransformFunc)transform_32f,
|
||||
(TransformFunc)transform_64f, 0
|
||||
};
|
||||
|
||||
static TransformFunc diagTransformTab[] =
|
||||
return transformTab[depth];
|
||||
}
|
||||
|
||||
static TransformFunc getDiagTransformFunc(int depth)
|
||||
{
|
||||
(TransformFunc)diagtransform_8u, (TransformFunc)diagtransform_8s, (TransformFunc)diagtransform_16u,
|
||||
(TransformFunc)diagtransform_16s, (TransformFunc)diagtransform_32s, (TransformFunc)diagtransform_32f,
|
||||
(TransformFunc)diagtransform_64f, 0
|
||||
};
|
||||
static TransformFunc diagTransformTab[] =
|
||||
{
|
||||
(TransformFunc)diagtransform_8u, (TransformFunc)diagtransform_8s, (TransformFunc)diagtransform_16u,
|
||||
(TransformFunc)diagtransform_16s, (TransformFunc)diagtransform_32s, (TransformFunc)diagtransform_32f,
|
||||
(TransformFunc)diagtransform_64f, 0
|
||||
};
|
||||
|
||||
return diagTransformTab[depth];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1800,7 +1810,7 @@ void cv::transform( InputArray _src, OutputArray _dst, InputArray _mtx )
|
||||
}
|
||||
}
|
||||
|
||||
TransformFunc func = isDiag ? diagTransformTab[depth] : transformTab[depth];
|
||||
TransformFunc func = isDiag ? getDiagTransformFunc(depth): getTransformFunc(depth);
|
||||
CV_Assert( func != 0 );
|
||||
|
||||
const Mat* arrays[] = {&src, &dst, 0};
|
||||
@@ -2761,19 +2771,24 @@ static double dotProd_64f(const double* src1, const double* src2, int len)
|
||||
|
||||
typedef double (*DotProdFunc)(const uchar* src1, const uchar* src2, int len);
|
||||
|
||||
static DotProdFunc dotProdTab[] =
|
||||
static DotProdFunc getDotProdFunc(int depth)
|
||||
{
|
||||
(DotProdFunc)GET_OPTIMIZED(dotProd_8u), (DotProdFunc)GET_OPTIMIZED(dotProd_8s),
|
||||
(DotProdFunc)dotProd_16u, (DotProdFunc)dotProd_16s,
|
||||
(DotProdFunc)dotProd_32s, (DotProdFunc)GET_OPTIMIZED(dotProd_32f),
|
||||
(DotProdFunc)dotProd_64f, 0
|
||||
};
|
||||
static DotProdFunc dotProdTab[] =
|
||||
{
|
||||
(DotProdFunc)GET_OPTIMIZED(dotProd_8u), (DotProdFunc)GET_OPTIMIZED(dotProd_8s),
|
||||
(DotProdFunc)dotProd_16u, (DotProdFunc)dotProd_16s,
|
||||
(DotProdFunc)dotProd_32s, (DotProdFunc)GET_OPTIMIZED(dotProd_32f),
|
||||
(DotProdFunc)dotProd_64f, 0
|
||||
};
|
||||
|
||||
return dotProdTab[depth];
|
||||
}
|
||||
|
||||
double Mat::dot(InputArray _mat) const
|
||||
{
|
||||
Mat mat = _mat.getMat();
|
||||
int cn = channels();
|
||||
DotProdFunc func = dotProdTab[depth()];
|
||||
DotProdFunc func = getDotProdFunc(depth());
|
||||
CV_Assert( mat.type() == type() && mat.size == size && func != 0 );
|
||||
|
||||
if( isContinuous() && mat.isContinuous() )
|
||||
@@ -2896,6 +2911,27 @@ PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, int maxComp
|
||||
return *this;
|
||||
}
|
||||
|
||||
void PCA::write(FileStorage& fs ) const
|
||||
{
|
||||
CV_Assert( fs.isOpened() );
|
||||
|
||||
fs << "name" << "PCA";
|
||||
fs << "vectors" << eigenvectors;
|
||||
fs << "values" << eigenvalues;
|
||||
fs << "mean" << mean;
|
||||
}
|
||||
|
||||
void PCA::read(const FileNode& fs)
|
||||
{
|
||||
CV_Assert( !fs.empty() );
|
||||
String name = (String)fs["name"];
|
||||
CV_Assert( name == "PCA" );
|
||||
|
||||
cv::read(fs["vectors"], eigenvectors);
|
||||
cv::read(fs["values"], eigenvalues);
|
||||
cv::read(fs["mean"], mean);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
int computeCumulativeEnergy(const Mat& eigenvalues, double retainedVariance)
|
||||
{
|
||||
|
||||
@@ -144,9 +144,9 @@ namespace
|
||||
{
|
||||
cv::Range r;
|
||||
r.start = (int)(wholeRange.start +
|
||||
((size_t)sr.start*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
|
||||
((uint64)sr.start*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
|
||||
r.end = sr.end >= nstripes ? wholeRange.end : (int)(wholeRange.start +
|
||||
((size_t)sr.end*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
|
||||
((uint64)sr.end*(wholeRange.end - wholeRange.start) + nstripes/2)/nstripes);
|
||||
(*body)(r);
|
||||
}
|
||||
cv::Range stripeRange() const { return cv::Range(0, nstripes); }
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
/*M///////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||||
//
|
||||
// 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
|
||||
//
|
||||
// Copyright (C) 2000-2008, Intel Corporation, all rights reserved.
|
||||
// Copyright (C) 2009, Willow Garage Inc., all rights reserved.
|
||||
// Third party copyrights are property of their respective owners.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without modification,
|
||||
// are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistribution's of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistribution's 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.
|
||||
//
|
||||
// * The name of the copyright holders may not 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 the Intel Corporation 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.
|
||||
//
|
||||
//M*/
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
/* End of file. */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -66,4 +66,4 @@ void cv::String::deallocate()
|
||||
{
|
||||
cv::fastFree(data-1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,6 +42,12 @@
|
||||
|
||||
#include "precomp.hpp"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
# if _MSC_VER >= 1700
|
||||
# pragma warning(disable:4447) // Disable warning 'main' signature found without threading model
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if defined WIN32 || defined _WIN32 || defined WINCE
|
||||
#ifndef _WIN32_WINNT // This is needed for the declaration of TryEnterCriticalSection in winbase.h with Visual Studio 2005 (and older?)
|
||||
#define _WIN32_WINNT 0x0400 // http://msdn.microsoft.com/en-us/library/ms686857(VS.85).aspx
|
||||
@@ -423,15 +429,14 @@ String tempfile( const char* suffix )
|
||||
temp_file = temp_dir + std::wstring(L"\\") + temp_file;
|
||||
DeleteFileW(temp_file.c_str());
|
||||
|
||||
size_t asize = wcstombs(NULL, temp_file.c_str(), 0);
|
||||
Ptr<char> aname = new char[asize+1];
|
||||
aname[asize] = 0;
|
||||
wcstombs(aname, temp_file.c_str(), asize);
|
||||
char aname[MAX_PATH];
|
||||
size_t copied = wcstombs(aname, temp_file.c_str(), MAX_PATH);
|
||||
CV_Assert((copied != MAX_PATH) && (copied != (size_t)-1));
|
||||
fname = std::string(aname);
|
||||
RoUninitialize();
|
||||
#else
|
||||
char temp_dir2[MAX_PATH + 1] = { 0 };
|
||||
char temp_file[MAX_PATH + 1] = { 0 };
|
||||
char temp_dir2[MAX_PATH] = { 0 };
|
||||
char temp_file[MAX_PATH] = { 0 };
|
||||
|
||||
if (temp_dir == 0 || temp_dir[0] == 0)
|
||||
{
|
||||
|
||||
@@ -136,4 +136,4 @@ float KeyPoint::overlap( const KeyPoint& kp1, const KeyPoint& kp2 )
|
||||
return ovrl;
|
||||
}
|
||||
|
||||
} // cv
|
||||
} // cv
|
||||
|
||||
@@ -2118,5 +2118,3 @@ TEST(Core_DS_Seq, sort_invert) { Core_SeqSortInvTest test; test.safe_run(); }
|
||||
TEST(Core_DS_Set, basic_operations) { Core_SetTest test; test.safe_run(); }
|
||||
TEST(Core_DS_Graph, basic_operations) { Core_GraphTest test; test.safe_run(); }
|
||||
TEST(Core_DS_Graph, scan) { Core_GraphScanTest test; test.safe_run(); }
|
||||
|
||||
|
||||
|
||||
@@ -866,5 +866,3 @@ protected:
|
||||
};
|
||||
|
||||
TEST(Core_DFT, complex_output) { Core_DFTComplexOutputTest test; test.safe_run(); }
|
||||
|
||||
|
||||
|
||||
@@ -391,7 +391,6 @@ protected:
|
||||
try
|
||||
{
|
||||
string fname = cv::tempfile(".xml");
|
||||
FileStorage fs(fname, FileStorage::WRITE);
|
||||
vector<int> mi, mi2, mi3, mi4;
|
||||
vector<Mat> mv, mv2, mv3, mv4;
|
||||
Mat m(10, 9, CV_32F);
|
||||
@@ -399,24 +398,59 @@ protected:
|
||||
randu(m, 0, 1);
|
||||
mi3.push_back(5);
|
||||
mv3.push_back(m);
|
||||
Point_<float> p1(1.1f, 2.2f), op1;
|
||||
Point3i p2(3, 4, 5), op2;
|
||||
Size s1(6, 7), os1;
|
||||
Complex<int> c1(9, 10), oc1;
|
||||
Rect r1(11, 12, 13, 14), or1;
|
||||
Vec<int, 5> v1(15, 16, 17, 18, 19), ov1;
|
||||
Scalar sc1(20.0, 21.1, 22.2, 23.3), osc1;
|
||||
Range g1(7, 8), og1;
|
||||
|
||||
FileStorage fs(fname, FileStorage::WRITE);
|
||||
fs << "mi" << mi;
|
||||
fs << "mv" << mv;
|
||||
fs << "mi3" << mi3;
|
||||
fs << "mv3" << mv3;
|
||||
fs << "empty" << empty;
|
||||
fs << "p1" << p1;
|
||||
fs << "p2" << p2;
|
||||
fs << "s1" << s1;
|
||||
fs << "c1" << c1;
|
||||
fs << "r1" << r1;
|
||||
fs << "v1" << v1;
|
||||
fs << "sc1" << sc1;
|
||||
fs << "g1" << g1;
|
||||
fs.release();
|
||||
|
||||
fs.open(fname, FileStorage::READ);
|
||||
fs["mi"] >> mi2;
|
||||
fs["mv"] >> mv2;
|
||||
fs["mi3"] >> mi4;
|
||||
fs["mv3"] >> mv4;
|
||||
fs["empty"] >> empty;
|
||||
fs["p1"] >> op1;
|
||||
fs["p2"] >> op2;
|
||||
fs["s1"] >> os1;
|
||||
fs["c1"] >> oc1;
|
||||
fs["r1"] >> or1;
|
||||
fs["v1"] >> ov1;
|
||||
fs["sc1"] >> osc1;
|
||||
fs["g1"] >> og1;
|
||||
CV_Assert( mi2.empty() );
|
||||
CV_Assert( mv2.empty() );
|
||||
CV_Assert( norm(mi3, mi4, CV_C) == 0 );
|
||||
CV_Assert( mv4.size() == 1 );
|
||||
double n = norm(mv3[0], mv4[0], CV_C);
|
||||
CV_Assert( n == 0 );
|
||||
CV_Assert( op1 == p1 );
|
||||
CV_Assert( op2 == p2 );
|
||||
CV_Assert( os1 == s1 );
|
||||
CV_Assert( oc1 == c1 );
|
||||
CV_Assert( or1 == r1 );
|
||||
CV_Assert( ov1 == v1 );
|
||||
CV_Assert( osc1 == sc1 );
|
||||
CV_Assert( og1 == g1 );
|
||||
}
|
||||
catch(...)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
#ifdef HAVE_WINRT
|
||||
#pragma warning(disable:4447) // Disable warning 'main' signature found without threading model
|
||||
#ifdef _MSC_VER
|
||||
# if _MSC_VER >= 1700
|
||||
# pragma warning(disable:4447) // Disable warning 'main' signature found without threading model
|
||||
# endif
|
||||
#endif
|
||||
|
||||
|
||||
#include "test_precomp.hpp"
|
||||
|
||||
CV_TEST_MAIN("cv")
|
||||
|
||||
@@ -510,6 +510,32 @@ protected:
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
// Test read and write
|
||||
FileStorage fs( "PCA_store.yml", FileStorage::WRITE );
|
||||
rPCA.write( fs );
|
||||
fs.release();
|
||||
|
||||
PCA lPCA;
|
||||
fs.open( "PCA_store.yml", FileStorage::READ );
|
||||
lPCA.read( fs.root() );
|
||||
err = norm( rPCA.eigenvectors, lPCA.eigenvectors, CV_RELATIVE_L2 );
|
||||
if( err > 0 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "bad accuracy of write/load functions (YML); err = %f\n", err );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
}
|
||||
err = norm( rPCA.eigenvalues, lPCA.eigenvalues, CV_RELATIVE_L2 );
|
||||
if( err > 0 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "bad accuracy of write/load functions (YML); err = %f\n", err );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
}
|
||||
err = norm( rPCA.mean, lPCA.mean, CV_RELATIVE_L2 );
|
||||
if( err > 0 )
|
||||
{
|
||||
ts->printf( cvtest::TS::LOG, "bad accuracy of write/load functions (YML); err = %f\n", err );
|
||||
ts->set_failed_test_info( cvtest::TS::FAIL_BAD_ACCURACY );
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -2755,4 +2755,3 @@ TEST(CovariationMatrixVectorOfMatWithMean, accuracy)
|
||||
}
|
||||
|
||||
/* End of file. */
|
||||
|
||||
|
||||
@@ -1 +0,0 @@
|
||||
#include "test_precomp.hpp"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user