mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 23:33:05 +04:00
Normalize line endings and whitespace
This commit is contained in:
committed by
Andrey Kamaev
parent
69020da607
commit
04384a71e4
+127
-127
@@ -1,127 +1,127 @@
|
||||
/*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*/
|
||||
|
||||
#ifndef __OPENCV_TEST_INTERPOLATION_HPP__
|
||||
#define __OPENCV_TEST_INTERPOLATION_HPP__
|
||||
|
||||
template <typename T> T readVal(const cv::Mat& src, int y, int x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
if (border_type == cv::BORDER_CONSTANT)
|
||||
return (y >= 0 && y < src.rows && x >= 0 && x < src.cols) ? src.at<T>(y, x * src.channels() + c) : cv::saturate_cast<T>(borderVal.val[c]);
|
||||
|
||||
return src.at<T>(cv::borderInterpolate(y, src.rows, border_type), cv::borderInterpolate(x, src.cols, border_type) * src.channels() + c);
|
||||
}
|
||||
|
||||
template <typename T> struct NearestInterpolator
|
||||
{
|
||||
static T getValue(const cv::Mat& src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
return readVal<T>(src, int(y), int(x), c, border_type, borderVal);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T> struct LinearInterpolator
|
||||
{
|
||||
static T getValue(const cv::Mat& src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
int x1 = cvFloor(x);
|
||||
int y1 = cvFloor(y);
|
||||
int x2 = x1 + 1;
|
||||
int y2 = y1 + 1;
|
||||
|
||||
float res = 0;
|
||||
|
||||
res += readVal<T>(src, y1, x1, c, border_type, borderVal) * ((x2 - x) * (y2 - y));
|
||||
res += readVal<T>(src, y1, x2, c, border_type, borderVal) * ((x - x1) * (y2 - y));
|
||||
res += readVal<T>(src, y2, x1, c, border_type, borderVal) * ((x2 - x) * (y - y1));
|
||||
res += readVal<T>(src, y2, x2, c, border_type, borderVal) * ((x - x1) * (y - y1));
|
||||
|
||||
return cv::saturate_cast<T>(res);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T> struct CubicInterpolator
|
||||
{
|
||||
static float bicubicCoeff(float x_)
|
||||
{
|
||||
float x = fabsf(x_);
|
||||
if (x <= 1.0f)
|
||||
{
|
||||
return x * x * (1.5f * x - 2.5f) + 1.0f;
|
||||
}
|
||||
else if (x < 2.0f)
|
||||
{
|
||||
return x * (x * (-0.5f * x + 2.5f) - 4.0f) + 2.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
static T getValue(const cv::Mat& src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
const float xmin = ceilf(x - 2.0f);
|
||||
const float xmax = floorf(x + 2.0f);
|
||||
|
||||
const float ymin = ceilf(y - 2.0f);
|
||||
const float ymax = floorf(y + 2.0f);
|
||||
|
||||
float sum = 0.0f;
|
||||
float wsum = 0.0f;
|
||||
|
||||
for (float cy = ymin; cy <= ymax; cy += 1.0f)
|
||||
{
|
||||
for (float cx = xmin; cx <= xmax; cx += 1.0f)
|
||||
{
|
||||
const float w = bicubicCoeff(x - cx) * bicubicCoeff(y - cy);
|
||||
sum += w * readVal<T>(src, cvFloor(cy), cvFloor(cx), c, border_type, borderVal);
|
||||
wsum += w;
|
||||
}
|
||||
}
|
||||
|
||||
float res = (!wsum)? 0 : sum / wsum;
|
||||
|
||||
return cv::saturate_cast<T>(res);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __OPENCV_TEST_INTERPOLATION_HPP__
|
||||
/*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*/
|
||||
|
||||
#ifndef __OPENCV_TEST_INTERPOLATION_HPP__
|
||||
#define __OPENCV_TEST_INTERPOLATION_HPP__
|
||||
|
||||
template <typename T> T readVal(const cv::Mat& src, int y, int x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
if (border_type == cv::BORDER_CONSTANT)
|
||||
return (y >= 0 && y < src.rows && x >= 0 && x < src.cols) ? src.at<T>(y, x * src.channels() + c) : cv::saturate_cast<T>(borderVal.val[c]);
|
||||
|
||||
return src.at<T>(cv::borderInterpolate(y, src.rows, border_type), cv::borderInterpolate(x, src.cols, border_type) * src.channels() + c);
|
||||
}
|
||||
|
||||
template <typename T> struct NearestInterpolator
|
||||
{
|
||||
static T getValue(const cv::Mat& src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
return readVal<T>(src, int(y), int(x), c, border_type, borderVal);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T> struct LinearInterpolator
|
||||
{
|
||||
static T getValue(const cv::Mat& src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
int x1 = cvFloor(x);
|
||||
int y1 = cvFloor(y);
|
||||
int x2 = x1 + 1;
|
||||
int y2 = y1 + 1;
|
||||
|
||||
float res = 0;
|
||||
|
||||
res += readVal<T>(src, y1, x1, c, border_type, borderVal) * ((x2 - x) * (y2 - y));
|
||||
res += readVal<T>(src, y1, x2, c, border_type, borderVal) * ((x - x1) * (y2 - y));
|
||||
res += readVal<T>(src, y2, x1, c, border_type, borderVal) * ((x2 - x) * (y - y1));
|
||||
res += readVal<T>(src, y2, x2, c, border_type, borderVal) * ((x - x1) * (y - y1));
|
||||
|
||||
return cv::saturate_cast<T>(res);
|
||||
}
|
||||
};
|
||||
|
||||
template <typename T> struct CubicInterpolator
|
||||
{
|
||||
static float bicubicCoeff(float x_)
|
||||
{
|
||||
float x = fabsf(x_);
|
||||
if (x <= 1.0f)
|
||||
{
|
||||
return x * x * (1.5f * x - 2.5f) + 1.0f;
|
||||
}
|
||||
else if (x < 2.0f)
|
||||
{
|
||||
return x * (x * (-0.5f * x + 2.5f) - 4.0f) + 2.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
return 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
static T getValue(const cv::Mat& src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
|
||||
{
|
||||
const float xmin = ceilf(x - 2.0f);
|
||||
const float xmax = floorf(x + 2.0f);
|
||||
|
||||
const float ymin = ceilf(y - 2.0f);
|
||||
const float ymax = floorf(y + 2.0f);
|
||||
|
||||
float sum = 0.0f;
|
||||
float wsum = 0.0f;
|
||||
|
||||
for (float cy = ymin; cy <= ymax; cy += 1.0f)
|
||||
{
|
||||
for (float cx = xmin; cx <= xmax; cx += 1.0f)
|
||||
{
|
||||
const float w = bicubicCoeff(x - cx) * bicubicCoeff(y - cy);
|
||||
sum += w * readVal<T>(src, cvFloor(cy), cvFloor(cx), c, border_type, borderVal);
|
||||
wsum += w;
|
||||
}
|
||||
}
|
||||
|
||||
float res = (!wsum)? 0 : sum / wsum;
|
||||
|
||||
return cv::saturate_cast<T>(res);
|
||||
}
|
||||
};
|
||||
|
||||
#endif // __OPENCV_TEST_INTERPOLATION_HPP__
|
||||
|
||||
+195
-195
@@ -1,195 +1,195 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace cv::gpu;
|
||||
using namespace cvtest;
|
||||
using namespace testing;
|
||||
|
||||
void printOsInfo()
|
||||
{
|
||||
#if defined _WIN32
|
||||
# if defined _WIN64
|
||||
cout << "OS: Windows x64 \n" << endl;
|
||||
# else
|
||||
cout << "OS: Windows x32 \n" << endl;
|
||||
# endif
|
||||
#elif defined linux
|
||||
# if defined _LP64
|
||||
cout << "OS: Linux x64 \n" << endl;
|
||||
# else
|
||||
cout << "OS: Linux x32 \n" << endl;
|
||||
# endif
|
||||
#elif defined __APPLE__
|
||||
# if defined _LP64
|
||||
cout << "OS: Apple x64 \n" << endl;
|
||||
# else
|
||||
cout << "OS: Apple x32 \n" << endl;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void printCudaInfo()
|
||||
{
|
||||
#if !defined HAVE_CUDA || defined(CUDA_DISABLER)
|
||||
cout << "OpenCV was built without CUDA support \n" << endl;
|
||||
#else
|
||||
int driver;
|
||||
cudaDriverGetVersion(&driver);
|
||||
|
||||
cout << "CUDA Driver version: " << driver << '\n';
|
||||
cout << "CUDA Runtime version: " << CUDART_VERSION << '\n';
|
||||
|
||||
cout << endl;
|
||||
|
||||
cout << "GPU module was compiled for the following GPU archs:" << endl;
|
||||
cout << " BIN: " << CUDA_ARCH_BIN << '\n';
|
||||
cout << " PTX: " << CUDA_ARCH_PTX << '\n';
|
||||
|
||||
cout << endl;
|
||||
|
||||
int deviceCount = getCudaEnabledDeviceCount();
|
||||
cout << "CUDA device count: " << deviceCount << '\n';
|
||||
|
||||
cout << endl;
|
||||
|
||||
for (int i = 0; i < deviceCount; ++i)
|
||||
{
|
||||
DeviceInfo info(i);
|
||||
|
||||
cout << "Device [" << i << "] \n";
|
||||
cout << "\t Name: " << info.name() << '\n';
|
||||
cout << "\t Compute capability: " << info.majorVersion() << '.' << info.minorVersion()<< '\n';
|
||||
cout << "\t Multi Processor Count: " << info.multiProcessorCount() << '\n';
|
||||
cout << "\t Total memory: " << static_cast<int>(static_cast<int>(info.totalMemory() / 1024.0) / 1024.0) << " Mb \n";
|
||||
cout << "\t Free memory: " << static_cast<int>(static_cast<int>(info.freeMemory() / 1024.0) / 1024.0) << " Mb \n";
|
||||
if (!info.isCompatible())
|
||||
cout << "\t !!! This device is NOT compatible with current GPU module build \n";
|
||||
|
||||
cout << endl;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
try
|
||||
{
|
||||
const char* keys =
|
||||
"{ h help ? | | Print help}"
|
||||
"{ i info | | Print information about system and exit }"
|
||||
"{ device | -1 | Device on which tests will be executed (-1 means all devices) }"
|
||||
"{ nvtest_output_level | none | NVidia test verbosity level (none, compact, full) }"
|
||||
;
|
||||
|
||||
CommandLineParser cmd(argc, (const char**)argv, keys);
|
||||
|
||||
if (cmd.get<bool>("help"))
|
||||
{
|
||||
cmd.printParams();
|
||||
return 0;
|
||||
}
|
||||
|
||||
printOsInfo();
|
||||
printCudaInfo();
|
||||
|
||||
if (cmd.get<bool>("info"))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int device = cmd.get<int>("device");
|
||||
if (device < 0)
|
||||
{
|
||||
DeviceManager::instance().loadAll();
|
||||
|
||||
cout << "Run tests on all supported devices \n" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
DeviceManager::instance().load(device);
|
||||
|
||||
DeviceInfo info(device);
|
||||
cout << "Run tests on device " << device << " [" << info.name() << "] \n" << endl;
|
||||
}
|
||||
|
||||
string outputLevel = cmd.get<string>("nvtest_output_level");
|
||||
|
||||
if (outputLevel == "none")
|
||||
nvidiaTestOutputLevel = OutputLevelNone;
|
||||
else if (outputLevel == "compact")
|
||||
nvidiaTestOutputLevel = OutputLevelCompact;
|
||||
else if (outputLevel == "full")
|
||||
nvidiaTestOutputLevel = OutputLevelFull;
|
||||
|
||||
TS::ptr()->init("gpu");
|
||||
InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
catch (const exception& e)
|
||||
{
|
||||
cerr << e.what() << endl;
|
||||
return -1;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
cerr << "Unknown error" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else // HAVE_CUDA
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("OpenCV was built without CUDA support\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace cv::gpu;
|
||||
using namespace cvtest;
|
||||
using namespace testing;
|
||||
|
||||
void printOsInfo()
|
||||
{
|
||||
#if defined _WIN32
|
||||
# if defined _WIN64
|
||||
cout << "OS: Windows x64 \n" << endl;
|
||||
# else
|
||||
cout << "OS: Windows x32 \n" << endl;
|
||||
# endif
|
||||
#elif defined linux
|
||||
# if defined _LP64
|
||||
cout << "OS: Linux x64 \n" << endl;
|
||||
# else
|
||||
cout << "OS: Linux x32 \n" << endl;
|
||||
# endif
|
||||
#elif defined __APPLE__
|
||||
# if defined _LP64
|
||||
cout << "OS: Apple x64 \n" << endl;
|
||||
# else
|
||||
cout << "OS: Apple x32 \n" << endl;
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
|
||||
void printCudaInfo()
|
||||
{
|
||||
#if !defined HAVE_CUDA || defined(CUDA_DISABLER)
|
||||
cout << "OpenCV was built without CUDA support \n" << endl;
|
||||
#else
|
||||
int driver;
|
||||
cudaDriverGetVersion(&driver);
|
||||
|
||||
cout << "CUDA Driver version: " << driver << '\n';
|
||||
cout << "CUDA Runtime version: " << CUDART_VERSION << '\n';
|
||||
|
||||
cout << endl;
|
||||
|
||||
cout << "GPU module was compiled for the following GPU archs:" << endl;
|
||||
cout << " BIN: " << CUDA_ARCH_BIN << '\n';
|
||||
cout << " PTX: " << CUDA_ARCH_PTX << '\n';
|
||||
|
||||
cout << endl;
|
||||
|
||||
int deviceCount = getCudaEnabledDeviceCount();
|
||||
cout << "CUDA device count: " << deviceCount << '\n';
|
||||
|
||||
cout << endl;
|
||||
|
||||
for (int i = 0; i < deviceCount; ++i)
|
||||
{
|
||||
DeviceInfo info(i);
|
||||
|
||||
cout << "Device [" << i << "] \n";
|
||||
cout << "\t Name: " << info.name() << '\n';
|
||||
cout << "\t Compute capability: " << info.majorVersion() << '.' << info.minorVersion()<< '\n';
|
||||
cout << "\t Multi Processor Count: " << info.multiProcessorCount() << '\n';
|
||||
cout << "\t Total memory: " << static_cast<int>(static_cast<int>(info.totalMemory() / 1024.0) / 1024.0) << " Mb \n";
|
||||
cout << "\t Free memory: " << static_cast<int>(static_cast<int>(info.freeMemory() / 1024.0) / 1024.0) << " Mb \n";
|
||||
if (!info.isCompatible())
|
||||
cout << "\t !!! This device is NOT compatible with current GPU module build \n";
|
||||
|
||||
cout << endl;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
try
|
||||
{
|
||||
const char* keys =
|
||||
"{ h help ? | | Print help}"
|
||||
"{ i info | | Print information about system and exit }"
|
||||
"{ device | -1 | Device on which tests will be executed (-1 means all devices) }"
|
||||
"{ nvtest_output_level | none | NVidia test verbosity level (none, compact, full) }"
|
||||
;
|
||||
|
||||
CommandLineParser cmd(argc, (const char**)argv, keys);
|
||||
|
||||
if (cmd.get<bool>("help"))
|
||||
{
|
||||
cmd.printParams();
|
||||
return 0;
|
||||
}
|
||||
|
||||
printOsInfo();
|
||||
printCudaInfo();
|
||||
|
||||
if (cmd.get<bool>("info"))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int device = cmd.get<int>("device");
|
||||
if (device < 0)
|
||||
{
|
||||
DeviceManager::instance().loadAll();
|
||||
|
||||
cout << "Run tests on all supported devices \n" << endl;
|
||||
}
|
||||
else
|
||||
{
|
||||
DeviceManager::instance().load(device);
|
||||
|
||||
DeviceInfo info(device);
|
||||
cout << "Run tests on device " << device << " [" << info.name() << "] \n" << endl;
|
||||
}
|
||||
|
||||
string outputLevel = cmd.get<string>("nvtest_output_level");
|
||||
|
||||
if (outputLevel == "none")
|
||||
nvidiaTestOutputLevel = OutputLevelNone;
|
||||
else if (outputLevel == "compact")
|
||||
nvidiaTestOutputLevel = OutputLevelCompact;
|
||||
else if (outputLevel == "full")
|
||||
nvidiaTestOutputLevel = OutputLevelFull;
|
||||
|
||||
TS::ptr()->init("gpu");
|
||||
InitGoogleTest(&argc, argv);
|
||||
|
||||
return RUN_ALL_TESTS();
|
||||
}
|
||||
catch (const exception& e)
|
||||
{
|
||||
cerr << e.what() << endl;
|
||||
return -1;
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
cerr << "Unknown error" << endl;
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else // HAVE_CUDA
|
||||
|
||||
int main()
|
||||
{
|
||||
printf("OpenCV was built without CUDA support\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
@@ -1,140 +1,140 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _ncvautotestlister_hpp_
|
||||
#define _ncvautotestlister_hpp_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include <main_test_nvidia.h>
|
||||
//enum OutputLevel
|
||||
//{
|
||||
// OutputLevelNone,
|
||||
// OutputLevelCompact,
|
||||
// OutputLevelFull
|
||||
//};
|
||||
|
||||
class NCVAutoTestLister
|
||||
{
|
||||
public:
|
||||
|
||||
NCVAutoTestLister(std::string testSuiteName_, OutputLevel outputLevel_ = OutputLevelCompact, NcvBool bStopOnFirstFail_=false)
|
||||
:
|
||||
testSuiteName(testSuiteName_),
|
||||
outputLevel(outputLevel_),
|
||||
bStopOnFirstFail(bStopOnFirstFail_)
|
||||
{
|
||||
}
|
||||
|
||||
void add(INCVTest *test)
|
||||
{
|
||||
this->tests.push_back(test);
|
||||
}
|
||||
|
||||
bool invoke()
|
||||
{
|
||||
Ncv32u nPassed = 0;
|
||||
Ncv32u nFailed = 0;
|
||||
Ncv32u nFailedMem = 0;
|
||||
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("Test suite '%s' with %d tests\n",
|
||||
testSuiteName.c_str(),
|
||||
(int)(this->tests.size()));
|
||||
}
|
||||
|
||||
for (Ncv32u i=0; i<this->tests.size(); i++)
|
||||
{
|
||||
INCVTest &curTest = *tests[i];
|
||||
|
||||
NCVTestReport curReport;
|
||||
bool res = curTest.executeTest(curReport);
|
||||
|
||||
if (outputLevel == OutputLevelFull)
|
||||
{
|
||||
printf("Test %3i %16s; Consumed mem GPU = %8d, CPU = %8d; %s\n",
|
||||
i,
|
||||
curTest.getName().c_str(),
|
||||
curReport.statsNums["MemGPU"],
|
||||
curReport.statsNums["MemCPU"],
|
||||
curReport.statsText["rcode"].c_str());
|
||||
}
|
||||
|
||||
if (res)
|
||||
{
|
||||
nPassed++;
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf(".");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!curReport.statsText["rcode"].compare("FAILED"))
|
||||
{
|
||||
nFailed++;
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("x");
|
||||
}
|
||||
if (bStopOnFirstFail)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nFailedMem++;
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("m");
|
||||
}
|
||||
}
|
||||
}
|
||||
fflush(stdout);
|
||||
}
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (outputLevel != OutputLevelNone)
|
||||
{
|
||||
printf("Test suite '%s' complete: %d total, %d passed, %d memory errors, %d failed\n\n",
|
||||
testSuiteName.c_str(),
|
||||
(int)(this->tests.size()),
|
||||
nPassed,
|
||||
nFailedMem,
|
||||
nFailed);
|
||||
}
|
||||
|
||||
bool passed = nFailed == 0 && nFailedMem == 0;
|
||||
return passed;
|
||||
}
|
||||
|
||||
~NCVAutoTestLister()
|
||||
{
|
||||
for (Ncv32u i=0; i<this->tests.size(); i++)
|
||||
{
|
||||
delete tests[i];
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
std::string testSuiteName;
|
||||
OutputLevel outputLevel;
|
||||
NcvBool bStopOnFirstFail;
|
||||
std::vector<INCVTest *> tests;
|
||||
};
|
||||
|
||||
#endif // _ncvautotestlister_hpp_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _ncvautotestlister_hpp_
|
||||
#define _ncvautotestlister_hpp_
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include <main_test_nvidia.h>
|
||||
//enum OutputLevel
|
||||
//{
|
||||
// OutputLevelNone,
|
||||
// OutputLevelCompact,
|
||||
// OutputLevelFull
|
||||
//};
|
||||
|
||||
class NCVAutoTestLister
|
||||
{
|
||||
public:
|
||||
|
||||
NCVAutoTestLister(std::string testSuiteName_, OutputLevel outputLevel_ = OutputLevelCompact, NcvBool bStopOnFirstFail_=false)
|
||||
:
|
||||
testSuiteName(testSuiteName_),
|
||||
outputLevel(outputLevel_),
|
||||
bStopOnFirstFail(bStopOnFirstFail_)
|
||||
{
|
||||
}
|
||||
|
||||
void add(INCVTest *test)
|
||||
{
|
||||
this->tests.push_back(test);
|
||||
}
|
||||
|
||||
bool invoke()
|
||||
{
|
||||
Ncv32u nPassed = 0;
|
||||
Ncv32u nFailed = 0;
|
||||
Ncv32u nFailedMem = 0;
|
||||
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("Test suite '%s' with %d tests\n",
|
||||
testSuiteName.c_str(),
|
||||
(int)(this->tests.size()));
|
||||
}
|
||||
|
||||
for (Ncv32u i=0; i<this->tests.size(); i++)
|
||||
{
|
||||
INCVTest &curTest = *tests[i];
|
||||
|
||||
NCVTestReport curReport;
|
||||
bool res = curTest.executeTest(curReport);
|
||||
|
||||
if (outputLevel == OutputLevelFull)
|
||||
{
|
||||
printf("Test %3i %16s; Consumed mem GPU = %8d, CPU = %8d; %s\n",
|
||||
i,
|
||||
curTest.getName().c_str(),
|
||||
curReport.statsNums["MemGPU"],
|
||||
curReport.statsNums["MemCPU"],
|
||||
curReport.statsText["rcode"].c_str());
|
||||
}
|
||||
|
||||
if (res)
|
||||
{
|
||||
nPassed++;
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf(".");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!curReport.statsText["rcode"].compare("FAILED"))
|
||||
{
|
||||
nFailed++;
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("x");
|
||||
}
|
||||
if (bStopOnFirstFail)
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
nFailedMem++;
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("m");
|
||||
}
|
||||
}
|
||||
}
|
||||
fflush(stdout);
|
||||
}
|
||||
if (outputLevel == OutputLevelCompact)
|
||||
{
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
if (outputLevel != OutputLevelNone)
|
||||
{
|
||||
printf("Test suite '%s' complete: %d total, %d passed, %d memory errors, %d failed\n\n",
|
||||
testSuiteName.c_str(),
|
||||
(int)(this->tests.size()),
|
||||
nPassed,
|
||||
nFailedMem,
|
||||
nFailed);
|
||||
}
|
||||
|
||||
bool passed = nFailed == 0 && nFailedMem == 0;
|
||||
return passed;
|
||||
}
|
||||
|
||||
~NCVAutoTestLister()
|
||||
{
|
||||
for (Ncv32u i=0; i<this->tests.size(); i++)
|
||||
{
|
||||
delete tests[i];
|
||||
}
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
std::string testSuiteName;
|
||||
OutputLevel outputLevel;
|
||||
NcvBool bStopOnFirstFail;
|
||||
std::vector<INCVTest *> tests;
|
||||
};
|
||||
|
||||
#endif // _ncvautotestlister_hpp_
|
||||
|
||||
+214
-214
@@ -1,214 +1,214 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _ncvtest_hpp_
|
||||
#define _ncvtest_hpp_
|
||||
|
||||
#if defined _MSC_VER
|
||||
# pragma warning( disable : 4201 4408 4127 4100)
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
|
||||
#include <cuda_runtime.h>
|
||||
#include "NPP_staging.hpp"
|
||||
|
||||
|
||||
struct NCVTestReport
|
||||
{
|
||||
std::map<std::string, Ncv32u> statsNums;
|
||||
std::map<std::string, std::string> statsText;
|
||||
};
|
||||
|
||||
|
||||
class INCVTest
|
||||
{
|
||||
public:
|
||||
virtual bool executeTest(NCVTestReport &report) = 0;
|
||||
virtual std::string getName() const = 0;
|
||||
virtual ~INCVTest(){}
|
||||
};
|
||||
|
||||
|
||||
class NCVTestProvider : public INCVTest
|
||||
{
|
||||
public:
|
||||
|
||||
NCVTestProvider(std::string testName_)
|
||||
:
|
||||
testName(testName_)
|
||||
{
|
||||
int devId;
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDevice(&devId), "Error returned from cudaGetDevice", );
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDeviceProperties(&this->devProp, devId), "Error returned from cudaGetDeviceProperties", );
|
||||
}
|
||||
|
||||
virtual bool init() = 0;
|
||||
virtual bool process() = 0;
|
||||
virtual bool deinit() = 0;
|
||||
virtual bool toString(std::ofstream &strOut) = 0;
|
||||
|
||||
virtual std::string getName() const
|
||||
{
|
||||
return this->testName;
|
||||
}
|
||||
|
||||
virtual ~NCVTestProvider()
|
||||
{
|
||||
deinitMemory();
|
||||
}
|
||||
|
||||
virtual bool executeTest(NCVTestReport &report)
|
||||
{
|
||||
bool res;
|
||||
report.statsText["rcode"] = "FAILED";
|
||||
|
||||
res = initMemory(report);
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
res = init();
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinit();
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
res = process();
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinit();
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
res = deinit();
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
deinitMemory();
|
||||
|
||||
report.statsText["rcode"] = "Passed";
|
||||
return true;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
cudaDeviceProp devProp;
|
||||
std::auto_ptr<INCVMemAllocator> allocatorGPU;
|
||||
std::auto_ptr<INCVMemAllocator> allocatorCPU;
|
||||
|
||||
private:
|
||||
|
||||
std::string testName;
|
||||
|
||||
bool initMemory(NCVTestReport &report)
|
||||
{
|
||||
this->allocatorGPU.reset(new NCVMemStackAllocator(static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
this->allocatorCPU.reset(new NCVMemStackAllocator(static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
|
||||
if (!this->allocatorGPU.get()->isInitialized() ||
|
||||
!this->allocatorCPU.get()->isInitialized())
|
||||
{
|
||||
report.statsText["rcode"] = "Memory FAILED";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this->process())
|
||||
{
|
||||
report.statsText["rcode"] = "Memory FAILED";
|
||||
return false;
|
||||
}
|
||||
|
||||
Ncv32u maxGPUsize = (Ncv32u)this->allocatorGPU.get()->maxSize();
|
||||
Ncv32u maxCPUsize = (Ncv32u)this->allocatorCPU.get()->maxSize();
|
||||
|
||||
report.statsNums["MemGPU"] = maxGPUsize;
|
||||
report.statsNums["MemCPU"] = maxCPUsize;
|
||||
|
||||
this->allocatorGPU.reset(new NCVMemStackAllocator(NCVMemoryTypeDevice, maxGPUsize, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
|
||||
this->allocatorCPU.reset(new NCVMemStackAllocator(NCVMemoryTypeHostPinned, maxCPUsize, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
|
||||
if (!this->allocatorGPU.get()->isInitialized() ||
|
||||
!this->allocatorCPU.get()->isInitialized())
|
||||
{
|
||||
report.statsText["rcode"] = "Memory FAILED";
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void deinitMemory()
|
||||
{
|
||||
this->allocatorGPU.reset();
|
||||
this->allocatorCPU.reset();
|
||||
}
|
||||
|
||||
void dumpToFile(NCVTestReport &report)
|
||||
{
|
||||
bool bReasonMem = (0 == report.statsText["rcode"].compare("Memory FAILED"));
|
||||
std::string fname = "TestDump_";
|
||||
fname += (bReasonMem ? "m_" : "") + this->testName + ".log";
|
||||
std::ofstream stream(fname.c_str(), std::ios::trunc | std::ios::out);
|
||||
if (!stream.is_open()) return;
|
||||
|
||||
stream << "NCV Test Failure Log: " << this->testName << std::endl;
|
||||
stream << "====================================================" << std::endl << std::endl;
|
||||
stream << "Test initialization report: " << std::endl;
|
||||
for (std::map<std::string,std::string>::iterator it=report.statsText.begin();
|
||||
it != report.statsText.end(); it++)
|
||||
{
|
||||
stream << it->first << "=" << it->second << std::endl;
|
||||
}
|
||||
for (std::map<std::string,Ncv32u>::iterator it=report.statsNums.begin();
|
||||
it != report.statsNums.end(); it++)
|
||||
{
|
||||
stream << it->first << "=" << it->second << std::endl;
|
||||
}
|
||||
stream << std::endl;
|
||||
|
||||
stream << "Test initialization parameters: " << std::endl;
|
||||
bool bSerializeRes = false;
|
||||
try
|
||||
{
|
||||
bSerializeRes = this->toString(stream);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
if (!bSerializeRes)
|
||||
{
|
||||
stream << "Couldn't retrieve object dump" << std::endl;
|
||||
}
|
||||
|
||||
stream.flush();
|
||||
}
|
||||
};
|
||||
|
||||
#endif // _ncvtest_hpp_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _ncvtest_hpp_
|
||||
#define _ncvtest_hpp_
|
||||
|
||||
#if defined _MSC_VER
|
||||
# pragma warning( disable : 4201 4408 4127 4100)
|
||||
#endif
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <algorithm>
|
||||
#include <fstream>
|
||||
|
||||
#include <cuda_runtime.h>
|
||||
#include "NPP_staging.hpp"
|
||||
|
||||
|
||||
struct NCVTestReport
|
||||
{
|
||||
std::map<std::string, Ncv32u> statsNums;
|
||||
std::map<std::string, std::string> statsText;
|
||||
};
|
||||
|
||||
|
||||
class INCVTest
|
||||
{
|
||||
public:
|
||||
virtual bool executeTest(NCVTestReport &report) = 0;
|
||||
virtual std::string getName() const = 0;
|
||||
virtual ~INCVTest(){}
|
||||
};
|
||||
|
||||
|
||||
class NCVTestProvider : public INCVTest
|
||||
{
|
||||
public:
|
||||
|
||||
NCVTestProvider(std::string testName_)
|
||||
:
|
||||
testName(testName_)
|
||||
{
|
||||
int devId;
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDevice(&devId), "Error returned from cudaGetDevice", );
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDeviceProperties(&this->devProp, devId), "Error returned from cudaGetDeviceProperties", );
|
||||
}
|
||||
|
||||
virtual bool init() = 0;
|
||||
virtual bool process() = 0;
|
||||
virtual bool deinit() = 0;
|
||||
virtual bool toString(std::ofstream &strOut) = 0;
|
||||
|
||||
virtual std::string getName() const
|
||||
{
|
||||
return this->testName;
|
||||
}
|
||||
|
||||
virtual ~NCVTestProvider()
|
||||
{
|
||||
deinitMemory();
|
||||
}
|
||||
|
||||
virtual bool executeTest(NCVTestReport &report)
|
||||
{
|
||||
bool res;
|
||||
report.statsText["rcode"] = "FAILED";
|
||||
|
||||
res = initMemory(report);
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
res = init();
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinit();
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
res = process();
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinit();
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
res = deinit();
|
||||
if (!res)
|
||||
{
|
||||
dumpToFile(report);
|
||||
deinitMemory();
|
||||
return false;
|
||||
}
|
||||
|
||||
deinitMemory();
|
||||
|
||||
report.statsText["rcode"] = "Passed";
|
||||
return true;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
cudaDeviceProp devProp;
|
||||
std::auto_ptr<INCVMemAllocator> allocatorGPU;
|
||||
std::auto_ptr<INCVMemAllocator> allocatorCPU;
|
||||
|
||||
private:
|
||||
|
||||
std::string testName;
|
||||
|
||||
bool initMemory(NCVTestReport &report)
|
||||
{
|
||||
this->allocatorGPU.reset(new NCVMemStackAllocator(static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
this->allocatorCPU.reset(new NCVMemStackAllocator(static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
|
||||
if (!this->allocatorGPU.get()->isInitialized() ||
|
||||
!this->allocatorCPU.get()->isInitialized())
|
||||
{
|
||||
report.statsText["rcode"] = "Memory FAILED";
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!this->process())
|
||||
{
|
||||
report.statsText["rcode"] = "Memory FAILED";
|
||||
return false;
|
||||
}
|
||||
|
||||
Ncv32u maxGPUsize = (Ncv32u)this->allocatorGPU.get()->maxSize();
|
||||
Ncv32u maxCPUsize = (Ncv32u)this->allocatorCPU.get()->maxSize();
|
||||
|
||||
report.statsNums["MemGPU"] = maxGPUsize;
|
||||
report.statsNums["MemCPU"] = maxCPUsize;
|
||||
|
||||
this->allocatorGPU.reset(new NCVMemStackAllocator(NCVMemoryTypeDevice, maxGPUsize, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
|
||||
this->allocatorCPU.reset(new NCVMemStackAllocator(NCVMemoryTypeHostPinned, maxCPUsize, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
|
||||
if (!this->allocatorGPU.get()->isInitialized() ||
|
||||
!this->allocatorCPU.get()->isInitialized())
|
||||
{
|
||||
report.statsText["rcode"] = "Memory FAILED";
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void deinitMemory()
|
||||
{
|
||||
this->allocatorGPU.reset();
|
||||
this->allocatorCPU.reset();
|
||||
}
|
||||
|
||||
void dumpToFile(NCVTestReport &report)
|
||||
{
|
||||
bool bReasonMem = (0 == report.statsText["rcode"].compare("Memory FAILED"));
|
||||
std::string fname = "TestDump_";
|
||||
fname += (bReasonMem ? "m_" : "") + this->testName + ".log";
|
||||
std::ofstream stream(fname.c_str(), std::ios::trunc | std::ios::out);
|
||||
if (!stream.is_open()) return;
|
||||
|
||||
stream << "NCV Test Failure Log: " << this->testName << std::endl;
|
||||
stream << "====================================================" << std::endl << std::endl;
|
||||
stream << "Test initialization report: " << std::endl;
|
||||
for (std::map<std::string,std::string>::iterator it=report.statsText.begin();
|
||||
it != report.statsText.end(); it++)
|
||||
{
|
||||
stream << it->first << "=" << it->second << std::endl;
|
||||
}
|
||||
for (std::map<std::string,Ncv32u>::iterator it=report.statsNums.begin();
|
||||
it != report.statsNums.end(); it++)
|
||||
{
|
||||
stream << it->first << "=" << it->second << std::endl;
|
||||
}
|
||||
stream << std::endl;
|
||||
|
||||
stream << "Test initialization parameters: " << std::endl;
|
||||
bool bSerializeRes = false;
|
||||
try
|
||||
{
|
||||
bSerializeRes = this->toString(stream);
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
}
|
||||
|
||||
if (!bSerializeRes)
|
||||
{
|
||||
stream << "Couldn't retrieve object dump" << std::endl;
|
||||
}
|
||||
|
||||
stream.flush();
|
||||
}
|
||||
};
|
||||
|
||||
#endif // _ncvtest_hpp_
|
||||
|
||||
@@ -1,161 +1,161 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _ncvtestsourceprovider_hpp_
|
||||
#define _ncvtestsourceprovider_hpp_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "NCV.hpp"
|
||||
#include <opencv2/highgui/highgui.hpp>
|
||||
|
||||
|
||||
template <class T>
|
||||
class NCVTestSourceProvider
|
||||
{
|
||||
public:
|
||||
|
||||
NCVTestSourceProvider(Ncv32u seed, T rangeLow, T rangeHigh, Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
:
|
||||
bInit(false)
|
||||
{
|
||||
ncvAssertPrintReturn(rangeLow < rangeHigh, "NCVTestSourceProvider ctor:: Invalid range", );
|
||||
|
||||
int devId;
|
||||
cudaDeviceProp devProp;
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDevice(&devId), "Error returned from cudaGetDevice", );
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDeviceProperties(&devProp, devId), "Error returned from cudaGetDeviceProperties", );
|
||||
|
||||
//Ncv32u maxWpitch = alignUp(maxWidth * sizeof(T), devProp.textureAlignment);
|
||||
|
||||
allocatorCPU.reset(new NCVMemNativeAllocator(NCVMemoryTypeHostPinned, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
data.reset(new NCVMatrixAlloc<T>(*this->allocatorCPU.get(), maxWidth, maxHeight));
|
||||
ncvAssertPrintReturn(data.get()->isMemAllocated(), "NCVTestSourceProvider ctor:: Matrix not allocated", );
|
||||
|
||||
this->dataWidth = maxWidth;
|
||||
this->dataHeight = maxHeight;
|
||||
|
||||
srand(seed);
|
||||
|
||||
for (Ncv32u i=0; i<maxHeight; i++)
|
||||
{
|
||||
for (Ncv32u j=0; j<data.get()->stride(); j++)
|
||||
{
|
||||
data.get()->ptr()[i * data.get()->stride() + j] =
|
||||
(T)(((1.0 * rand()) / RAND_MAX) * (rangeHigh - rangeLow) + rangeLow);
|
||||
}
|
||||
}
|
||||
|
||||
this->bInit = true;
|
||||
}
|
||||
|
||||
NCVTestSourceProvider(std::string pgmFilename)
|
||||
:
|
||||
bInit(false)
|
||||
{
|
||||
ncvAssertPrintReturn(sizeof(T) == 1, "NCVTestSourceProvider ctor:: PGM constructor complies only with 8bit types", );
|
||||
|
||||
cv::Mat image = cv::imread(pgmFilename);
|
||||
ncvAssertPrintReturn(!image.empty(), "NCVTestSourceProvider ctor:: PGM file error", );
|
||||
|
||||
int devId;
|
||||
cudaDeviceProp devProp;
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDevice(&devId), "Error returned from cudaGetDevice", );
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDeviceProperties(&devProp, devId), "Error returned from cudaGetDeviceProperties", );
|
||||
|
||||
allocatorCPU.reset(new NCVMemNativeAllocator(NCVMemoryTypeHostPinned, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
data.reset(new NCVMatrixAlloc<T>(*this->allocatorCPU.get(), image.cols, image.rows));
|
||||
ncvAssertPrintReturn(data.get()->isMemAllocated(), "NCVTestSourceProvider ctor:: Matrix not allocated", );
|
||||
|
||||
this->dataWidth = image.cols;
|
||||
this->dataHeight = image.rows;
|
||||
|
||||
cv::Mat hdr(image.size(), CV_8UC1, data.get()->ptr(), data.get()->pitch());
|
||||
image.copyTo(hdr);
|
||||
|
||||
this->bInit = true;
|
||||
}
|
||||
|
||||
NcvBool fill(NCVMatrix<T> &dst)
|
||||
{
|
||||
ncvAssertReturn(this->isInit() &&
|
||||
dst.memType() == allocatorCPU.get()->memType(), false);
|
||||
|
||||
if (dst.width() == 0 || dst.height() == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (Ncv32u i=0; i<dst.height(); i++)
|
||||
{
|
||||
Ncv32u srcLine = i % this->dataHeight;
|
||||
|
||||
Ncv32u srcFullChunks = dst.width() / this->dataWidth;
|
||||
for (Ncv32u j=0; j<srcFullChunks; j++)
|
||||
{
|
||||
memcpy(dst.ptr() + i * dst.stride() + j * this->dataWidth,
|
||||
this->data.get()->ptr() + this->data.get()->stride() * srcLine,
|
||||
this->dataWidth * sizeof(T));
|
||||
}
|
||||
|
||||
Ncv32u srcLastChunk = dst.width() % this->dataWidth;
|
||||
memcpy(dst.ptr() + i * dst.stride() + srcFullChunks * this->dataWidth,
|
||||
this->data.get()->ptr() + this->data.get()->stride() * srcLine,
|
||||
srcLastChunk * sizeof(T));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
NcvBool fill(NCVVector<T> &dst)
|
||||
{
|
||||
ncvAssertReturn(this->isInit() &&
|
||||
dst.memType() == allocatorCPU.get()->memType(), false);
|
||||
|
||||
if (dst.length() == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Ncv32u srcLen = this->dataWidth * this->dataHeight;
|
||||
|
||||
Ncv32u srcFullChunks = (Ncv32u)dst.length() / srcLen;
|
||||
for (Ncv32u j=0; j<srcFullChunks; j++)
|
||||
{
|
||||
memcpy(dst.ptr() + j * srcLen, this->data.get()->ptr(), srcLen * sizeof(T));
|
||||
}
|
||||
|
||||
Ncv32u srcLastChunk = dst.length() % srcLen;
|
||||
memcpy(dst.ptr() + srcFullChunks * srcLen, this->data.get()->ptr(), srcLastChunk * sizeof(T));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
~NCVTestSourceProvider()
|
||||
{
|
||||
data.reset();
|
||||
allocatorCPU.reset();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
NcvBool isInit(void)
|
||||
{
|
||||
return this->bInit;
|
||||
}
|
||||
|
||||
NcvBool bInit;
|
||||
std::auto_ptr< INCVMemAllocator > allocatorCPU;
|
||||
std::auto_ptr< NCVMatrixAlloc<T> > data;
|
||||
Ncv32u dataWidth;
|
||||
Ncv32u dataHeight;
|
||||
};
|
||||
|
||||
#endif // _ncvtestsourceprovider_hpp_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _ncvtestsourceprovider_hpp_
|
||||
#define _ncvtestsourceprovider_hpp_
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "NCV.hpp"
|
||||
#include <opencv2/highgui/highgui.hpp>
|
||||
|
||||
|
||||
template <class T>
|
||||
class NCVTestSourceProvider
|
||||
{
|
||||
public:
|
||||
|
||||
NCVTestSourceProvider(Ncv32u seed, T rangeLow, T rangeHigh, Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
:
|
||||
bInit(false)
|
||||
{
|
||||
ncvAssertPrintReturn(rangeLow < rangeHigh, "NCVTestSourceProvider ctor:: Invalid range", );
|
||||
|
||||
int devId;
|
||||
cudaDeviceProp devProp;
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDevice(&devId), "Error returned from cudaGetDevice", );
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDeviceProperties(&devProp, devId), "Error returned from cudaGetDeviceProperties", );
|
||||
|
||||
//Ncv32u maxWpitch = alignUp(maxWidth * sizeof(T), devProp.textureAlignment);
|
||||
|
||||
allocatorCPU.reset(new NCVMemNativeAllocator(NCVMemoryTypeHostPinned, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
data.reset(new NCVMatrixAlloc<T>(*this->allocatorCPU.get(), maxWidth, maxHeight));
|
||||
ncvAssertPrintReturn(data.get()->isMemAllocated(), "NCVTestSourceProvider ctor:: Matrix not allocated", );
|
||||
|
||||
this->dataWidth = maxWidth;
|
||||
this->dataHeight = maxHeight;
|
||||
|
||||
srand(seed);
|
||||
|
||||
for (Ncv32u i=0; i<maxHeight; i++)
|
||||
{
|
||||
for (Ncv32u j=0; j<data.get()->stride(); j++)
|
||||
{
|
||||
data.get()->ptr()[i * data.get()->stride() + j] =
|
||||
(T)(((1.0 * rand()) / RAND_MAX) * (rangeHigh - rangeLow) + rangeLow);
|
||||
}
|
||||
}
|
||||
|
||||
this->bInit = true;
|
||||
}
|
||||
|
||||
NCVTestSourceProvider(std::string pgmFilename)
|
||||
:
|
||||
bInit(false)
|
||||
{
|
||||
ncvAssertPrintReturn(sizeof(T) == 1, "NCVTestSourceProvider ctor:: PGM constructor complies only with 8bit types", );
|
||||
|
||||
cv::Mat image = cv::imread(pgmFilename);
|
||||
ncvAssertPrintReturn(!image.empty(), "NCVTestSourceProvider ctor:: PGM file error", );
|
||||
|
||||
int devId;
|
||||
cudaDeviceProp devProp;
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDevice(&devId), "Error returned from cudaGetDevice", );
|
||||
ncvAssertPrintReturn(cudaSuccess == cudaGetDeviceProperties(&devProp, devId), "Error returned from cudaGetDeviceProperties", );
|
||||
|
||||
allocatorCPU.reset(new NCVMemNativeAllocator(NCVMemoryTypeHostPinned, static_cast<Ncv32u>(devProp.textureAlignment)));
|
||||
data.reset(new NCVMatrixAlloc<T>(*this->allocatorCPU.get(), image.cols, image.rows));
|
||||
ncvAssertPrintReturn(data.get()->isMemAllocated(), "NCVTestSourceProvider ctor:: Matrix not allocated", );
|
||||
|
||||
this->dataWidth = image.cols;
|
||||
this->dataHeight = image.rows;
|
||||
|
||||
cv::Mat hdr(image.size(), CV_8UC1, data.get()->ptr(), data.get()->pitch());
|
||||
image.copyTo(hdr);
|
||||
|
||||
this->bInit = true;
|
||||
}
|
||||
|
||||
NcvBool fill(NCVMatrix<T> &dst)
|
||||
{
|
||||
ncvAssertReturn(this->isInit() &&
|
||||
dst.memType() == allocatorCPU.get()->memType(), false);
|
||||
|
||||
if (dst.width() == 0 || dst.height() == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
for (Ncv32u i=0; i<dst.height(); i++)
|
||||
{
|
||||
Ncv32u srcLine = i % this->dataHeight;
|
||||
|
||||
Ncv32u srcFullChunks = dst.width() / this->dataWidth;
|
||||
for (Ncv32u j=0; j<srcFullChunks; j++)
|
||||
{
|
||||
memcpy(dst.ptr() + i * dst.stride() + j * this->dataWidth,
|
||||
this->data.get()->ptr() + this->data.get()->stride() * srcLine,
|
||||
this->dataWidth * sizeof(T));
|
||||
}
|
||||
|
||||
Ncv32u srcLastChunk = dst.width() % this->dataWidth;
|
||||
memcpy(dst.ptr() + i * dst.stride() + srcFullChunks * this->dataWidth,
|
||||
this->data.get()->ptr() + this->data.get()->stride() * srcLine,
|
||||
srcLastChunk * sizeof(T));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
NcvBool fill(NCVVector<T> &dst)
|
||||
{
|
||||
ncvAssertReturn(this->isInit() &&
|
||||
dst.memType() == allocatorCPU.get()->memType(), false);
|
||||
|
||||
if (dst.length() == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
Ncv32u srcLen = this->dataWidth * this->dataHeight;
|
||||
|
||||
Ncv32u srcFullChunks = (Ncv32u)dst.length() / srcLen;
|
||||
for (Ncv32u j=0; j<srcFullChunks; j++)
|
||||
{
|
||||
memcpy(dst.ptr() + j * srcLen, this->data.get()->ptr(), srcLen * sizeof(T));
|
||||
}
|
||||
|
||||
Ncv32u srcLastChunk = dst.length() % srcLen;
|
||||
memcpy(dst.ptr() + srcFullChunks * srcLen, this->data.get()->ptr(), srcLastChunk * sizeof(T));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
~NCVTestSourceProvider()
|
||||
{
|
||||
data.reset();
|
||||
allocatorCPU.reset();
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
NcvBool isInit(void)
|
||||
{
|
||||
return this->bInit;
|
||||
}
|
||||
|
||||
NcvBool bInit;
|
||||
std::auto_ptr< INCVMemAllocator > allocatorCPU;
|
||||
std::auto_ptr< NCVMatrixAlloc<T> > data;
|
||||
Ncv32u dataWidth;
|
||||
Ncv32u dataHeight;
|
||||
};
|
||||
|
||||
#endif // _ncvtestsourceprovider_hpp_
|
||||
|
||||
@@ -1,133 +1,133 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestCompact.h"
|
||||
|
||||
|
||||
TestCompact::TestCompact(std::string testName_, NCVTestSourceProvider<Ncv32u> &src_,
|
||||
Ncv32u length_, Ncv32u badElem_, Ncv32u badElemPercentage_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
length(length_),
|
||||
badElem(badElem_),
|
||||
badElemPercentage(badElemPercentage_ > 100 ? 100 : badElemPercentage_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "length=" << length << std::endl;
|
||||
strOut << "badElem=" << badElem << std::endl;
|
||||
strOut << "badElemPercentage=" << badElemPercentage << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_vecSrc(*this->allocatorCPU.get(), this->length);
|
||||
ncvAssertReturn(h_vecSrc.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> d_vecSrc(*this->allocatorGPU.get(), this->length);
|
||||
ncvAssertReturn(d_vecSrc.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_vecDst(*this->allocatorCPU.get(), this->length);
|
||||
ncvAssertReturn(h_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> d_vecDst(*this->allocatorGPU.get(), this->length);
|
||||
ncvAssertReturn(d_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> h_vecDst_d(*this->allocatorCPU.get(), this->length);
|
||||
ncvAssertReturn(h_vecDst_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_vecSrc), false);
|
||||
for (Ncv32u i=0; i<this->length; i++)
|
||||
{
|
||||
Ncv32u tmp = (h_vecSrc.ptr()[i]) & 0xFF;
|
||||
tmp = tmp * 99 / 255;
|
||||
if (tmp < this->badElemPercentage)
|
||||
{
|
||||
h_vecSrc.ptr()[i] = this->badElem;
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_dstLen(*this->allocatorCPU.get(), 1);
|
||||
ncvAssertReturn(h_dstLen.isMemAllocated(), false);
|
||||
Ncv32u bufSize;
|
||||
ncvStat = nppsStCompactGetSize_32u(this->length, &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
Ncv32u h_outElemNum_h = 0;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvStat = h_vecSrc.copySolid(d_vecSrc, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
ncvStat = nppsStCompact_32u(d_vecSrc.ptr(), this->length,
|
||||
d_vecDst.ptr(), h_dstLen.ptr(), this->badElem,
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
ncvStat = d_vecDst.copySolid(h_vecDst_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppsStCompact_32u_host(h_vecSrc.ptr(), this->length, h_vecDst.ptr(), &h_outElemNum_h, this->badElem);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (h_dstLen.ptr()[0] != h_outElemNum_h)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_outElemNum_h; i++)
|
||||
{
|
||||
if (h_vecDst.ptr()[i] != h_vecDst_d.ptr()[i])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestCompact.h"
|
||||
|
||||
|
||||
TestCompact::TestCompact(std::string testName_, NCVTestSourceProvider<Ncv32u> &src_,
|
||||
Ncv32u length_, Ncv32u badElem_, Ncv32u badElemPercentage_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
length(length_),
|
||||
badElem(badElem_),
|
||||
badElemPercentage(badElemPercentage_ > 100 ? 100 : badElemPercentage_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "length=" << length << std::endl;
|
||||
strOut << "badElem=" << badElem << std::endl;
|
||||
strOut << "badElemPercentage=" << badElemPercentage << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_vecSrc(*this->allocatorCPU.get(), this->length);
|
||||
ncvAssertReturn(h_vecSrc.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> d_vecSrc(*this->allocatorGPU.get(), this->length);
|
||||
ncvAssertReturn(d_vecSrc.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_vecDst(*this->allocatorCPU.get(), this->length);
|
||||
ncvAssertReturn(h_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> d_vecDst(*this->allocatorGPU.get(), this->length);
|
||||
ncvAssertReturn(d_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> h_vecDst_d(*this->allocatorCPU.get(), this->length);
|
||||
ncvAssertReturn(h_vecDst_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_vecSrc), false);
|
||||
for (Ncv32u i=0; i<this->length; i++)
|
||||
{
|
||||
Ncv32u tmp = (h_vecSrc.ptr()[i]) & 0xFF;
|
||||
tmp = tmp * 99 / 255;
|
||||
if (tmp < this->badElemPercentage)
|
||||
{
|
||||
h_vecSrc.ptr()[i] = this->badElem;
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_dstLen(*this->allocatorCPU.get(), 1);
|
||||
ncvAssertReturn(h_dstLen.isMemAllocated(), false);
|
||||
Ncv32u bufSize;
|
||||
ncvStat = nppsStCompactGetSize_32u(this->length, &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
Ncv32u h_outElemNum_h = 0;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvStat = h_vecSrc.copySolid(d_vecSrc, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
ncvStat = nppsStCompact_32u(d_vecSrc.ptr(), this->length,
|
||||
d_vecDst.ptr(), h_dstLen.ptr(), this->badElem,
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
ncvStat = d_vecDst.copySolid(h_vecDst_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppsStCompact_32u_host(h_vecSrc.ptr(), this->length, h_vecDst.ptr(), &h_outElemNum_h, this->badElem);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (h_dstLen.ptr()[0] != h_outElemNum_h)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_outElemNum_h; i++)
|
||||
{
|
||||
if (h_vecDst.ptr()[i] != h_vecDst_d.ptr()[i])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestCompact::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,41 +1,41 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhypothesescompact_h_
|
||||
#define _testhypothesescompact_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestCompact : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestCompact(std::string testName, NCVTestSourceProvider<Ncv32u> &src,
|
||||
Ncv32u length, Ncv32u badElem, Ncv32u badElemPercentage);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestCompact(const TestCompact&);
|
||||
TestCompact& operator=(const TestCompact&);
|
||||
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> &src;
|
||||
Ncv32u length;
|
||||
Ncv32u badElem;
|
||||
Ncv32u badElemPercentage;
|
||||
};
|
||||
|
||||
#endif // _testhypothesescompact_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhypothesescompact_h_
|
||||
#define _testhypothesescompact_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestCompact : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestCompact(std::string testName, NCVTestSourceProvider<Ncv32u> &src,
|
||||
Ncv32u length, Ncv32u badElem, Ncv32u badElemPercentage);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestCompact(const TestCompact&);
|
||||
TestCompact& operator=(const TestCompact&);
|
||||
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> &src;
|
||||
Ncv32u length;
|
||||
Ncv32u badElem;
|
||||
Ncv32u badElemPercentage;
|
||||
};
|
||||
|
||||
#endif // _testhypothesescompact_h_
|
||||
|
||||
@@ -1,168 +1,168 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestDrawRects.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
template <class T>
|
||||
TestDrawRects<T>::TestDrawRects(std::string testName_, NCVTestSourceProvider<T> &src_,
|
||||
NCVTestSourceProvider<Ncv32u> &src32u_,
|
||||
Ncv32u width_, Ncv32u height_, Ncv32u numRects_, T color_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
src32u(src32u_),
|
||||
width(width_),
|
||||
height(height_),
|
||||
numRects(numRects_),
|
||||
color(color_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T)=" << sizeof(T) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
strOut << "numRects=" << numRects << std::endl;
|
||||
strOut << "color=" << color << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVMatrixAlloc<T> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img_d(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img_d.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> d_rects(*this->allocatorGPU.get(), this->numRects);
|
||||
ncvAssertReturn(d_rects.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_rects(*this->allocatorCPU.get(), this->numRects);
|
||||
ncvAssertReturn(h_rects.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
//fill vector of rectangles with random rects covering the input
|
||||
NCVVectorReuse<Ncv32u> h_rects_as32u(h_rects.getSegment());
|
||||
ncvAssertReturn(h_rects_as32u.isMemReused(), false);
|
||||
ncvAssertReturn(this->src32u.fill(h_rects_as32u), false);
|
||||
for (Ncv32u i=0; i<this->numRects; i++)
|
||||
{
|
||||
h_rects.ptr()[i].x = (Ncv32u)(((1.0 * h_rects.ptr()[i].x) / RAND_MAX) * (this->width-2));
|
||||
h_rects.ptr()[i].y = (Ncv32u)(((1.0 * h_rects.ptr()[i].y) / RAND_MAX) * (this->height-2));
|
||||
h_rects.ptr()[i].width = (Ncv32u)(((1.0 * h_rects.ptr()[i].width) / RAND_MAX) * (this->width+10 - h_rects.ptr()[i].x));
|
||||
h_rects.ptr()[i].height = (Ncv32u)(((1.0 * h_rects.ptr()[i].height) / RAND_MAX) * (this->height+10 - h_rects.ptr()[i].y));
|
||||
}
|
||||
ncvStat = h_rects.copySolid(d_rects, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_32u_device((Ncv32u *)d_img.ptr(), d_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)d_rects.ptr(), this->numRects, this->color, 0);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_8u_device((Ncv8u *)d_img.ptr(), d_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)d_rects.ptr(), this->numRects, (Ncv8u)this->color, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect drawrects test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = d_img.copySolid(h_img_d, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_32u_host((Ncv32u *)h_img.ptr(), h_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)h_rects.ptr(), this->numRects, this->color);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_8u_host((Ncv8u *)h_img.ptr(), h_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)h_rects.ptr(), this->numRects, (Ncv8u)this->color);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect drawrects test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
//const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_img.height(); i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_img.width(); j++)
|
||||
{
|
||||
if (h_img.ptr()[h_img.stride()*i+j] != h_img_d.ptr()[h_img_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestDrawRects<Ncv8u>;
|
||||
template class TestDrawRects<Ncv32u>;
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestDrawRects.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
template <class T>
|
||||
TestDrawRects<T>::TestDrawRects(std::string testName_, NCVTestSourceProvider<T> &src_,
|
||||
NCVTestSourceProvider<Ncv32u> &src32u_,
|
||||
Ncv32u width_, Ncv32u height_, Ncv32u numRects_, T color_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
src32u(src32u_),
|
||||
width(width_),
|
||||
height(height_),
|
||||
numRects(numRects_),
|
||||
color(color_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T)=" << sizeof(T) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
strOut << "numRects=" << numRects << std::endl;
|
||||
strOut << "color=" << color << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVMatrixAlloc<T> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img_d(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img_d.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> d_rects(*this->allocatorGPU.get(), this->numRects);
|
||||
ncvAssertReturn(d_rects.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_rects(*this->allocatorCPU.get(), this->numRects);
|
||||
ncvAssertReturn(h_rects.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
//fill vector of rectangles with random rects covering the input
|
||||
NCVVectorReuse<Ncv32u> h_rects_as32u(h_rects.getSegment());
|
||||
ncvAssertReturn(h_rects_as32u.isMemReused(), false);
|
||||
ncvAssertReturn(this->src32u.fill(h_rects_as32u), false);
|
||||
for (Ncv32u i=0; i<this->numRects; i++)
|
||||
{
|
||||
h_rects.ptr()[i].x = (Ncv32u)(((1.0 * h_rects.ptr()[i].x) / RAND_MAX) * (this->width-2));
|
||||
h_rects.ptr()[i].y = (Ncv32u)(((1.0 * h_rects.ptr()[i].y) / RAND_MAX) * (this->height-2));
|
||||
h_rects.ptr()[i].width = (Ncv32u)(((1.0 * h_rects.ptr()[i].width) / RAND_MAX) * (this->width+10 - h_rects.ptr()[i].x));
|
||||
h_rects.ptr()[i].height = (Ncv32u)(((1.0 * h_rects.ptr()[i].height) / RAND_MAX) * (this->height+10 - h_rects.ptr()[i].y));
|
||||
}
|
||||
ncvStat = h_rects.copySolid(d_rects, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_32u_device((Ncv32u *)d_img.ptr(), d_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)d_rects.ptr(), this->numRects, this->color, 0);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_8u_device((Ncv8u *)d_img.ptr(), d_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)d_rects.ptr(), this->numRects, (Ncv8u)this->color, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect drawrects test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = d_img.copySolid(h_img_d, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_32u_host((Ncv32u *)h_img.ptr(), h_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)h_rects.ptr(), this->numRects, this->color);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = ncvDrawRects_8u_host((Ncv8u *)h_img.ptr(), h_img.stride(), this->width, this->height,
|
||||
(NcvRect32u *)h_rects.ptr(), this->numRects, (Ncv8u)this->color);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect drawrects test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
//const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_img.height(); i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_img.width(); j++)
|
||||
{
|
||||
if (h_img.ptr()[h_img.stride()*i+j] != h_img_d.ptr()[h_img_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestDrawRects<T>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestDrawRects<Ncv8u>;
|
||||
template class TestDrawRects<Ncv32u>;
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,44 +1,44 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testdrawrects_h_
|
||||
#define _testdrawrects_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
template <class T>
|
||||
class TestDrawRects : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestDrawRects(std::string testName, NCVTestSourceProvider<T> &src, NCVTestSourceProvider<Ncv32u> &src32u,
|
||||
Ncv32u width, Ncv32u height, Ncv32u numRects, T color);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
TestDrawRects(const TestDrawRects&);
|
||||
TestDrawRects& operator=(const TestDrawRects&);
|
||||
|
||||
NCVTestSourceProvider<T> &src;
|
||||
NCVTestSourceProvider<Ncv32u> &src32u;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
Ncv32u numRects;
|
||||
T color;
|
||||
};
|
||||
|
||||
#endif // _testdrawrects_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testdrawrects_h_
|
||||
#define _testdrawrects_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
template <class T>
|
||||
class TestDrawRects : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestDrawRects(std::string testName, NCVTestSourceProvider<T> &src, NCVTestSourceProvider<Ncv32u> &src32u,
|
||||
Ncv32u width, Ncv32u height, Ncv32u numRects, T color);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
TestDrawRects(const TestDrawRects&);
|
||||
TestDrawRects& operator=(const TestDrawRects&);
|
||||
|
||||
NCVTestSourceProvider<T> &src;
|
||||
NCVTestSourceProvider<Ncv32u> &src32u;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
Ncv32u numRects;
|
||||
T color;
|
||||
};
|
||||
|
||||
#endif // _testdrawrects_h_
|
||||
|
||||
@@ -1,305 +1,305 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#if defined(__GNUC__) && !defined(__APPLE__)
|
||||
#include <fpu_control.h>
|
||||
#endif
|
||||
|
||||
#include "TestHaarCascadeApplication.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHaarCascadeApplication::TestHaarCascadeApplication(std::string testName_, NCVTestSourceProvider<Ncv8u> &src_,
|
||||
std::string cascadeName_, Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
cascadeName(cascadeName_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "cascadeName=" << cascadeName << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::process()
|
||||
{
|
||||
#if defined(__APPLE)
|
||||
return true;
|
||||
#endif
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u numStages, numNodes, numFeatures;
|
||||
|
||||
ncvStat = ncvHaarGetClassifierSize(this->cascadeName, numStages, numNodes, numFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> h_HaarStages(*this->allocatorCPU.get(), numStages);
|
||||
ncvAssertReturn(h_HaarStages.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> h_HaarNodes(*this->allocatorCPU.get(), numNodes);
|
||||
ncvAssertReturn(h_HaarNodes.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> h_HaarFeatures(*this->allocatorCPU.get(), numFeatures);
|
||||
ncvAssertReturn(h_HaarFeatures.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> d_HaarStages(*this->allocatorGPU.get(), numStages);
|
||||
ncvAssertReturn(d_HaarStages.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> d_HaarNodes(*this->allocatorGPU.get(), numNodes);
|
||||
ncvAssertReturn(d_HaarNodes.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> d_HaarFeatures(*this->allocatorGPU.get(), numFeatures);
|
||||
ncvAssertReturn(d_HaarFeatures.isMemAllocated(), false);
|
||||
|
||||
HaarClassifierCascadeDescriptor haar;
|
||||
haar.ClassifierSize.width = haar.ClassifierSize.height = 1;
|
||||
haar.bNeedsTiltedII = false;
|
||||
haar.NumClassifierRootNodes = numNodes;
|
||||
haar.NumClassifierTotalNodes = numNodes;
|
||||
haar.NumFeatures = numFeatures;
|
||||
haar.NumStages = numStages;
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvStat = ncvHaarLoadFromFile_host(this->cascadeName, haar, h_HaarStages, h_HaarNodes, h_HaarFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvAssertReturn(NCV_SUCCESS == h_HaarStages.copySolid(d_HaarStages, 0), false);
|
||||
ncvAssertReturn(NCV_SUCCESS == h_HaarNodes.copySolid(d_HaarNodes, 0), false);
|
||||
ncvAssertReturn(NCV_SUCCESS == h_HaarFeatures.copySolid(d_HaarFeatures, 0), false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
NcvSize32s srcRoi, srcIIRoi, searchRoi;
|
||||
srcRoi.width = this->width;
|
||||
srcRoi.height = this->height;
|
||||
srcIIRoi.width = srcRoi.width + 1;
|
||||
srcIIRoi.height = srcRoi.height + 1;
|
||||
searchRoi.width = srcIIRoi.width - haar.ClassifierSize.width;
|
||||
searchRoi.height = srcIIRoi.height - haar.ClassifierSize.height;
|
||||
if (searchRoi.width <= 0 || searchRoi.height <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
NcvSize32u searchRoiU(searchRoi.width, searchRoi.height);
|
||||
|
||||
NCVMatrixAlloc<Ncv8u> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv8u> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
Ncv32u integralWidth = this->width + 1;
|
||||
Ncv32u integralHeight = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<Ncv32u> d_integralImage(*this->allocatorGPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(d_integralImage.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> d_sqIntegralImage(*this->allocatorGPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(d_sqIntegralImage.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> h_integralImage(*this->allocatorCPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(h_integralImage.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_sqIntegralImage(*this->allocatorCPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(h_sqIntegralImage.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32f> d_rectStdDev(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_rectStdDev.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> d_pixelMask(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_pixelMask.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32f> h_rectStdDev(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_rectStdDev.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> h_pixelMask(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_pixelMask.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> d_hypotheses(*this->allocatorGPU.get(), this->width * this->height);
|
||||
ncvAssertReturn(d_hypotheses.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_hypotheses(*this->allocatorCPU.get(), this->width * this->height);
|
||||
ncvAssertReturn(h_hypotheses.isMemAllocated(), false);
|
||||
|
||||
NCVStatus nppStat;
|
||||
Ncv32u szTmpBufIntegral, szTmpBufSqIntegral;
|
||||
nppStat = nppiStIntegralGetSize_8u32u(NcvSize32u(this->width, this->height), &szTmpBufIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
nppStat = nppiStSqrIntegralGetSize_8u64u(NcvSize32u(this->width, this->height), &szTmpBufSqIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
NCVVectorAlloc<Ncv8u> d_tmpIIbuf(*this->allocatorGPU.get(), std::max(szTmpBufIntegral, szTmpBufSqIntegral));
|
||||
ncvAssertReturn(d_tmpIIbuf.isMemAllocated(), false);
|
||||
|
||||
Ncv32u detectionsOnThisScale_d = 0;
|
||||
Ncv32u detectionsOnThisScale_h = 0;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
nppStat = nppiStIntegral_8u32u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_integralImage.ptr(), d_integralImage.pitch(),
|
||||
NcvSize32u(d_img.width(), d_img.height()),
|
||||
d_tmpIIbuf.ptr(), szTmpBufIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
|
||||
nppStat = nppiStSqrIntegral_8u64u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_sqIntegralImage.ptr(), d_sqIntegralImage.pitch(),
|
||||
NcvSize32u(d_img.width(), d_img.height()),
|
||||
d_tmpIIbuf.ptr(), szTmpBufSqIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
|
||||
const NcvRect32u rect(
|
||||
HAAR_STDDEV_BORDER,
|
||||
HAAR_STDDEV_BORDER,
|
||||
haar.ClassifierSize.width - 2*HAAR_STDDEV_BORDER,
|
||||
haar.ClassifierSize.height - 2*HAAR_STDDEV_BORDER);
|
||||
nppStat = nppiStRectStdDev_32f_C1R(
|
||||
d_integralImage.ptr(), d_integralImage.pitch(),
|
||||
d_sqIntegralImage.ptr(), d_sqIntegralImage.pitch(),
|
||||
d_rectStdDev.ptr(), d_rectStdDev.pitch(),
|
||||
NcvSize32u(searchRoi.width, searchRoi.height), rect,
|
||||
1.0f, true);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = d_integralImage.copySolid(h_integralImage, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvStat = d_rectStdDev.copySolid(h_rectStdDev, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
for (Ncv32u i=0; i<searchRoiU.height; i++)
|
||||
{
|
||||
for (Ncv32u j=0; j<h_pixelMask.stride(); j++)
|
||||
{
|
||||
if (j<searchRoiU.width)
|
||||
{
|
||||
h_pixelMask.ptr()[i*h_pixelMask.stride()+j] = (i << 16) | j;
|
||||
}
|
||||
else
|
||||
{
|
||||
h_pixelMask.ptr()[i*h_pixelMask.stride()+j] = OBJDET_MASK_ELEMENT_INVALID_32U;
|
||||
}
|
||||
}
|
||||
}
|
||||
ncvAssertReturn(cudaSuccess == cudaStreamSynchronize(0), false);
|
||||
|
||||
#if !defined(__APPLE__)
|
||||
|
||||
#if defined(__GNUC__)
|
||||
//http://www.christian-seiler.de/projekte/fpmath/
|
||||
|
||||
fpu_control_t fpu_oldcw, fpu_cw;
|
||||
_FPU_GETCW(fpu_oldcw); // store old cw
|
||||
fpu_cw = (fpu_oldcw & ~_FPU_EXTENDED & ~_FPU_DOUBLE & ~_FPU_SINGLE) | _FPU_SINGLE;
|
||||
_FPU_SETCW(fpu_cw);
|
||||
|
||||
// calculations here
|
||||
ncvStat = ncvApplyHaarClassifierCascade_host(
|
||||
h_integralImage, h_rectStdDev, h_pixelMask,
|
||||
detectionsOnThisScale_h,
|
||||
haar, h_HaarStages, h_HaarNodes, h_HaarFeatures, false,
|
||||
searchRoiU, 1, 1.0f);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
_FPU_SETCW(fpu_oldcw); // restore old cw
|
||||
#else
|
||||
#ifndef _WIN64
|
||||
Ncv32u fpu_oldcw, fpu_cw;
|
||||
_controlfp_s(&fpu_cw, 0, 0);
|
||||
fpu_oldcw = fpu_cw;
|
||||
_controlfp_s(&fpu_cw, _PC_24, _MCW_PC);
|
||||
#endif
|
||||
ncvStat = ncvApplyHaarClassifierCascade_host(
|
||||
h_integralImage, h_rectStdDev, h_pixelMask,
|
||||
detectionsOnThisScale_h,
|
||||
haar, h_HaarStages, h_HaarNodes, h_HaarFeatures, false,
|
||||
searchRoiU, 1, 1.0f);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
#ifndef _WIN64
|
||||
_controlfp_s(&fpu_cw, fpu_oldcw, _MCW_PC);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
int devId;
|
||||
ncvAssertCUDAReturn(cudaGetDevice(&devId), false);
|
||||
cudaDeviceProp _devProp;
|
||||
ncvAssertCUDAReturn(cudaGetDeviceProperties(&_devProp, devId), false);
|
||||
|
||||
ncvStat = ncvApplyHaarClassifierCascade_device(
|
||||
d_integralImage, d_rectStdDev, d_pixelMask,
|
||||
detectionsOnThisScale_d,
|
||||
haar, h_HaarStages, d_HaarStages, d_HaarNodes, d_HaarFeatures, false,
|
||||
searchRoiU, 1, 1.0f,
|
||||
*this->allocatorGPU.get(), *this->allocatorCPU.get(),
|
||||
_devProp, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32u> h_pixelMask_d(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_pixelMask_d.isMemAllocated(), false);
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvStat = d_pixelMask.copySolid(h_pixelMask_d, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
if (detectionsOnThisScale_d != detectionsOnThisScale_h)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::sort(h_pixelMask_d.ptr(), h_pixelMask_d.ptr() + detectionsOnThisScale_d);
|
||||
for (Ncv32u i=0; i<detectionsOnThisScale_d && bLoopVirgin; i++)
|
||||
{
|
||||
if (h_pixelMask.ptr()[i] != h_pixelMask_d.ptr()[i])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <float.h>
|
||||
|
||||
#if defined(__GNUC__) && !defined(__APPLE__)
|
||||
#include <fpu_control.h>
|
||||
#endif
|
||||
|
||||
#include "TestHaarCascadeApplication.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHaarCascadeApplication::TestHaarCascadeApplication(std::string testName_, NCVTestSourceProvider<Ncv8u> &src_,
|
||||
std::string cascadeName_, Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
cascadeName(cascadeName_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "cascadeName=" << cascadeName << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::process()
|
||||
{
|
||||
#if defined(__APPLE)
|
||||
return true;
|
||||
#endif
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u numStages, numNodes, numFeatures;
|
||||
|
||||
ncvStat = ncvHaarGetClassifierSize(this->cascadeName, numStages, numNodes, numFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> h_HaarStages(*this->allocatorCPU.get(), numStages);
|
||||
ncvAssertReturn(h_HaarStages.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> h_HaarNodes(*this->allocatorCPU.get(), numNodes);
|
||||
ncvAssertReturn(h_HaarNodes.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> h_HaarFeatures(*this->allocatorCPU.get(), numFeatures);
|
||||
ncvAssertReturn(h_HaarFeatures.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> d_HaarStages(*this->allocatorGPU.get(), numStages);
|
||||
ncvAssertReturn(d_HaarStages.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> d_HaarNodes(*this->allocatorGPU.get(), numNodes);
|
||||
ncvAssertReturn(d_HaarNodes.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> d_HaarFeatures(*this->allocatorGPU.get(), numFeatures);
|
||||
ncvAssertReturn(d_HaarFeatures.isMemAllocated(), false);
|
||||
|
||||
HaarClassifierCascadeDescriptor haar;
|
||||
haar.ClassifierSize.width = haar.ClassifierSize.height = 1;
|
||||
haar.bNeedsTiltedII = false;
|
||||
haar.NumClassifierRootNodes = numNodes;
|
||||
haar.NumClassifierTotalNodes = numNodes;
|
||||
haar.NumFeatures = numFeatures;
|
||||
haar.NumStages = numStages;
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvStat = ncvHaarLoadFromFile_host(this->cascadeName, haar, h_HaarStages, h_HaarNodes, h_HaarFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvAssertReturn(NCV_SUCCESS == h_HaarStages.copySolid(d_HaarStages, 0), false);
|
||||
ncvAssertReturn(NCV_SUCCESS == h_HaarNodes.copySolid(d_HaarNodes, 0), false);
|
||||
ncvAssertReturn(NCV_SUCCESS == h_HaarFeatures.copySolid(d_HaarFeatures, 0), false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
NcvSize32s srcRoi, srcIIRoi, searchRoi;
|
||||
srcRoi.width = this->width;
|
||||
srcRoi.height = this->height;
|
||||
srcIIRoi.width = srcRoi.width + 1;
|
||||
srcIIRoi.height = srcRoi.height + 1;
|
||||
searchRoi.width = srcIIRoi.width - haar.ClassifierSize.width;
|
||||
searchRoi.height = srcIIRoi.height - haar.ClassifierSize.height;
|
||||
if (searchRoi.width <= 0 || searchRoi.height <= 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
NcvSize32u searchRoiU(searchRoi.width, searchRoi.height);
|
||||
|
||||
NCVMatrixAlloc<Ncv8u> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv8u> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
Ncv32u integralWidth = this->width + 1;
|
||||
Ncv32u integralHeight = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<Ncv32u> d_integralImage(*this->allocatorGPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(d_integralImage.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> d_sqIntegralImage(*this->allocatorGPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(d_sqIntegralImage.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> h_integralImage(*this->allocatorCPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(h_integralImage.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_sqIntegralImage(*this->allocatorCPU.get(), integralWidth, integralHeight);
|
||||
ncvAssertReturn(h_sqIntegralImage.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32f> d_rectStdDev(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_rectStdDev.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> d_pixelMask(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_pixelMask.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32f> h_rectStdDev(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_rectStdDev.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> h_pixelMask(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_pixelMask.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> d_hypotheses(*this->allocatorGPU.get(), this->width * this->height);
|
||||
ncvAssertReturn(d_hypotheses.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_hypotheses(*this->allocatorCPU.get(), this->width * this->height);
|
||||
ncvAssertReturn(h_hypotheses.isMemAllocated(), false);
|
||||
|
||||
NCVStatus nppStat;
|
||||
Ncv32u szTmpBufIntegral, szTmpBufSqIntegral;
|
||||
nppStat = nppiStIntegralGetSize_8u32u(NcvSize32u(this->width, this->height), &szTmpBufIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
nppStat = nppiStSqrIntegralGetSize_8u64u(NcvSize32u(this->width, this->height), &szTmpBufSqIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
NCVVectorAlloc<Ncv8u> d_tmpIIbuf(*this->allocatorGPU.get(), std::max(szTmpBufIntegral, szTmpBufSqIntegral));
|
||||
ncvAssertReturn(d_tmpIIbuf.isMemAllocated(), false);
|
||||
|
||||
Ncv32u detectionsOnThisScale_d = 0;
|
||||
Ncv32u detectionsOnThisScale_h = 0;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
nppStat = nppiStIntegral_8u32u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_integralImage.ptr(), d_integralImage.pitch(),
|
||||
NcvSize32u(d_img.width(), d_img.height()),
|
||||
d_tmpIIbuf.ptr(), szTmpBufIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
|
||||
nppStat = nppiStSqrIntegral_8u64u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_sqIntegralImage.ptr(), d_sqIntegralImage.pitch(),
|
||||
NcvSize32u(d_img.width(), d_img.height()),
|
||||
d_tmpIIbuf.ptr(), szTmpBufSqIntegral, this->devProp);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
|
||||
const NcvRect32u rect(
|
||||
HAAR_STDDEV_BORDER,
|
||||
HAAR_STDDEV_BORDER,
|
||||
haar.ClassifierSize.width - 2*HAAR_STDDEV_BORDER,
|
||||
haar.ClassifierSize.height - 2*HAAR_STDDEV_BORDER);
|
||||
nppStat = nppiStRectStdDev_32f_C1R(
|
||||
d_integralImage.ptr(), d_integralImage.pitch(),
|
||||
d_sqIntegralImage.ptr(), d_sqIntegralImage.pitch(),
|
||||
d_rectStdDev.ptr(), d_rectStdDev.pitch(),
|
||||
NcvSize32u(searchRoi.width, searchRoi.height), rect,
|
||||
1.0f, true);
|
||||
ncvAssertReturn(nppStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = d_integralImage.copySolid(h_integralImage, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvStat = d_rectStdDev.copySolid(h_rectStdDev, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
for (Ncv32u i=0; i<searchRoiU.height; i++)
|
||||
{
|
||||
for (Ncv32u j=0; j<h_pixelMask.stride(); j++)
|
||||
{
|
||||
if (j<searchRoiU.width)
|
||||
{
|
||||
h_pixelMask.ptr()[i*h_pixelMask.stride()+j] = (i << 16) | j;
|
||||
}
|
||||
else
|
||||
{
|
||||
h_pixelMask.ptr()[i*h_pixelMask.stride()+j] = OBJDET_MASK_ELEMENT_INVALID_32U;
|
||||
}
|
||||
}
|
||||
}
|
||||
ncvAssertReturn(cudaSuccess == cudaStreamSynchronize(0), false);
|
||||
|
||||
#if !defined(__APPLE__)
|
||||
|
||||
#if defined(__GNUC__)
|
||||
//http://www.christian-seiler.de/projekte/fpmath/
|
||||
|
||||
fpu_control_t fpu_oldcw, fpu_cw;
|
||||
_FPU_GETCW(fpu_oldcw); // store old cw
|
||||
fpu_cw = (fpu_oldcw & ~_FPU_EXTENDED & ~_FPU_DOUBLE & ~_FPU_SINGLE) | _FPU_SINGLE;
|
||||
_FPU_SETCW(fpu_cw);
|
||||
|
||||
// calculations here
|
||||
ncvStat = ncvApplyHaarClassifierCascade_host(
|
||||
h_integralImage, h_rectStdDev, h_pixelMask,
|
||||
detectionsOnThisScale_h,
|
||||
haar, h_HaarStages, h_HaarNodes, h_HaarFeatures, false,
|
||||
searchRoiU, 1, 1.0f);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
_FPU_SETCW(fpu_oldcw); // restore old cw
|
||||
#else
|
||||
#ifndef _WIN64
|
||||
Ncv32u fpu_oldcw, fpu_cw;
|
||||
_controlfp_s(&fpu_cw, 0, 0);
|
||||
fpu_oldcw = fpu_cw;
|
||||
_controlfp_s(&fpu_cw, _PC_24, _MCW_PC);
|
||||
#endif
|
||||
ncvStat = ncvApplyHaarClassifierCascade_host(
|
||||
h_integralImage, h_rectStdDev, h_pixelMask,
|
||||
detectionsOnThisScale_h,
|
||||
haar, h_HaarStages, h_HaarNodes, h_HaarFeatures, false,
|
||||
searchRoiU, 1, 1.0f);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
#ifndef _WIN64
|
||||
_controlfp_s(&fpu_cw, fpu_oldcw, _MCW_PC);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
int devId;
|
||||
ncvAssertCUDAReturn(cudaGetDevice(&devId), false);
|
||||
cudaDeviceProp _devProp;
|
||||
ncvAssertCUDAReturn(cudaGetDeviceProperties(&_devProp, devId), false);
|
||||
|
||||
ncvStat = ncvApplyHaarClassifierCascade_device(
|
||||
d_integralImage, d_rectStdDev, d_pixelMask,
|
||||
detectionsOnThisScale_d,
|
||||
haar, h_HaarStages, d_HaarStages, d_HaarNodes, d_HaarFeatures, false,
|
||||
searchRoiU, 1, 1.0f,
|
||||
*this->allocatorGPU.get(), *this->allocatorCPU.get(),
|
||||
_devProp, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32u> h_pixelMask_d(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_pixelMask_d.isMemAllocated(), false);
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvStat = d_pixelMask.copySolid(h_pixelMask_d, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
if (detectionsOnThisScale_d != detectionsOnThisScale_h)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::sort(h_pixelMask_d.ptr(), h_pixelMask_d.ptr() + detectionsOnThisScale_d);
|
||||
for (Ncv32u i=0; i<detectionsOnThisScale_d && bLoopVirgin; i++)
|
||||
{
|
||||
if (h_pixelMask.ptr()[i] != h_pixelMask_d.ptr()[i])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeApplication::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,41 +1,41 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhaarcascadeapplication_h_
|
||||
#define _testhaarcascadeapplication_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHaarCascadeApplication : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHaarCascadeApplication(std::string testName, NCVTestSourceProvider<Ncv8u> &src,
|
||||
std::string cascadeName, Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestHaarCascadeApplication(const TestHaarCascadeApplication&);
|
||||
TestHaarCascadeApplication& operator=(const TestHaarCascadeApplication&);
|
||||
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> &src;
|
||||
std::string cascadeName;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testhaarcascadeapplication_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhaarcascadeapplication_h_
|
||||
#define _testhaarcascadeapplication_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHaarCascadeApplication : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHaarCascadeApplication(std::string testName, NCVTestSourceProvider<Ncv8u> &src,
|
||||
std::string cascadeName, Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestHaarCascadeApplication(const TestHaarCascadeApplication&);
|
||||
TestHaarCascadeApplication& operator=(const TestHaarCascadeApplication&);
|
||||
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> &src;
|
||||
std::string cascadeName;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testhaarcascadeapplication_h_
|
||||
|
||||
@@ -1,127 +1,127 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestHaarCascadeLoader.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHaarCascadeLoader::TestHaarCascadeLoader(std::string testName_, std::string cascadeName_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
cascadeName(cascadeName_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "cascadeName=" << cascadeName << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u numStages, numNodes, numFeatures;
|
||||
Ncv32u numStages_2 = 0, numNodes_2 = 0, numFeatures_2 = 0;
|
||||
|
||||
ncvStat = ncvHaarGetClassifierSize(this->cascadeName, numStages, numNodes, numFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> h_HaarStages(*this->allocatorCPU.get(), numStages);
|
||||
ncvAssertReturn(h_HaarStages.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> h_HaarNodes(*this->allocatorCPU.get(), numNodes);
|
||||
ncvAssertReturn(h_HaarNodes.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> h_HaarFeatures(*this->allocatorCPU.get(), numFeatures);
|
||||
ncvAssertReturn(h_HaarFeatures.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> h_HaarStages_2(*this->allocatorCPU.get(), numStages);
|
||||
ncvAssertReturn(h_HaarStages_2.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> h_HaarNodes_2(*this->allocatorCPU.get(), numNodes);
|
||||
ncvAssertReturn(h_HaarNodes_2.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> h_HaarFeatures_2(*this->allocatorCPU.get(), numFeatures);
|
||||
ncvAssertReturn(h_HaarFeatures_2.isMemAllocated(), false);
|
||||
|
||||
HaarClassifierCascadeDescriptor haar;
|
||||
HaarClassifierCascadeDescriptor haar_2;
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
const std::string testNvbinName = "test.nvbin";
|
||||
ncvStat = ncvHaarLoadFromFile_host(this->cascadeName, haar, h_HaarStages, h_HaarNodes, h_HaarFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvStat = ncvHaarStoreNVBIN_host(testNvbinName, haar, h_HaarStages, h_HaarNodes, h_HaarFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvStat = ncvHaarGetClassifierSize(testNvbinName, numStages_2, numNodes_2, numFeatures_2);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvStat = ncvHaarLoadFromFile_host(testNvbinName, haar_2, h_HaarStages_2, h_HaarNodes_2, h_HaarFeatures_2);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
if (
|
||||
numStages_2 != numStages ||
|
||||
numNodes_2 != numNodes ||
|
||||
numFeatures_2 != numFeatures ||
|
||||
haar.NumStages != haar_2.NumStages ||
|
||||
haar.NumClassifierRootNodes != haar_2.NumClassifierRootNodes ||
|
||||
haar.NumClassifierTotalNodes != haar_2.NumClassifierTotalNodes ||
|
||||
haar.NumFeatures != haar_2.NumFeatures ||
|
||||
haar.ClassifierSize.width != haar_2.ClassifierSize.width ||
|
||||
haar.ClassifierSize.height != haar_2.ClassifierSize.height ||
|
||||
haar.bNeedsTiltedII != haar_2.bNeedsTiltedII ||
|
||||
haar.bHasStumpsOnly != haar_2.bHasStumpsOnly )
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
if (memcmp(h_HaarStages.ptr(), h_HaarStages_2.ptr(), haar.NumStages * sizeof(HaarStage64)) ||
|
||||
memcmp(h_HaarNodes.ptr(), h_HaarNodes_2.ptr(), haar.NumClassifierTotalNodes * sizeof(HaarClassifierNode128)) ||
|
||||
memcmp(h_HaarFeatures.ptr(), h_HaarFeatures_2.ptr(), haar.NumFeatures * sizeof(HaarFeature64)) )
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestHaarCascadeLoader.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHaarCascadeLoader::TestHaarCascadeLoader(std::string testName_, std::string cascadeName_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
cascadeName(cascadeName_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "cascadeName=" << cascadeName << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u numStages, numNodes, numFeatures;
|
||||
Ncv32u numStages_2 = 0, numNodes_2 = 0, numFeatures_2 = 0;
|
||||
|
||||
ncvStat = ncvHaarGetClassifierSize(this->cascadeName, numStages, numNodes, numFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> h_HaarStages(*this->allocatorCPU.get(), numStages);
|
||||
ncvAssertReturn(h_HaarStages.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> h_HaarNodes(*this->allocatorCPU.get(), numNodes);
|
||||
ncvAssertReturn(h_HaarNodes.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> h_HaarFeatures(*this->allocatorCPU.get(), numFeatures);
|
||||
ncvAssertReturn(h_HaarFeatures.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<HaarStage64> h_HaarStages_2(*this->allocatorCPU.get(), numStages);
|
||||
ncvAssertReturn(h_HaarStages_2.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarClassifierNode128> h_HaarNodes_2(*this->allocatorCPU.get(), numNodes);
|
||||
ncvAssertReturn(h_HaarNodes_2.isMemAllocated(), false);
|
||||
NCVVectorAlloc<HaarFeature64> h_HaarFeatures_2(*this->allocatorCPU.get(), numFeatures);
|
||||
ncvAssertReturn(h_HaarFeatures_2.isMemAllocated(), false);
|
||||
|
||||
HaarClassifierCascadeDescriptor haar;
|
||||
HaarClassifierCascadeDescriptor haar_2;
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
const std::string testNvbinName = "test.nvbin";
|
||||
ncvStat = ncvHaarLoadFromFile_host(this->cascadeName, haar, h_HaarStages, h_HaarNodes, h_HaarFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvStat = ncvHaarStoreNVBIN_host(testNvbinName, haar, h_HaarStages, h_HaarNodes, h_HaarFeatures);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvStat = ncvHaarGetClassifierSize(testNvbinName, numStages_2, numNodes_2, numFeatures_2);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
ncvStat = ncvHaarLoadFromFile_host(testNvbinName, haar_2, h_HaarStages_2, h_HaarNodes_2, h_HaarFeatures_2);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
if (
|
||||
numStages_2 != numStages ||
|
||||
numNodes_2 != numNodes ||
|
||||
numFeatures_2 != numFeatures ||
|
||||
haar.NumStages != haar_2.NumStages ||
|
||||
haar.NumClassifierRootNodes != haar_2.NumClassifierRootNodes ||
|
||||
haar.NumClassifierTotalNodes != haar_2.NumClassifierTotalNodes ||
|
||||
haar.NumFeatures != haar_2.NumFeatures ||
|
||||
haar.ClassifierSize.width != haar_2.ClassifierSize.width ||
|
||||
haar.ClassifierSize.height != haar_2.ClassifierSize.height ||
|
||||
haar.bNeedsTiltedII != haar_2.bNeedsTiltedII ||
|
||||
haar.bHasStumpsOnly != haar_2.bHasStumpsOnly )
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
if (memcmp(h_HaarStages.ptr(), h_HaarStages_2.ptr(), haar.NumStages * sizeof(HaarStage64)) ||
|
||||
memcmp(h_HaarNodes.ptr(), h_HaarNodes_2.ptr(), haar.NumClassifierTotalNodes * sizeof(HaarClassifierNode128)) ||
|
||||
memcmp(h_HaarFeatures.ptr(), h_HaarFeatures_2.ptr(), haar.NumFeatures * sizeof(HaarFeature64)) )
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHaarCascadeLoader::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,34 +1,34 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhaarcascadeloader_h_
|
||||
#define _testhaarcascadeloader_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHaarCascadeLoader : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHaarCascadeLoader(std::string testName, std::string cascadeName);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
std::string cascadeName;
|
||||
};
|
||||
|
||||
#endif // _testhaarcascadeloader_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhaarcascadeloader_h_
|
||||
#define _testhaarcascadeloader_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHaarCascadeLoader : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHaarCascadeLoader(std::string testName, std::string cascadeName);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
std::string cascadeName;
|
||||
};
|
||||
|
||||
#endif // _testhaarcascadeloader_h_
|
||||
|
||||
@@ -1,180 +1,180 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestHypothesesFilter.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHypothesesFilter::TestHypothesesFilter(std::string testName_, NCVTestSourceProvider<Ncv32u> &src_,
|
||||
Ncv32u numDstRects_, Ncv32u minNeighbors_, Ncv32f eps_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
numDstRects(numDstRects_),
|
||||
minNeighbors(minNeighbors_),
|
||||
eps(eps_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "numDstRects=" << numDstRects << std::endl;
|
||||
strOut << "minNeighbors=" << minNeighbors << std::endl;
|
||||
strOut << "eps=" << eps << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::init()
|
||||
{
|
||||
this->canvasWidth = 4096;
|
||||
this->canvasHeight = 4096;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool compareRects(const NcvRect32u &r1, const NcvRect32u &r2, Ncv32f eps)
|
||||
{
|
||||
double delta = eps*(std::min(r1.width, r2.width) + std::min(r1.height, r2.height))*0.5;
|
||||
return std::abs((Ncv32s)r1.x - (Ncv32s)r2.x) <= delta &&
|
||||
std::abs((Ncv32s)r1.y - (Ncv32s)r2.y) <= delta &&
|
||||
std::abs((Ncv32s)r1.x + (Ncv32s)r1.width - (Ncv32s)r2.x - (Ncv32s)r2.width) <= delta &&
|
||||
std::abs((Ncv32s)r1.y + (Ncv32s)r1.height - (Ncv32s)r2.y - (Ncv32s)r2.height) <= delta;
|
||||
}
|
||||
|
||||
|
||||
inline bool operator < (const NcvRect32u &a, const NcvRect32u &b)
|
||||
{
|
||||
return a.x < b.x;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_random32u(*this->allocatorCPU.get(), this->numDstRects * sizeof(NcvRect32u) / sizeof(Ncv32u));
|
||||
ncvAssertReturn(h_random32u.isMemAllocated(), false);
|
||||
|
||||
Ncv32u srcSlotSize = 2 * this->minNeighbors + 1;
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> h_vecSrc(*this->allocatorCPU.get(), this->numDstRects*srcSlotSize);
|
||||
ncvAssertReturn(h_vecSrc.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_vecDst_groundTruth(*this->allocatorCPU.get(), this->numDstRects);
|
||||
ncvAssertReturn(h_vecDst_groundTruth.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorCPU.get()->isCounting());
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_random32u), false);
|
||||
Ncv32u randCnt = 0;
|
||||
Ncv64f randVal;
|
||||
|
||||
for (Ncv32u i=0; i<this->numDstRects; i++)
|
||||
{
|
||||
h_vecDst_groundTruth.ptr()[i].x = i * this->canvasWidth / this->numDstRects + this->canvasWidth / (this->numDstRects * 4);
|
||||
h_vecDst_groundTruth.ptr()[i].y = i * this->canvasHeight / this->numDstRects + this->canvasHeight / (this->numDstRects * 4);
|
||||
h_vecDst_groundTruth.ptr()[i].width = this->canvasWidth / (this->numDstRects * 2);
|
||||
h_vecDst_groundTruth.ptr()[i].height = this->canvasHeight / (this->numDstRects * 2);
|
||||
|
||||
Ncv32u numNeighbors = this->minNeighbors + 1 + (Ncv32u)(((1.0 * h_random32u.ptr()[i]) * (this->minNeighbors + 1)) / 0xFFFFFFFF);
|
||||
numNeighbors = (numNeighbors > srcSlotSize) ? srcSlotSize : numNeighbors;
|
||||
|
||||
//fill in strong hypotheses (2 * ((1.0 * randVal) / 0xFFFFFFFF) - 1)
|
||||
for (Ncv32u j=0; j<numNeighbors; j++)
|
||||
{
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].x =
|
||||
h_vecDst_groundTruth.ptr()[i].x +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].width * this->eps * (randVal - 0.5));
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].y =
|
||||
h_vecDst_groundTruth.ptr()[i].y +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].height * this->eps * (randVal - 0.5));
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].width = h_vecDst_groundTruth.ptr()[i].width;
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].height = h_vecDst_groundTruth.ptr()[i].height;
|
||||
}
|
||||
|
||||
//generate weak hypotheses (to be removed in processing)
|
||||
for (Ncv32u j=numNeighbors; j<srcSlotSize; j++)
|
||||
{
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].x =
|
||||
this->canvasWidth + h_vecDst_groundTruth.ptr()[i].x +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].width * this->eps * (randVal - 0.5));
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].y =
|
||||
this->canvasHeight + h_vecDst_groundTruth.ptr()[i].y +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].height * this->eps * (randVal - 0.5));
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].width = h_vecDst_groundTruth.ptr()[i].width;
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].height = h_vecDst_groundTruth.ptr()[i].height;
|
||||
}
|
||||
}
|
||||
|
||||
//shuffle
|
||||
for (Ncv32u i=0; i<this->numDstRects*srcSlotSize-1; i++)
|
||||
{
|
||||
Ncv32u randValLocal = h_random32u.ptr()[randCnt++]; randCnt = randCnt % h_random32u.length();
|
||||
Ncv32u secondSwap = randValLocal % (this->numDstRects*srcSlotSize-1 - i);
|
||||
NcvRect32u tmp = h_vecSrc.ptr()[i + secondSwap];
|
||||
h_vecSrc.ptr()[i + secondSwap] = h_vecSrc.ptr()[i];
|
||||
h_vecSrc.ptr()[i] = tmp;
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
Ncv32u numHypothesesSrc = static_cast<Ncv32u>(h_vecSrc.length());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvStat = ncvGroupRectangles_host(h_vecSrc, numHypothesesSrc, this->minNeighbors, this->eps, NULL);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//verification
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (numHypothesesSrc != this->numDstRects)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::vector<NcvRect32u> tmpRects(numHypothesesSrc);
|
||||
memcpy(&tmpRects[0], h_vecSrc.ptr(), numHypothesesSrc * sizeof(NcvRect32u));
|
||||
std::sort(tmpRects.begin(), tmpRects.end());
|
||||
for (Ncv32u i=0; i<numHypothesesSrc && bLoopVirgin; i++)
|
||||
{
|
||||
if (!compareRects(tmpRects[i], h_vecDst_groundTruth.ptr()[i], this->eps))
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestHypothesesFilter.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHypothesesFilter::TestHypothesesFilter(std::string testName_, NCVTestSourceProvider<Ncv32u> &src_,
|
||||
Ncv32u numDstRects_, Ncv32u minNeighbors_, Ncv32f eps_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
numDstRects(numDstRects_),
|
||||
minNeighbors(minNeighbors_),
|
||||
eps(eps_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "numDstRects=" << numDstRects << std::endl;
|
||||
strOut << "minNeighbors=" << minNeighbors << std::endl;
|
||||
strOut << "eps=" << eps << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::init()
|
||||
{
|
||||
this->canvasWidth = 4096;
|
||||
this->canvasHeight = 4096;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool compareRects(const NcvRect32u &r1, const NcvRect32u &r2, Ncv32f eps)
|
||||
{
|
||||
double delta = eps*(std::min(r1.width, r2.width) + std::min(r1.height, r2.height))*0.5;
|
||||
return std::abs((Ncv32s)r1.x - (Ncv32s)r2.x) <= delta &&
|
||||
std::abs((Ncv32s)r1.y - (Ncv32s)r2.y) <= delta &&
|
||||
std::abs((Ncv32s)r1.x + (Ncv32s)r1.width - (Ncv32s)r2.x - (Ncv32s)r2.width) <= delta &&
|
||||
std::abs((Ncv32s)r1.y + (Ncv32s)r1.height - (Ncv32s)r2.y - (Ncv32s)r2.height) <= delta;
|
||||
}
|
||||
|
||||
|
||||
inline bool operator < (const NcvRect32u &a, const NcvRect32u &b)
|
||||
{
|
||||
return a.x < b.x;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_random32u(*this->allocatorCPU.get(), this->numDstRects * sizeof(NcvRect32u) / sizeof(Ncv32u));
|
||||
ncvAssertReturn(h_random32u.isMemAllocated(), false);
|
||||
|
||||
Ncv32u srcSlotSize = 2 * this->minNeighbors + 1;
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> h_vecSrc(*this->allocatorCPU.get(), this->numDstRects*srcSlotSize);
|
||||
ncvAssertReturn(h_vecSrc.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_vecDst_groundTruth(*this->allocatorCPU.get(), this->numDstRects);
|
||||
ncvAssertReturn(h_vecDst_groundTruth.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorCPU.get()->isCounting());
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_random32u), false);
|
||||
Ncv32u randCnt = 0;
|
||||
Ncv64f randVal;
|
||||
|
||||
for (Ncv32u i=0; i<this->numDstRects; i++)
|
||||
{
|
||||
h_vecDst_groundTruth.ptr()[i].x = i * this->canvasWidth / this->numDstRects + this->canvasWidth / (this->numDstRects * 4);
|
||||
h_vecDst_groundTruth.ptr()[i].y = i * this->canvasHeight / this->numDstRects + this->canvasHeight / (this->numDstRects * 4);
|
||||
h_vecDst_groundTruth.ptr()[i].width = this->canvasWidth / (this->numDstRects * 2);
|
||||
h_vecDst_groundTruth.ptr()[i].height = this->canvasHeight / (this->numDstRects * 2);
|
||||
|
||||
Ncv32u numNeighbors = this->minNeighbors + 1 + (Ncv32u)(((1.0 * h_random32u.ptr()[i]) * (this->minNeighbors + 1)) / 0xFFFFFFFF);
|
||||
numNeighbors = (numNeighbors > srcSlotSize) ? srcSlotSize : numNeighbors;
|
||||
|
||||
//fill in strong hypotheses (2 * ((1.0 * randVal) / 0xFFFFFFFF) - 1)
|
||||
for (Ncv32u j=0; j<numNeighbors; j++)
|
||||
{
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].x =
|
||||
h_vecDst_groundTruth.ptr()[i].x +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].width * this->eps * (randVal - 0.5));
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].y =
|
||||
h_vecDst_groundTruth.ptr()[i].y +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].height * this->eps * (randVal - 0.5));
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].width = h_vecDst_groundTruth.ptr()[i].width;
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].height = h_vecDst_groundTruth.ptr()[i].height;
|
||||
}
|
||||
|
||||
//generate weak hypotheses (to be removed in processing)
|
||||
for (Ncv32u j=numNeighbors; j<srcSlotSize; j++)
|
||||
{
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].x =
|
||||
this->canvasWidth + h_vecDst_groundTruth.ptr()[i].x +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].width * this->eps * (randVal - 0.5));
|
||||
randVal = (1.0 * h_random32u.ptr()[randCnt++]) / 0xFFFFFFFF; randCnt = randCnt % h_random32u.length();
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].y =
|
||||
this->canvasHeight + h_vecDst_groundTruth.ptr()[i].y +
|
||||
(Ncv32s)(h_vecDst_groundTruth.ptr()[i].height * this->eps * (randVal - 0.5));
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].width = h_vecDst_groundTruth.ptr()[i].width;
|
||||
h_vecSrc.ptr()[srcSlotSize * i + j].height = h_vecDst_groundTruth.ptr()[i].height;
|
||||
}
|
||||
}
|
||||
|
||||
//shuffle
|
||||
for (Ncv32u i=0; i<this->numDstRects*srcSlotSize-1; i++)
|
||||
{
|
||||
Ncv32u randValLocal = h_random32u.ptr()[randCnt++]; randCnt = randCnt % h_random32u.length();
|
||||
Ncv32u secondSwap = randValLocal % (this->numDstRects*srcSlotSize-1 - i);
|
||||
NcvRect32u tmp = h_vecSrc.ptr()[i + secondSwap];
|
||||
h_vecSrc.ptr()[i + secondSwap] = h_vecSrc.ptr()[i];
|
||||
h_vecSrc.ptr()[i] = tmp;
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
Ncv32u numHypothesesSrc = static_cast<Ncv32u>(h_vecSrc.length());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvStat = ncvGroupRectangles_host(h_vecSrc, numHypothesesSrc, this->minNeighbors, this->eps, NULL);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//verification
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (numHypothesesSrc != this->numDstRects)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
std::vector<NcvRect32u> tmpRects(numHypothesesSrc);
|
||||
memcpy(&tmpRects[0], h_vecSrc.ptr(), numHypothesesSrc * sizeof(NcvRect32u));
|
||||
std::sort(tmpRects.begin(), tmpRects.end());
|
||||
for (Ncv32u i=0; i<numHypothesesSrc && bLoopVirgin; i++)
|
||||
{
|
||||
if (!compareRects(tmpRects[i], h_vecDst_groundTruth.ptr()[i], this->eps))
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesFilter::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,44 +1,44 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhypothesesfilter_h_
|
||||
#define _testhypothesesfilter_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHypothesesFilter : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHypothesesFilter(std::string testName, NCVTestSourceProvider<Ncv32u> &src,
|
||||
Ncv32u numDstRects, Ncv32u minNeighbors, Ncv32f eps);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
TestHypothesesFilter(const TestHypothesesFilter&);
|
||||
TestHypothesesFilter& operator=(const TestHypothesesFilter&);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> &src;
|
||||
Ncv32u numDstRects;
|
||||
Ncv32u minNeighbors;
|
||||
Ncv32f eps;
|
||||
|
||||
Ncv32u canvasWidth;
|
||||
Ncv32u canvasHeight;
|
||||
};
|
||||
|
||||
#endif // _testhypothesesfilter_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhypothesesfilter_h_
|
||||
#define _testhypothesesfilter_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHypothesesFilter : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHypothesesFilter(std::string testName, NCVTestSourceProvider<Ncv32u> &src,
|
||||
Ncv32u numDstRects, Ncv32u minNeighbors, Ncv32f eps);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
TestHypothesesFilter(const TestHypothesesFilter&);
|
||||
TestHypothesesFilter& operator=(const TestHypothesesFilter&);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> &src;
|
||||
Ncv32u numDstRects;
|
||||
Ncv32u minNeighbors;
|
||||
Ncv32f eps;
|
||||
|
||||
Ncv32u canvasWidth;
|
||||
Ncv32u canvasHeight;
|
||||
};
|
||||
|
||||
#endif // _testhypothesesfilter_h_
|
||||
|
||||
@@ -1,138 +1,138 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestHypothesesGrow.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHypothesesGrow::TestHypothesesGrow(std::string testName_, NCVTestSourceProvider<Ncv32u> &src_,
|
||||
Ncv32u rectWidth_, Ncv32u rectHeight_, Ncv32f rectScale_,
|
||||
Ncv32u maxLenSrc_, Ncv32u lenSrc_, Ncv32u maxLenDst_, Ncv32u lenDst_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
rectWidth(rectWidth_),
|
||||
rectHeight(rectHeight_),
|
||||
rectScale(rectScale_),
|
||||
maxLenSrc(maxLenSrc_),
|
||||
lenSrc(lenSrc_),
|
||||
maxLenDst(maxLenDst_),
|
||||
lenDst(lenDst_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "rectWidth=" << rectWidth << std::endl;
|
||||
strOut << "rectHeight=" << rectHeight << std::endl;
|
||||
strOut << "rectScale=" << rectScale << std::endl;
|
||||
strOut << "maxLenSrc=" << maxLenSrc << std::endl;
|
||||
strOut << "lenSrc=" << lenSrc << std::endl;
|
||||
strOut << "maxLenDst=" << maxLenDst << std::endl;
|
||||
strOut << "lenDst=" << lenDst << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_vecSrc(*this->allocatorCPU.get(), this->maxLenSrc);
|
||||
ncvAssertReturn(h_vecSrc.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> d_vecSrc(*this->allocatorGPU.get(), this->maxLenSrc);
|
||||
ncvAssertReturn(d_vecSrc.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> h_vecDst(*this->allocatorCPU.get(), this->maxLenDst);
|
||||
ncvAssertReturn(h_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> d_vecDst(*this->allocatorGPU.get(), this->maxLenDst);
|
||||
ncvAssertReturn(d_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_vecDst_d(*this->allocatorCPU.get(), this->maxLenDst);
|
||||
ncvAssertReturn(h_vecDst_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_vecSrc), false);
|
||||
memset(h_vecDst.ptr(), 0, h_vecDst.length() * sizeof(NcvRect32u));
|
||||
NCVVectorReuse<Ncv32u> h_vecDst_as32u(h_vecDst.getSegment(), lenDst * sizeof(NcvRect32u) / sizeof(Ncv32u));
|
||||
ncvAssertReturn(h_vecDst_as32u.isMemReused(), false);
|
||||
ncvAssertReturn(this->src.fill(h_vecDst_as32u), false);
|
||||
memcpy(h_vecDst_d.ptr(), h_vecDst.ptr(), h_vecDst.length() * sizeof(NcvRect32u));
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = h_vecSrc.copySolid(d_vecSrc, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvStat = h_vecDst.copySolid(d_vecDst, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
Ncv32u h_outElemNum_d = 0;
|
||||
Ncv32u h_outElemNum_h = 0;
|
||||
NCV_SKIP_COND_BEGIN
|
||||
h_outElemNum_d = this->lenDst;
|
||||
ncvStat = ncvGrowDetectionsVector_device(d_vecSrc, this->lenSrc,
|
||||
d_vecDst, h_outElemNum_d, this->maxLenDst,
|
||||
this->rectWidth, this->rectHeight, this->rectScale, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvStat = d_vecDst.copySolid(h_vecDst_d, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
h_outElemNum_h = this->lenDst;
|
||||
ncvStat = ncvGrowDetectionsVector_host(h_vecSrc, this->lenSrc,
|
||||
h_vecDst, h_outElemNum_h, this->maxLenDst,
|
||||
this->rectWidth, this->rectHeight, this->rectScale);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (h_outElemNum_d != h_outElemNum_h)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (memcmp(h_vecDst.ptr(), h_vecDst_d.ptr(), this->maxLenDst * sizeof(NcvRect32u)))
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestHypothesesGrow.h"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
|
||||
TestHypothesesGrow::TestHypothesesGrow(std::string testName_, NCVTestSourceProvider<Ncv32u> &src_,
|
||||
Ncv32u rectWidth_, Ncv32u rectHeight_, Ncv32f rectScale_,
|
||||
Ncv32u maxLenSrc_, Ncv32u lenSrc_, Ncv32u maxLenDst_, Ncv32u lenDst_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
rectWidth(rectWidth_),
|
||||
rectHeight(rectHeight_),
|
||||
rectScale(rectScale_),
|
||||
maxLenSrc(maxLenSrc_),
|
||||
lenSrc(lenSrc_),
|
||||
maxLenDst(maxLenDst_),
|
||||
lenDst(lenDst_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "rectWidth=" << rectWidth << std::endl;
|
||||
strOut << "rectHeight=" << rectHeight << std::endl;
|
||||
strOut << "rectScale=" << rectScale << std::endl;
|
||||
strOut << "maxLenSrc=" << maxLenSrc << std::endl;
|
||||
strOut << "lenSrc=" << lenSrc << std::endl;
|
||||
strOut << "maxLenDst=" << maxLenDst << std::endl;
|
||||
strOut << "lenDst=" << lenDst << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NCVVectorAlloc<Ncv32u> h_vecSrc(*this->allocatorCPU.get(), this->maxLenSrc);
|
||||
ncvAssertReturn(h_vecSrc.isMemAllocated(), false);
|
||||
NCVVectorAlloc<Ncv32u> d_vecSrc(*this->allocatorGPU.get(), this->maxLenSrc);
|
||||
ncvAssertReturn(d_vecSrc.isMemAllocated(), false);
|
||||
|
||||
NCVVectorAlloc<NcvRect32u> h_vecDst(*this->allocatorCPU.get(), this->maxLenDst);
|
||||
ncvAssertReturn(h_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> d_vecDst(*this->allocatorGPU.get(), this->maxLenDst);
|
||||
ncvAssertReturn(d_vecDst.isMemAllocated(), false);
|
||||
NCVVectorAlloc<NcvRect32u> h_vecDst_d(*this->allocatorCPU.get(), this->maxLenDst);
|
||||
ncvAssertReturn(h_vecDst_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_vecSrc), false);
|
||||
memset(h_vecDst.ptr(), 0, h_vecDst.length() * sizeof(NcvRect32u));
|
||||
NCVVectorReuse<Ncv32u> h_vecDst_as32u(h_vecDst.getSegment(), lenDst * sizeof(NcvRect32u) / sizeof(Ncv32u));
|
||||
ncvAssertReturn(h_vecDst_as32u.isMemReused(), false);
|
||||
ncvAssertReturn(this->src.fill(h_vecDst_as32u), false);
|
||||
memcpy(h_vecDst_d.ptr(), h_vecDst.ptr(), h_vecDst.length() * sizeof(NcvRect32u));
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = h_vecSrc.copySolid(d_vecSrc, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvStat = h_vecDst.copySolid(d_vecDst, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
Ncv32u h_outElemNum_d = 0;
|
||||
Ncv32u h_outElemNum_h = 0;
|
||||
NCV_SKIP_COND_BEGIN
|
||||
h_outElemNum_d = this->lenDst;
|
||||
ncvStat = ncvGrowDetectionsVector_device(d_vecSrc, this->lenSrc,
|
||||
d_vecDst, h_outElemNum_d, this->maxLenDst,
|
||||
this->rectWidth, this->rectHeight, this->rectScale, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvStat = d_vecDst.copySolid(h_vecDst_d, 0);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
ncvAssertCUDAReturn(cudaStreamSynchronize(0), false);
|
||||
|
||||
h_outElemNum_h = this->lenDst;
|
||||
ncvStat = ncvGrowDetectionsVector_host(h_vecSrc, this->lenSrc,
|
||||
h_vecDst, h_outElemNum_h, this->maxLenDst,
|
||||
this->rectWidth, this->rectHeight, this->rectScale);
|
||||
ncvAssertReturn(ncvStat == NCV_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (h_outElemNum_d != h_outElemNum_h)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (memcmp(h_vecDst.ptr(), h_vecDst_d.ptr(), this->maxLenDst * sizeof(NcvRect32u)))
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestHypothesesGrow::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,46 +1,46 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhypothesesgrow_h_
|
||||
#define _testhypothesesgrow_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHypothesesGrow : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHypothesesGrow(std::string testName, NCVTestSourceProvider<Ncv32u> &src,
|
||||
Ncv32u rectWidth, Ncv32u rectHeight, Ncv32f rectScale,
|
||||
Ncv32u maxLenSrc, Ncv32u lenSrc, Ncv32u maxLenDst, Ncv32u lenDst);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestHypothesesGrow(const TestHypothesesGrow&);
|
||||
TestHypothesesGrow& operator=(const TestHypothesesGrow&);
|
||||
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> &src;
|
||||
Ncv32u rectWidth;
|
||||
Ncv32u rectHeight;
|
||||
Ncv32f rectScale;
|
||||
Ncv32u maxLenSrc;
|
||||
Ncv32u lenSrc;
|
||||
Ncv32u maxLenDst;
|
||||
Ncv32u lenDst;
|
||||
};
|
||||
|
||||
#endif // _testhypothesesgrow_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testhypothesesgrow_h_
|
||||
#define _testhypothesesgrow_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestHypothesesGrow : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestHypothesesGrow(std::string testName, NCVTestSourceProvider<Ncv32u> &src,
|
||||
Ncv32u rectWidth, Ncv32u rectHeight, Ncv32f rectScale,
|
||||
Ncv32u maxLenSrc, Ncv32u lenSrc, Ncv32u maxLenDst, Ncv32u lenDst);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestHypothesesGrow(const TestHypothesesGrow&);
|
||||
TestHypothesesGrow& operator=(const TestHypothesesGrow&);
|
||||
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> &src;
|
||||
Ncv32u rectWidth;
|
||||
Ncv32u rectHeight;
|
||||
Ncv32f rectScale;
|
||||
Ncv32u maxLenSrc;
|
||||
Ncv32u lenSrc;
|
||||
Ncv32u maxLenDst;
|
||||
Ncv32u lenDst;
|
||||
};
|
||||
|
||||
#endif // _testhypothesesgrow_h_
|
||||
|
||||
@@ -1,189 +1,189 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
#include "TestIntegralImage.h"
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
TestIntegralImage<T_in, T_out>::TestIntegralImage(std::string testName_, NCVTestSourceProvider<T_in> &src_,
|
||||
Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T_in)=" << sizeof(T_in) << std::endl;
|
||||
strOut << "sizeof(T_out)=" << sizeof(T_out) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u widthII = this->width + 1;
|
||||
Ncv32u heightII = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<T_in> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_in> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_out> d_imgII(*this->allocatorGPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(d_imgII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_out> h_imgII(*this->allocatorCPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(h_imgII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_out> h_imgII_d(*this->allocatorCPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(h_imgII_d.isMemAllocated(), false);
|
||||
|
||||
Ncv32u bufSize;
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = nppiStIntegralGetSize_8u32u(NcvSize32u(this->width, this->height), &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
ncvStat = nppiStIntegralGetSize_32f32f(NcvSize32u(this->width, this->height), &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = nppiStIntegral_8u32u_C1R((Ncv8u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32u *)d_imgII.ptr(), d_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
ncvStat = nppiStIntegral_32f32f_C1R((Ncv32f *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32f *)d_imgII.ptr(), d_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
|
||||
ncvStat = d_imgII.copySolid(h_imgII_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = nppiStIntegral_8u32u_C1R_host((Ncv8u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32u *)h_imgII.ptr(), h_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
ncvStat = nppiStIntegral_32f32f_C1R_host((Ncv32f *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32f *)h_imgII.ptr(), h_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_img.height() + 1; i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_img.width() + 1; j++)
|
||||
{
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
if (h_imgII.ptr()[h_imgII.stride()*i+j] != h_imgII_d.ptr()[h_imgII_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
if (fabsf((float)h_imgII.ptr()[h_imgII.stride()*i+j] - (float)h_imgII_d.ptr()[h_imgII_d.stride()*i+j]) > 0.01f)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestIntegralImage<Ncv8u, Ncv32u>;
|
||||
template class TestIntegralImage<Ncv32f, Ncv32f>;
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
#include "TestIntegralImage.h"
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
TestIntegralImage<T_in, T_out>::TestIntegralImage(std::string testName_, NCVTestSourceProvider<T_in> &src_,
|
||||
Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T_in)=" << sizeof(T_in) << std::endl;
|
||||
strOut << "sizeof(T_out)=" << sizeof(T_out) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u widthII = this->width + 1;
|
||||
Ncv32u heightII = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<T_in> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_in> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_out> d_imgII(*this->allocatorGPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(d_imgII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_out> h_imgII(*this->allocatorCPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(h_imgII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T_out> h_imgII_d(*this->allocatorCPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(h_imgII_d.isMemAllocated(), false);
|
||||
|
||||
Ncv32u bufSize;
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = nppiStIntegralGetSize_8u32u(NcvSize32u(this->width, this->height), &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
ncvStat = nppiStIntegralGetSize_32f32f(NcvSize32u(this->width, this->height), &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = nppiStIntegral_8u32u_C1R((Ncv8u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32u *)d_imgII.ptr(), d_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
ncvStat = nppiStIntegral_32f32f_C1R((Ncv32f *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32f *)d_imgII.ptr(), d_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
|
||||
ncvStat = d_imgII.copySolid(h_imgII_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
ncvStat = nppiStIntegral_8u32u_C1R_host((Ncv8u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32u *)h_imgII.ptr(), h_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
ncvStat = nppiStIntegral_32f32f_C1R_host((Ncv32f *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32f *)h_imgII.ptr(), h_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_img.height() + 1; i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_img.width() + 1; j++)
|
||||
{
|
||||
if (sizeof(T_in) == sizeof(Ncv8u))
|
||||
{
|
||||
if (h_imgII.ptr()[h_imgII.stride()*i+j] != h_imgII_d.ptr()[h_imgII_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
else if (sizeof(T_in) == sizeof(Ncv32f))
|
||||
{
|
||||
if (fabsf((float)h_imgII.ptr()[h_imgII.stride()*i+j] - (float)h_imgII_d.ptr()[h_imgII_d.stride()*i+j]) > 0.01f)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect integral image test instance", false);
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
bool TestIntegralImage<T_in, T_out>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestIntegralImage<Ncv8u, Ncv32u>;
|
||||
template class TestIntegralImage<Ncv32f, Ncv32f>;
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,40 +1,40 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testintegralimage_h_
|
||||
#define _testintegralimage_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
class TestIntegralImage : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestIntegralImage(std::string testName, NCVTestSourceProvider<T_in> &src,
|
||||
Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestIntegralImage(const TestIntegralImage&);
|
||||
TestIntegralImage& operator=(const TestIntegralImage&);
|
||||
|
||||
NCVTestSourceProvider<T_in> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testintegralimage_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testintegralimage_h_
|
||||
#define _testintegralimage_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
template <class T_in, class T_out>
|
||||
class TestIntegralImage : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestIntegralImage(std::string testName, NCVTestSourceProvider<T_in> &src,
|
||||
Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestIntegralImage(const TestIntegralImage&);
|
||||
TestIntegralImage& operator=(const TestIntegralImage&);
|
||||
|
||||
NCVTestSourceProvider<T_in> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testintegralimage_h_
|
||||
|
||||
@@ -1,121 +1,121 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestIntegralImageSquared.h"
|
||||
|
||||
|
||||
TestIntegralImageSquared::TestIntegralImageSquared(std::string testName_, NCVTestSourceProvider<Ncv8u> &src_,
|
||||
Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u widthSII = this->width + 1;
|
||||
Ncv32u heightSII = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<Ncv8u> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv8u> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> d_imgSII(*this->allocatorGPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(d_imgSII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_imgSII(*this->allocatorCPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(h_imgSII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_imgSII_d(*this->allocatorCPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(h_imgSII_d.isMemAllocated(), false);
|
||||
|
||||
Ncv32u bufSize;
|
||||
ncvStat = nppiStSqrIntegralGetSize_8u64u(NcvSize32u(this->width, this->height), &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_imgSII.ptr(), d_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = d_imgSII.copySolid(h_imgSII_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R_host(h_img.ptr(), h_img.pitch(),
|
||||
h_imgSII.ptr(), h_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_img.height() + 1; i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_img.width() + 1; j++)
|
||||
{
|
||||
if (h_imgSII.ptr()[h_imgSII.stride()*i+j] != h_imgSII_d.ptr()[h_imgSII_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include "TestIntegralImageSquared.h"
|
||||
|
||||
|
||||
TestIntegralImageSquared::TestIntegralImageSquared(std::string testName_, NCVTestSourceProvider<Ncv8u> &src_,
|
||||
Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32u widthSII = this->width + 1;
|
||||
Ncv32u heightSII = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<Ncv8u> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv8u> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> d_imgSII(*this->allocatorGPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(d_imgSII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_imgSII(*this->allocatorCPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(h_imgSII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_imgSII_d(*this->allocatorCPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(h_imgSII_d.isMemAllocated(), false);
|
||||
|
||||
Ncv32u bufSize;
|
||||
ncvStat = nppiStSqrIntegralGetSize_8u64u(NcvSize32u(this->width, this->height), &bufSize, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_imgSII.ptr(), d_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = d_imgSII.copySolid(h_imgSII_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R_host(h_img.ptr(), h_img.pitch(),
|
||||
h_imgSII.ptr(), h_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_img.height() + 1; i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_img.width() + 1; j++)
|
||||
{
|
||||
if (h_imgSII.ptr()[h_imgSII.stride()*i+j] != h_imgSII_d.ptr()[h_imgSII_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestIntegralImageSquared::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,39 +1,39 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testintegralimagesquared_h_
|
||||
#define _testintegralimagesquared_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestIntegralImageSquared : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestIntegralImageSquared(std::string testName, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestIntegralImageSquared(const TestIntegralImageSquared&);
|
||||
TestIntegralImageSquared& operator=(const TestIntegralImageSquared&);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testintegralimagesquared_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testintegralimagesquared_h_
|
||||
#define _testintegralimagesquared_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestIntegralImageSquared : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestIntegralImageSquared(std::string testName, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestIntegralImageSquared(const TestIntegralImageSquared&);
|
||||
TestIntegralImageSquared& operator=(const TestIntegralImageSquared&);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testintegralimagesquared_h_
|
||||
|
||||
@@ -1,184 +1,184 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "TestRectStdDev.h"
|
||||
|
||||
|
||||
TestRectStdDev::TestRectStdDev(std::string testName_, NCVTestSourceProvider<Ncv8u> &src_,
|
||||
Ncv32u width_, Ncv32u height_, NcvRect32u rect_, Ncv32f scaleFactor_,
|
||||
NcvBool bTextureCache_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_),
|
||||
rect(rect_),
|
||||
scaleFactor(scaleFactor_),
|
||||
bTextureCache(bTextureCache_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
strOut << "rect=[" << rect.x << ", " << rect.y << ", " << rect.width << ", " << rect.height << "]\n";
|
||||
strOut << "scaleFactor=" << scaleFactor << std::endl;
|
||||
strOut << "bTextureCache=" << bTextureCache << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32s _normWidth = (Ncv32s)this->width - this->rect.x - this->rect.width + 1;
|
||||
Ncv32s _normHeight = (Ncv32s)this->height - this->rect.y - this->rect.height + 1;
|
||||
if (_normWidth <= 0 || _normHeight <= 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
Ncv32u normWidth = (Ncv32u)_normWidth;
|
||||
Ncv32u normHeight = (Ncv32u)_normHeight;
|
||||
NcvSize32u szNormRoi(normWidth, normHeight);
|
||||
|
||||
Ncv32u widthII = this->width + 1;
|
||||
Ncv32u heightII = this->height + 1;
|
||||
Ncv32u widthSII = this->width + 1;
|
||||
Ncv32u heightSII = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<Ncv8u> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv8u> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32u> d_imgII(*this->allocatorGPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(d_imgII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> h_imgII(*this->allocatorCPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(h_imgII.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv64u> d_imgSII(*this->allocatorGPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(d_imgSII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_imgSII(*this->allocatorCPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(h_imgSII.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32f> d_norm(*this->allocatorGPU.get(), normWidth, normHeight);
|
||||
ncvAssertReturn(d_norm.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32f> h_norm(*this->allocatorCPU.get(), normWidth, normHeight);
|
||||
ncvAssertReturn(h_norm.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32f> h_norm_d(*this->allocatorCPU.get(), normWidth, normHeight);
|
||||
ncvAssertReturn(h_norm_d.isMemAllocated(), false);
|
||||
|
||||
Ncv32u bufSizeII, bufSizeSII;
|
||||
ncvStat = nppiStIntegralGetSize_8u32u(NcvSize32u(this->width, this->height), &bufSizeII, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
ncvStat = nppiStSqrIntegralGetSize_8u64u(NcvSize32u(this->width, this->height), &bufSizeSII, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
Ncv32u bufSize = bufSizeII > bufSizeSII ? bufSizeII : bufSizeSII;
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStIntegral_8u32u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_imgII.ptr(), d_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_imgSII.ptr(), d_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStRectStdDev_32f_C1R(d_imgII.ptr(), d_imgII.pitch(),
|
||||
d_imgSII.ptr(), d_imgSII.pitch(),
|
||||
d_norm.ptr(), d_norm.pitch(),
|
||||
szNormRoi, this->rect,
|
||||
this->scaleFactor,
|
||||
this->bTextureCache);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = d_norm.copySolid(h_norm_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStIntegral_8u32u_C1R_host(h_img.ptr(), h_img.pitch(),
|
||||
h_imgII.ptr(), h_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R_host(h_img.ptr(), h_img.pitch(),
|
||||
h_imgSII.ptr(), h_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStRectStdDev_32f_C1R_host(h_imgII.ptr(), h_imgII.pitch(),
|
||||
h_imgSII.ptr(), h_imgSII.pitch(),
|
||||
h_norm.ptr(), h_norm.pitch(),
|
||||
szNormRoi, this->rect,
|
||||
this->scaleFactor);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_norm.height(); i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_norm.width(); j++)
|
||||
{
|
||||
Ncv64f absErr = fabs(h_norm.ptr()[h_norm.stride()*i+j] - h_norm_d.ptr()[h_norm_d.stride()*i+j]);
|
||||
Ncv64f relErr = absErr / h_norm.ptr()[h_norm.stride()*i+j];
|
||||
|
||||
if (relErr > relEPS)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "TestRectStdDev.h"
|
||||
|
||||
|
||||
TestRectStdDev::TestRectStdDev(std::string testName_, NCVTestSourceProvider<Ncv8u> &src_,
|
||||
Ncv32u width_, Ncv32u height_, NcvRect32u rect_, Ncv32f scaleFactor_,
|
||||
NcvBool bTextureCache_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_),
|
||||
rect(rect_),
|
||||
scaleFactor(scaleFactor_),
|
||||
bTextureCache(bTextureCache_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "height=" << height << std::endl;
|
||||
strOut << "rect=[" << rect.x << ", " << rect.y << ", " << rect.width << ", " << rect.height << "]\n";
|
||||
strOut << "scaleFactor=" << scaleFactor << std::endl;
|
||||
strOut << "bTextureCache=" << bTextureCache << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32s _normWidth = (Ncv32s)this->width - this->rect.x - this->rect.width + 1;
|
||||
Ncv32s _normHeight = (Ncv32s)this->height - this->rect.y - this->rect.height + 1;
|
||||
if (_normWidth <= 0 || _normHeight <= 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
Ncv32u normWidth = (Ncv32u)_normWidth;
|
||||
Ncv32u normHeight = (Ncv32u)_normHeight;
|
||||
NcvSize32u szNormRoi(normWidth, normHeight);
|
||||
|
||||
Ncv32u widthII = this->width + 1;
|
||||
Ncv32u heightII = this->height + 1;
|
||||
Ncv32u widthSII = this->width + 1;
|
||||
Ncv32u heightSII = this->height + 1;
|
||||
|
||||
NCVMatrixAlloc<Ncv8u> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv8u> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32u> d_imgII(*this->allocatorGPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(d_imgII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32u> h_imgII(*this->allocatorCPU.get(), widthII, heightII);
|
||||
ncvAssertReturn(h_imgII.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv64u> d_imgSII(*this->allocatorGPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(d_imgSII.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv64u> h_imgSII(*this->allocatorCPU.get(), widthSII, heightSII);
|
||||
ncvAssertReturn(h_imgSII.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<Ncv32f> d_norm(*this->allocatorGPU.get(), normWidth, normHeight);
|
||||
ncvAssertReturn(d_norm.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32f> h_norm(*this->allocatorCPU.get(), normWidth, normHeight);
|
||||
ncvAssertReturn(h_norm.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<Ncv32f> h_norm_d(*this->allocatorCPU.get(), normWidth, normHeight);
|
||||
ncvAssertReturn(h_norm_d.isMemAllocated(), false);
|
||||
|
||||
Ncv32u bufSizeII, bufSizeSII;
|
||||
ncvStat = nppiStIntegralGetSize_8u32u(NcvSize32u(this->width, this->height), &bufSizeII, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
ncvStat = nppiStSqrIntegralGetSize_8u64u(NcvSize32u(this->width, this->height), &bufSizeSII, this->devProp);
|
||||
ncvAssertReturn(NPPST_SUCCESS == ncvStat, false);
|
||||
Ncv32u bufSize = bufSizeII > bufSizeSII ? bufSizeII : bufSizeSII;
|
||||
NCVVectorAlloc<Ncv8u> d_tmpBuf(*this->allocatorGPU.get(), bufSize);
|
||||
ncvAssertReturn(d_tmpBuf.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStIntegral_8u32u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_imgII.ptr(), d_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R(d_img.ptr(), d_img.pitch(),
|
||||
d_imgSII.ptr(), d_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height),
|
||||
d_tmpBuf.ptr(), bufSize, this->devProp);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStRectStdDev_32f_C1R(d_imgII.ptr(), d_imgII.pitch(),
|
||||
d_imgSII.ptr(), d_imgSII.pitch(),
|
||||
d_norm.ptr(), d_norm.pitch(),
|
||||
szNormRoi, this->rect,
|
||||
this->scaleFactor,
|
||||
this->bTextureCache);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = d_norm.copySolid(h_norm_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStIntegral_8u32u_C1R_host(h_img.ptr(), h_img.pitch(),
|
||||
h_imgII.ptr(), h_imgII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStSqrIntegral_8u64u_C1R_host(h_img.ptr(), h_img.pitch(),
|
||||
h_imgSII.ptr(), h_imgSII.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
ncvStat = nppiStRectStdDev_32f_C1R_host(h_imgII.ptr(), h_imgII.pitch(),
|
||||
h_imgSII.ptr(), h_imgSII.pitch(),
|
||||
h_norm.ptr(), h_norm.pitch(),
|
||||
szNormRoi, this->rect,
|
||||
this->scaleFactor);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_norm.height(); i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_norm.width(); j++)
|
||||
{
|
||||
Ncv64f absErr = fabs(h_norm.ptr()[h_norm.stride()*i+j] - h_norm_d.ptr()[h_norm_d.stride()*i+j]);
|
||||
Ncv64f relErr = absErr / h_norm.ptr()[h_norm.stride()*i+j];
|
||||
|
||||
if (relErr > relEPS)
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
bool TestRectStdDev::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,44 +1,44 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testrectstddev_h_
|
||||
#define _testrectstddev_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestRectStdDev : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestRectStdDev(std::string testName, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u width, Ncv32u height, NcvRect32u rect, Ncv32f scaleFactor,
|
||||
NcvBool bTextureCache);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestRectStdDev(const TestRectStdDev&);
|
||||
TestRectStdDev& operator=(const TestRectStdDev&);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
NcvRect32u rect;
|
||||
Ncv32f scaleFactor;
|
||||
|
||||
NcvBool bTextureCache;
|
||||
};
|
||||
|
||||
#endif // _testrectstddev_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testrectstddev_h_
|
||||
#define _testrectstddev_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
class TestRectStdDev : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestRectStdDev(std::string testName, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u width, Ncv32u height, NcvRect32u rect, Ncv32f scaleFactor,
|
||||
NcvBool bTextureCache);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestRectStdDev(const TestRectStdDev&);
|
||||
TestRectStdDev& operator=(const TestRectStdDev&);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
NcvRect32u rect;
|
||||
Ncv32f scaleFactor;
|
||||
|
||||
NcvBool bTextureCache;
|
||||
};
|
||||
|
||||
#endif // _testrectstddev_h_
|
||||
|
||||
@@ -1,165 +1,165 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "TestResize.h"
|
||||
|
||||
|
||||
template <class T>
|
||||
TestResize<T>::TestResize(std::string testName_, NCVTestSourceProvider<T> &src_,
|
||||
Ncv32u width_, Ncv32u height_, Ncv32u scaleFactor_, NcvBool bTextureCache_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_),
|
||||
scaleFactor(scaleFactor_),
|
||||
bTextureCache(bTextureCache_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T)=" << sizeof(T) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "scaleFactor=" << scaleFactor << std::endl;
|
||||
strOut << "bTextureCache=" << bTextureCache << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32s smallWidth = this->width / this->scaleFactor;
|
||||
Ncv32s smallHeight = this->height / this->scaleFactor;
|
||||
if (smallWidth == 0 || smallHeight == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
NcvSize32u srcSize(this->width, this->height);
|
||||
|
||||
NCVMatrixAlloc<T> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<T> d_small(*this->allocatorGPU.get(), smallWidth, smallHeight);
|
||||
ncvAssertReturn(d_small.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_small(*this->allocatorCPU.get(), smallWidth, smallHeight);
|
||||
ncvAssertReturn(h_small.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_small_d(*this->allocatorCPU.get(), smallWidth, smallHeight);
|
||||
ncvAssertReturn(h_small_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_32u_C1R((Ncv32u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32u *)d_small.ptr(), d_small.pitch(),
|
||||
srcSize, this->scaleFactor,
|
||||
this->bTextureCache);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_64u_C1R((Ncv64u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv64u *)d_small.ptr(), d_small.pitch(),
|
||||
srcSize, this->scaleFactor,
|
||||
this->bTextureCache);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect downsample test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
ncvStat = d_small.copySolid(h_small_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_32u_C1R_host((Ncv32u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32u *)h_small.ptr(), h_small.pitch(),
|
||||
srcSize, this->scaleFactor);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_64u_C1R_host((Ncv64u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv64u *)h_small.ptr(), h_small.pitch(),
|
||||
srcSize, this->scaleFactor);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect downsample test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
//const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_small.height(); i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_small.width(); j++)
|
||||
{
|
||||
if (h_small.ptr()[h_small.stride()*i+j] != h_small_d.ptr()[h_small_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestResize<Ncv32u>;
|
||||
template class TestResize<Ncv64u>;
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "TestResize.h"
|
||||
|
||||
|
||||
template <class T>
|
||||
TestResize<T>::TestResize(std::string testName_, NCVTestSourceProvider<T> &src_,
|
||||
Ncv32u width_, Ncv32u height_, Ncv32u scaleFactor_, NcvBool bTextureCache_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_),
|
||||
scaleFactor(scaleFactor_),
|
||||
bTextureCache(bTextureCache_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T)=" << sizeof(T) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
strOut << "scaleFactor=" << scaleFactor << std::endl;
|
||||
strOut << "bTextureCache=" << bTextureCache << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
Ncv32s smallWidth = this->width / this->scaleFactor;
|
||||
Ncv32s smallHeight = this->height / this->scaleFactor;
|
||||
if (smallWidth == 0 || smallHeight == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
NcvSize32u srcSize(this->width, this->height);
|
||||
|
||||
NCVMatrixAlloc<T> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<T> d_small(*this->allocatorGPU.get(), smallWidth, smallHeight);
|
||||
ncvAssertReturn(d_small.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_small(*this->allocatorCPU.get(), smallWidth, smallHeight);
|
||||
ncvAssertReturn(h_small.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_small_d(*this->allocatorCPU.get(), smallWidth, smallHeight);
|
||||
ncvAssertReturn(h_small_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_32u_C1R((Ncv32u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32u *)d_small.ptr(), d_small.pitch(),
|
||||
srcSize, this->scaleFactor,
|
||||
this->bTextureCache);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_64u_C1R((Ncv64u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv64u *)d_small.ptr(), d_small.pitch(),
|
||||
srcSize, this->scaleFactor,
|
||||
this->bTextureCache);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect downsample test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
ncvStat = d_small.copySolid(h_small_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_32u_C1R_host((Ncv32u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32u *)h_small.ptr(), h_small.pitch(),
|
||||
srcSize, this->scaleFactor);
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStDecimate_64u_C1R_host((Ncv64u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv64u *)h_small.ptr(), h_small.pitch(),
|
||||
srcSize, this->scaleFactor);
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect downsample test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
//const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < h_small.height(); i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < h_small.width(); j++)
|
||||
{
|
||||
if (h_small.ptr()[h_small.stride()*i+j] != h_small_d.ptr()[h_small_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestResize<T>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestResize<Ncv32u>;
|
||||
template class TestResize<Ncv64u>;
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,42 +1,42 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testresize_h_
|
||||
#define _testresize_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
template <class T>
|
||||
class TestResize : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestResize(std::string testName, NCVTestSourceProvider<T> &src,
|
||||
Ncv32u width, Ncv32u height, Ncv32u scaleFactor, NcvBool bTextureCache);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestResize(const TestResize&);
|
||||
TestResize& operator=(const TestResize&);
|
||||
|
||||
NCVTestSourceProvider<T> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
Ncv32u scaleFactor;
|
||||
|
||||
NcvBool bTextureCache;
|
||||
};
|
||||
|
||||
#endif // _testresize_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testresize_h_
|
||||
#define _testresize_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
template <class T>
|
||||
class TestResize : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestResize(std::string testName, NCVTestSourceProvider<T> &src,
|
||||
Ncv32u width, Ncv32u height, Ncv32u scaleFactor, NcvBool bTextureCache);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
TestResize(const TestResize&);
|
||||
TestResize& operator=(const TestResize&);
|
||||
|
||||
NCVTestSourceProvider<T> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
Ncv32u scaleFactor;
|
||||
|
||||
NcvBool bTextureCache;
|
||||
};
|
||||
|
||||
#endif // _testresize_h_
|
||||
|
||||
@@ -1,152 +1,152 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "TestTranspose.h"
|
||||
|
||||
|
||||
template <class T>
|
||||
TestTranspose<T>::TestTranspose(std::string testName_, NCVTestSourceProvider<T> &src_,
|
||||
Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T)=" << sizeof(T) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NcvSize32u srcSize(this->width, this->height);
|
||||
|
||||
NCVMatrixAlloc<T> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<T> d_dst(*this->allocatorGPU.get(), this->height, this->width);
|
||||
ncvAssertReturn(d_dst.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_dst(*this->allocatorCPU.get(), this->height, this->width);
|
||||
ncvAssertReturn(h_dst.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_dst_d(*this->allocatorCPU.get(), this->height, this->width);
|
||||
ncvAssertReturn(h_dst_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_32u_C1R((Ncv32u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32u *)d_dst.ptr(), d_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_64u_C1R((Ncv64u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv64u *)d_dst.ptr(), d_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect transpose test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
ncvStat = d_dst.copySolid(h_dst_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_32u_C1R_host((Ncv32u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32u *)h_dst.ptr(), h_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_64u_C1R_host((Ncv64u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv64u *)h_dst.ptr(), h_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect downsample test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
//const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < this->width; i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < this->height; j++)
|
||||
{
|
||||
if (h_dst.ptr()[h_dst.stride()*i+j] != h_dst_d.ptr()[h_dst_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestTranspose<Ncv32u>;
|
||||
template class TestTranspose<Ncv64u>;
|
||||
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <math.h>
|
||||
|
||||
#include "TestTranspose.h"
|
||||
|
||||
|
||||
template <class T>
|
||||
TestTranspose<T>::TestTranspose(std::string testName_, NCVTestSourceProvider<T> &src_,
|
||||
Ncv32u width_, Ncv32u height_)
|
||||
:
|
||||
NCVTestProvider(testName_),
|
||||
src(src_),
|
||||
width(width_),
|
||||
height(height_)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::toString(std::ofstream &strOut)
|
||||
{
|
||||
strOut << "sizeof(T)=" << sizeof(T) << std::endl;
|
||||
strOut << "width=" << width << std::endl;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::process()
|
||||
{
|
||||
NCVStatus ncvStat;
|
||||
bool rcode = false;
|
||||
|
||||
NcvSize32u srcSize(this->width, this->height);
|
||||
|
||||
NCVMatrixAlloc<T> d_img(*this->allocatorGPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(d_img.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_img(*this->allocatorCPU.get(), this->width, this->height);
|
||||
ncvAssertReturn(h_img.isMemAllocated(), false);
|
||||
|
||||
NCVMatrixAlloc<T> d_dst(*this->allocatorGPU.get(), this->height, this->width);
|
||||
ncvAssertReturn(d_dst.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_dst(*this->allocatorCPU.get(), this->height, this->width);
|
||||
ncvAssertReturn(h_dst.isMemAllocated(), false);
|
||||
NCVMatrixAlloc<T> h_dst_d(*this->allocatorCPU.get(), this->height, this->width);
|
||||
ncvAssertReturn(h_dst_d.isMemAllocated(), false);
|
||||
|
||||
NCV_SET_SKIP_COND(this->allocatorGPU.get()->isCounting());
|
||||
NCV_SKIP_COND_BEGIN
|
||||
ncvAssertReturn(this->src.fill(h_img), false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
ncvStat = h_img.copySolid(d_img, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_32u_C1R((Ncv32u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv32u *)d_dst.ptr(), d_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_64u_C1R((Ncv64u *)d_img.ptr(), d_img.pitch(),
|
||||
(Ncv64u *)d_dst.ptr(), d_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect transpose test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
ncvStat = d_dst.copySolid(h_dst_d, 0);
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_32u_C1R_host((Ncv32u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv32u *)h_dst.ptr(), h_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv64u))
|
||||
{
|
||||
ncvStat = nppiStTranspose_64u_C1R_host((Ncv64u *)h_img.ptr(), h_img.pitch(),
|
||||
(Ncv64u *)h_dst.ptr(), h_dst.pitch(),
|
||||
NcvSize32u(this->width, this->height));
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintReturn(false, "Incorrect downsample test instance", false);
|
||||
}
|
||||
ncvAssertReturn(ncvStat == NPPST_SUCCESS, false);
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
//bit-to-bit check
|
||||
bool bLoopVirgin = true;
|
||||
|
||||
NCV_SKIP_COND_BEGIN
|
||||
//const Ncv64f relEPS = 0.005;
|
||||
for (Ncv32u i=0; bLoopVirgin && i < this->width; i++)
|
||||
{
|
||||
for (Ncv32u j=0; bLoopVirgin && j < this->height; j++)
|
||||
{
|
||||
if (h_dst.ptr()[h_dst.stride()*i+j] != h_dst_d.ptr()[h_dst_d.stride()*i+j])
|
||||
{
|
||||
bLoopVirgin = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
NCV_SKIP_COND_END
|
||||
|
||||
if (bLoopVirgin)
|
||||
{
|
||||
rcode = true;
|
||||
}
|
||||
|
||||
return rcode;
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
bool TestTranspose<T>::deinit()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template class TestTranspose<Ncv32u>;
|
||||
template class TestTranspose<Ncv64u>;
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
@@ -1,41 +1,41 @@
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testtranspose_h_
|
||||
#define _testtranspose_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
template <class T>
|
||||
class TestTranspose : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestTranspose(std::string testName, NCVTestSourceProvider<T> &src,
|
||||
Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
TestTranspose(const TestTranspose&);
|
||||
TestTranspose& operator=(const TestTranspose&);
|
||||
|
||||
NCVTestSourceProvider<T> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testtranspose_h_
|
||||
/*
|
||||
* Copyright 1993-2010 NVIDIA Corporation. All rights reserved.
|
||||
*
|
||||
* NVIDIA Corporation and its licensors retain all intellectual
|
||||
* property and proprietary rights in and to this software and
|
||||
* related documentation and any modifications thereto.
|
||||
* Any use, reproduction, disclosure, or distribution of this
|
||||
* software and related documentation without an express license
|
||||
* agreement from NVIDIA Corporation is strictly prohibited.
|
||||
*/
|
||||
#ifndef _testtranspose_h_
|
||||
#define _testtranspose_h_
|
||||
|
||||
#include "NCVTest.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
|
||||
template <class T>
|
||||
class TestTranspose : public NCVTestProvider
|
||||
{
|
||||
public:
|
||||
|
||||
TestTranspose(std::string testName, NCVTestSourceProvider<T> &src,
|
||||
Ncv32u width, Ncv32u height);
|
||||
|
||||
virtual bool init();
|
||||
virtual bool process();
|
||||
virtual bool deinit();
|
||||
virtual bool toString(std::ofstream &strOut);
|
||||
|
||||
private:
|
||||
|
||||
TestTranspose(const TestTranspose&);
|
||||
TestTranspose& operator=(const TestTranspose&);
|
||||
|
||||
NCVTestSourceProvider<T> &src;
|
||||
Ncv32u width;
|
||||
Ncv32u height;
|
||||
};
|
||||
|
||||
#endif // _testtranspose_h_
|
||||
|
||||
@@ -1,442 +1,442 @@
|
||||
#if defined _MSC_VER && _MSC_VER >= 1200
|
||||
# pragma warning (disable : 4408 4201 4100)
|
||||
#endif
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
#include "NCV.hpp"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
#include "TestIntegralImage.h"
|
||||
#include "TestIntegralImageSquared.h"
|
||||
#include "TestRectStdDev.h"
|
||||
#include "TestResize.h"
|
||||
#include "TestCompact.h"
|
||||
#include "TestTranspose.h"
|
||||
|
||||
#include "TestDrawRects.h"
|
||||
#include "TestHypothesesGrow.h"
|
||||
#include "TestHypothesesFilter.h"
|
||||
#include "TestHaarCascadeLoader.h"
|
||||
#include "TestHaarCascadeApplication.h"
|
||||
|
||||
#include "NCVAutoTestLister.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
#include <main_test_nvidia.h>
|
||||
|
||||
static std::string path;
|
||||
|
||||
namespace {
|
||||
|
||||
template <class T_in, class T_out>
|
||||
void generateIntegralTests(NCVAutoTestLister &testLister,
|
||||
NCVTestSourceProvider<T_in> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
for (Ncv32f _i=1.0; _i<maxWidth; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "LinIntImgW%dH%d", i, 2);
|
||||
testLister.add(new TestIntegralImage<T_in, T_out>(testName, src, i, 2));
|
||||
}
|
||||
for (Ncv32f _i=1.0; _i<maxHeight; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "LinIntImgW%dH%d", 2, i);
|
||||
testLister.add(new TestIntegralImage<T_in, T_out>(testName, src, 2, i));
|
||||
}
|
||||
|
||||
testLister.add(new TestIntegralImage<T_in, T_out>("LinIntImg_VGA", src, 640, 480));
|
||||
}
|
||||
|
||||
void generateSquaredIntegralTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
for (Ncv32f _i=1.0; _i<maxWidth; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "SqIntImgW%dH%d", i, 32);
|
||||
testLister.add(new TestIntegralImageSquared(testName, src, i, 32));
|
||||
}
|
||||
for (Ncv32f _i=1.0; _i<maxHeight; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "SqIntImgW%dH%d", 32, i);
|
||||
testLister.add(new TestIntegralImageSquared(testName, src, 32, i));
|
||||
}
|
||||
|
||||
testLister.add(new TestIntegralImageSquared("SqLinIntImg_VGA", src, 640, 480));
|
||||
}
|
||||
|
||||
void generateRectStdDevTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
NcvRect32u rect(1,1,18,18);
|
||||
|
||||
for (Ncv32f _i=32; _i<maxHeight/2 && _i < maxWidth/2; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "RectStdDevW%dH%d", i*2, i);
|
||||
testLister.add(new TestRectStdDev(testName, src, i*2, i, rect, 1, true));
|
||||
testLister.add(new TestRectStdDev(testName, src, i*2, i, rect, 1.5, false));
|
||||
testLister.add(new TestRectStdDev(testName, src, i-1, i*2-1, rect, 1, false));
|
||||
testLister.add(new TestRectStdDev(testName, src, i-1, i*2-1, rect, 2.5, true));
|
||||
}
|
||||
|
||||
testLister.add(new TestRectStdDev("RectStdDev_VGA", src, 640, 480, rect, 1, true));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void generateResizeTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<T> &src)
|
||||
{
|
||||
for (Ncv32u i=1; i<480; i+=3)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestResize_VGA_s%d", i);
|
||||
testLister.add(new TestResize<T>(testName, src, 640, 480, i, true));
|
||||
testLister.add(new TestResize<T>(testName, src, 640, 480, i, false));
|
||||
}
|
||||
|
||||
for (Ncv32u i=1; i<1080; i+=5)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestResize_1080_s%d", i);
|
||||
testLister.add(new TestResize<T>(testName, src, 1920, 1080, i, true));
|
||||
testLister.add(new TestResize<T>(testName, src, 1920, 1080, i, false));
|
||||
}
|
||||
}
|
||||
|
||||
void generateNPPSTVectorTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv32u> &src, Ncv32u maxLength)
|
||||
{
|
||||
//compaction
|
||||
for (Ncv32f _i=256.0; _i<maxLength; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0xFFFFFFFF, 30));
|
||||
}
|
||||
for (Ncv32u i=1; i<260; i++)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0xC001C0DE, 70));
|
||||
testLister.add(new TestCompact(testName, src, i, 0xC001C0DE, 0));
|
||||
testLister.add(new TestCompact(testName, src, i, 0xC001C0DE, 100));
|
||||
}
|
||||
for (Ncv32u i=256*256-256; i<256*256+257; i++)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0xFFFFFFFF, 40));
|
||||
}
|
||||
for (Ncv32u i=256*256*256-10; i<256*256*256+10; i++)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0x00000000, 2));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
void generateTransposeTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<T> &src)
|
||||
{
|
||||
for (int i=2; i<64; i+=4)
|
||||
{
|
||||
for (int j=2; j<64; j+=4)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestTranspose_%dx%d", i, j);
|
||||
testLister.add(new TestTranspose<T>(testName, src, i, j));
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=1; i<128; i+=1)
|
||||
{
|
||||
for (int j=1; j<2; j+=1)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestTranspose_%dx%d", i, j);
|
||||
testLister.add(new TestTranspose<T>(testName, src, i, j));
|
||||
}
|
||||
}
|
||||
|
||||
testLister.add(new TestTranspose<T>("TestTranspose_VGA", src, 640, 480));
|
||||
testLister.add(new TestTranspose<T>("TestTranspose_HD1080", src, 1920, 1080));
|
||||
|
||||
//regression tests
|
||||
testLister.add(new TestTranspose<T>("TestTranspose_reg_0", src, 1072, 375));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void generateDrawRectsTests(NCVAutoTestLister &testLister,
|
||||
NCVTestSourceProvider<T> &src,
|
||||
NCVTestSourceProvider<Ncv32u> &src32u,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
for (Ncv32f _i=16.0; _i<maxWidth; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
Ncv32u j = maxHeight * i / maxWidth;
|
||||
if (!j) continue;
|
||||
char testName[80];
|
||||
sprintf(testName, "DrawRectsW%dH%d", i, j);
|
||||
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
testLister.add(new TestDrawRects<T>(testName, src, src32u, i, j, i*j/1000+1, (T)0xFFFFFFFF));
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv8u))
|
||||
{
|
||||
testLister.add(new TestDrawRects<T>(testName, src, src32u, i, j, i*j/1000+1, (T)0xFF));
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintCheck(false, "Attempted to instantiate non-existing DrawRects test suite");
|
||||
}
|
||||
}
|
||||
|
||||
//test VGA
|
||||
testLister.add(new TestDrawRects<T>("DrawRects_VGA", src, src32u, 640, 480, 640*480/1000, (T)0xFF));
|
||||
}
|
||||
|
||||
void generateVectorTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv32u> &src, Ncv32u maxLength)
|
||||
{
|
||||
//growth
|
||||
for (Ncv32f _i=10.0; _i<maxLength; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "VectorGrow%d", i);
|
||||
testLister.add(new TestHypothesesGrow(testName, src, 20, 20, 2.2f, i, i/2, i, i/4));
|
||||
testLister.add(new TestHypothesesGrow(testName, src, 10, 42, 1.2f, i, i, i, 0));
|
||||
}
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow01b", src, 10, 42, 1.2f, 10, 0, 10, 1));
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow11b", src, 10, 42, 1.2f, 10, 1, 10, 1));
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow10b", src, 10, 42, 1.2f, 10, 1, 10, 0));
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow00b", src, 10, 42, 1.2f, 10, 0, 10, 0));
|
||||
}
|
||||
|
||||
void generateHypothesesFiltrationTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv32u> &src, Ncv32u maxLength)
|
||||
{
|
||||
for (Ncv32f _i=1.0; _i<maxLength; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "HypFilter%d", i);
|
||||
testLister.add(new TestHypothesesFilter(testName, src, i, 3, 0.2f));
|
||||
testLister.add(new TestHypothesesFilter(testName, src, i, 0, 0.2f));
|
||||
testLister.add(new TestHypothesesFilter(testName, src, i, 1, 0.1f));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void generateHaarLoaderTests(NCVAutoTestLister &testLister)
|
||||
{
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_eye.xml", path + "haarcascade_eye.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_frontalface_alt.xml", path + "haarcascade_frontalface_alt.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_frontalface_alt2.xml", path + "haarcascade_frontalface_alt2.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_frontalface_alt_tree.xml", path + "haarcascade_frontalface_alt_tree.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_eye_tree_eyeglasses.xml", path + "haarcascade_eye_tree_eyeglasses.xml"));
|
||||
}
|
||||
|
||||
void generateHaarApplicationTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
(void)maxHeight;
|
||||
for (Ncv32u i=20; i<512; i+=11)
|
||||
{
|
||||
for (Ncv32u j=20; j<128; j+=5)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "HaarAppl%d_%d", i, j);
|
||||
testLister.add(new TestHaarCascadeApplication(testName, src, path + "haarcascade_frontalface_alt.xml", j, i));
|
||||
}
|
||||
}
|
||||
for (Ncv32f _i=20.0; _i<maxWidth; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "HaarAppl%d", i);
|
||||
testLister.add(new TestHaarCascadeApplication(testName, src, path + "haarcascade_frontalface_alt.xml", i, i));
|
||||
}
|
||||
}
|
||||
|
||||
static void devNullOutput(const std::string& msg)
|
||||
{
|
||||
(void)msg;
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Integral_Image(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path.c_str();
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerII("NPPST Integral Image", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv32f> testSrcRandom_32f(2010, -1.0f, 1.0f, 4096, 4096);
|
||||
|
||||
generateIntegralTests<Ncv8u, Ncv32u>(testListerII, testSrcRandom_8u, 4096, 4096);
|
||||
generateIntegralTests<Ncv32f, Ncv32f>(testListerII, testSrcRandom_32f, 4096, 4096);
|
||||
|
||||
return testListerII.invoke();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Squared_Integral_Image(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerSII("NPPST Squared Integral Image", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
|
||||
generateSquaredIntegralTests(testListerSII, testSrcRandom_8u, 4096, 4096);
|
||||
|
||||
return testListerSII.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_RectStdDev(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerRStdDev("NPPST RectStdDev", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
|
||||
generateRectStdDevTests(testListerRStdDev, testSrcRandom_8u, 4096, 4096);
|
||||
|
||||
return testListerRStdDev.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Resize(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerResize("NPPST Resize", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv64u> testSrcRandom_64u(2010, 0, -1, 4096, 4096);
|
||||
|
||||
generateResizeTests(testListerResize, testSrcRandom_32u);
|
||||
generateResizeTests(testListerResize, testSrcRandom_64u);
|
||||
|
||||
return testListerResize.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Vector_Operations(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerNPPSTVectorOperations("NPPST Vector Operations", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
|
||||
generateNPPSTVectorTests(testListerNPPSTVectorOperations, testSrcRandom_32u, 4096*4096);
|
||||
|
||||
return testListerNPPSTVectorOperations.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Transpose(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerTranspose("NPPST Transpose", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv64u> testSrcRandom_64u(2010, 0, -1, 4096, 4096);
|
||||
|
||||
generateTransposeTests(testListerTranspose, testSrcRandom_32u);
|
||||
generateTransposeTests(testListerTranspose, testSrcRandom_64u);
|
||||
|
||||
return testListerTranspose.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Vector_Operations(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerVectorOperations("Vector Operations", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
|
||||
generateVectorTests(testListerVectorOperations, testSrcRandom_32u, 4096*4096);
|
||||
|
||||
return testListerVectorOperations.invoke();
|
||||
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Haar_Cascade_Loader(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerHaarLoader("Haar Cascade Loader", outputLevel);
|
||||
|
||||
generateHaarLoaderTests(testListerHaarLoader);
|
||||
|
||||
return testListerHaarLoader.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Haar_Cascade_Application(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerHaarAppl("Haar Cascade Application", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcFacesVGA_8u(path + "group_1_640x480_VGA.pgm");
|
||||
|
||||
generateHaarApplicationTests(testListerHaarAppl, testSrcFacesVGA_8u, 1280, 720);
|
||||
|
||||
return testListerHaarAppl.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Hypotheses_Filtration(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerHypFiltration("Hypotheses Filtration", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
|
||||
generateHypothesesFiltrationTests(testListerHypFiltration, testSrcRandom_32u, 1024);
|
||||
|
||||
return testListerHypFiltration.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Visualization(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerVisualize("Visualization", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, RAND_MAX, 4096, 4096);
|
||||
|
||||
generateDrawRectsTests(testListerVisualize, testSrcRandom_8u, testSrcRandom_32u, 4096, 4096);
|
||||
generateDrawRectsTests(testListerVisualize, testSrcRandom_32u, testSrcRandom_32u, 4096, 4096);
|
||||
|
||||
return testListerVisualize.invoke();
|
||||
}
|
||||
|
||||
#if defined _MSC_VER && _MSC_VER >= 1200
|
||||
# pragma warning (disable : 4408 4201 4100)
|
||||
#endif
|
||||
|
||||
#if !defined CUDA_DISABLER
|
||||
|
||||
#include <cstdio>
|
||||
|
||||
#include "NCV.hpp"
|
||||
#include "NCVHaarObjectDetection.hpp"
|
||||
|
||||
#include "TestIntegralImage.h"
|
||||
#include "TestIntegralImageSquared.h"
|
||||
#include "TestRectStdDev.h"
|
||||
#include "TestResize.h"
|
||||
#include "TestCompact.h"
|
||||
#include "TestTranspose.h"
|
||||
|
||||
#include "TestDrawRects.h"
|
||||
#include "TestHypothesesGrow.h"
|
||||
#include "TestHypothesesFilter.h"
|
||||
#include "TestHaarCascadeLoader.h"
|
||||
#include "TestHaarCascadeApplication.h"
|
||||
|
||||
#include "NCVAutoTestLister.hpp"
|
||||
#include "NCVTestSourceProvider.hpp"
|
||||
|
||||
#include <main_test_nvidia.h>
|
||||
|
||||
static std::string path;
|
||||
|
||||
namespace {
|
||||
|
||||
template <class T_in, class T_out>
|
||||
void generateIntegralTests(NCVAutoTestLister &testLister,
|
||||
NCVTestSourceProvider<T_in> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
for (Ncv32f _i=1.0; _i<maxWidth; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "LinIntImgW%dH%d", i, 2);
|
||||
testLister.add(new TestIntegralImage<T_in, T_out>(testName, src, i, 2));
|
||||
}
|
||||
for (Ncv32f _i=1.0; _i<maxHeight; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "LinIntImgW%dH%d", 2, i);
|
||||
testLister.add(new TestIntegralImage<T_in, T_out>(testName, src, 2, i));
|
||||
}
|
||||
|
||||
testLister.add(new TestIntegralImage<T_in, T_out>("LinIntImg_VGA", src, 640, 480));
|
||||
}
|
||||
|
||||
void generateSquaredIntegralTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
for (Ncv32f _i=1.0; _i<maxWidth; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "SqIntImgW%dH%d", i, 32);
|
||||
testLister.add(new TestIntegralImageSquared(testName, src, i, 32));
|
||||
}
|
||||
for (Ncv32f _i=1.0; _i<maxHeight; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "SqIntImgW%dH%d", 32, i);
|
||||
testLister.add(new TestIntegralImageSquared(testName, src, 32, i));
|
||||
}
|
||||
|
||||
testLister.add(new TestIntegralImageSquared("SqLinIntImg_VGA", src, 640, 480));
|
||||
}
|
||||
|
||||
void generateRectStdDevTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
NcvRect32u rect(1,1,18,18);
|
||||
|
||||
for (Ncv32f _i=32; _i<maxHeight/2 && _i < maxWidth/2; _i*=1.2f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "RectStdDevW%dH%d", i*2, i);
|
||||
testLister.add(new TestRectStdDev(testName, src, i*2, i, rect, 1, true));
|
||||
testLister.add(new TestRectStdDev(testName, src, i*2, i, rect, 1.5, false));
|
||||
testLister.add(new TestRectStdDev(testName, src, i-1, i*2-1, rect, 1, false));
|
||||
testLister.add(new TestRectStdDev(testName, src, i-1, i*2-1, rect, 2.5, true));
|
||||
}
|
||||
|
||||
testLister.add(new TestRectStdDev("RectStdDev_VGA", src, 640, 480, rect, 1, true));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void generateResizeTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<T> &src)
|
||||
{
|
||||
for (Ncv32u i=1; i<480; i+=3)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestResize_VGA_s%d", i);
|
||||
testLister.add(new TestResize<T>(testName, src, 640, 480, i, true));
|
||||
testLister.add(new TestResize<T>(testName, src, 640, 480, i, false));
|
||||
}
|
||||
|
||||
for (Ncv32u i=1; i<1080; i+=5)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestResize_1080_s%d", i);
|
||||
testLister.add(new TestResize<T>(testName, src, 1920, 1080, i, true));
|
||||
testLister.add(new TestResize<T>(testName, src, 1920, 1080, i, false));
|
||||
}
|
||||
}
|
||||
|
||||
void generateNPPSTVectorTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv32u> &src, Ncv32u maxLength)
|
||||
{
|
||||
//compaction
|
||||
for (Ncv32f _i=256.0; _i<maxLength; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0xFFFFFFFF, 30));
|
||||
}
|
||||
for (Ncv32u i=1; i<260; i++)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0xC001C0DE, 70));
|
||||
testLister.add(new TestCompact(testName, src, i, 0xC001C0DE, 0));
|
||||
testLister.add(new TestCompact(testName, src, i, 0xC001C0DE, 100));
|
||||
}
|
||||
for (Ncv32u i=256*256-256; i<256*256+257; i++)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0xFFFFFFFF, 40));
|
||||
}
|
||||
for (Ncv32u i=256*256*256-10; i<256*256*256+10; i++)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "Compaction%d", i);
|
||||
testLister.add(new TestCompact(testName, src, i, 0x00000000, 2));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template <class T>
|
||||
void generateTransposeTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<T> &src)
|
||||
{
|
||||
for (int i=2; i<64; i+=4)
|
||||
{
|
||||
for (int j=2; j<64; j+=4)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestTranspose_%dx%d", i, j);
|
||||
testLister.add(new TestTranspose<T>(testName, src, i, j));
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=1; i<128; i+=1)
|
||||
{
|
||||
for (int j=1; j<2; j+=1)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "TestTranspose_%dx%d", i, j);
|
||||
testLister.add(new TestTranspose<T>(testName, src, i, j));
|
||||
}
|
||||
}
|
||||
|
||||
testLister.add(new TestTranspose<T>("TestTranspose_VGA", src, 640, 480));
|
||||
testLister.add(new TestTranspose<T>("TestTranspose_HD1080", src, 1920, 1080));
|
||||
|
||||
//regression tests
|
||||
testLister.add(new TestTranspose<T>("TestTranspose_reg_0", src, 1072, 375));
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void generateDrawRectsTests(NCVAutoTestLister &testLister,
|
||||
NCVTestSourceProvider<T> &src,
|
||||
NCVTestSourceProvider<Ncv32u> &src32u,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
for (Ncv32f _i=16.0; _i<maxWidth; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
Ncv32u j = maxHeight * i / maxWidth;
|
||||
if (!j) continue;
|
||||
char testName[80];
|
||||
sprintf(testName, "DrawRectsW%dH%d", i, j);
|
||||
|
||||
if (sizeof(T) == sizeof(Ncv32u))
|
||||
{
|
||||
testLister.add(new TestDrawRects<T>(testName, src, src32u, i, j, i*j/1000+1, (T)0xFFFFFFFF));
|
||||
}
|
||||
else if (sizeof(T) == sizeof(Ncv8u))
|
||||
{
|
||||
testLister.add(new TestDrawRects<T>(testName, src, src32u, i, j, i*j/1000+1, (T)0xFF));
|
||||
}
|
||||
else
|
||||
{
|
||||
ncvAssertPrintCheck(false, "Attempted to instantiate non-existing DrawRects test suite");
|
||||
}
|
||||
}
|
||||
|
||||
//test VGA
|
||||
testLister.add(new TestDrawRects<T>("DrawRects_VGA", src, src32u, 640, 480, 640*480/1000, (T)0xFF));
|
||||
}
|
||||
|
||||
void generateVectorTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv32u> &src, Ncv32u maxLength)
|
||||
{
|
||||
//growth
|
||||
for (Ncv32f _i=10.0; _i<maxLength; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "VectorGrow%d", i);
|
||||
testLister.add(new TestHypothesesGrow(testName, src, 20, 20, 2.2f, i, i/2, i, i/4));
|
||||
testLister.add(new TestHypothesesGrow(testName, src, 10, 42, 1.2f, i, i, i, 0));
|
||||
}
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow01b", src, 10, 42, 1.2f, 10, 0, 10, 1));
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow11b", src, 10, 42, 1.2f, 10, 1, 10, 1));
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow10b", src, 10, 42, 1.2f, 10, 1, 10, 0));
|
||||
testLister.add(new TestHypothesesGrow("VectorGrow00b", src, 10, 42, 1.2f, 10, 0, 10, 0));
|
||||
}
|
||||
|
||||
void generateHypothesesFiltrationTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv32u> &src, Ncv32u maxLength)
|
||||
{
|
||||
for (Ncv32f _i=1.0; _i<maxLength; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "HypFilter%d", i);
|
||||
testLister.add(new TestHypothesesFilter(testName, src, i, 3, 0.2f));
|
||||
testLister.add(new TestHypothesesFilter(testName, src, i, 0, 0.2f));
|
||||
testLister.add(new TestHypothesesFilter(testName, src, i, 1, 0.1f));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void generateHaarLoaderTests(NCVAutoTestLister &testLister)
|
||||
{
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_eye.xml", path + "haarcascade_eye.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_frontalface_alt.xml", path + "haarcascade_frontalface_alt.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_frontalface_alt2.xml", path + "haarcascade_frontalface_alt2.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_frontalface_alt_tree.xml", path + "haarcascade_frontalface_alt_tree.xml"));
|
||||
testLister.add(new TestHaarCascadeLoader("haarcascade_eye_tree_eyeglasses.xml", path + "haarcascade_eye_tree_eyeglasses.xml"));
|
||||
}
|
||||
|
||||
void generateHaarApplicationTests(NCVAutoTestLister &testLister, NCVTestSourceProvider<Ncv8u> &src,
|
||||
Ncv32u maxWidth, Ncv32u maxHeight)
|
||||
{
|
||||
(void)maxHeight;
|
||||
for (Ncv32u i=20; i<512; i+=11)
|
||||
{
|
||||
for (Ncv32u j=20; j<128; j+=5)
|
||||
{
|
||||
char testName[80];
|
||||
sprintf(testName, "HaarAppl%d_%d", i, j);
|
||||
testLister.add(new TestHaarCascadeApplication(testName, src, path + "haarcascade_frontalface_alt.xml", j, i));
|
||||
}
|
||||
}
|
||||
for (Ncv32f _i=20.0; _i<maxWidth; _i*=1.1f)
|
||||
{
|
||||
Ncv32u i = (Ncv32u)_i;
|
||||
char testName[80];
|
||||
sprintf(testName, "HaarAppl%d", i);
|
||||
testLister.add(new TestHaarCascadeApplication(testName, src, path + "haarcascade_frontalface_alt.xml", i, i));
|
||||
}
|
||||
}
|
||||
|
||||
static void devNullOutput(const std::string& msg)
|
||||
{
|
||||
(void)msg;
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Integral_Image(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path.c_str();
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerII("NPPST Integral Image", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv32f> testSrcRandom_32f(2010, -1.0f, 1.0f, 4096, 4096);
|
||||
|
||||
generateIntegralTests<Ncv8u, Ncv32u>(testListerII, testSrcRandom_8u, 4096, 4096);
|
||||
generateIntegralTests<Ncv32f, Ncv32f>(testListerII, testSrcRandom_32f, 4096, 4096);
|
||||
|
||||
return testListerII.invoke();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Squared_Integral_Image(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerSII("NPPST Squared Integral Image", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
|
||||
generateSquaredIntegralTests(testListerSII, testSrcRandom_8u, 4096, 4096);
|
||||
|
||||
return testListerSII.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_RectStdDev(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerRStdDev("NPPST RectStdDev", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
|
||||
generateRectStdDevTests(testListerRStdDev, testSrcRandom_8u, 4096, 4096);
|
||||
|
||||
return testListerRStdDev.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Resize(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerResize("NPPST Resize", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv64u> testSrcRandom_64u(2010, 0, -1, 4096, 4096);
|
||||
|
||||
generateResizeTests(testListerResize, testSrcRandom_32u);
|
||||
generateResizeTests(testListerResize, testSrcRandom_64u);
|
||||
|
||||
return testListerResize.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Vector_Operations(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerNPPSTVectorOperations("NPPST Vector Operations", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
|
||||
generateNPPSTVectorTests(testListerNPPSTVectorOperations, testSrcRandom_32u, 4096*4096);
|
||||
|
||||
return testListerNPPSTVectorOperations.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NPPST_Transpose(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerTranspose("NPPST Transpose", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv64u> testSrcRandom_64u(2010, 0, -1, 4096, 4096);
|
||||
|
||||
generateTransposeTests(testListerTranspose, testSrcRandom_32u);
|
||||
generateTransposeTests(testListerTranspose, testSrcRandom_64u);
|
||||
|
||||
return testListerTranspose.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Vector_Operations(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerVectorOperations("Vector Operations", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
|
||||
generateVectorTests(testListerVectorOperations, testSrcRandom_32u, 4096*4096);
|
||||
|
||||
return testListerVectorOperations.invoke();
|
||||
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Haar_Cascade_Loader(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerHaarLoader("Haar Cascade Loader", outputLevel);
|
||||
|
||||
generateHaarLoaderTests(testListerHaarLoader);
|
||||
|
||||
return testListerHaarLoader.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Haar_Cascade_Application(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerHaarAppl("Haar Cascade Application", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcFacesVGA_8u(path + "group_1_640x480_VGA.pgm");
|
||||
|
||||
generateHaarApplicationTests(testListerHaarAppl, testSrcFacesVGA_8u, 1280, 720);
|
||||
|
||||
return testListerHaarAppl.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Hypotheses_Filtration(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerHypFiltration("Hypotheses Filtration", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, 0xFFFFFFFF, 4096, 4096);
|
||||
|
||||
generateHypothesesFiltrationTests(testListerHypFiltration, testSrcRandom_32u, 1024);
|
||||
|
||||
return testListerHypFiltration.invoke();
|
||||
}
|
||||
|
||||
bool nvidia_NCV_Visualization(const std::string& test_data_path, OutputLevel outputLevel)
|
||||
{
|
||||
path = test_data_path;
|
||||
ncvSetDebugOutputHandler(devNullOutput);
|
||||
|
||||
NCVAutoTestLister testListerVisualize("Visualization", outputLevel);
|
||||
|
||||
NCVTestSourceProvider<Ncv8u> testSrcRandom_8u(2010, 0, 255, 4096, 4096);
|
||||
NCVTestSourceProvider<Ncv32u> testSrcRandom_32u(2010, 0, RAND_MAX, 4096, 4096);
|
||||
|
||||
generateDrawRectsTests(testListerVisualize, testSrcRandom_8u, testSrcRandom_32u, 4096, 4096);
|
||||
generateDrawRectsTests(testListerVisualize, testSrcRandom_32u, testSrcRandom_32u, 4096, 4096);
|
||||
|
||||
return testListerVisualize.invoke();
|
||||
}
|
||||
|
||||
#endif /* CUDA_DISABLER */
|
||||
+349
-349
@@ -1,349 +1,349 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// StereoBM
|
||||
|
||||
struct StereoBM : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(StereoBM, Regression)
|
||||
{
|
||||
cv::Mat left_image = readImage("stereobm/aloe-L.png", cv::IMREAD_GRAYSCALE);
|
||||
cv::Mat right_image = readImage("stereobm/aloe-R.png", cv::IMREAD_GRAYSCALE);
|
||||
cv::Mat disp_gold = readImage("stereobm/aloe-disp.png", cv::IMREAD_GRAYSCALE);
|
||||
|
||||
ASSERT_FALSE(left_image.empty());
|
||||
ASSERT_FALSE(right_image.empty());
|
||||
ASSERT_FALSE(disp_gold.empty());
|
||||
|
||||
cv::gpu::StereoBM_GPU bm(0, 128, 19);
|
||||
cv::gpu::GpuMat disp;
|
||||
|
||||
bm(loadMat(left_image), loadMat(right_image), disp);
|
||||
|
||||
EXPECT_MAT_NEAR(disp_gold, disp, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, StereoBM, ALL_DEVICES);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// StereoBeliefPropagation
|
||||
|
||||
struct StereoBeliefPropagation : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(StereoBeliefPropagation, Regression)
|
||||
{
|
||||
cv::Mat left_image = readImage("stereobp/aloe-L.png");
|
||||
cv::Mat right_image = readImage("stereobp/aloe-R.png");
|
||||
cv::Mat disp_gold = readImage("stereobp/aloe-disp.png", cv::IMREAD_GRAYSCALE);
|
||||
|
||||
ASSERT_FALSE(left_image.empty());
|
||||
ASSERT_FALSE(right_image.empty());
|
||||
ASSERT_FALSE(disp_gold.empty());
|
||||
|
||||
cv::gpu::StereoBeliefPropagation bp(64, 8, 2, 25, 0.1f, 15, 1, CV_16S);
|
||||
cv::gpu::GpuMat disp;
|
||||
|
||||
bp(loadMat(left_image), loadMat(right_image), disp);
|
||||
|
||||
cv::Mat h_disp(disp);
|
||||
h_disp.convertTo(h_disp, disp_gold.depth());
|
||||
|
||||
EXPECT_MAT_NEAR(disp_gold, h_disp, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, StereoBeliefPropagation, ALL_DEVICES);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// StereoConstantSpaceBP
|
||||
|
||||
struct StereoConstantSpaceBP : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(StereoConstantSpaceBP, Regression)
|
||||
{
|
||||
cv::Mat left_image = readImage("csstereobp/aloe-L.png");
|
||||
cv::Mat right_image = readImage("csstereobp/aloe-R.png");
|
||||
|
||||
cv::Mat disp_gold;
|
||||
|
||||
if (supportFeature(devInfo, cv::gpu::FEATURE_SET_COMPUTE_20))
|
||||
disp_gold = readImage("csstereobp/aloe-disp.png", cv::IMREAD_GRAYSCALE);
|
||||
else
|
||||
disp_gold = readImage("csstereobp/aloe-disp_CC1X.png", cv::IMREAD_GRAYSCALE);
|
||||
|
||||
ASSERT_FALSE(left_image.empty());
|
||||
ASSERT_FALSE(right_image.empty());
|
||||
ASSERT_FALSE(disp_gold.empty());
|
||||
|
||||
cv::gpu::StereoConstantSpaceBP csbp(128, 16, 4, 4);
|
||||
cv::gpu::GpuMat disp;
|
||||
|
||||
csbp(loadMat(left_image), loadMat(right_image), disp);
|
||||
|
||||
cv::Mat h_disp(disp);
|
||||
h_disp.convertTo(h_disp, disp_gold.depth());
|
||||
|
||||
EXPECT_MAT_NEAR(disp_gold, h_disp, 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, StereoConstantSpaceBP, ALL_DEVICES);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// transformPoints
|
||||
|
||||
struct TransformPoints : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(TransformPoints, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(cv::Size(1000, 1), CV_32FC3, 0, 10);
|
||||
cv::Mat rvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::Mat tvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::transformPoints(loadMat(src), rvec, tvec, dst);
|
||||
|
||||
ASSERT_EQ(src.size(), dst.size());
|
||||
ASSERT_EQ(src.type(), dst.type());
|
||||
|
||||
cv::Mat h_dst(dst);
|
||||
|
||||
cv::Mat rot;
|
||||
cv::Rodrigues(rvec, rot);
|
||||
|
||||
for (int i = 0; i < h_dst.cols; ++i)
|
||||
{
|
||||
cv::Point3f res = h_dst.at<cv::Point3f>(0, i);
|
||||
|
||||
cv::Point3f p = src.at<cv::Point3f>(0, i);
|
||||
cv::Point3f res_gold(
|
||||
rot.at<float>(0, 0) * p.x + rot.at<float>(0, 1) * p.y + rot.at<float>(0, 2) * p.z + tvec.at<float>(0, 0),
|
||||
rot.at<float>(1, 0) * p.x + rot.at<float>(1, 1) * p.y + rot.at<float>(1, 2) * p.z + tvec.at<float>(0, 1),
|
||||
rot.at<float>(2, 0) * p.x + rot.at<float>(2, 1) * p.y + rot.at<float>(2, 2) * p.z + tvec.at<float>(0, 2));
|
||||
|
||||
ASSERT_POINT3_NEAR(res_gold, res, 1e-5);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, TransformPoints, ALL_DEVICES);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ProjectPoints
|
||||
|
||||
struct ProjectPoints : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ProjectPoints, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(cv::Size(1000, 1), CV_32FC3, 0, 10);
|
||||
cv::Mat rvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::Mat tvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::Mat camera_mat = randomMat(cv::Size(3, 3), CV_32F, 0.5, 1);
|
||||
camera_mat.at<float>(0, 1) = 0.f;
|
||||
camera_mat.at<float>(1, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 1) = 0.f;
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::projectPoints(loadMat(src), rvec, tvec, camera_mat, cv::Mat(), dst);
|
||||
|
||||
ASSERT_EQ(1, dst.rows);
|
||||
ASSERT_EQ(MatType(CV_32FC2), MatType(dst.type()));
|
||||
|
||||
std::vector<cv::Point2f> dst_gold;
|
||||
cv::projectPoints(src, rvec, tvec, camera_mat, cv::Mat(1, 8, CV_32F, cv::Scalar::all(0)), dst_gold);
|
||||
|
||||
ASSERT_EQ(dst_gold.size(), static_cast<size_t>(dst.cols));
|
||||
|
||||
cv::Mat h_dst(dst);
|
||||
|
||||
for (size_t i = 0; i < dst_gold.size(); ++i)
|
||||
{
|
||||
cv::Point2f res = h_dst.at<cv::Point2f>(0, (int)i);
|
||||
cv::Point2f res_gold = dst_gold[i];
|
||||
|
||||
ASSERT_LE(cv::norm(res_gold - res) / cv::norm(res_gold), 1e-3f);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, ProjectPoints, ALL_DEVICES);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// SolvePnPRansac
|
||||
|
||||
struct SolvePnPRansac : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(SolvePnPRansac, Accuracy)
|
||||
{
|
||||
cv::Mat object = randomMat(cv::Size(5000, 1), CV_32FC3, 0, 100);
|
||||
cv::Mat camera_mat = randomMat(cv::Size(3, 3), CV_32F, 0.5, 1);
|
||||
camera_mat.at<float>(0, 1) = 0.f;
|
||||
camera_mat.at<float>(1, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 1) = 0.f;
|
||||
|
||||
std::vector<cv::Point2f> image_vec;
|
||||
cv::Mat rvec_gold;
|
||||
cv::Mat tvec_gold;
|
||||
rvec_gold = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
tvec_gold = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::projectPoints(object, rvec_gold, tvec_gold, camera_mat, cv::Mat(1, 8, CV_32F, cv::Scalar::all(0)), image_vec);
|
||||
|
||||
cv::Mat rvec, tvec;
|
||||
std::vector<int> inliers;
|
||||
cv::gpu::solvePnPRansac(object, cv::Mat(1, (int)image_vec.size(), CV_32FC2, &image_vec[0]),
|
||||
camera_mat, cv::Mat(1, 8, CV_32F, cv::Scalar::all(0)),
|
||||
rvec, tvec, false, 200, 2.f, 100, &inliers);
|
||||
|
||||
ASSERT_LE(cv::norm(rvec - rvec_gold), 1e-3);
|
||||
ASSERT_LE(cv::norm(tvec - tvec_gold), 1e-3);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, SolvePnPRansac, ALL_DEVICES);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// reprojectImageTo3D
|
||||
|
||||
PARAM_TEST_CASE(ReprojectImageTo3D, cv::gpu::DeviceInfo, cv::Size, MatDepth, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int depth;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
depth = GET_PARAM(2);
|
||||
useRoi = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ReprojectImageTo3D, Accuracy)
|
||||
{
|
||||
cv::Mat disp = randomMat(size, depth, 5.0, 30.0);
|
||||
cv::Mat Q = randomMat(cv::Size(4, 4), CV_32FC1, 0.1, 1.0);
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::reprojectImageTo3D(loadMat(disp, useRoi), dst, Q, 3);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::reprojectImageTo3D(disp, dst_gold, Q, false);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 1e-5);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, ReprojectImageTo3D, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatDepth(CV_8U), MatDepth(CV_16S)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// StereoBM
|
||||
|
||||
struct StereoBM : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(StereoBM, Regression)
|
||||
{
|
||||
cv::Mat left_image = readImage("stereobm/aloe-L.png", cv::IMREAD_GRAYSCALE);
|
||||
cv::Mat right_image = readImage("stereobm/aloe-R.png", cv::IMREAD_GRAYSCALE);
|
||||
cv::Mat disp_gold = readImage("stereobm/aloe-disp.png", cv::IMREAD_GRAYSCALE);
|
||||
|
||||
ASSERT_FALSE(left_image.empty());
|
||||
ASSERT_FALSE(right_image.empty());
|
||||
ASSERT_FALSE(disp_gold.empty());
|
||||
|
||||
cv::gpu::StereoBM_GPU bm(0, 128, 19);
|
||||
cv::gpu::GpuMat disp;
|
||||
|
||||
bm(loadMat(left_image), loadMat(right_image), disp);
|
||||
|
||||
EXPECT_MAT_NEAR(disp_gold, disp, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, StereoBM, ALL_DEVICES);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// StereoBeliefPropagation
|
||||
|
||||
struct StereoBeliefPropagation : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(StereoBeliefPropagation, Regression)
|
||||
{
|
||||
cv::Mat left_image = readImage("stereobp/aloe-L.png");
|
||||
cv::Mat right_image = readImage("stereobp/aloe-R.png");
|
||||
cv::Mat disp_gold = readImage("stereobp/aloe-disp.png", cv::IMREAD_GRAYSCALE);
|
||||
|
||||
ASSERT_FALSE(left_image.empty());
|
||||
ASSERT_FALSE(right_image.empty());
|
||||
ASSERT_FALSE(disp_gold.empty());
|
||||
|
||||
cv::gpu::StereoBeliefPropagation bp(64, 8, 2, 25, 0.1f, 15, 1, CV_16S);
|
||||
cv::gpu::GpuMat disp;
|
||||
|
||||
bp(loadMat(left_image), loadMat(right_image), disp);
|
||||
|
||||
cv::Mat h_disp(disp);
|
||||
h_disp.convertTo(h_disp, disp_gold.depth());
|
||||
|
||||
EXPECT_MAT_NEAR(disp_gold, h_disp, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, StereoBeliefPropagation, ALL_DEVICES);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// StereoConstantSpaceBP
|
||||
|
||||
struct StereoConstantSpaceBP : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(StereoConstantSpaceBP, Regression)
|
||||
{
|
||||
cv::Mat left_image = readImage("csstereobp/aloe-L.png");
|
||||
cv::Mat right_image = readImage("csstereobp/aloe-R.png");
|
||||
|
||||
cv::Mat disp_gold;
|
||||
|
||||
if (supportFeature(devInfo, cv::gpu::FEATURE_SET_COMPUTE_20))
|
||||
disp_gold = readImage("csstereobp/aloe-disp.png", cv::IMREAD_GRAYSCALE);
|
||||
else
|
||||
disp_gold = readImage("csstereobp/aloe-disp_CC1X.png", cv::IMREAD_GRAYSCALE);
|
||||
|
||||
ASSERT_FALSE(left_image.empty());
|
||||
ASSERT_FALSE(right_image.empty());
|
||||
ASSERT_FALSE(disp_gold.empty());
|
||||
|
||||
cv::gpu::StereoConstantSpaceBP csbp(128, 16, 4, 4);
|
||||
cv::gpu::GpuMat disp;
|
||||
|
||||
csbp(loadMat(left_image), loadMat(right_image), disp);
|
||||
|
||||
cv::Mat h_disp(disp);
|
||||
h_disp.convertTo(h_disp, disp_gold.depth());
|
||||
|
||||
EXPECT_MAT_NEAR(disp_gold, h_disp, 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, StereoConstantSpaceBP, ALL_DEVICES);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// transformPoints
|
||||
|
||||
struct TransformPoints : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(TransformPoints, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(cv::Size(1000, 1), CV_32FC3, 0, 10);
|
||||
cv::Mat rvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::Mat tvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::transformPoints(loadMat(src), rvec, tvec, dst);
|
||||
|
||||
ASSERT_EQ(src.size(), dst.size());
|
||||
ASSERT_EQ(src.type(), dst.type());
|
||||
|
||||
cv::Mat h_dst(dst);
|
||||
|
||||
cv::Mat rot;
|
||||
cv::Rodrigues(rvec, rot);
|
||||
|
||||
for (int i = 0; i < h_dst.cols; ++i)
|
||||
{
|
||||
cv::Point3f res = h_dst.at<cv::Point3f>(0, i);
|
||||
|
||||
cv::Point3f p = src.at<cv::Point3f>(0, i);
|
||||
cv::Point3f res_gold(
|
||||
rot.at<float>(0, 0) * p.x + rot.at<float>(0, 1) * p.y + rot.at<float>(0, 2) * p.z + tvec.at<float>(0, 0),
|
||||
rot.at<float>(1, 0) * p.x + rot.at<float>(1, 1) * p.y + rot.at<float>(1, 2) * p.z + tvec.at<float>(0, 1),
|
||||
rot.at<float>(2, 0) * p.x + rot.at<float>(2, 1) * p.y + rot.at<float>(2, 2) * p.z + tvec.at<float>(0, 2));
|
||||
|
||||
ASSERT_POINT3_NEAR(res_gold, res, 1e-5);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, TransformPoints, ALL_DEVICES);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// ProjectPoints
|
||||
|
||||
struct ProjectPoints : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ProjectPoints, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(cv::Size(1000, 1), CV_32FC3, 0, 10);
|
||||
cv::Mat rvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::Mat tvec = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::Mat camera_mat = randomMat(cv::Size(3, 3), CV_32F, 0.5, 1);
|
||||
camera_mat.at<float>(0, 1) = 0.f;
|
||||
camera_mat.at<float>(1, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 1) = 0.f;
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::projectPoints(loadMat(src), rvec, tvec, camera_mat, cv::Mat(), dst);
|
||||
|
||||
ASSERT_EQ(1, dst.rows);
|
||||
ASSERT_EQ(MatType(CV_32FC2), MatType(dst.type()));
|
||||
|
||||
std::vector<cv::Point2f> dst_gold;
|
||||
cv::projectPoints(src, rvec, tvec, camera_mat, cv::Mat(1, 8, CV_32F, cv::Scalar::all(0)), dst_gold);
|
||||
|
||||
ASSERT_EQ(dst_gold.size(), static_cast<size_t>(dst.cols));
|
||||
|
||||
cv::Mat h_dst(dst);
|
||||
|
||||
for (size_t i = 0; i < dst_gold.size(); ++i)
|
||||
{
|
||||
cv::Point2f res = h_dst.at<cv::Point2f>(0, (int)i);
|
||||
cv::Point2f res_gold = dst_gold[i];
|
||||
|
||||
ASSERT_LE(cv::norm(res_gold - res) / cv::norm(res_gold), 1e-3f);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, ProjectPoints, ALL_DEVICES);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
// SolvePnPRansac
|
||||
|
||||
struct SolvePnPRansac : testing::TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(SolvePnPRansac, Accuracy)
|
||||
{
|
||||
cv::Mat object = randomMat(cv::Size(5000, 1), CV_32FC3, 0, 100);
|
||||
cv::Mat camera_mat = randomMat(cv::Size(3, 3), CV_32F, 0.5, 1);
|
||||
camera_mat.at<float>(0, 1) = 0.f;
|
||||
camera_mat.at<float>(1, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 0) = 0.f;
|
||||
camera_mat.at<float>(2, 1) = 0.f;
|
||||
|
||||
std::vector<cv::Point2f> image_vec;
|
||||
cv::Mat rvec_gold;
|
||||
cv::Mat tvec_gold;
|
||||
rvec_gold = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
tvec_gold = randomMat(cv::Size(3, 1), CV_32F, 0, 1);
|
||||
cv::projectPoints(object, rvec_gold, tvec_gold, camera_mat, cv::Mat(1, 8, CV_32F, cv::Scalar::all(0)), image_vec);
|
||||
|
||||
cv::Mat rvec, tvec;
|
||||
std::vector<int> inliers;
|
||||
cv::gpu::solvePnPRansac(object, cv::Mat(1, (int)image_vec.size(), CV_32FC2, &image_vec[0]),
|
||||
camera_mat, cv::Mat(1, 8, CV_32F, cv::Scalar::all(0)),
|
||||
rvec, tvec, false, 200, 2.f, 100, &inliers);
|
||||
|
||||
ASSERT_LE(cv::norm(rvec - rvec_gold), 1e-3);
|
||||
ASSERT_LE(cv::norm(tvec - tvec_gold), 1e-3);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, SolvePnPRansac, ALL_DEVICES);
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// reprojectImageTo3D
|
||||
|
||||
PARAM_TEST_CASE(ReprojectImageTo3D, cv::gpu::DeviceInfo, cv::Size, MatDepth, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int depth;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
depth = GET_PARAM(2);
|
||||
useRoi = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ReprojectImageTo3D, Accuracy)
|
||||
{
|
||||
cv::Mat disp = randomMat(size, depth, 5.0, 30.0);
|
||||
cv::Mat Q = randomMat(cv::Size(4, 4), CV_32FC1, 0.1, 1.0);
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::reprojectImageTo3D(loadMat(disp, useRoi), dst, Q, 3);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::reprojectImageTo3D(disp, dst_gold, Q, false);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 1e-5);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_Calib3D, ReprojectImageTo3D, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatDepth(CV_8U), MatDepth(CV_16S)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
@@ -1,104 +1,104 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
IMPLEMENT_PARAM_CLASS(Border, int)
|
||||
|
||||
PARAM_TEST_CASE(CopyMakeBorder, cv::gpu::DeviceInfo, cv::Size, MatType, Border, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
int border;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
border = GET_PARAM(3);
|
||||
borderType = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(CopyMakeBorder, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Scalar val = randomScalar(0, 255);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(cv::Size(size.width + 2 * border, size.height + 2 * border), type, useRoi);
|
||||
cv::gpu::copyMakeBorder(loadMat(src, useRoi), dst, border, border, border, border, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::copyMakeBorder(src, dst_gold, border, border, border, border, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CopyMakeBorder, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1),
|
||||
MatType(CV_8UC3),
|
||||
MatType(CV_8UC4),
|
||||
MatType(CV_16UC1),
|
||||
MatType(CV_16UC3),
|
||||
MatType(CV_16UC4),
|
||||
MatType(CV_32FC1),
|
||||
MatType(CV_32FC3),
|
||||
MatType(CV_32FC4)),
|
||||
testing::Values(Border(1), Border(10), Border(50)),
|
||||
ALL_BORDER_TYPES,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
IMPLEMENT_PARAM_CLASS(Border, int)
|
||||
|
||||
PARAM_TEST_CASE(CopyMakeBorder, cv::gpu::DeviceInfo, cv::Size, MatType, Border, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
int border;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
border = GET_PARAM(3);
|
||||
borderType = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(CopyMakeBorder, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Scalar val = randomScalar(0, 255);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(cv::Size(size.width + 2 * border, size.height + 2 * border), type, useRoi);
|
||||
cv::gpu::copyMakeBorder(loadMat(src, useRoi), dst, border, border, border, border, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::copyMakeBorder(src, dst_gold, border, border, border, border, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CopyMakeBorder, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1),
|
||||
MatType(CV_8UC3),
|
||||
MatType(CV_8UC4),
|
||||
MatType(CV_16UC1),
|
||||
MatType(CV_16UC3),
|
||||
MatType(CV_16UC4),
|
||||
MatType(CV_32FC1),
|
||||
MatType(CV_32FC3),
|
||||
MatType(CV_32FC4)),
|
||||
testing::Values(Border(1), Border(10), Border(50)),
|
||||
ALL_BORDER_TYPES,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
+3291
-3291
File diff suppressed because it is too large
Load Diff
@@ -72,7 +72,7 @@ PARAM_TEST_CASE(BilateralFilter, cv::gpu::DeviceInfo, cv::Size, MatType)
|
||||
TEST_P(BilateralFilter, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
|
||||
|
||||
src.convertTo(src, type);
|
||||
cv::gpu::GpuMat dst;
|
||||
|
||||
@@ -111,7 +111,7 @@ TEST_P(BruteForceNonLocalMeans, Regression)
|
||||
|
||||
cv::Mat bgr = readImage("denoising/lena_noised_gaussian_sigma=20_multi_0.png", cv::IMREAD_COLOR);
|
||||
ASSERT_FALSE(bgr.empty());
|
||||
|
||||
|
||||
cv::Mat gray;
|
||||
cv::cvtColor(bgr, gray, CV_BGR2GRAY);
|
||||
|
||||
@@ -154,7 +154,7 @@ TEST_P(FastNonLocalMeans, Regression)
|
||||
{
|
||||
using cv::gpu::GpuMat;
|
||||
|
||||
cv::Mat bgr = readImage("denoising/lena_noised_gaussian_sigma=20_multi_0.png", cv::IMREAD_COLOR);
|
||||
cv::Mat bgr = readImage("denoising/lena_noised_gaussian_sigma=20_multi_0.png", cv::IMREAD_COLOR);
|
||||
ASSERT_FALSE(bgr.empty());
|
||||
|
||||
cv::Mat gray;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+558
-558
File diff suppressed because it is too large
Load Diff
+329
-329
@@ -1,329 +1,329 @@
|
||||
/*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 GpuMaterials 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 bpied warranties, including, but not limited to, the bpied
|
||||
// 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"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// SetTo
|
||||
|
||||
PARAM_TEST_CASE(SetTo, cv::gpu::DeviceInfo, cv::Size, MatType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
useRoi = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(SetTo, Zero)
|
||||
{
|
||||
cv::Scalar zero = cv::Scalar::all(0);
|
||||
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(zero);
|
||||
|
||||
EXPECT_MAT_NEAR(cv::Mat::zeros(size, type), mat, 0.0);
|
||||
}
|
||||
|
||||
TEST_P(SetTo, SameVal)
|
||||
{
|
||||
cv::Scalar val = cv::Scalar::all(randomDouble(0.0, 255.0));
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
|
||||
EXPECT_MAT_NEAR(cv::Mat(size, type, val), mat, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(SetTo, DifferentVal)
|
||||
{
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
|
||||
EXPECT_MAT_NEAR(cv::Mat(size, type, val), mat, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(SetTo, Masked)
|
||||
{
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
cv::Mat mat_gold = randomMat(size, type);
|
||||
cv::Mat mask = randomMat(size, CV_8UC1, 0.0, 2.0);
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val, loadMat(mask));
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat mat = loadMat(mat_gold, useRoi);
|
||||
mat.setTo(val, loadMat(mask, useRoi));
|
||||
|
||||
mat_gold.setTo(val, mask);
|
||||
|
||||
EXPECT_MAT_NEAR(mat_gold, mat, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_GpuMat, SetTo, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
ALL_TYPES,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// CopyTo
|
||||
|
||||
PARAM_TEST_CASE(CopyTo, cv::gpu::DeviceInfo, cv::Size, MatType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
useRoi = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(CopyTo, WithOutMask)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = createMat(size, type, useRoi);
|
||||
d_src.copyTo(dst);
|
||||
|
||||
EXPECT_MAT_NEAR(src, dst, 0.0);
|
||||
}
|
||||
|
||||
TEST_P(CopyTo, Masked)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Mat mask = randomMat(size, CV_8UC1, 0.0, 2.0);
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src);
|
||||
cv::gpu::GpuMat dst;
|
||||
d_src.copyTo(dst, loadMat(mask, useRoi));
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = loadMat(cv::Mat::zeros(size, type), useRoi);
|
||||
d_src.copyTo(dst, loadMat(mask, useRoi));
|
||||
|
||||
cv::Mat dst_gold = cv::Mat::zeros(size, type);
|
||||
src.copyTo(dst_gold, mask);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_GpuMat, CopyTo, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
ALL_TYPES,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ConvertTo
|
||||
|
||||
PARAM_TEST_CASE(ConvertTo, cv::gpu::DeviceInfo, cv::Size, MatDepth, MatDepth, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int depth1;
|
||||
int depth2;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
depth1 = GET_PARAM(2);
|
||||
depth2 = GET_PARAM(3);
|
||||
useRoi = GET_PARAM(4);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ConvertTo, WithOutScaling)
|
||||
{
|
||||
cv::Mat src = randomMat(size, depth1);
|
||||
|
||||
if ((depth1 == CV_64F || depth2 == CV_64F) && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src);
|
||||
cv::gpu::GpuMat dst;
|
||||
d_src.convertTo(dst, depth2);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = createMat(size, depth2, useRoi);
|
||||
d_src.convertTo(dst, depth2);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
src.convertTo(dst_gold, depth2);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(ConvertTo, WithScaling)
|
||||
{
|
||||
cv::Mat src = randomMat(size, depth1);
|
||||
double a = randomDouble(0.0, 1.0);
|
||||
double b = randomDouble(-10.0, 10.0);
|
||||
|
||||
if ((depth1 == CV_64F || depth2 == CV_64F) && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src);
|
||||
cv::gpu::GpuMat dst;
|
||||
d_src.convertTo(dst, depth2, a, b);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = createMat(size, depth2, useRoi);
|
||||
d_src.convertTo(dst, depth2, a, b);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
src.convertTo(dst_gold, depth2, a, b);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, depth2 < CV_32F ? 1.0 : 1e-4);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_GpuMat, ConvertTo, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
ALL_DEPTH,
|
||||
ALL_DEPTH,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 GpuMaterials 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 bpied warranties, including, but not limited to, the bpied
|
||||
// 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"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// SetTo
|
||||
|
||||
PARAM_TEST_CASE(SetTo, cv::gpu::DeviceInfo, cv::Size, MatType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
useRoi = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(SetTo, Zero)
|
||||
{
|
||||
cv::Scalar zero = cv::Scalar::all(0);
|
||||
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(zero);
|
||||
|
||||
EXPECT_MAT_NEAR(cv::Mat::zeros(size, type), mat, 0.0);
|
||||
}
|
||||
|
||||
TEST_P(SetTo, SameVal)
|
||||
{
|
||||
cv::Scalar val = cv::Scalar::all(randomDouble(0.0, 255.0));
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
|
||||
EXPECT_MAT_NEAR(cv::Mat(size, type, val), mat, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(SetTo, DifferentVal)
|
||||
{
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val);
|
||||
|
||||
EXPECT_MAT_NEAR(cv::Mat(size, type, val), mat, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(SetTo, Masked)
|
||||
{
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
cv::Mat mat_gold = randomMat(size, type);
|
||||
cv::Mat mask = randomMat(size, CV_8UC1, 0.0, 2.0);
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat mat = createMat(size, type, useRoi);
|
||||
mat.setTo(val, loadMat(mask));
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat mat = loadMat(mat_gold, useRoi);
|
||||
mat.setTo(val, loadMat(mask, useRoi));
|
||||
|
||||
mat_gold.setTo(val, mask);
|
||||
|
||||
EXPECT_MAT_NEAR(mat_gold, mat, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_GpuMat, SetTo, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
ALL_TYPES,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// CopyTo
|
||||
|
||||
PARAM_TEST_CASE(CopyTo, cv::gpu::DeviceInfo, cv::Size, MatType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
useRoi = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(CopyTo, WithOutMask)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = createMat(size, type, useRoi);
|
||||
d_src.copyTo(dst);
|
||||
|
||||
EXPECT_MAT_NEAR(src, dst, 0.0);
|
||||
}
|
||||
|
||||
TEST_P(CopyTo, Masked)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Mat mask = randomMat(size, CV_8UC1, 0.0, 2.0);
|
||||
|
||||
if (CV_MAT_DEPTH(type) == CV_64F && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src);
|
||||
cv::gpu::GpuMat dst;
|
||||
d_src.copyTo(dst, loadMat(mask, useRoi));
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = loadMat(cv::Mat::zeros(size, type), useRoi);
|
||||
d_src.copyTo(dst, loadMat(mask, useRoi));
|
||||
|
||||
cv::Mat dst_gold = cv::Mat::zeros(size, type);
|
||||
src.copyTo(dst_gold, mask);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_GpuMat, CopyTo, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
ALL_TYPES,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
// ConvertTo
|
||||
|
||||
PARAM_TEST_CASE(ConvertTo, cv::gpu::DeviceInfo, cv::Size, MatDepth, MatDepth, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int depth1;
|
||||
int depth2;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
depth1 = GET_PARAM(2);
|
||||
depth2 = GET_PARAM(3);
|
||||
useRoi = GET_PARAM(4);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ConvertTo, WithOutScaling)
|
||||
{
|
||||
cv::Mat src = randomMat(size, depth1);
|
||||
|
||||
if ((depth1 == CV_64F || depth2 == CV_64F) && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src);
|
||||
cv::gpu::GpuMat dst;
|
||||
d_src.convertTo(dst, depth2);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = createMat(size, depth2, useRoi);
|
||||
d_src.convertTo(dst, depth2);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
src.convertTo(dst_gold, depth2);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
}
|
||||
|
||||
TEST_P(ConvertTo, WithScaling)
|
||||
{
|
||||
cv::Mat src = randomMat(size, depth1);
|
||||
double a = randomDouble(0.0, 1.0);
|
||||
double b = randomDouble(-10.0, 10.0);
|
||||
|
||||
if ((depth1 == CV_64F || depth2 == CV_64F) && !supportFeature(devInfo, cv::gpu::NATIVE_DOUBLE))
|
||||
{
|
||||
try
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src);
|
||||
cv::gpu::GpuMat dst;
|
||||
d_src.convertTo(dst, depth2, a, b);
|
||||
}
|
||||
catch (const cv::Exception& e)
|
||||
{
|
||||
ASSERT_EQ(CV_StsUnsupportedFormat, e.code);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
cv::gpu::GpuMat d_src = loadMat(src, useRoi);
|
||||
cv::gpu::GpuMat dst = createMat(size, depth2, useRoi);
|
||||
d_src.convertTo(dst, depth2, a, b);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
src.convertTo(dst_gold, depth2, a, b);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, depth2 < CV_32F ? 1.0 : 1e-4);
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_GpuMat, ConvertTo, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
ALL_DEPTH,
|
||||
ALL_DEPTH,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
+1131
-1131
File diff suppressed because it is too large
Load Diff
+153
-153
@@ -1,153 +1,153 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#if defined HAVE_CUDA
|
||||
OutputLevel nvidiaTestOutputLevel = OutputLevelNone;
|
||||
#endif
|
||||
|
||||
#if defined HAVE_CUDA && !defined(CUDA_DISABLER)
|
||||
|
||||
using namespace cvtest;
|
||||
using namespace testing;
|
||||
|
||||
struct NVidiaTest : TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
std::string _path;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
_path = TS::ptr()->get_data_path().c_str();
|
||||
_path = _path + "haarcascade/";
|
||||
}
|
||||
};
|
||||
|
||||
struct NPPST : NVidiaTest {};
|
||||
struct NCV : NVidiaTest {};
|
||||
|
||||
//TEST_P(NPPST, Integral)
|
||||
//{
|
||||
// bool res = nvidia_NPPST_Integral_Image(path, nvidiaTestOutputLevel);
|
||||
|
||||
// ASSERT_TRUE(res);
|
||||
//}
|
||||
|
||||
TEST_P(NPPST, SquaredIntegral)
|
||||
{
|
||||
bool res = nvidia_NPPST_Squared_Integral_Image(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, RectStdDev)
|
||||
{
|
||||
bool res = nvidia_NPPST_RectStdDev(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, Resize)
|
||||
{
|
||||
bool res = nvidia_NPPST_Resize(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, VectorOperations)
|
||||
{
|
||||
bool res = nvidia_NPPST_Vector_Operations(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, Transpose)
|
||||
{
|
||||
bool res = nvidia_NPPST_Transpose(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, VectorOperations)
|
||||
{
|
||||
bool res = nvidia_NCV_Vector_Operations(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, HaarCascadeLoader)
|
||||
{
|
||||
bool res = nvidia_NCV_Haar_Cascade_Loader(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, HaarCascadeApplication)
|
||||
{
|
||||
bool res = nvidia_NCV_Haar_Cascade_Application(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, HypothesesFiltration)
|
||||
{
|
||||
bool res = nvidia_NCV_Hypotheses_Filtration(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, Visualization)
|
||||
{
|
||||
// this functionality doesn't used in gpu module
|
||||
bool res = nvidia_NCV_Visualization(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_NVidia, NPPST, ALL_DEVICES);
|
||||
INSTANTIATE_TEST_CASE_P(GPU_NVidia, NCV, ALL_DEVICES);
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#if defined HAVE_CUDA
|
||||
OutputLevel nvidiaTestOutputLevel = OutputLevelNone;
|
||||
#endif
|
||||
|
||||
#if defined HAVE_CUDA && !defined(CUDA_DISABLER)
|
||||
|
||||
using namespace cvtest;
|
||||
using namespace testing;
|
||||
|
||||
struct NVidiaTest : TestWithParam<cv::gpu::DeviceInfo>
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
std::string _path;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
_path = TS::ptr()->get_data_path().c_str();
|
||||
_path = _path + "haarcascade/";
|
||||
}
|
||||
};
|
||||
|
||||
struct NPPST : NVidiaTest {};
|
||||
struct NCV : NVidiaTest {};
|
||||
|
||||
//TEST_P(NPPST, Integral)
|
||||
//{
|
||||
// bool res = nvidia_NPPST_Integral_Image(path, nvidiaTestOutputLevel);
|
||||
|
||||
// ASSERT_TRUE(res);
|
||||
//}
|
||||
|
||||
TEST_P(NPPST, SquaredIntegral)
|
||||
{
|
||||
bool res = nvidia_NPPST_Squared_Integral_Image(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, RectStdDev)
|
||||
{
|
||||
bool res = nvidia_NPPST_RectStdDev(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, Resize)
|
||||
{
|
||||
bool res = nvidia_NPPST_Resize(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, VectorOperations)
|
||||
{
|
||||
bool res = nvidia_NPPST_Vector_Operations(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NPPST, Transpose)
|
||||
{
|
||||
bool res = nvidia_NPPST_Transpose(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, VectorOperations)
|
||||
{
|
||||
bool res = nvidia_NCV_Vector_Operations(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, HaarCascadeLoader)
|
||||
{
|
||||
bool res = nvidia_NCV_Haar_Cascade_Loader(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, HaarCascadeApplication)
|
||||
{
|
||||
bool res = nvidia_NCV_Haar_Cascade_Application(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, HypothesesFiltration)
|
||||
{
|
||||
bool res = nvidia_NCV_Hypotheses_Filtration(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
TEST_P(NCV, Visualization)
|
||||
{
|
||||
// this functionality doesn't used in gpu module
|
||||
bool res = nvidia_NCV_Visualization(_path, nvidiaTestOutputLevel);
|
||||
|
||||
ASSERT_TRUE(res);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_NVidia, NPPST, ALL_DEVICES);
|
||||
INSTANTIATE_TEST_CASE_P(GPU_NVidia, NCV, ALL_DEVICES);
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
+427
-427
@@ -1,427 +1,427 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
//#define DUMP
|
||||
|
||||
struct HOG : testing::TestWithParam<cv::gpu::DeviceInfo>, cv::gpu::HOGDescriptor
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
#ifdef DUMP
|
||||
std::ofstream f;
|
||||
#else
|
||||
std::ifstream f;
|
||||
#endif
|
||||
|
||||
int wins_per_img_x;
|
||||
int wins_per_img_y;
|
||||
int blocks_per_win_x;
|
||||
int blocks_per_win_y;
|
||||
int block_hist_size;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
|
||||
#ifdef DUMP
|
||||
void dump(const cv::Mat& blockHists, const std::vector<cv::Point>& locations)
|
||||
{
|
||||
f.write((char*)&blockHists.rows, sizeof(blockHists.rows));
|
||||
f.write((char*)&blockHists.cols, sizeof(blockHists.cols));
|
||||
|
||||
for (int i = 0; i < blockHists.rows; ++i)
|
||||
{
|
||||
for (int j = 0; j < blockHists.cols; ++j)
|
||||
{
|
||||
float val = blockHists.at<float>(i, j);
|
||||
f.write((char*)&val, sizeof(val));
|
||||
}
|
||||
}
|
||||
|
||||
int nlocations = locations.size();
|
||||
f.write((char*)&nlocations, sizeof(nlocations));
|
||||
|
||||
for (int i = 0; i < locations.size(); ++i)
|
||||
f.write((char*)&locations[i], sizeof(locations[i]));
|
||||
}
|
||||
#else
|
||||
void compare(const cv::Mat& blockHists, const std::vector<cv::Point>& locations)
|
||||
{
|
||||
int rows, cols;
|
||||
f.read((char*)&rows, sizeof(rows));
|
||||
f.read((char*)&cols, sizeof(cols));
|
||||
ASSERT_EQ(rows, blockHists.rows);
|
||||
ASSERT_EQ(cols, blockHists.cols);
|
||||
|
||||
for (int i = 0; i < blockHists.rows; ++i)
|
||||
{
|
||||
for (int j = 0; j < blockHists.cols; ++j)
|
||||
{
|
||||
float val;
|
||||
f.read((char*)&val, sizeof(val));
|
||||
ASSERT_NEAR(val, blockHists.at<float>(i, j), 1e-3);
|
||||
}
|
||||
}
|
||||
|
||||
int nlocations;
|
||||
f.read((char*)&nlocations, sizeof(nlocations));
|
||||
ASSERT_EQ(nlocations, static_cast<int>(locations.size()));
|
||||
|
||||
for (int i = 0; i < nlocations; ++i)
|
||||
{
|
||||
cv::Point location;
|
||||
f.read((char*)&location, sizeof(location));
|
||||
ASSERT_EQ(location, locations[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void testDetect(const cv::Mat& img)
|
||||
{
|
||||
gamma_correction = false;
|
||||
setSVMDetector(cv::gpu::HOGDescriptor::getDefaultPeopleDetector());
|
||||
|
||||
std::vector<cv::Point> locations;
|
||||
|
||||
// Test detect
|
||||
detect(loadMat(img), locations, 0);
|
||||
|
||||
#ifdef DUMP
|
||||
dump(cv::Mat(block_hists), locations);
|
||||
#else
|
||||
compare(cv::Mat(block_hists), locations);
|
||||
#endif
|
||||
|
||||
// Test detect on smaller image
|
||||
cv::Mat img2;
|
||||
cv::resize(img, img2, cv::Size(img.cols / 2, img.rows / 2));
|
||||
detect(loadMat(img2), locations, 0);
|
||||
|
||||
#ifdef DUMP
|
||||
dump(cv::Mat(block_hists), locations);
|
||||
#else
|
||||
compare(cv::Mat(block_hists), locations);
|
||||
#endif
|
||||
|
||||
// Test detect on greater image
|
||||
cv::resize(img, img2, cv::Size(img.cols * 2, img.rows * 2));
|
||||
detect(loadMat(img2), locations, 0);
|
||||
|
||||
#ifdef DUMP
|
||||
dump(cv::Mat(block_hists), locations);
|
||||
#else
|
||||
compare(cv::Mat(block_hists), locations);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Does not compare border value, as interpolation leads to delta
|
||||
void compare_inner_parts(cv::Mat d1, cv::Mat d2)
|
||||
{
|
||||
for (int i = 1; i < blocks_per_win_y - 1; ++i)
|
||||
for (int j = 1; j < blocks_per_win_x - 1; ++j)
|
||||
for (int k = 0; k < block_hist_size; ++k)
|
||||
{
|
||||
float a = d1.at<float>(0, (i * blocks_per_win_x + j) * block_hist_size);
|
||||
float b = d2.at<float>(0, (i * blocks_per_win_x + j) * block_hist_size);
|
||||
ASSERT_FLOAT_EQ(a, b);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// desabled while resize does not fixed
|
||||
TEST_P(HOG, DISABLED_Detect)
|
||||
{
|
||||
cv::Mat img_rgb = readImage("hog/road.png");
|
||||
ASSERT_FALSE(img_rgb.empty());
|
||||
|
||||
#ifdef DUMP
|
||||
f.open((std::string(cvtest::TS::ptr()->get_data_path()) + "hog/expected_output.bin").c_str(), std::ios_base::binary);
|
||||
ASSERT_TRUE(f.is_open());
|
||||
#else
|
||||
f.open((std::string(cvtest::TS::ptr()->get_data_path()) + "hog/expected_output.bin").c_str(), std::ios_base::binary);
|
||||
ASSERT_TRUE(f.is_open());
|
||||
#endif
|
||||
|
||||
// Test on color image
|
||||
cv::Mat img;
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
testDetect(img);
|
||||
|
||||
// Test on gray image
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2GRAY);
|
||||
testDetect(img);
|
||||
|
||||
f.close();
|
||||
}
|
||||
|
||||
TEST_P(HOG, GetDescriptors)
|
||||
{
|
||||
// Load image (e.g. train data, composed from windows)
|
||||
cv::Mat img_rgb = readImage("hog/train_data.png");
|
||||
ASSERT_FALSE(img_rgb.empty());
|
||||
|
||||
// Convert to C4
|
||||
cv::Mat img;
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
|
||||
cv::gpu::GpuMat d_img(img);
|
||||
|
||||
// Convert train images into feature vectors (train table)
|
||||
cv::gpu::GpuMat descriptors, descriptors_by_cols;
|
||||
getDescriptors(d_img, win_size, descriptors, DESCR_FORMAT_ROW_BY_ROW);
|
||||
getDescriptors(d_img, win_size, descriptors_by_cols, DESCR_FORMAT_COL_BY_COL);
|
||||
|
||||
// Check size of the result train table
|
||||
wins_per_img_x = 3;
|
||||
wins_per_img_y = 2;
|
||||
blocks_per_win_x = 7;
|
||||
blocks_per_win_y = 15;
|
||||
block_hist_size = 36;
|
||||
cv::Size descr_size_expected = cv::Size(blocks_per_win_x * blocks_per_win_y * block_hist_size,
|
||||
wins_per_img_x * wins_per_img_y);
|
||||
ASSERT_EQ(descr_size_expected, descriptors.size());
|
||||
|
||||
// Check both formats of output descriptors are handled correctly
|
||||
cv::Mat dr(descriptors);
|
||||
cv::Mat dc(descriptors_by_cols);
|
||||
for (int i = 0; i < wins_per_img_x * wins_per_img_y; ++i)
|
||||
{
|
||||
const float* l = dr.rowRange(i, i + 1).ptr<float>();
|
||||
const float* r = dc.rowRange(i, i + 1).ptr<float>();
|
||||
for (int y = 0; y < blocks_per_win_y; ++y)
|
||||
for (int x = 0; x < blocks_per_win_x; ++x)
|
||||
for (int k = 0; k < block_hist_size; ++k)
|
||||
ASSERT_EQ(l[(y * blocks_per_win_x + x) * block_hist_size + k],
|
||||
r[(x * blocks_per_win_y + y) * block_hist_size + k]);
|
||||
}
|
||||
|
||||
/* Now we want to extract the same feature vectors, but from single images. NOTE: results will
|
||||
be defferent, due to border values interpolation. Using of many small images is slower, however we
|
||||
wont't call getDescriptors and will use computeBlockHistograms instead of. computeBlockHistograms
|
||||
works good, it can be checked in the gpu_hog sample */
|
||||
|
||||
img_rgb = readImage("hog/positive1.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
// Everything is fine with interpolation for left top subimage
|
||||
ASSERT_EQ(0.0, cv::norm((cv::Mat)block_hists, (cv::Mat)descriptors.rowRange(0, 1)));
|
||||
|
||||
img_rgb = readImage("hog/positive2.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(1, 2)));
|
||||
|
||||
img_rgb = readImage("hog/negative1.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(2, 3)));
|
||||
|
||||
img_rgb = readImage("hog/negative2.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(3, 4)));
|
||||
|
||||
img_rgb = readImage("hog/positive3.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(4, 5)));
|
||||
|
||||
img_rgb = readImage("hog/negative3.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(5, 6)));
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, HOG, ALL_DEVICES);
|
||||
|
||||
//============== caltech hog tests =====================//
|
||||
struct CalTech : public ::testing::TestWithParam<std::tr1::tuple<cv::gpu::DeviceInfo, std::string> >
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Mat img;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
|
||||
img = readImage(GET_PARAM(1), cv::IMREAD_GRAYSCALE);
|
||||
ASSERT_FALSE(img.empty());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(CalTech, HOG)
|
||||
{
|
||||
cv::gpu::GpuMat d_img(img);
|
||||
cv::Mat markedImage(img.clone());
|
||||
|
||||
cv::gpu::HOGDescriptor d_hog;
|
||||
d_hog.setSVMDetector(cv::gpu::HOGDescriptor::getDefaultPeopleDetector());
|
||||
d_hog.nlevels = d_hog.nlevels + 32;
|
||||
|
||||
std::vector<cv::Rect> found_locations;
|
||||
d_hog.detectMultiScale(d_img, found_locations);
|
||||
|
||||
#if defined (LOG_CASCADE_STATISTIC)
|
||||
for (int i = 0; i < (int)found_locations.size(); i++)
|
||||
{
|
||||
cv::Rect r = found_locations[i];
|
||||
|
||||
std::cout << r.x << " " << r.y << " " << r.width << " " << r.height << std::endl;
|
||||
cv::rectangle(markedImage, r , CV_RGB(255, 0, 0));
|
||||
}
|
||||
|
||||
cv::imshow("Res", markedImage); cv::waitKey();
|
||||
#endif
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(detect, CalTech, testing::Combine(ALL_DEVICES,
|
||||
::testing::Values<std::string>("caltech/image_00000009_0.png", "caltech/image_00000032_0.png",
|
||||
"caltech/image_00000165_0.png", "caltech/image_00000261_0.png", "caltech/image_00000469_0.png",
|
||||
"caltech/image_00000527_0.png", "caltech/image_00000574_0.png")));
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// LBP classifier
|
||||
|
||||
PARAM_TEST_CASE(LBP_Read_classifier, cv::gpu::DeviceInfo, int)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(LBP_Read_classifier, Accuracy)
|
||||
{
|
||||
cv::gpu::CascadeClassifier_GPU classifier;
|
||||
std::string classifierXmlPath = std::string(cvtest::TS::ptr()->get_data_path()) + "lbpcascade/lbpcascade_frontalface.xml";
|
||||
ASSERT_TRUE(classifier.load(classifierXmlPath));
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, LBP_Read_classifier,
|
||||
testing::Combine(ALL_DEVICES, testing::Values<int>(0)));
|
||||
|
||||
|
||||
PARAM_TEST_CASE(LBP_classify, cv::gpu::DeviceInfo, int)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(LBP_classify, Accuracy)
|
||||
{
|
||||
std::string classifierXmlPath = std::string(cvtest::TS::ptr()->get_data_path()) + "lbpcascade/lbpcascade_frontalface.xml";
|
||||
std::string imagePath = std::string(cvtest::TS::ptr()->get_data_path()) + "lbpcascade/er.png";
|
||||
|
||||
cv::CascadeClassifier cpuClassifier(classifierXmlPath);
|
||||
ASSERT_FALSE(cpuClassifier.empty());
|
||||
|
||||
cv::Mat image = cv::imread(imagePath);
|
||||
image = image.colRange(0, image.cols/2);
|
||||
cv::Mat grey;
|
||||
cvtColor(image, grey, CV_BGR2GRAY);
|
||||
ASSERT_FALSE(image.empty());
|
||||
|
||||
std::vector<cv::Rect> rects;
|
||||
cpuClassifier.detectMultiScale(grey, rects);
|
||||
cv::Mat markedImage = image.clone();
|
||||
|
||||
std::vector<cv::Rect>::iterator it = rects.begin();
|
||||
for (; it != rects.end(); ++it)
|
||||
cv::rectangle(markedImage, *it, CV_RGB(0, 0, 255));
|
||||
|
||||
cv::gpu::CascadeClassifier_GPU gpuClassifier;
|
||||
ASSERT_TRUE(gpuClassifier.load(classifierXmlPath));
|
||||
|
||||
cv::gpu::GpuMat gpu_rects;
|
||||
cv::gpu::GpuMat tested(grey);
|
||||
int count = gpuClassifier.detectMultiScale(tested, gpu_rects);
|
||||
|
||||
#if defined (LOG_CASCADE_STATISTIC)
|
||||
cv::Mat downloaded(gpu_rects);
|
||||
const cv::Rect* faces = downloaded.ptr<cv::Rect>();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
cv::Rect r = faces[i];
|
||||
|
||||
std::cout << r.x << " " << r.y << " " << r.width << " " << r.height << std::endl;
|
||||
cv::rectangle(markedImage, r , CV_RGB(255, 0, 0));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (LOG_CASCADE_STATISTIC)
|
||||
cv::imshow("Res", markedImage); cv::waitKey();
|
||||
#endif
|
||||
(void)count;
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, LBP_classify,
|
||||
testing::Combine(ALL_DEVICES, testing::Values<int>(0)));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace {
|
||||
|
||||
//#define DUMP
|
||||
|
||||
struct HOG : testing::TestWithParam<cv::gpu::DeviceInfo>, cv::gpu::HOGDescriptor
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
#ifdef DUMP
|
||||
std::ofstream f;
|
||||
#else
|
||||
std::ifstream f;
|
||||
#endif
|
||||
|
||||
int wins_per_img_x;
|
||||
int wins_per_img_y;
|
||||
int blocks_per_win_x;
|
||||
int blocks_per_win_y;
|
||||
int block_hist_size;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GetParam();
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
|
||||
#ifdef DUMP
|
||||
void dump(const cv::Mat& blockHists, const std::vector<cv::Point>& locations)
|
||||
{
|
||||
f.write((char*)&blockHists.rows, sizeof(blockHists.rows));
|
||||
f.write((char*)&blockHists.cols, sizeof(blockHists.cols));
|
||||
|
||||
for (int i = 0; i < blockHists.rows; ++i)
|
||||
{
|
||||
for (int j = 0; j < blockHists.cols; ++j)
|
||||
{
|
||||
float val = blockHists.at<float>(i, j);
|
||||
f.write((char*)&val, sizeof(val));
|
||||
}
|
||||
}
|
||||
|
||||
int nlocations = locations.size();
|
||||
f.write((char*)&nlocations, sizeof(nlocations));
|
||||
|
||||
for (int i = 0; i < locations.size(); ++i)
|
||||
f.write((char*)&locations[i], sizeof(locations[i]));
|
||||
}
|
||||
#else
|
||||
void compare(const cv::Mat& blockHists, const std::vector<cv::Point>& locations)
|
||||
{
|
||||
int rows, cols;
|
||||
f.read((char*)&rows, sizeof(rows));
|
||||
f.read((char*)&cols, sizeof(cols));
|
||||
ASSERT_EQ(rows, blockHists.rows);
|
||||
ASSERT_EQ(cols, blockHists.cols);
|
||||
|
||||
for (int i = 0; i < blockHists.rows; ++i)
|
||||
{
|
||||
for (int j = 0; j < blockHists.cols; ++j)
|
||||
{
|
||||
float val;
|
||||
f.read((char*)&val, sizeof(val));
|
||||
ASSERT_NEAR(val, blockHists.at<float>(i, j), 1e-3);
|
||||
}
|
||||
}
|
||||
|
||||
int nlocations;
|
||||
f.read((char*)&nlocations, sizeof(nlocations));
|
||||
ASSERT_EQ(nlocations, static_cast<int>(locations.size()));
|
||||
|
||||
for (int i = 0; i < nlocations; ++i)
|
||||
{
|
||||
cv::Point location;
|
||||
f.read((char*)&location, sizeof(location));
|
||||
ASSERT_EQ(location, locations[i]);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void testDetect(const cv::Mat& img)
|
||||
{
|
||||
gamma_correction = false;
|
||||
setSVMDetector(cv::gpu::HOGDescriptor::getDefaultPeopleDetector());
|
||||
|
||||
std::vector<cv::Point> locations;
|
||||
|
||||
// Test detect
|
||||
detect(loadMat(img), locations, 0);
|
||||
|
||||
#ifdef DUMP
|
||||
dump(cv::Mat(block_hists), locations);
|
||||
#else
|
||||
compare(cv::Mat(block_hists), locations);
|
||||
#endif
|
||||
|
||||
// Test detect on smaller image
|
||||
cv::Mat img2;
|
||||
cv::resize(img, img2, cv::Size(img.cols / 2, img.rows / 2));
|
||||
detect(loadMat(img2), locations, 0);
|
||||
|
||||
#ifdef DUMP
|
||||
dump(cv::Mat(block_hists), locations);
|
||||
#else
|
||||
compare(cv::Mat(block_hists), locations);
|
||||
#endif
|
||||
|
||||
// Test detect on greater image
|
||||
cv::resize(img, img2, cv::Size(img.cols * 2, img.rows * 2));
|
||||
detect(loadMat(img2), locations, 0);
|
||||
|
||||
#ifdef DUMP
|
||||
dump(cv::Mat(block_hists), locations);
|
||||
#else
|
||||
compare(cv::Mat(block_hists), locations);
|
||||
#endif
|
||||
}
|
||||
|
||||
// Does not compare border value, as interpolation leads to delta
|
||||
void compare_inner_parts(cv::Mat d1, cv::Mat d2)
|
||||
{
|
||||
for (int i = 1; i < blocks_per_win_y - 1; ++i)
|
||||
for (int j = 1; j < blocks_per_win_x - 1; ++j)
|
||||
for (int k = 0; k < block_hist_size; ++k)
|
||||
{
|
||||
float a = d1.at<float>(0, (i * blocks_per_win_x + j) * block_hist_size);
|
||||
float b = d2.at<float>(0, (i * blocks_per_win_x + j) * block_hist_size);
|
||||
ASSERT_FLOAT_EQ(a, b);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// desabled while resize does not fixed
|
||||
TEST_P(HOG, DISABLED_Detect)
|
||||
{
|
||||
cv::Mat img_rgb = readImage("hog/road.png");
|
||||
ASSERT_FALSE(img_rgb.empty());
|
||||
|
||||
#ifdef DUMP
|
||||
f.open((std::string(cvtest::TS::ptr()->get_data_path()) + "hog/expected_output.bin").c_str(), std::ios_base::binary);
|
||||
ASSERT_TRUE(f.is_open());
|
||||
#else
|
||||
f.open((std::string(cvtest::TS::ptr()->get_data_path()) + "hog/expected_output.bin").c_str(), std::ios_base::binary);
|
||||
ASSERT_TRUE(f.is_open());
|
||||
#endif
|
||||
|
||||
// Test on color image
|
||||
cv::Mat img;
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
testDetect(img);
|
||||
|
||||
// Test on gray image
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2GRAY);
|
||||
testDetect(img);
|
||||
|
||||
f.close();
|
||||
}
|
||||
|
||||
TEST_P(HOG, GetDescriptors)
|
||||
{
|
||||
// Load image (e.g. train data, composed from windows)
|
||||
cv::Mat img_rgb = readImage("hog/train_data.png");
|
||||
ASSERT_FALSE(img_rgb.empty());
|
||||
|
||||
// Convert to C4
|
||||
cv::Mat img;
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
|
||||
cv::gpu::GpuMat d_img(img);
|
||||
|
||||
// Convert train images into feature vectors (train table)
|
||||
cv::gpu::GpuMat descriptors, descriptors_by_cols;
|
||||
getDescriptors(d_img, win_size, descriptors, DESCR_FORMAT_ROW_BY_ROW);
|
||||
getDescriptors(d_img, win_size, descriptors_by_cols, DESCR_FORMAT_COL_BY_COL);
|
||||
|
||||
// Check size of the result train table
|
||||
wins_per_img_x = 3;
|
||||
wins_per_img_y = 2;
|
||||
blocks_per_win_x = 7;
|
||||
blocks_per_win_y = 15;
|
||||
block_hist_size = 36;
|
||||
cv::Size descr_size_expected = cv::Size(blocks_per_win_x * blocks_per_win_y * block_hist_size,
|
||||
wins_per_img_x * wins_per_img_y);
|
||||
ASSERT_EQ(descr_size_expected, descriptors.size());
|
||||
|
||||
// Check both formats of output descriptors are handled correctly
|
||||
cv::Mat dr(descriptors);
|
||||
cv::Mat dc(descriptors_by_cols);
|
||||
for (int i = 0; i < wins_per_img_x * wins_per_img_y; ++i)
|
||||
{
|
||||
const float* l = dr.rowRange(i, i + 1).ptr<float>();
|
||||
const float* r = dc.rowRange(i, i + 1).ptr<float>();
|
||||
for (int y = 0; y < blocks_per_win_y; ++y)
|
||||
for (int x = 0; x < blocks_per_win_x; ++x)
|
||||
for (int k = 0; k < block_hist_size; ++k)
|
||||
ASSERT_EQ(l[(y * blocks_per_win_x + x) * block_hist_size + k],
|
||||
r[(x * blocks_per_win_y + y) * block_hist_size + k]);
|
||||
}
|
||||
|
||||
/* Now we want to extract the same feature vectors, but from single images. NOTE: results will
|
||||
be defferent, due to border values interpolation. Using of many small images is slower, however we
|
||||
wont't call getDescriptors and will use computeBlockHistograms instead of. computeBlockHistograms
|
||||
works good, it can be checked in the gpu_hog sample */
|
||||
|
||||
img_rgb = readImage("hog/positive1.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
// Everything is fine with interpolation for left top subimage
|
||||
ASSERT_EQ(0.0, cv::norm((cv::Mat)block_hists, (cv::Mat)descriptors.rowRange(0, 1)));
|
||||
|
||||
img_rgb = readImage("hog/positive2.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(1, 2)));
|
||||
|
||||
img_rgb = readImage("hog/negative1.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(2, 3)));
|
||||
|
||||
img_rgb = readImage("hog/negative2.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(3, 4)));
|
||||
|
||||
img_rgb = readImage("hog/positive3.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(4, 5)));
|
||||
|
||||
img_rgb = readImage("hog/negative3.png");
|
||||
ASSERT_TRUE(!img_rgb.empty());
|
||||
cv::cvtColor(img_rgb, img, CV_BGR2BGRA);
|
||||
computeBlockHistograms(cv::gpu::GpuMat(img));
|
||||
compare_inner_parts(cv::Mat(block_hists), cv::Mat(descriptors.rowRange(5, 6)));
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, HOG, ALL_DEVICES);
|
||||
|
||||
//============== caltech hog tests =====================//
|
||||
struct CalTech : public ::testing::TestWithParam<std::tr1::tuple<cv::gpu::DeviceInfo, std::string> >
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Mat img;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
|
||||
img = readImage(GET_PARAM(1), cv::IMREAD_GRAYSCALE);
|
||||
ASSERT_FALSE(img.empty());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(CalTech, HOG)
|
||||
{
|
||||
cv::gpu::GpuMat d_img(img);
|
||||
cv::Mat markedImage(img.clone());
|
||||
|
||||
cv::gpu::HOGDescriptor d_hog;
|
||||
d_hog.setSVMDetector(cv::gpu::HOGDescriptor::getDefaultPeopleDetector());
|
||||
d_hog.nlevels = d_hog.nlevels + 32;
|
||||
|
||||
std::vector<cv::Rect> found_locations;
|
||||
d_hog.detectMultiScale(d_img, found_locations);
|
||||
|
||||
#if defined (LOG_CASCADE_STATISTIC)
|
||||
for (int i = 0; i < (int)found_locations.size(); i++)
|
||||
{
|
||||
cv::Rect r = found_locations[i];
|
||||
|
||||
std::cout << r.x << " " << r.y << " " << r.width << " " << r.height << std::endl;
|
||||
cv::rectangle(markedImage, r , CV_RGB(255, 0, 0));
|
||||
}
|
||||
|
||||
cv::imshow("Res", markedImage); cv::waitKey();
|
||||
#endif
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(detect, CalTech, testing::Combine(ALL_DEVICES,
|
||||
::testing::Values<std::string>("caltech/image_00000009_0.png", "caltech/image_00000032_0.png",
|
||||
"caltech/image_00000165_0.png", "caltech/image_00000261_0.png", "caltech/image_00000469_0.png",
|
||||
"caltech/image_00000527_0.png", "caltech/image_00000574_0.png")));
|
||||
|
||||
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////
|
||||
/// LBP classifier
|
||||
|
||||
PARAM_TEST_CASE(LBP_Read_classifier, cv::gpu::DeviceInfo, int)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(LBP_Read_classifier, Accuracy)
|
||||
{
|
||||
cv::gpu::CascadeClassifier_GPU classifier;
|
||||
std::string classifierXmlPath = std::string(cvtest::TS::ptr()->get_data_path()) + "lbpcascade/lbpcascade_frontalface.xml";
|
||||
ASSERT_TRUE(classifier.load(classifierXmlPath));
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, LBP_Read_classifier,
|
||||
testing::Combine(ALL_DEVICES, testing::Values<int>(0)));
|
||||
|
||||
|
||||
PARAM_TEST_CASE(LBP_classify, cv::gpu::DeviceInfo, int)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(LBP_classify, Accuracy)
|
||||
{
|
||||
std::string classifierXmlPath = std::string(cvtest::TS::ptr()->get_data_path()) + "lbpcascade/lbpcascade_frontalface.xml";
|
||||
std::string imagePath = std::string(cvtest::TS::ptr()->get_data_path()) + "lbpcascade/er.png";
|
||||
|
||||
cv::CascadeClassifier cpuClassifier(classifierXmlPath);
|
||||
ASSERT_FALSE(cpuClassifier.empty());
|
||||
|
||||
cv::Mat image = cv::imread(imagePath);
|
||||
image = image.colRange(0, image.cols/2);
|
||||
cv::Mat grey;
|
||||
cvtColor(image, grey, CV_BGR2GRAY);
|
||||
ASSERT_FALSE(image.empty());
|
||||
|
||||
std::vector<cv::Rect> rects;
|
||||
cpuClassifier.detectMultiScale(grey, rects);
|
||||
cv::Mat markedImage = image.clone();
|
||||
|
||||
std::vector<cv::Rect>::iterator it = rects.begin();
|
||||
for (; it != rects.end(); ++it)
|
||||
cv::rectangle(markedImage, *it, CV_RGB(0, 0, 255));
|
||||
|
||||
cv::gpu::CascadeClassifier_GPU gpuClassifier;
|
||||
ASSERT_TRUE(gpuClassifier.load(classifierXmlPath));
|
||||
|
||||
cv::gpu::GpuMat gpu_rects;
|
||||
cv::gpu::GpuMat tested(grey);
|
||||
int count = gpuClassifier.detectMultiScale(tested, gpu_rects);
|
||||
|
||||
#if defined (LOG_CASCADE_STATISTIC)
|
||||
cv::Mat downloaded(gpu_rects);
|
||||
const cv::Rect* faces = downloaded.ptr<cv::Rect>();
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
cv::Rect r = faces[i];
|
||||
|
||||
std::cout << r.x << " " << r.y << " " << r.width << " " << r.height << std::endl;
|
||||
cv::rectangle(markedImage, r , CV_RGB(255, 0, 0));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined (LOG_CASCADE_STATISTIC)
|
||||
cv::imshow("Res", markedImage); cv::waitKey();
|
||||
#endif
|
||||
(void)count;
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ObjDetect, LBP_classify,
|
||||
testing::Combine(ALL_DEVICES, testing::Values<int>(0)));
|
||||
|
||||
} // namespace
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
@@ -1,42 +1,42 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
@@ -1,84 +1,84 @@
|
||||
/*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*/
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC diagnostic ignored "-Wmissing-declarations"
|
||||
# pragma GCC diagnostic ignored "-Wmissing-prototypes" //OSX
|
||||
#endif
|
||||
|
||||
#ifndef __OPENCV_TEST_PRECOMP_HPP__
|
||||
#define __OPENCV_TEST_PRECOMP_HPP__
|
||||
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "cvconfig.h"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
#include <cuda.h>
|
||||
#include <cuda_runtime.h>
|
||||
|
||||
#include "opencv2/core/core.hpp"
|
||||
#include "opencv2/highgui/highgui.hpp"
|
||||
#include "opencv2/calib3d/calib3d.hpp"
|
||||
#include "opencv2/imgproc/imgproc.hpp"
|
||||
#include "opencv2/video/video.hpp"
|
||||
#include "opencv2/ts/ts.hpp"
|
||||
#include "opencv2/ts/ts_perf.hpp"
|
||||
#include "opencv2/gpu/gpu.hpp"
|
||||
#include "opencv2/nonfree/nonfree.hpp"
|
||||
#include "opencv2/legacy/legacy.hpp"
|
||||
|
||||
#include "utility.hpp"
|
||||
#include "interpolation.hpp"
|
||||
#include "main_test_nvidia.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
/*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*/
|
||||
|
||||
#ifdef __GNUC__
|
||||
# pragma GCC diagnostic ignored "-Wmissing-declarations"
|
||||
# pragma GCC diagnostic ignored "-Wmissing-prototypes" //OSX
|
||||
#endif
|
||||
|
||||
#ifndef __OPENCV_TEST_PRECOMP_HPP__
|
||||
#define __OPENCV_TEST_PRECOMP_HPP__
|
||||
|
||||
#include <cmath>
|
||||
#include <cstdio>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <functional>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <limits>
|
||||
#include <algorithm>
|
||||
#include <iterator>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "cvconfig.h"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
#include <cuda.h>
|
||||
#include <cuda_runtime.h>
|
||||
|
||||
#include "opencv2/core/core.hpp"
|
||||
#include "opencv2/highgui/highgui.hpp"
|
||||
#include "opencv2/calib3d/calib3d.hpp"
|
||||
#include "opencv2/imgproc/imgproc.hpp"
|
||||
#include "opencv2/video/video.hpp"
|
||||
#include "opencv2/ts/ts.hpp"
|
||||
#include "opencv2/ts/ts_perf.hpp"
|
||||
#include "opencv2/gpu/gpu.hpp"
|
||||
#include "opencv2/nonfree/nonfree.hpp"
|
||||
#include "opencv2/legacy/legacy.hpp"
|
||||
|
||||
#include "utility.hpp"
|
||||
#include "interpolation.hpp"
|
||||
#include "main_test_nvidia.h"
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
+177
-177
@@ -1,177 +1,177 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator> void remapImpl(const cv::Mat& src, const cv::Mat& xmap, const cv::Mat& ymap, cv::Mat& dst, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
cv::Size dsize = xmap.size();
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, ymap.at<float>(y, x), xmap.at<float>(y, x), c, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void remapGold(const cv::Mat& src, const cv::Mat& xmap, const cv::Mat& ymap, cv::Mat& dst, int interpolation, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, const cv::Mat& xmap, const cv::Mat& ymap, cv::Mat& dst, int borderType, cv::Scalar borderVal);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
remapImpl<unsigned char, NearestInterpolator>,
|
||||
remapImpl<signed char, NearestInterpolator>,
|
||||
remapImpl<unsigned short, NearestInterpolator>,
|
||||
remapImpl<short, NearestInterpolator>,
|
||||
remapImpl<int, NearestInterpolator>,
|
||||
remapImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
remapImpl<unsigned char, LinearInterpolator>,
|
||||
remapImpl<signed char, LinearInterpolator>,
|
||||
remapImpl<unsigned short, LinearInterpolator>,
|
||||
remapImpl<short, LinearInterpolator>,
|
||||
remapImpl<int, LinearInterpolator>,
|
||||
remapImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
remapImpl<unsigned char, CubicInterpolator>,
|
||||
remapImpl<signed char, CubicInterpolator>,
|
||||
remapImpl<unsigned short, CubicInterpolator>,
|
||||
remapImpl<short, CubicInterpolator>,
|
||||
remapImpl<int, CubicInterpolator>,
|
||||
remapImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
funcs[interpolation][src.depth()](src, xmap, ymap, dst, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(Remap, cv::gpu::DeviceInfo, cv::Size, MatType, Interpolation, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
int interpolation;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
cv::Mat xmap;
|
||||
cv::Mat ymap;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
borderType = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
|
||||
// rotation matrix
|
||||
|
||||
const double aplha = CV_PI / 4;
|
||||
static double M[2][3] = { {std::cos(aplha), -std::sin(aplha), size.width / 2.0},
|
||||
{std::sin(aplha), std::cos(aplha), 0.0}};
|
||||
|
||||
xmap.create(size, CV_32FC1);
|
||||
ymap.create(size, CV_32FC1);
|
||||
|
||||
for (int y = 0; y < size.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < size.width; ++x)
|
||||
{
|
||||
xmap.at<float>(y, x) = static_cast<float>(M[0][0] * x + M[0][1] * y + M[0][2]);
|
||||
ymap.at<float>(y, x) = static_cast<float>(M[1][0] * x + M[1][1] * y + M[1][2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(Remap, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(xmap.size(), type, useRoi);
|
||||
cv::gpu::remap(loadMat(src, useRoi), dst, loadMat(xmap, useRoi), loadMat(ymap, useRoi), interpolation, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
remapGold(src, xmap, ymap, dst_gold, interpolation, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-3 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Remap, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator> void remapImpl(const cv::Mat& src, const cv::Mat& xmap, const cv::Mat& ymap, cv::Mat& dst, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
cv::Size dsize = xmap.size();
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, ymap.at<float>(y, x), xmap.at<float>(y, x), c, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void remapGold(const cv::Mat& src, const cv::Mat& xmap, const cv::Mat& ymap, cv::Mat& dst, int interpolation, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, const cv::Mat& xmap, const cv::Mat& ymap, cv::Mat& dst, int borderType, cv::Scalar borderVal);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
remapImpl<unsigned char, NearestInterpolator>,
|
||||
remapImpl<signed char, NearestInterpolator>,
|
||||
remapImpl<unsigned short, NearestInterpolator>,
|
||||
remapImpl<short, NearestInterpolator>,
|
||||
remapImpl<int, NearestInterpolator>,
|
||||
remapImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
remapImpl<unsigned char, LinearInterpolator>,
|
||||
remapImpl<signed char, LinearInterpolator>,
|
||||
remapImpl<unsigned short, LinearInterpolator>,
|
||||
remapImpl<short, LinearInterpolator>,
|
||||
remapImpl<int, LinearInterpolator>,
|
||||
remapImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
remapImpl<unsigned char, CubicInterpolator>,
|
||||
remapImpl<signed char, CubicInterpolator>,
|
||||
remapImpl<unsigned short, CubicInterpolator>,
|
||||
remapImpl<short, CubicInterpolator>,
|
||||
remapImpl<int, CubicInterpolator>,
|
||||
remapImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
funcs[interpolation][src.depth()](src, xmap, ymap, dst, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(Remap, cv::gpu::DeviceInfo, cv::Size, MatType, Interpolation, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
int interpolation;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
cv::Mat xmap;
|
||||
cv::Mat ymap;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
borderType = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
|
||||
// rotation matrix
|
||||
|
||||
const double aplha = CV_PI / 4;
|
||||
static double M[2][3] = { {std::cos(aplha), -std::sin(aplha), size.width / 2.0},
|
||||
{std::sin(aplha), std::cos(aplha), 0.0}};
|
||||
|
||||
xmap.create(size, CV_32FC1);
|
||||
ymap.create(size, CV_32FC1);
|
||||
|
||||
for (int y = 0; y < size.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < size.width; ++x)
|
||||
{
|
||||
xmap.at<float>(y, x) = static_cast<float>(M[0][0] * x + M[0][1] * y + M[0][2]);
|
||||
ymap.at<float>(y, x) = static_cast<float>(M[1][0] * x + M[1][1] * y + M[1][2]);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(Remap, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(xmap.size(), type, useRoi);
|
||||
cv::gpu::remap(loadMat(src, useRoi), dst, loadMat(xmap, useRoi), loadMat(ymap, useRoi), interpolation, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
remapGold(src, xmap, ymap, dst_gold, interpolation, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-3 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Remap, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
+247
-247
@@ -1,247 +1,247 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator>
|
||||
void resizeImpl(const cv::Mat& src, cv::Mat& dst, double fx, double fy)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
cv::Size dsize(cv::saturate_cast<int>(src.cols * fx), cv::saturate_cast<int>(src.rows * fy));
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
float ifx = static_cast<float>(1.0 / fx);
|
||||
float ify = static_cast<float>(1.0 / fy);
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, y * ify, x * ifx, c, cv::BORDER_REPLICATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void resizeGold(const cv::Mat& src, cv::Mat& dst, double fx, double fy, int interpolation)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, cv::Mat& dst, double fx, double fy);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
resizeImpl<unsigned char, NearestInterpolator>,
|
||||
resizeImpl<signed char, NearestInterpolator>,
|
||||
resizeImpl<unsigned short, NearestInterpolator>,
|
||||
resizeImpl<short, NearestInterpolator>,
|
||||
resizeImpl<int, NearestInterpolator>,
|
||||
resizeImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
resizeImpl<unsigned char, LinearInterpolator>,
|
||||
resizeImpl<signed char, LinearInterpolator>,
|
||||
resizeImpl<unsigned short, LinearInterpolator>,
|
||||
resizeImpl<short, LinearInterpolator>,
|
||||
resizeImpl<int, LinearInterpolator>,
|
||||
resizeImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
resizeImpl<unsigned char, CubicInterpolator>,
|
||||
resizeImpl<signed char, CubicInterpolator>,
|
||||
resizeImpl<unsigned short, CubicInterpolator>,
|
||||
resizeImpl<short, CubicInterpolator>,
|
||||
resizeImpl<int, CubicInterpolator>,
|
||||
resizeImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
funcs[interpolation][src.depth()](src, dst, fx, fy);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(Resize, cv::gpu::DeviceInfo, cv::Size, MatType, double, Interpolation, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
double coeff;
|
||||
int interpolation;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
coeff = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(Resize, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(cv::Size(cv::saturate_cast<int>(src.cols * coeff), cv::saturate_cast<int>(src.rows * coeff)), type, useRoi);
|
||||
cv::gpu::resize(loadMat(src, useRoi), dst, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
resizeGold(src, dst_gold, coeff, coeff, interpolation);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-2 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Resize, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC3), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
testing::Values(0.3, 0.5, 1.5, 2.0),
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
|
||||
/////////////////
|
||||
PARAM_TEST_CASE(ResizeSameAsHost, cv::gpu::DeviceInfo, cv::Size, MatType, double, Interpolation, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
double coeff;
|
||||
int interpolation;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
coeff = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
// downscaling only: used for classifiers
|
||||
TEST_P(ResizeSameAsHost, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(cv::Size(cv::saturate_cast<int>(src.cols * coeff), cv::saturate_cast<int>(src.rows * coeff)), type, useRoi);
|
||||
cv::gpu::resize(loadMat(src, useRoi), dst, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::resize(src, dst_gold, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-2 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ResizeSameAsHost, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC3), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
testing::Values(0.3, 0.5),
|
||||
testing::Values(Interpolation(cv::INTER_AREA), Interpolation(cv::INTER_NEAREST)), //, Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test NPP
|
||||
|
||||
PARAM_TEST_CASE(ResizeNPP, cv::gpu::DeviceInfo, MatType, double, Interpolation)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
double coeff;
|
||||
int interpolation;
|
||||
int type;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
type = GET_PARAM(1);
|
||||
coeff = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ResizeNPP, Accuracy)
|
||||
{
|
||||
cv::Mat src = readImageType("stereobp/aloe-L.png", type);
|
||||
ASSERT_FALSE(src.empty());
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::resize(loadMat(src), dst, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
resizeGold(src, dst_gold, coeff, coeff, interpolation);
|
||||
|
||||
EXPECT_MAT_SIMILAR(dst_gold, dst, 1e-1);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ResizeNPP, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
|
||||
testing::Values(0.3, 0.5, 1.5, 2.0),
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR))));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator>
|
||||
void resizeImpl(const cv::Mat& src, cv::Mat& dst, double fx, double fy)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
cv::Size dsize(cv::saturate_cast<int>(src.cols * fx), cv::saturate_cast<int>(src.rows * fy));
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
float ifx = static_cast<float>(1.0 / fx);
|
||||
float ify = static_cast<float>(1.0 / fy);
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, y * ify, x * ifx, c, cv::BORDER_REPLICATE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void resizeGold(const cv::Mat& src, cv::Mat& dst, double fx, double fy, int interpolation)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, cv::Mat& dst, double fx, double fy);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
resizeImpl<unsigned char, NearestInterpolator>,
|
||||
resizeImpl<signed char, NearestInterpolator>,
|
||||
resizeImpl<unsigned short, NearestInterpolator>,
|
||||
resizeImpl<short, NearestInterpolator>,
|
||||
resizeImpl<int, NearestInterpolator>,
|
||||
resizeImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
resizeImpl<unsigned char, LinearInterpolator>,
|
||||
resizeImpl<signed char, LinearInterpolator>,
|
||||
resizeImpl<unsigned short, LinearInterpolator>,
|
||||
resizeImpl<short, LinearInterpolator>,
|
||||
resizeImpl<int, LinearInterpolator>,
|
||||
resizeImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
resizeImpl<unsigned char, CubicInterpolator>,
|
||||
resizeImpl<signed char, CubicInterpolator>,
|
||||
resizeImpl<unsigned short, CubicInterpolator>,
|
||||
resizeImpl<short, CubicInterpolator>,
|
||||
resizeImpl<int, CubicInterpolator>,
|
||||
resizeImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
funcs[interpolation][src.depth()](src, dst, fx, fy);
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(Resize, cv::gpu::DeviceInfo, cv::Size, MatType, double, Interpolation, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
double coeff;
|
||||
int interpolation;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
coeff = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(Resize, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(cv::Size(cv::saturate_cast<int>(src.cols * coeff), cv::saturate_cast<int>(src.rows * coeff)), type, useRoi);
|
||||
cv::gpu::resize(loadMat(src, useRoi), dst, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
resizeGold(src, dst_gold, coeff, coeff, interpolation);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-2 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Resize, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC3), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
testing::Values(0.3, 0.5, 1.5, 2.0),
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
|
||||
/////////////////
|
||||
PARAM_TEST_CASE(ResizeSameAsHost, cv::gpu::DeviceInfo, cv::Size, MatType, double, Interpolation, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
double coeff;
|
||||
int interpolation;
|
||||
int type;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
coeff = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
useRoi = GET_PARAM(5);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
// downscaling only: used for classifiers
|
||||
TEST_P(ResizeSameAsHost, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(cv::Size(cv::saturate_cast<int>(src.cols * coeff), cv::saturate_cast<int>(src.rows * coeff)), type, useRoi);
|
||||
cv::gpu::resize(loadMat(src, useRoi), dst, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::resize(src, dst_gold, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-2 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ResizeSameAsHost, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC3), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
testing::Values(0.3, 0.5),
|
||||
testing::Values(Interpolation(cv::INTER_AREA), Interpolation(cv::INTER_NEAREST)), //, Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test NPP
|
||||
|
||||
PARAM_TEST_CASE(ResizeNPP, cv::gpu::DeviceInfo, MatType, double, Interpolation)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
double coeff;
|
||||
int interpolation;
|
||||
int type;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
type = GET_PARAM(1);
|
||||
coeff = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ResizeNPP, Accuracy)
|
||||
{
|
||||
cv::Mat src = readImageType("stereobp/aloe-L.png", type);
|
||||
ASSERT_FALSE(src.empty());
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::resize(loadMat(src), dst, cv::Size(), coeff, coeff, interpolation);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
resizeGold(src, dst_gold, coeff, coeff, interpolation);
|
||||
|
||||
EXPECT_MAT_SIMILAR(dst_gold, dst, 1e-1);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ResizeNPP, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)),
|
||||
testing::Values(0.3, 0.5, 1.5, 2.0),
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR))));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
@@ -1,91 +1,91 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
CV_ENUM(ThreshOp, cv::THRESH_BINARY, cv::THRESH_BINARY_INV, cv::THRESH_TRUNC, cv::THRESH_TOZERO, cv::THRESH_TOZERO_INV)
|
||||
#define ALL_THRESH_OPS testing::Values(ThreshOp(cv::THRESH_BINARY), ThreshOp(cv::THRESH_BINARY_INV), ThreshOp(cv::THRESH_TRUNC), ThreshOp(cv::THRESH_TOZERO), ThreshOp(cv::THRESH_TOZERO_INV))
|
||||
|
||||
PARAM_TEST_CASE(Threshold, cv::gpu::DeviceInfo, cv::Size, MatType, ThreshOp, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
int threshOp;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
threshOp = GET_PARAM(3);
|
||||
useRoi = GET_PARAM(4);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(Threshold, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
double maxVal = randomDouble(20.0, 127.0);
|
||||
double thresh = randomDouble(0.0, maxVal);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(src.size(), src.type(), useRoi);
|
||||
cv::gpu::threshold(loadMat(src, useRoi), dst, thresh, maxVal, threshOp);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::threshold(src, dst_gold, thresh, maxVal, threshOp);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Threshold, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_16SC1), MatType(CV_32FC1)),
|
||||
ALL_THRESH_OPS,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
CV_ENUM(ThreshOp, cv::THRESH_BINARY, cv::THRESH_BINARY_INV, cv::THRESH_TRUNC, cv::THRESH_TOZERO, cv::THRESH_TOZERO_INV)
|
||||
#define ALL_THRESH_OPS testing::Values(ThreshOp(cv::THRESH_BINARY), ThreshOp(cv::THRESH_BINARY_INV), ThreshOp(cv::THRESH_TRUNC), ThreshOp(cv::THRESH_TOZERO), ThreshOp(cv::THRESH_TOZERO_INV))
|
||||
|
||||
PARAM_TEST_CASE(Threshold, cv::gpu::DeviceInfo, cv::Size, MatType, ThreshOp, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
int threshOp;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
threshOp = GET_PARAM(3);
|
||||
useRoi = GET_PARAM(4);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(Threshold, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
double maxVal = randomDouble(20.0, 127.0);
|
||||
double thresh = randomDouble(0.0, maxVal);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(src.size(), src.type(), useRoi);
|
||||
cv::gpu::threshold(loadMat(src, useRoi), dst, thresh, maxVal, threshOp);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
cv::threshold(src, dst_gold, thresh, maxVal, threshOp);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Threshold, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_16SC1), MatType(CV_32FC1)),
|
||||
ALL_THRESH_OPS,
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
@@ -1,273 +1,273 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace
|
||||
{
|
||||
cv::Mat createTransfomMatrix(cv::Size srcSize, double angle)
|
||||
{
|
||||
cv::Mat M(2, 3, CV_64FC1);
|
||||
M.at<double>(0, 0) = std::cos(angle); M.at<double>(0, 1) = -std::sin(angle); M.at<double>(0, 2) = srcSize.width / 2;
|
||||
M.at<double>(1, 0) = std::sin(angle); M.at<double>(1, 1) = std::cos(angle); M.at<double>(1, 2) = 0.0;
|
||||
|
||||
return M;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test buildWarpAffineMaps
|
||||
|
||||
PARAM_TEST_CASE(BuildWarpAffineMaps, cv::gpu::DeviceInfo, cv::Size, Inverse)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
bool inverse;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(BuildWarpAffineMaps, Accuracy)
|
||||
{
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 4);
|
||||
cv::gpu::GpuMat xmap, ymap;
|
||||
cv::gpu::buildWarpAffineMaps(M, inverse, size, xmap, ymap);
|
||||
|
||||
int interpolation = cv::INTER_NEAREST;
|
||||
int borderMode = cv::BORDER_CONSTANT;
|
||||
|
||||
cv::Mat src = randomMat(randomSize(200, 400), CV_8UC1);
|
||||
cv::Mat dst;
|
||||
cv::remap(src, dst, cv::Mat(xmap), cv::Mat(ymap), interpolation, borderMode);
|
||||
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Mat dst_gold;
|
||||
cv::warpAffine(src, dst_gold, M, size, flags, borderMode);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, BuildWarpAffineMaps, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
DIRECT_INVERSE));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator> void warpAffineImpl(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
float xcoo = static_cast<float>(M.at<double>(0, 0) * x + M.at<double>(0, 1) * y + M.at<double>(0, 2));
|
||||
float ycoo = static_cast<float>(M.at<double>(1, 0) * x + M.at<double>(1, 1) * y + M.at<double>(1, 2));
|
||||
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, ycoo, xcoo, c, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void warpAffineGold(const cv::Mat& src, const cv::Mat& M, bool inverse, cv::Size dsize, cv::Mat& dst, int interpolation, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
warpAffineImpl<unsigned char, NearestInterpolator>,
|
||||
warpAffineImpl<signed char, NearestInterpolator>,
|
||||
warpAffineImpl<unsigned short, NearestInterpolator>,
|
||||
warpAffineImpl<short, NearestInterpolator>,
|
||||
warpAffineImpl<int, NearestInterpolator>,
|
||||
warpAffineImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
warpAffineImpl<unsigned char, LinearInterpolator>,
|
||||
warpAffineImpl<signed char, LinearInterpolator>,
|
||||
warpAffineImpl<unsigned short, LinearInterpolator>,
|
||||
warpAffineImpl<short, LinearInterpolator>,
|
||||
warpAffineImpl<int, LinearInterpolator>,
|
||||
warpAffineImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
warpAffineImpl<unsigned char, CubicInterpolator>,
|
||||
warpAffineImpl<signed char, CubicInterpolator>,
|
||||
warpAffineImpl<unsigned short, CubicInterpolator>,
|
||||
warpAffineImpl<short, CubicInterpolator>,
|
||||
warpAffineImpl<int, CubicInterpolator>,
|
||||
warpAffineImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
if (inverse)
|
||||
funcs[interpolation][src.depth()](src, M, dsize, dst, borderType, borderVal);
|
||||
else
|
||||
{
|
||||
cv::Mat iM;
|
||||
cv::invertAffineTransform(M, iM);
|
||||
funcs[interpolation][src.depth()](src, iM, dsize, dst, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(WarpAffine, cv::gpu::DeviceInfo, cv::Size, MatType, Inverse, Interpolation, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
inverse = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
borderType = GET_PARAM(5);
|
||||
useRoi = GET_PARAM(6);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpAffine, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 3);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(size, type, useRoi);
|
||||
cv::gpu::warpAffine(loadMat(src, useRoi), dst, M, size, flags, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpAffineGold(src, M, inverse, size, dst_gold, interpolation, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-1 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpAffine, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test NPP
|
||||
|
||||
PARAM_TEST_CASE(WarpAffineNPP, cv::gpu::DeviceInfo, MatType, Inverse, Interpolation)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
type = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpAffineNPP, Accuracy)
|
||||
{
|
||||
cv::Mat src = readImageType("stereobp/aloe-L.png", type);
|
||||
cv::Mat M = createTransfomMatrix(src.size(), CV_PI / 4);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::warpAffine(loadMat(src), dst, M, src.size(), flags);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpAffineGold(src, M, inverse, src.size(), dst_gold, interpolation, cv::BORDER_CONSTANT, cv::Scalar::all(0));
|
||||
|
||||
EXPECT_MAT_SIMILAR(dst_gold, dst, 2e-2);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpAffineNPP, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC))));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace
|
||||
{
|
||||
cv::Mat createTransfomMatrix(cv::Size srcSize, double angle)
|
||||
{
|
||||
cv::Mat M(2, 3, CV_64FC1);
|
||||
M.at<double>(0, 0) = std::cos(angle); M.at<double>(0, 1) = -std::sin(angle); M.at<double>(0, 2) = srcSize.width / 2;
|
||||
M.at<double>(1, 0) = std::sin(angle); M.at<double>(1, 1) = std::cos(angle); M.at<double>(1, 2) = 0.0;
|
||||
|
||||
return M;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test buildWarpAffineMaps
|
||||
|
||||
PARAM_TEST_CASE(BuildWarpAffineMaps, cv::gpu::DeviceInfo, cv::Size, Inverse)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
bool inverse;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(BuildWarpAffineMaps, Accuracy)
|
||||
{
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 4);
|
||||
cv::gpu::GpuMat xmap, ymap;
|
||||
cv::gpu::buildWarpAffineMaps(M, inverse, size, xmap, ymap);
|
||||
|
||||
int interpolation = cv::INTER_NEAREST;
|
||||
int borderMode = cv::BORDER_CONSTANT;
|
||||
|
||||
cv::Mat src = randomMat(randomSize(200, 400), CV_8UC1);
|
||||
cv::Mat dst;
|
||||
cv::remap(src, dst, cv::Mat(xmap), cv::Mat(ymap), interpolation, borderMode);
|
||||
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Mat dst_gold;
|
||||
cv::warpAffine(src, dst_gold, M, size, flags, borderMode);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, BuildWarpAffineMaps, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
DIRECT_INVERSE));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator> void warpAffineImpl(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
float xcoo = static_cast<float>(M.at<double>(0, 0) * x + M.at<double>(0, 1) * y + M.at<double>(0, 2));
|
||||
float ycoo = static_cast<float>(M.at<double>(1, 0) * x + M.at<double>(1, 1) * y + M.at<double>(1, 2));
|
||||
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, ycoo, xcoo, c, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void warpAffineGold(const cv::Mat& src, const cv::Mat& M, bool inverse, cv::Size dsize, cv::Mat& dst, int interpolation, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
warpAffineImpl<unsigned char, NearestInterpolator>,
|
||||
warpAffineImpl<signed char, NearestInterpolator>,
|
||||
warpAffineImpl<unsigned short, NearestInterpolator>,
|
||||
warpAffineImpl<short, NearestInterpolator>,
|
||||
warpAffineImpl<int, NearestInterpolator>,
|
||||
warpAffineImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
warpAffineImpl<unsigned char, LinearInterpolator>,
|
||||
warpAffineImpl<signed char, LinearInterpolator>,
|
||||
warpAffineImpl<unsigned short, LinearInterpolator>,
|
||||
warpAffineImpl<short, LinearInterpolator>,
|
||||
warpAffineImpl<int, LinearInterpolator>,
|
||||
warpAffineImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
warpAffineImpl<unsigned char, CubicInterpolator>,
|
||||
warpAffineImpl<signed char, CubicInterpolator>,
|
||||
warpAffineImpl<unsigned short, CubicInterpolator>,
|
||||
warpAffineImpl<short, CubicInterpolator>,
|
||||
warpAffineImpl<int, CubicInterpolator>,
|
||||
warpAffineImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
if (inverse)
|
||||
funcs[interpolation][src.depth()](src, M, dsize, dst, borderType, borderVal);
|
||||
else
|
||||
{
|
||||
cv::Mat iM;
|
||||
cv::invertAffineTransform(M, iM);
|
||||
funcs[interpolation][src.depth()](src, iM, dsize, dst, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(WarpAffine, cv::gpu::DeviceInfo, cv::Size, MatType, Inverse, Interpolation, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
inverse = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
borderType = GET_PARAM(5);
|
||||
useRoi = GET_PARAM(6);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpAffine, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 3);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(size, type, useRoi);
|
||||
cv::gpu::warpAffine(loadMat(src, useRoi), dst, M, size, flags, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpAffineGold(src, M, inverse, size, dst_gold, interpolation, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-1 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpAffine, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test NPP
|
||||
|
||||
PARAM_TEST_CASE(WarpAffineNPP, cv::gpu::DeviceInfo, MatType, Inverse, Interpolation)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
type = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpAffineNPP, Accuracy)
|
||||
{
|
||||
cv::Mat src = readImageType("stereobp/aloe-L.png", type);
|
||||
cv::Mat M = createTransfomMatrix(src.size(), CV_PI / 4);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::warpAffine(loadMat(src), dst, M, src.size(), flags);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpAffineGold(src, M, inverse, src.size(), dst_gold, interpolation, cv::BORDER_CONSTANT, cv::Scalar::all(0));
|
||||
|
||||
EXPECT_MAT_SIMILAR(dst_gold, dst, 2e-2);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpAffineNPP, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC))));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
@@ -1,273 +1,273 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace
|
||||
{
|
||||
cv::Mat createTransfomMatrix(cv::Size srcSize, double angle)
|
||||
{
|
||||
cv::Mat M(3, 3, CV_64FC1);
|
||||
M.at<double>(0, 0) = std::cos(angle); M.at<double>(0, 1) = -std::sin(angle); M.at<double>(0, 2) = srcSize.width / 2;
|
||||
M.at<double>(1, 0) = std::sin(angle); M.at<double>(1, 1) = std::cos(angle); M.at<double>(1, 2) = 0.0;
|
||||
M.at<double>(2, 0) = 0.0 ; M.at<double>(2, 1) = 0.0 ; M.at<double>(2, 2) = 1.0;
|
||||
|
||||
return M;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test buildWarpPerspectiveMaps
|
||||
|
||||
PARAM_TEST_CASE(BuildWarpPerspectiveMaps, cv::gpu::DeviceInfo, cv::Size, Inverse)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
bool inverse;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(BuildWarpPerspectiveMaps, Accuracy)
|
||||
{
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 4);
|
||||
cv::gpu::GpuMat xmap, ymap;
|
||||
cv::gpu::buildWarpPerspectiveMaps(M, inverse, size, xmap, ymap);
|
||||
|
||||
cv::Mat src = randomMat(randomSize(200, 400), CV_8UC1);
|
||||
cv::Mat dst;
|
||||
cv::remap(src, dst, cv::Mat(xmap), cv::Mat(ymap), cv::INTER_NEAREST, cv::BORDER_CONSTANT);
|
||||
|
||||
int flags = cv::INTER_NEAREST;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Mat dst_gold;
|
||||
cv::warpPerspective(src, dst_gold, M, size, flags, cv::BORDER_CONSTANT);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, BuildWarpPerspectiveMaps, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
DIRECT_INVERSE));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator> void warpPerspectiveImpl(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
float coeff = static_cast<float>(M.at<double>(2, 0) * x + M.at<double>(2, 1) * y + M.at<double>(2, 2));
|
||||
|
||||
float xcoo = static_cast<float>((M.at<double>(0, 0) * x + M.at<double>(0, 1) * y + M.at<double>(0, 2)) / coeff);
|
||||
float ycoo = static_cast<float>((M.at<double>(1, 0) * x + M.at<double>(1, 1) * y + M.at<double>(1, 2)) / coeff);
|
||||
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, ycoo, xcoo, c, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void warpPerspectiveGold(const cv::Mat& src, const cv::Mat& M, bool inverse, cv::Size dsize, cv::Mat& dst, int interpolation, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
warpPerspectiveImpl<unsigned char, NearestInterpolator>,
|
||||
warpPerspectiveImpl<signed char, NearestInterpolator>,
|
||||
warpPerspectiveImpl<unsigned short, NearestInterpolator>,
|
||||
warpPerspectiveImpl<short, NearestInterpolator>,
|
||||
warpPerspectiveImpl<int, NearestInterpolator>,
|
||||
warpPerspectiveImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
warpPerspectiveImpl<unsigned char, LinearInterpolator>,
|
||||
warpPerspectiveImpl<signed char, LinearInterpolator>,
|
||||
warpPerspectiveImpl<unsigned short, LinearInterpolator>,
|
||||
warpPerspectiveImpl<short, LinearInterpolator>,
|
||||
warpPerspectiveImpl<int, LinearInterpolator>,
|
||||
warpPerspectiveImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
warpPerspectiveImpl<unsigned char, CubicInterpolator>,
|
||||
warpPerspectiveImpl<signed char, CubicInterpolator>,
|
||||
warpPerspectiveImpl<unsigned short, CubicInterpolator>,
|
||||
warpPerspectiveImpl<short, CubicInterpolator>,
|
||||
warpPerspectiveImpl<int, CubicInterpolator>,
|
||||
warpPerspectiveImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
if (inverse)
|
||||
funcs[interpolation][src.depth()](src, M, dsize, dst, borderType, borderVal);
|
||||
else
|
||||
{
|
||||
cv::Mat iM;
|
||||
cv::invert(M, iM);
|
||||
funcs[interpolation][src.depth()](src, iM, dsize, dst, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(WarpPerspective, cv::gpu::DeviceInfo, cv::Size, MatType, Inverse, Interpolation, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
inverse = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
borderType = GET_PARAM(5);
|
||||
useRoi = GET_PARAM(6);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpPerspective, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 3);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(size, type, useRoi);
|
||||
cv::gpu::warpPerspective(loadMat(src, useRoi), dst, M, size, flags, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpPerspectiveGold(src, M, inverse, size, dst_gold, interpolation, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-1 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpPerspective, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test NPP
|
||||
|
||||
PARAM_TEST_CASE(WarpPerspectiveNPP, cv::gpu::DeviceInfo, MatType, Inverse, Interpolation)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
type = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpPerspectiveNPP, Accuracy)
|
||||
{
|
||||
cv::Mat src = readImageType("stereobp/aloe-L.png", type);
|
||||
cv::Mat M = createTransfomMatrix(src.size(), CV_PI / 4);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::warpPerspective(loadMat(src), dst, M, src.size(), flags);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpPerspectiveGold(src, M, inverse, src.size(), dst_gold, interpolation, cv::BORDER_CONSTANT, cv::Scalar::all(0));
|
||||
|
||||
EXPECT_MAT_SIMILAR(dst_gold, dst, 2e-2);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpPerspectiveNPP, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC))));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
namespace
|
||||
{
|
||||
cv::Mat createTransfomMatrix(cv::Size srcSize, double angle)
|
||||
{
|
||||
cv::Mat M(3, 3, CV_64FC1);
|
||||
M.at<double>(0, 0) = std::cos(angle); M.at<double>(0, 1) = -std::sin(angle); M.at<double>(0, 2) = srcSize.width / 2;
|
||||
M.at<double>(1, 0) = std::sin(angle); M.at<double>(1, 1) = std::cos(angle); M.at<double>(1, 2) = 0.0;
|
||||
M.at<double>(2, 0) = 0.0 ; M.at<double>(2, 1) = 0.0 ; M.at<double>(2, 2) = 1.0;
|
||||
|
||||
return M;
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test buildWarpPerspectiveMaps
|
||||
|
||||
PARAM_TEST_CASE(BuildWarpPerspectiveMaps, cv::gpu::DeviceInfo, cv::Size, Inverse)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
bool inverse;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(BuildWarpPerspectiveMaps, Accuracy)
|
||||
{
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 4);
|
||||
cv::gpu::GpuMat xmap, ymap;
|
||||
cv::gpu::buildWarpPerspectiveMaps(M, inverse, size, xmap, ymap);
|
||||
|
||||
cv::Mat src = randomMat(randomSize(200, 400), CV_8UC1);
|
||||
cv::Mat dst;
|
||||
cv::remap(src, dst, cv::Mat(xmap), cv::Mat(ymap), cv::INTER_NEAREST, cv::BORDER_CONSTANT);
|
||||
|
||||
int flags = cv::INTER_NEAREST;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Mat dst_gold;
|
||||
cv::warpPerspective(src, dst_gold, M, size, flags, cv::BORDER_CONSTANT);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, 0.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, BuildWarpPerspectiveMaps, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
DIRECT_INVERSE));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Gold implementation
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, template <typename> class Interpolator> void warpPerspectiveImpl(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
const int cn = src.channels();
|
||||
|
||||
dst.create(dsize, src.type());
|
||||
|
||||
for (int y = 0; y < dsize.height; ++y)
|
||||
{
|
||||
for (int x = 0; x < dsize.width; ++x)
|
||||
{
|
||||
float coeff = static_cast<float>(M.at<double>(2, 0) * x + M.at<double>(2, 1) * y + M.at<double>(2, 2));
|
||||
|
||||
float xcoo = static_cast<float>((M.at<double>(0, 0) * x + M.at<double>(0, 1) * y + M.at<double>(0, 2)) / coeff);
|
||||
float ycoo = static_cast<float>((M.at<double>(1, 0) * x + M.at<double>(1, 1) * y + M.at<double>(1, 2)) / coeff);
|
||||
|
||||
for (int c = 0; c < cn; ++c)
|
||||
dst.at<T>(y, x * cn + c) = Interpolator<T>::getValue(src, ycoo, xcoo, c, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void warpPerspectiveGold(const cv::Mat& src, const cv::Mat& M, bool inverse, cv::Size dsize, cv::Mat& dst, int interpolation, int borderType, cv::Scalar borderVal)
|
||||
{
|
||||
typedef void (*func_t)(const cv::Mat& src, const cv::Mat& M, cv::Size dsize, cv::Mat& dst, int borderType, cv::Scalar borderVal);
|
||||
|
||||
static const func_t nearest_funcs[] =
|
||||
{
|
||||
warpPerspectiveImpl<unsigned char, NearestInterpolator>,
|
||||
warpPerspectiveImpl<signed char, NearestInterpolator>,
|
||||
warpPerspectiveImpl<unsigned short, NearestInterpolator>,
|
||||
warpPerspectiveImpl<short, NearestInterpolator>,
|
||||
warpPerspectiveImpl<int, NearestInterpolator>,
|
||||
warpPerspectiveImpl<float, NearestInterpolator>
|
||||
};
|
||||
|
||||
static const func_t linear_funcs[] =
|
||||
{
|
||||
warpPerspectiveImpl<unsigned char, LinearInterpolator>,
|
||||
warpPerspectiveImpl<signed char, LinearInterpolator>,
|
||||
warpPerspectiveImpl<unsigned short, LinearInterpolator>,
|
||||
warpPerspectiveImpl<short, LinearInterpolator>,
|
||||
warpPerspectiveImpl<int, LinearInterpolator>,
|
||||
warpPerspectiveImpl<float, LinearInterpolator>
|
||||
};
|
||||
|
||||
static const func_t cubic_funcs[] =
|
||||
{
|
||||
warpPerspectiveImpl<unsigned char, CubicInterpolator>,
|
||||
warpPerspectiveImpl<signed char, CubicInterpolator>,
|
||||
warpPerspectiveImpl<unsigned short, CubicInterpolator>,
|
||||
warpPerspectiveImpl<short, CubicInterpolator>,
|
||||
warpPerspectiveImpl<int, CubicInterpolator>,
|
||||
warpPerspectiveImpl<float, CubicInterpolator>
|
||||
};
|
||||
|
||||
static const func_t* funcs[] = {nearest_funcs, linear_funcs, cubic_funcs};
|
||||
|
||||
if (inverse)
|
||||
funcs[interpolation][src.depth()](src, M, dsize, dst, borderType, borderVal);
|
||||
else
|
||||
{
|
||||
cv::Mat iM;
|
||||
cv::invert(M, iM);
|
||||
funcs[interpolation][src.depth()](src, iM, dsize, dst, borderType, borderVal);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test
|
||||
|
||||
PARAM_TEST_CASE(WarpPerspective, cv::gpu::DeviceInfo, cv::Size, MatType, Inverse, Interpolation, BorderType, UseRoi)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
cv::Size size;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
int borderType;
|
||||
bool useRoi;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
size = GET_PARAM(1);
|
||||
type = GET_PARAM(2);
|
||||
inverse = GET_PARAM(3);
|
||||
interpolation = GET_PARAM(4);
|
||||
borderType = GET_PARAM(5);
|
||||
useRoi = GET_PARAM(6);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpPerspective, Accuracy)
|
||||
{
|
||||
cv::Mat src = randomMat(size, type);
|
||||
cv::Mat M = createTransfomMatrix(size, CV_PI / 3);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
cv::Scalar val = randomScalar(0.0, 255.0);
|
||||
|
||||
cv::gpu::GpuMat dst = createMat(size, type, useRoi);
|
||||
cv::gpu::warpPerspective(loadMat(src, useRoi), dst, M, size, flags, borderType, val);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpPerspectiveGold(src, M, inverse, size, dst_gold, interpolation, borderType, val);
|
||||
|
||||
EXPECT_MAT_NEAR(dst_gold, dst, src.depth() == CV_32F ? 1e-1 : 1.0);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpPerspective, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
DIFFERENT_SIZES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_16UC1), MatType(CV_16UC3), MatType(CV_16UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC)),
|
||||
testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP)),
|
||||
WHOLE_SUBMAT));
|
||||
|
||||
///////////////////////////////////////////////////////////////////
|
||||
// Test NPP
|
||||
|
||||
PARAM_TEST_CASE(WarpPerspectiveNPP, cv::gpu::DeviceInfo, MatType, Inverse, Interpolation)
|
||||
{
|
||||
cv::gpu::DeviceInfo devInfo;
|
||||
int type;
|
||||
bool inverse;
|
||||
int interpolation;
|
||||
|
||||
virtual void SetUp()
|
||||
{
|
||||
devInfo = GET_PARAM(0);
|
||||
type = GET_PARAM(1);
|
||||
inverse = GET_PARAM(2);
|
||||
interpolation = GET_PARAM(3);
|
||||
|
||||
cv::gpu::setDevice(devInfo.deviceID());
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(WarpPerspectiveNPP, Accuracy)
|
||||
{
|
||||
cv::Mat src = readImageType("stereobp/aloe-L.png", type);
|
||||
cv::Mat M = createTransfomMatrix(src.size(), CV_PI / 4);
|
||||
int flags = interpolation;
|
||||
if (inverse)
|
||||
flags |= cv::WARP_INVERSE_MAP;
|
||||
|
||||
cv::gpu::GpuMat dst;
|
||||
cv::gpu::warpPerspective(loadMat(src), dst, M, src.size(), flags);
|
||||
|
||||
cv::Mat dst_gold;
|
||||
warpPerspectiveGold(src, M, inverse, src.size(), dst_gold, interpolation, cv::BORDER_CONSTANT, cv::Scalar::all(0));
|
||||
|
||||
EXPECT_MAT_SIMILAR(dst_gold, dst, 2e-2);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, WarpPerspectiveNPP, testing::Combine(
|
||||
ALL_DEVICES,
|
||||
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC3), MatType(CV_32FC4)),
|
||||
DIRECT_INVERSE,
|
||||
testing::Values(Interpolation(cv::INTER_NEAREST), Interpolation(cv::INTER_LINEAR), Interpolation(cv::INTER_CUBIC))));
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
+424
-424
@@ -1,424 +1,424 @@
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace cv::gpu;
|
||||
using namespace cvtest;
|
||||
using namespace testing;
|
||||
using namespace testing::internal;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// random generators
|
||||
|
||||
int randomInt(int minVal, int maxVal)
|
||||
{
|
||||
RNG& rng = TS::ptr()->get_rng();
|
||||
return rng.uniform(minVal, maxVal);
|
||||
}
|
||||
|
||||
double randomDouble(double minVal, double maxVal)
|
||||
{
|
||||
RNG& rng = TS::ptr()->get_rng();
|
||||
return rng.uniform(minVal, maxVal);
|
||||
}
|
||||
|
||||
Size randomSize(int minVal, int maxVal)
|
||||
{
|
||||
return cv::Size(randomInt(minVal, maxVal), randomInt(minVal, maxVal));
|
||||
}
|
||||
|
||||
Scalar randomScalar(double minVal, double maxVal)
|
||||
{
|
||||
return Scalar(randomDouble(minVal, maxVal), randomDouble(minVal, maxVal), randomDouble(minVal, maxVal), randomDouble(minVal, maxVal));
|
||||
}
|
||||
|
||||
Mat randomMat(Size size, int type, double minVal, double maxVal)
|
||||
{
|
||||
return randomMat(TS::ptr()->get_rng(), size, type, minVal, maxVal, false);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// GpuMat create
|
||||
|
||||
cv::gpu::GpuMat createMat(cv::Size size, int type, bool useRoi)
|
||||
{
|
||||
Size size0 = size;
|
||||
|
||||
if (useRoi)
|
||||
{
|
||||
size0.width += randomInt(5, 15);
|
||||
size0.height += randomInt(5, 15);
|
||||
}
|
||||
|
||||
GpuMat d_m(size0, type);
|
||||
|
||||
if (size0 != size)
|
||||
d_m = d_m(Rect((size0.width - size.width) / 2, (size0.height - size.height) / 2, size.width, size.height));
|
||||
|
||||
return d_m;
|
||||
}
|
||||
|
||||
GpuMat loadMat(const Mat& m, bool useRoi)
|
||||
{
|
||||
GpuMat d_m = createMat(m.size(), m.type(), useRoi);
|
||||
d_m.upload(m);
|
||||
return d_m;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image load
|
||||
|
||||
Mat readImage(const std::string& fileName, int flags)
|
||||
{
|
||||
return imread(TS::ptr()->get_data_path() + fileName, flags);
|
||||
}
|
||||
|
||||
Mat readImageType(const std::string& fname, int type)
|
||||
{
|
||||
Mat src = readImage(fname, CV_MAT_CN(type) == 1 ? IMREAD_GRAYSCALE : IMREAD_COLOR);
|
||||
if (CV_MAT_CN(type) == 4)
|
||||
{
|
||||
Mat temp;
|
||||
cvtColor(src, temp, cv::COLOR_BGR2BGRA);
|
||||
swap(src, temp);
|
||||
}
|
||||
src.convertTo(src, CV_MAT_DEPTH(type), CV_MAT_DEPTH(type) == CV_32F ? 1.0 / 255.0 : 1.0);
|
||||
return src;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image dumping
|
||||
|
||||
void dumpImage(const std::string& fileName, const cv::Mat& image)
|
||||
{
|
||||
cv::imwrite(TS::ptr()->get_data_path() + fileName, image);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Gpu devices
|
||||
|
||||
bool supportFeature(const DeviceInfo& info, FeatureSet feature)
|
||||
{
|
||||
return TargetArchs::builtWith(feature) && info.supports(feature);
|
||||
}
|
||||
|
||||
DeviceManager& DeviceManager::instance()
|
||||
{
|
||||
static DeviceManager obj;
|
||||
return obj;
|
||||
}
|
||||
|
||||
void DeviceManager::load(int i)
|
||||
{
|
||||
devices_.clear();
|
||||
devices_.reserve(1);
|
||||
|
||||
ostringstream msg;
|
||||
|
||||
if (i < 0 || i >= getCudaEnabledDeviceCount())
|
||||
{
|
||||
msg << "Incorrect device number - " << i;
|
||||
throw runtime_error(msg.str());
|
||||
}
|
||||
|
||||
DeviceInfo info(i);
|
||||
|
||||
if (!info.isCompatible())
|
||||
{
|
||||
msg << "Device " << i << " [" << info.name() << "] is NOT compatible with current GPU module build";
|
||||
throw runtime_error(msg.str());
|
||||
}
|
||||
|
||||
devices_.push_back(info);
|
||||
}
|
||||
|
||||
void DeviceManager::loadAll()
|
||||
{
|
||||
int deviceCount = getCudaEnabledDeviceCount();
|
||||
|
||||
devices_.clear();
|
||||
devices_.reserve(deviceCount);
|
||||
|
||||
for (int i = 0; i < deviceCount; ++i)
|
||||
{
|
||||
DeviceInfo info(i);
|
||||
if (info.isCompatible())
|
||||
{
|
||||
devices_.push_back(info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Additional assertion
|
||||
|
||||
Mat getMat(InputArray arr)
|
||||
{
|
||||
if (arr.kind() == _InputArray::GPU_MAT)
|
||||
{
|
||||
Mat m;
|
||||
arr.getGpuMat().download(m);
|
||||
return m;
|
||||
}
|
||||
|
||||
return arr.getMat();
|
||||
}
|
||||
|
||||
double checkNorm(InputArray m1, InputArray m2)
|
||||
{
|
||||
return norm(getMat(m1), getMat(m2), NORM_INF);
|
||||
}
|
||||
|
||||
void minMaxLocGold(const Mat& src, double* minVal_, double* maxVal_, Point* minLoc_, Point* maxLoc_, const Mat& mask)
|
||||
{
|
||||
if (src.depth() != CV_8S)
|
||||
{
|
||||
minMaxLoc(src, minVal_, maxVal_, minLoc_, maxLoc_, mask);
|
||||
return;
|
||||
}
|
||||
|
||||
// OpenCV's minMaxLoc doesn't support CV_8S type
|
||||
double minVal = numeric_limits<double>::max();
|
||||
Point minLoc(-1, -1);
|
||||
|
||||
double maxVal = -numeric_limits<double>::max();
|
||||
Point maxLoc(-1, -1);
|
||||
|
||||
for (int y = 0; y < src.rows; ++y)
|
||||
{
|
||||
const schar* src_row = src.ptr<signed char>(y);
|
||||
const uchar* mask_row = mask.empty() ? 0 : mask.ptr<unsigned char>(y);
|
||||
|
||||
for (int x = 0; x < src.cols; ++x)
|
||||
{
|
||||
if (!mask_row || mask_row[x])
|
||||
{
|
||||
schar val = src_row[x];
|
||||
|
||||
if (val < minVal)
|
||||
{
|
||||
minVal = val;
|
||||
minLoc = cv::Point(x, y);
|
||||
}
|
||||
|
||||
if (val > maxVal)
|
||||
{
|
||||
maxVal = val;
|
||||
maxLoc = cv::Point(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (minVal_) *minVal_ = minVal;
|
||||
if (maxVal_) *maxVal_ = maxVal;
|
||||
|
||||
if (minLoc_) *minLoc_ = minLoc;
|
||||
if (maxLoc_) *maxLoc_ = maxLoc;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, typename OutT> std::string printMatValImpl(const Mat& m, Point p)
|
||||
{
|
||||
const int cn = m.channels();
|
||||
|
||||
ostringstream ostr;
|
||||
ostr << "(";
|
||||
|
||||
p.x /= cn;
|
||||
|
||||
ostr << static_cast<OutT>(m.at<T>(p.y, p.x * cn));
|
||||
for (int c = 1; c < m.channels(); ++c)
|
||||
{
|
||||
ostr << ", " << static_cast<OutT>(m.at<T>(p.y, p.x * cn + c));
|
||||
}
|
||||
ostr << ")";
|
||||
|
||||
return ostr.str();
|
||||
}
|
||||
|
||||
std::string printMatVal(const Mat& m, Point p)
|
||||
{
|
||||
typedef std::string (*func_t)(const Mat& m, Point p);
|
||||
|
||||
static const func_t funcs[] =
|
||||
{
|
||||
printMatValImpl<uchar, int>, printMatValImpl<schar, int>, printMatValImpl<ushort, int>, printMatValImpl<short, int>,
|
||||
printMatValImpl<int, int>, printMatValImpl<float, float>, printMatValImpl<double, double>
|
||||
};
|
||||
|
||||
return funcs[m.depth()](m, p);
|
||||
}
|
||||
}
|
||||
|
||||
testing::AssertionResult assertMatNear(const char* expr1, const char* expr2, const char* eps_expr, cv::InputArray m1_, cv::InputArray m2_, double eps)
|
||||
{
|
||||
Mat m1 = getMat(m1_);
|
||||
Mat m2 = getMat(m2_);
|
||||
|
||||
if (m1.size() != m2.size())
|
||||
{
|
||||
return AssertionFailure() << "Matrices \"" << expr1 << "\" and \"" << expr2 << "\" have different sizes : \""
|
||||
<< expr1 << "\" [" << PrintToString(m1.size()) << "] vs \""
|
||||
<< expr2 << "\" [" << PrintToString(m2.size()) << "]";
|
||||
}
|
||||
|
||||
if (m1.type() != m2.type())
|
||||
{
|
||||
return AssertionFailure() << "Matrices \"" << expr1 << "\" and \"" << expr2 << "\" have different types : \""
|
||||
<< expr1 << "\" [" << PrintToString(MatType(m1.type())) << "] vs \""
|
||||
<< expr2 << "\" [" << PrintToString(MatType(m2.type())) << "]";
|
||||
}
|
||||
|
||||
Mat diff;
|
||||
absdiff(m1.reshape(1), m2.reshape(1), diff);
|
||||
|
||||
double maxVal = 0.0;
|
||||
Point maxLoc;
|
||||
minMaxLocGold(diff, 0, &maxVal, 0, &maxLoc);
|
||||
|
||||
if (maxVal > eps)
|
||||
{
|
||||
return AssertionFailure() << "The max difference between matrices \"" << expr1 << "\" and \"" << expr2
|
||||
<< "\" is " << maxVal << " at (" << maxLoc.y << ", " << maxLoc.x / m1.channels() << ")"
|
||||
<< ", which exceeds \"" << eps_expr << "\", where \""
|
||||
<< expr1 << "\" at (" << maxLoc.y << ", " << maxLoc.x / m1.channels() << ") evaluates to " << printMatVal(m1, maxLoc) << ", \""
|
||||
<< expr2 << "\" at (" << maxLoc.y << ", " << maxLoc.x / m1.channels() << ") evaluates to " << printMatVal(m2, maxLoc) << ", \""
|
||||
<< eps_expr << "\" evaluates to " << eps;
|
||||
}
|
||||
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
double checkSimilarity(InputArray m1, InputArray m2)
|
||||
{
|
||||
Mat diff;
|
||||
matchTemplate(getMat(m1), getMat(m2), diff, CV_TM_CCORR_NORMED);
|
||||
return std::abs(diff.at<float>(0, 0) - 1.f);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Helper structs for value-parameterized tests
|
||||
|
||||
vector<MatDepth> depths(int depth_start, int depth_end)
|
||||
{
|
||||
vector<MatDepth> v;
|
||||
|
||||
v.reserve((depth_end - depth_start + 1));
|
||||
|
||||
for (int depth = depth_start; depth <= depth_end; ++depth)
|
||||
v.push_back(depth);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end)
|
||||
{
|
||||
vector<MatType> v;
|
||||
|
||||
v.reserve((depth_end - depth_start + 1) * (cn_end - cn_start + 1));
|
||||
|
||||
for (int depth = depth_start; depth <= depth_end; ++depth)
|
||||
{
|
||||
for (int cn = cn_start; cn <= cn_end; ++cn)
|
||||
{
|
||||
v.push_back(CV_MAKETYPE(depth, cn));
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
const vector<MatType>& all_types()
|
||||
{
|
||||
static vector<MatType> v = types(CV_8U, CV_64F, 1, 4);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
void cv::gpu::PrintTo(const DeviceInfo& info, ostream* os)
|
||||
{
|
||||
(*os) << info.name();
|
||||
}
|
||||
|
||||
void PrintTo(const UseRoi& useRoi, std::ostream* os)
|
||||
{
|
||||
if (useRoi)
|
||||
(*os) << "sub matrix";
|
||||
else
|
||||
(*os) << "whole matrix";
|
||||
}
|
||||
|
||||
void PrintTo(const Inverse& inverse, std::ostream* os)
|
||||
{
|
||||
if (inverse)
|
||||
(*os) << "inverse";
|
||||
else
|
||||
(*os) << "direct";
|
||||
}
|
||||
|
||||
void showDiff(InputArray gold_, InputArray actual_, double eps)
|
||||
{
|
||||
Mat gold = getMat(gold_);
|
||||
Mat actual = getMat(actual_);
|
||||
|
||||
Mat diff;
|
||||
absdiff(gold, actual, diff);
|
||||
threshold(diff, diff, eps, 255.0, cv::THRESH_BINARY);
|
||||
|
||||
namedWindow("gold", WINDOW_NORMAL);
|
||||
namedWindow("actual", WINDOW_NORMAL);
|
||||
namedWindow("diff", WINDOW_NORMAL);
|
||||
|
||||
imshow("gold", gold);
|
||||
imshow("actual", actual);
|
||||
imshow("diff", diff);
|
||||
|
||||
waitKey();
|
||||
}
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
/*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 "test_precomp.hpp"
|
||||
|
||||
#ifdef HAVE_CUDA
|
||||
|
||||
using namespace std;
|
||||
using namespace cv;
|
||||
using namespace cv::gpu;
|
||||
using namespace cvtest;
|
||||
using namespace testing;
|
||||
using namespace testing::internal;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// random generators
|
||||
|
||||
int randomInt(int minVal, int maxVal)
|
||||
{
|
||||
RNG& rng = TS::ptr()->get_rng();
|
||||
return rng.uniform(minVal, maxVal);
|
||||
}
|
||||
|
||||
double randomDouble(double minVal, double maxVal)
|
||||
{
|
||||
RNG& rng = TS::ptr()->get_rng();
|
||||
return rng.uniform(minVal, maxVal);
|
||||
}
|
||||
|
||||
Size randomSize(int minVal, int maxVal)
|
||||
{
|
||||
return cv::Size(randomInt(minVal, maxVal), randomInt(minVal, maxVal));
|
||||
}
|
||||
|
||||
Scalar randomScalar(double minVal, double maxVal)
|
||||
{
|
||||
return Scalar(randomDouble(minVal, maxVal), randomDouble(minVal, maxVal), randomDouble(minVal, maxVal), randomDouble(minVal, maxVal));
|
||||
}
|
||||
|
||||
Mat randomMat(Size size, int type, double minVal, double maxVal)
|
||||
{
|
||||
return randomMat(TS::ptr()->get_rng(), size, type, minVal, maxVal, false);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// GpuMat create
|
||||
|
||||
cv::gpu::GpuMat createMat(cv::Size size, int type, bool useRoi)
|
||||
{
|
||||
Size size0 = size;
|
||||
|
||||
if (useRoi)
|
||||
{
|
||||
size0.width += randomInt(5, 15);
|
||||
size0.height += randomInt(5, 15);
|
||||
}
|
||||
|
||||
GpuMat d_m(size0, type);
|
||||
|
||||
if (size0 != size)
|
||||
d_m = d_m(Rect((size0.width - size.width) / 2, (size0.height - size.height) / 2, size.width, size.height));
|
||||
|
||||
return d_m;
|
||||
}
|
||||
|
||||
GpuMat loadMat(const Mat& m, bool useRoi)
|
||||
{
|
||||
GpuMat d_m = createMat(m.size(), m.type(), useRoi);
|
||||
d_m.upload(m);
|
||||
return d_m;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image load
|
||||
|
||||
Mat readImage(const std::string& fileName, int flags)
|
||||
{
|
||||
return imread(TS::ptr()->get_data_path() + fileName, flags);
|
||||
}
|
||||
|
||||
Mat readImageType(const std::string& fname, int type)
|
||||
{
|
||||
Mat src = readImage(fname, CV_MAT_CN(type) == 1 ? IMREAD_GRAYSCALE : IMREAD_COLOR);
|
||||
if (CV_MAT_CN(type) == 4)
|
||||
{
|
||||
Mat temp;
|
||||
cvtColor(src, temp, cv::COLOR_BGR2BGRA);
|
||||
swap(src, temp);
|
||||
}
|
||||
src.convertTo(src, CV_MAT_DEPTH(type), CV_MAT_DEPTH(type) == CV_32F ? 1.0 / 255.0 : 1.0);
|
||||
return src;
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image dumping
|
||||
|
||||
void dumpImage(const std::string& fileName, const cv::Mat& image)
|
||||
{
|
||||
cv::imwrite(TS::ptr()->get_data_path() + fileName, image);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Gpu devices
|
||||
|
||||
bool supportFeature(const DeviceInfo& info, FeatureSet feature)
|
||||
{
|
||||
return TargetArchs::builtWith(feature) && info.supports(feature);
|
||||
}
|
||||
|
||||
DeviceManager& DeviceManager::instance()
|
||||
{
|
||||
static DeviceManager obj;
|
||||
return obj;
|
||||
}
|
||||
|
||||
void DeviceManager::load(int i)
|
||||
{
|
||||
devices_.clear();
|
||||
devices_.reserve(1);
|
||||
|
||||
ostringstream msg;
|
||||
|
||||
if (i < 0 || i >= getCudaEnabledDeviceCount())
|
||||
{
|
||||
msg << "Incorrect device number - " << i;
|
||||
throw runtime_error(msg.str());
|
||||
}
|
||||
|
||||
DeviceInfo info(i);
|
||||
|
||||
if (!info.isCompatible())
|
||||
{
|
||||
msg << "Device " << i << " [" << info.name() << "] is NOT compatible with current GPU module build";
|
||||
throw runtime_error(msg.str());
|
||||
}
|
||||
|
||||
devices_.push_back(info);
|
||||
}
|
||||
|
||||
void DeviceManager::loadAll()
|
||||
{
|
||||
int deviceCount = getCudaEnabledDeviceCount();
|
||||
|
||||
devices_.clear();
|
||||
devices_.reserve(deviceCount);
|
||||
|
||||
for (int i = 0; i < deviceCount; ++i)
|
||||
{
|
||||
DeviceInfo info(i);
|
||||
if (info.isCompatible())
|
||||
{
|
||||
devices_.push_back(info);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Additional assertion
|
||||
|
||||
Mat getMat(InputArray arr)
|
||||
{
|
||||
if (arr.kind() == _InputArray::GPU_MAT)
|
||||
{
|
||||
Mat m;
|
||||
arr.getGpuMat().download(m);
|
||||
return m;
|
||||
}
|
||||
|
||||
return arr.getMat();
|
||||
}
|
||||
|
||||
double checkNorm(InputArray m1, InputArray m2)
|
||||
{
|
||||
return norm(getMat(m1), getMat(m2), NORM_INF);
|
||||
}
|
||||
|
||||
void minMaxLocGold(const Mat& src, double* minVal_, double* maxVal_, Point* minLoc_, Point* maxLoc_, const Mat& mask)
|
||||
{
|
||||
if (src.depth() != CV_8S)
|
||||
{
|
||||
minMaxLoc(src, minVal_, maxVal_, minLoc_, maxLoc_, mask);
|
||||
return;
|
||||
}
|
||||
|
||||
// OpenCV's minMaxLoc doesn't support CV_8S type
|
||||
double minVal = numeric_limits<double>::max();
|
||||
Point minLoc(-1, -1);
|
||||
|
||||
double maxVal = -numeric_limits<double>::max();
|
||||
Point maxLoc(-1, -1);
|
||||
|
||||
for (int y = 0; y < src.rows; ++y)
|
||||
{
|
||||
const schar* src_row = src.ptr<signed char>(y);
|
||||
const uchar* mask_row = mask.empty() ? 0 : mask.ptr<unsigned char>(y);
|
||||
|
||||
for (int x = 0; x < src.cols; ++x)
|
||||
{
|
||||
if (!mask_row || mask_row[x])
|
||||
{
|
||||
schar val = src_row[x];
|
||||
|
||||
if (val < minVal)
|
||||
{
|
||||
minVal = val;
|
||||
minLoc = cv::Point(x, y);
|
||||
}
|
||||
|
||||
if (val > maxVal)
|
||||
{
|
||||
maxVal = val;
|
||||
maxLoc = cv::Point(x, y);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (minVal_) *minVal_ = minVal;
|
||||
if (maxVal_) *maxVal_ = maxVal;
|
||||
|
||||
if (minLoc_) *minLoc_ = minLoc;
|
||||
if (maxLoc_) *maxLoc_ = maxLoc;
|
||||
}
|
||||
|
||||
namespace
|
||||
{
|
||||
template <typename T, typename OutT> std::string printMatValImpl(const Mat& m, Point p)
|
||||
{
|
||||
const int cn = m.channels();
|
||||
|
||||
ostringstream ostr;
|
||||
ostr << "(";
|
||||
|
||||
p.x /= cn;
|
||||
|
||||
ostr << static_cast<OutT>(m.at<T>(p.y, p.x * cn));
|
||||
for (int c = 1; c < m.channels(); ++c)
|
||||
{
|
||||
ostr << ", " << static_cast<OutT>(m.at<T>(p.y, p.x * cn + c));
|
||||
}
|
||||
ostr << ")";
|
||||
|
||||
return ostr.str();
|
||||
}
|
||||
|
||||
std::string printMatVal(const Mat& m, Point p)
|
||||
{
|
||||
typedef std::string (*func_t)(const Mat& m, Point p);
|
||||
|
||||
static const func_t funcs[] =
|
||||
{
|
||||
printMatValImpl<uchar, int>, printMatValImpl<schar, int>, printMatValImpl<ushort, int>, printMatValImpl<short, int>,
|
||||
printMatValImpl<int, int>, printMatValImpl<float, float>, printMatValImpl<double, double>
|
||||
};
|
||||
|
||||
return funcs[m.depth()](m, p);
|
||||
}
|
||||
}
|
||||
|
||||
testing::AssertionResult assertMatNear(const char* expr1, const char* expr2, const char* eps_expr, cv::InputArray m1_, cv::InputArray m2_, double eps)
|
||||
{
|
||||
Mat m1 = getMat(m1_);
|
||||
Mat m2 = getMat(m2_);
|
||||
|
||||
if (m1.size() != m2.size())
|
||||
{
|
||||
return AssertionFailure() << "Matrices \"" << expr1 << "\" and \"" << expr2 << "\" have different sizes : \""
|
||||
<< expr1 << "\" [" << PrintToString(m1.size()) << "] vs \""
|
||||
<< expr2 << "\" [" << PrintToString(m2.size()) << "]";
|
||||
}
|
||||
|
||||
if (m1.type() != m2.type())
|
||||
{
|
||||
return AssertionFailure() << "Matrices \"" << expr1 << "\" and \"" << expr2 << "\" have different types : \""
|
||||
<< expr1 << "\" [" << PrintToString(MatType(m1.type())) << "] vs \""
|
||||
<< expr2 << "\" [" << PrintToString(MatType(m2.type())) << "]";
|
||||
}
|
||||
|
||||
Mat diff;
|
||||
absdiff(m1.reshape(1), m2.reshape(1), diff);
|
||||
|
||||
double maxVal = 0.0;
|
||||
Point maxLoc;
|
||||
minMaxLocGold(diff, 0, &maxVal, 0, &maxLoc);
|
||||
|
||||
if (maxVal > eps)
|
||||
{
|
||||
return AssertionFailure() << "The max difference between matrices \"" << expr1 << "\" and \"" << expr2
|
||||
<< "\" is " << maxVal << " at (" << maxLoc.y << ", " << maxLoc.x / m1.channels() << ")"
|
||||
<< ", which exceeds \"" << eps_expr << "\", where \""
|
||||
<< expr1 << "\" at (" << maxLoc.y << ", " << maxLoc.x / m1.channels() << ") evaluates to " << printMatVal(m1, maxLoc) << ", \""
|
||||
<< expr2 << "\" at (" << maxLoc.y << ", " << maxLoc.x / m1.channels() << ") evaluates to " << printMatVal(m2, maxLoc) << ", \""
|
||||
<< eps_expr << "\" evaluates to " << eps;
|
||||
}
|
||||
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
double checkSimilarity(InputArray m1, InputArray m2)
|
||||
{
|
||||
Mat diff;
|
||||
matchTemplate(getMat(m1), getMat(m2), diff, CV_TM_CCORR_NORMED);
|
||||
return std::abs(diff.at<float>(0, 0) - 1.f);
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Helper structs for value-parameterized tests
|
||||
|
||||
vector<MatDepth> depths(int depth_start, int depth_end)
|
||||
{
|
||||
vector<MatDepth> v;
|
||||
|
||||
v.reserve((depth_end - depth_start + 1));
|
||||
|
||||
for (int depth = depth_start; depth <= depth_end; ++depth)
|
||||
v.push_back(depth);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end)
|
||||
{
|
||||
vector<MatType> v;
|
||||
|
||||
v.reserve((depth_end - depth_start + 1) * (cn_end - cn_start + 1));
|
||||
|
||||
for (int depth = depth_start; depth <= depth_end; ++depth)
|
||||
{
|
||||
for (int cn = cn_start; cn <= cn_end; ++cn)
|
||||
{
|
||||
v.push_back(CV_MAKETYPE(depth, cn));
|
||||
}
|
||||
}
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
const vector<MatType>& all_types()
|
||||
{
|
||||
static vector<MatType> v = types(CV_8U, CV_64F, 1, 4);
|
||||
|
||||
return v;
|
||||
}
|
||||
|
||||
void cv::gpu::PrintTo(const DeviceInfo& info, ostream* os)
|
||||
{
|
||||
(*os) << info.name();
|
||||
}
|
||||
|
||||
void PrintTo(const UseRoi& useRoi, std::ostream* os)
|
||||
{
|
||||
if (useRoi)
|
||||
(*os) << "sub matrix";
|
||||
else
|
||||
(*os) << "whole matrix";
|
||||
}
|
||||
|
||||
void PrintTo(const Inverse& inverse, std::ostream* os)
|
||||
{
|
||||
if (inverse)
|
||||
(*os) << "inverse";
|
||||
else
|
||||
(*os) << "direct";
|
||||
}
|
||||
|
||||
void showDiff(InputArray gold_, InputArray actual_, double eps)
|
||||
{
|
||||
Mat gold = getMat(gold_);
|
||||
Mat actual = getMat(actual_);
|
||||
|
||||
Mat diff;
|
||||
absdiff(gold, actual, diff);
|
||||
threshold(diff, diff, eps, 255.0, cv::THRESH_BINARY);
|
||||
|
||||
namedWindow("gold", WINDOW_NORMAL);
|
||||
namedWindow("actual", WINDOW_NORMAL);
|
||||
namedWindow("diff", WINDOW_NORMAL);
|
||||
|
||||
imshow("gold", gold);
|
||||
imshow("actual", actual);
|
||||
imshow("diff", diff);
|
||||
|
||||
waitKey();
|
||||
}
|
||||
|
||||
#endif // HAVE_CUDA
|
||||
|
||||
+296
-296
@@ -1,296 +1,296 @@
|
||||
/*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*/
|
||||
|
||||
#ifndef __OPENCV_TEST_UTILITY_HPP__
|
||||
#define __OPENCV_TEST_UTILITY_HPP__
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// random generators
|
||||
|
||||
int randomInt(int minVal, int maxVal);
|
||||
double randomDouble(double minVal, double maxVal);
|
||||
cv::Size randomSize(int minVal, int maxVal);
|
||||
cv::Scalar randomScalar(double minVal, double maxVal);
|
||||
cv::Mat randomMat(cv::Size size, int type, double minVal = 0.0, double maxVal = 255.0);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// GpuMat create
|
||||
|
||||
cv::gpu::GpuMat createMat(cv::Size size, int type, bool useRoi = false);
|
||||
cv::gpu::GpuMat loadMat(const cv::Mat& m, bool useRoi = false);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image load
|
||||
|
||||
//! read image from testdata folder
|
||||
cv::Mat readImage(const std::string& fileName, int flags = cv::IMREAD_COLOR);
|
||||
|
||||
//! read image from testdata folder and convert it to specified type
|
||||
cv::Mat readImageType(const std::string& fname, int type);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image dumping
|
||||
|
||||
void dumpImage(const std::string& fileName, const cv::Mat& image);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Gpu devices
|
||||
|
||||
//! return true if device supports specified feature and gpu module was built with support the feature.
|
||||
bool supportFeature(const cv::gpu::DeviceInfo& info, cv::gpu::FeatureSet feature);
|
||||
|
||||
class DeviceManager
|
||||
{
|
||||
public:
|
||||
static DeviceManager& instance();
|
||||
|
||||
void load(int i);
|
||||
void loadAll();
|
||||
|
||||
const std::vector<cv::gpu::DeviceInfo>& values() const { return devices_; }
|
||||
|
||||
private:
|
||||
std::vector<cv::gpu::DeviceInfo> devices_;
|
||||
};
|
||||
|
||||
#define ALL_DEVICES testing::ValuesIn(DeviceManager::instance().values())
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Additional assertion
|
||||
|
||||
cv::Mat getMat(cv::InputArray arr);
|
||||
|
||||
double checkNorm(cv::InputArray m1, cv::InputArray m2);
|
||||
|
||||
void minMaxLocGold(const cv::Mat& src, double* minVal_, double* maxVal_ = 0, cv::Point* minLoc_ = 0, cv::Point* maxLoc_ = 0, const cv::Mat& mask = cv::Mat());
|
||||
|
||||
testing::AssertionResult assertMatNear(const char* expr1, const char* expr2, const char* eps_expr, cv::InputArray m1, cv::InputArray m2, double eps);
|
||||
|
||||
#define EXPECT_MAT_NEAR(m1, m2, eps) EXPECT_PRED_FORMAT3(assertMatNear, m1, m2, eps)
|
||||
#define ASSERT_MAT_NEAR(m1, m2, eps) ASSERT_PRED_FORMAT3(assertMatNear, m1, m2, eps)
|
||||
|
||||
#define EXPECT_SCALAR_NEAR(s1, s2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(s1[0], s2[0], eps); \
|
||||
EXPECT_NEAR(s1[1], s2[1], eps); \
|
||||
EXPECT_NEAR(s1[2], s2[2], eps); \
|
||||
EXPECT_NEAR(s1[3], s2[3], eps); \
|
||||
}
|
||||
#define ASSERT_SCALAR_NEAR(s1, s2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(s1[0], s2[0], eps); \
|
||||
ASSERT_NEAR(s1[1], s2[1], eps); \
|
||||
ASSERT_NEAR(s1[2], s2[2], eps); \
|
||||
ASSERT_NEAR(s1[3], s2[3], eps); \
|
||||
}
|
||||
|
||||
#define EXPECT_POINT2_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(p1.x, p2.x, eps); \
|
||||
EXPECT_NEAR(p1.y, p2.y, eps); \
|
||||
}
|
||||
#define ASSERT_POINT2_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(p1.x, p2.x, eps); \
|
||||
ASSERT_NEAR(p1.y, p2.y, eps); \
|
||||
}
|
||||
|
||||
#define EXPECT_POINT3_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(p1.x, p2.x, eps); \
|
||||
EXPECT_NEAR(p1.y, p2.y, eps); \
|
||||
EXPECT_NEAR(p1.z, p2.z, eps); \
|
||||
}
|
||||
#define ASSERT_POINT3_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(p1.x, p2.x, eps); \
|
||||
ASSERT_NEAR(p1.y, p2.y, eps); \
|
||||
ASSERT_NEAR(p1.z, p2.z, eps); \
|
||||
}
|
||||
|
||||
double checkSimilarity(cv::InputArray m1, cv::InputArray m2);
|
||||
|
||||
#define EXPECT_MAT_SIMILAR(mat1, mat2, eps) \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
EXPECT_LE(checkSimilarity(mat1, mat2), eps); \
|
||||
}
|
||||
#define ASSERT_MAT_SIMILAR(mat1, mat2, eps) \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
ASSERT_LE(checkSimilarity(mat1, mat2), eps); \
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Helper structs for value-parameterized tests
|
||||
|
||||
#define PARAM_TEST_CASE(name, ...) struct name : testing::TestWithParam< std::tr1::tuple< __VA_ARGS__ > >
|
||||
#define GET_PARAM(k) std::tr1::get< k >(GetParam())
|
||||
|
||||
namespace cv { namespace gpu
|
||||
{
|
||||
void PrintTo(const DeviceInfo& info, std::ostream* os);
|
||||
}}
|
||||
|
||||
#define DIFFERENT_SIZES testing::Values(cv::Size(128, 128), cv::Size(113, 113))
|
||||
|
||||
// Depth
|
||||
|
||||
using perf::MatDepth;
|
||||
|
||||
//! return vector with depths from specified range.
|
||||
std::vector<MatDepth> depths(int depth_start, int depth_end);
|
||||
|
||||
#define ALL_DEPTH testing::Values(MatDepth(CV_8U), MatDepth(CV_8S), MatDepth(CV_16U), MatDepth(CV_16S), MatDepth(CV_32S), MatDepth(CV_32F), MatDepth(CV_64F))
|
||||
#define DEPTHS(depth_start, depth_end) testing::ValuesIn(depths(depth_start, depth_end))
|
||||
#define DEPTH_PAIRS testing::Values(std::make_pair(MatDepth(CV_8U), MatDepth(CV_8U)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_16U)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_16S)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_16U)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_16S)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_32F), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_32F), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_64F), MatDepth(CV_64F)))
|
||||
|
||||
// Type
|
||||
|
||||
using perf::MatType;
|
||||
|
||||
//! return vector with types from specified range.
|
||||
std::vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end);
|
||||
|
||||
//! return vector with all types (depth: CV_8U-CV_64F, channels: 1-4).
|
||||
const std::vector<MatType>& all_types();
|
||||
|
||||
#define ALL_TYPES testing::ValuesIn(all_types())
|
||||
#define TYPES(depth_start, depth_end, cn_start, cn_end) testing::ValuesIn(types(depth_start, depth_end, cn_start, cn_end))
|
||||
|
||||
// ROI
|
||||
|
||||
class UseRoi
|
||||
{
|
||||
public:
|
||||
inline UseRoi(bool val = false) : val_(val) {}
|
||||
|
||||
inline operator bool() const { return val_; }
|
||||
|
||||
private:
|
||||
bool val_;
|
||||
};
|
||||
|
||||
void PrintTo(const UseRoi& useRoi, std::ostream* os);
|
||||
|
||||
#define WHOLE testing::Values(UseRoi(false))
|
||||
#define SUBMAT testing::Values(UseRoi(true))
|
||||
#define WHOLE_SUBMAT testing::Values(UseRoi(false), UseRoi(true))
|
||||
|
||||
// Direct/Inverse
|
||||
|
||||
class Inverse
|
||||
{
|
||||
public:
|
||||
inline Inverse(bool val = false) : val_(val) {}
|
||||
|
||||
inline operator bool() const { return val_; }
|
||||
|
||||
private:
|
||||
bool val_;
|
||||
};
|
||||
void PrintTo(const Inverse& useRoi, std::ostream* os);
|
||||
#define DIRECT_INVERSE testing::Values(Inverse(false), Inverse(true))
|
||||
|
||||
// Param class
|
||||
|
||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
||||
class name \
|
||||
{ \
|
||||
public: \
|
||||
name ( type arg = type ()) : val_(arg) {} \
|
||||
operator type () const {return val_;} \
|
||||
private: \
|
||||
type val_; \
|
||||
}; \
|
||||
inline void PrintTo( name param, std::ostream* os) \
|
||||
{ \
|
||||
*os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \
|
||||
}
|
||||
|
||||
IMPLEMENT_PARAM_CLASS(Channels, int)
|
||||
|
||||
#define ALL_CHANNELS testing::Values(Channels(1), Channels(2), Channels(3), Channels(4))
|
||||
#define IMAGE_CHANNELS testing::Values(Channels(1), Channels(3), Channels(4))
|
||||
|
||||
// Flags and enums
|
||||
|
||||
CV_ENUM(NormCode, cv::NORM_INF, cv::NORM_L1, cv::NORM_L2, cv::NORM_TYPE_MASK, cv::NORM_RELATIVE, cv::NORM_MINMAX)
|
||||
|
||||
CV_ENUM(Interpolation, cv::INTER_NEAREST, cv::INTER_LINEAR, cv::INTER_CUBIC, cv::INTER_AREA)
|
||||
|
||||
CV_ENUM(BorderType, cv::BORDER_REFLECT101, cv::BORDER_REPLICATE, cv::BORDER_CONSTANT, cv::BORDER_REFLECT, cv::BORDER_WRAP)
|
||||
#define ALL_BORDER_TYPES testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP))
|
||||
|
||||
CV_FLAGS(WarpFlags, cv::INTER_NEAREST, cv::INTER_LINEAR, cv::INTER_CUBIC, cv::WARP_INVERSE_MAP)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Other
|
||||
|
||||
void showDiff(cv::InputArray gold, cv::InputArray actual, double eps);
|
||||
|
||||
#endif // __OPENCV_TEST_UTILITY_HPP__
|
||||
/*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*/
|
||||
|
||||
#ifndef __OPENCV_TEST_UTILITY_HPP__
|
||||
#define __OPENCV_TEST_UTILITY_HPP__
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// random generators
|
||||
|
||||
int randomInt(int minVal, int maxVal);
|
||||
double randomDouble(double minVal, double maxVal);
|
||||
cv::Size randomSize(int minVal, int maxVal);
|
||||
cv::Scalar randomScalar(double minVal, double maxVal);
|
||||
cv::Mat randomMat(cv::Size size, int type, double minVal = 0.0, double maxVal = 255.0);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// GpuMat create
|
||||
|
||||
cv::gpu::GpuMat createMat(cv::Size size, int type, bool useRoi = false);
|
||||
cv::gpu::GpuMat loadMat(const cv::Mat& m, bool useRoi = false);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image load
|
||||
|
||||
//! read image from testdata folder
|
||||
cv::Mat readImage(const std::string& fileName, int flags = cv::IMREAD_COLOR);
|
||||
|
||||
//! read image from testdata folder and convert it to specified type
|
||||
cv::Mat readImageType(const std::string& fname, int type);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Image dumping
|
||||
|
||||
void dumpImage(const std::string& fileName, const cv::Mat& image);
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Gpu devices
|
||||
|
||||
//! return true if device supports specified feature and gpu module was built with support the feature.
|
||||
bool supportFeature(const cv::gpu::DeviceInfo& info, cv::gpu::FeatureSet feature);
|
||||
|
||||
class DeviceManager
|
||||
{
|
||||
public:
|
||||
static DeviceManager& instance();
|
||||
|
||||
void load(int i);
|
||||
void loadAll();
|
||||
|
||||
const std::vector<cv::gpu::DeviceInfo>& values() const { return devices_; }
|
||||
|
||||
private:
|
||||
std::vector<cv::gpu::DeviceInfo> devices_;
|
||||
};
|
||||
|
||||
#define ALL_DEVICES testing::ValuesIn(DeviceManager::instance().values())
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Additional assertion
|
||||
|
||||
cv::Mat getMat(cv::InputArray arr);
|
||||
|
||||
double checkNorm(cv::InputArray m1, cv::InputArray m2);
|
||||
|
||||
void minMaxLocGold(const cv::Mat& src, double* minVal_, double* maxVal_ = 0, cv::Point* minLoc_ = 0, cv::Point* maxLoc_ = 0, const cv::Mat& mask = cv::Mat());
|
||||
|
||||
testing::AssertionResult assertMatNear(const char* expr1, const char* expr2, const char* eps_expr, cv::InputArray m1, cv::InputArray m2, double eps);
|
||||
|
||||
#define EXPECT_MAT_NEAR(m1, m2, eps) EXPECT_PRED_FORMAT3(assertMatNear, m1, m2, eps)
|
||||
#define ASSERT_MAT_NEAR(m1, m2, eps) ASSERT_PRED_FORMAT3(assertMatNear, m1, m2, eps)
|
||||
|
||||
#define EXPECT_SCALAR_NEAR(s1, s2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(s1[0], s2[0], eps); \
|
||||
EXPECT_NEAR(s1[1], s2[1], eps); \
|
||||
EXPECT_NEAR(s1[2], s2[2], eps); \
|
||||
EXPECT_NEAR(s1[3], s2[3], eps); \
|
||||
}
|
||||
#define ASSERT_SCALAR_NEAR(s1, s2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(s1[0], s2[0], eps); \
|
||||
ASSERT_NEAR(s1[1], s2[1], eps); \
|
||||
ASSERT_NEAR(s1[2], s2[2], eps); \
|
||||
ASSERT_NEAR(s1[3], s2[3], eps); \
|
||||
}
|
||||
|
||||
#define EXPECT_POINT2_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(p1.x, p2.x, eps); \
|
||||
EXPECT_NEAR(p1.y, p2.y, eps); \
|
||||
}
|
||||
#define ASSERT_POINT2_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(p1.x, p2.x, eps); \
|
||||
ASSERT_NEAR(p1.y, p2.y, eps); \
|
||||
}
|
||||
|
||||
#define EXPECT_POINT3_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
EXPECT_NEAR(p1.x, p2.x, eps); \
|
||||
EXPECT_NEAR(p1.y, p2.y, eps); \
|
||||
EXPECT_NEAR(p1.z, p2.z, eps); \
|
||||
}
|
||||
#define ASSERT_POINT3_NEAR(p1, p2, eps) \
|
||||
{ \
|
||||
ASSERT_NEAR(p1.x, p2.x, eps); \
|
||||
ASSERT_NEAR(p1.y, p2.y, eps); \
|
||||
ASSERT_NEAR(p1.z, p2.z, eps); \
|
||||
}
|
||||
|
||||
double checkSimilarity(cv::InputArray m1, cv::InputArray m2);
|
||||
|
||||
#define EXPECT_MAT_SIMILAR(mat1, mat2, eps) \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
EXPECT_LE(checkSimilarity(mat1, mat2), eps); \
|
||||
}
|
||||
#define ASSERT_MAT_SIMILAR(mat1, mat2, eps) \
|
||||
{ \
|
||||
ASSERT_EQ(mat1.type(), mat2.type()); \
|
||||
ASSERT_EQ(mat1.size(), mat2.size()); \
|
||||
ASSERT_LE(checkSimilarity(mat1, mat2), eps); \
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Helper structs for value-parameterized tests
|
||||
|
||||
#define PARAM_TEST_CASE(name, ...) struct name : testing::TestWithParam< std::tr1::tuple< __VA_ARGS__ > >
|
||||
#define GET_PARAM(k) std::tr1::get< k >(GetParam())
|
||||
|
||||
namespace cv { namespace gpu
|
||||
{
|
||||
void PrintTo(const DeviceInfo& info, std::ostream* os);
|
||||
}}
|
||||
|
||||
#define DIFFERENT_SIZES testing::Values(cv::Size(128, 128), cv::Size(113, 113))
|
||||
|
||||
// Depth
|
||||
|
||||
using perf::MatDepth;
|
||||
|
||||
//! return vector with depths from specified range.
|
||||
std::vector<MatDepth> depths(int depth_start, int depth_end);
|
||||
|
||||
#define ALL_DEPTH testing::Values(MatDepth(CV_8U), MatDepth(CV_8S), MatDepth(CV_16U), MatDepth(CV_16S), MatDepth(CV_32S), MatDepth(CV_32F), MatDepth(CV_64F))
|
||||
#define DEPTHS(depth_start, depth_end) testing::ValuesIn(depths(depth_start, depth_end))
|
||||
#define DEPTH_PAIRS testing::Values(std::make_pair(MatDepth(CV_8U), MatDepth(CV_8U)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_16U)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_16S)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_8U), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_16U)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_16U), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_16S)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_16S), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_32S)), \
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_32S), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_32F), MatDepth(CV_32F)), \
|
||||
std::make_pair(MatDepth(CV_32F), MatDepth(CV_64F)), \
|
||||
\
|
||||
std::make_pair(MatDepth(CV_64F), MatDepth(CV_64F)))
|
||||
|
||||
// Type
|
||||
|
||||
using perf::MatType;
|
||||
|
||||
//! return vector with types from specified range.
|
||||
std::vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end);
|
||||
|
||||
//! return vector with all types (depth: CV_8U-CV_64F, channels: 1-4).
|
||||
const std::vector<MatType>& all_types();
|
||||
|
||||
#define ALL_TYPES testing::ValuesIn(all_types())
|
||||
#define TYPES(depth_start, depth_end, cn_start, cn_end) testing::ValuesIn(types(depth_start, depth_end, cn_start, cn_end))
|
||||
|
||||
// ROI
|
||||
|
||||
class UseRoi
|
||||
{
|
||||
public:
|
||||
inline UseRoi(bool val = false) : val_(val) {}
|
||||
|
||||
inline operator bool() const { return val_; }
|
||||
|
||||
private:
|
||||
bool val_;
|
||||
};
|
||||
|
||||
void PrintTo(const UseRoi& useRoi, std::ostream* os);
|
||||
|
||||
#define WHOLE testing::Values(UseRoi(false))
|
||||
#define SUBMAT testing::Values(UseRoi(true))
|
||||
#define WHOLE_SUBMAT testing::Values(UseRoi(false), UseRoi(true))
|
||||
|
||||
// Direct/Inverse
|
||||
|
||||
class Inverse
|
||||
{
|
||||
public:
|
||||
inline Inverse(bool val = false) : val_(val) {}
|
||||
|
||||
inline operator bool() const { return val_; }
|
||||
|
||||
private:
|
||||
bool val_;
|
||||
};
|
||||
void PrintTo(const Inverse& useRoi, std::ostream* os);
|
||||
#define DIRECT_INVERSE testing::Values(Inverse(false), Inverse(true))
|
||||
|
||||
// Param class
|
||||
|
||||
#define IMPLEMENT_PARAM_CLASS(name, type) \
|
||||
class name \
|
||||
{ \
|
||||
public: \
|
||||
name ( type arg = type ()) : val_(arg) {} \
|
||||
operator type () const {return val_;} \
|
||||
private: \
|
||||
type val_; \
|
||||
}; \
|
||||
inline void PrintTo( name param, std::ostream* os) \
|
||||
{ \
|
||||
*os << #name << "(" << testing::PrintToString(static_cast< type >(param)) << ")"; \
|
||||
}
|
||||
|
||||
IMPLEMENT_PARAM_CLASS(Channels, int)
|
||||
|
||||
#define ALL_CHANNELS testing::Values(Channels(1), Channels(2), Channels(3), Channels(4))
|
||||
#define IMAGE_CHANNELS testing::Values(Channels(1), Channels(3), Channels(4))
|
||||
|
||||
// Flags and enums
|
||||
|
||||
CV_ENUM(NormCode, cv::NORM_INF, cv::NORM_L1, cv::NORM_L2, cv::NORM_TYPE_MASK, cv::NORM_RELATIVE, cv::NORM_MINMAX)
|
||||
|
||||
CV_ENUM(Interpolation, cv::INTER_NEAREST, cv::INTER_LINEAR, cv::INTER_CUBIC, cv::INTER_AREA)
|
||||
|
||||
CV_ENUM(BorderType, cv::BORDER_REFLECT101, cv::BORDER_REPLICATE, cv::BORDER_CONSTANT, cv::BORDER_REFLECT, cv::BORDER_WRAP)
|
||||
#define ALL_BORDER_TYPES testing::Values(BorderType(cv::BORDER_REFLECT101), BorderType(cv::BORDER_REPLICATE), BorderType(cv::BORDER_CONSTANT), BorderType(cv::BORDER_REFLECT), BorderType(cv::BORDER_WRAP))
|
||||
|
||||
CV_FLAGS(WarpFlags, cv::INTER_NEAREST, cv::INTER_LINEAR, cv::INTER_CUBIC, cv::WARP_INVERSE_MAP)
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Other
|
||||
|
||||
void showDiff(cv::InputArray gold, cv::InputArray actual, double eps);
|
||||
|
||||
#endif // __OPENCV_TEST_UTILITY_HPP__
|
||||
|
||||
Reference in New Issue
Block a user