format files to ANSI C style with coolformat

change the download channels to oclchannles()
fix bugs of arithm functions
perf fix of bilateral
bug fix of split test case
add build_warps functions
This commit is contained in:
niko
2012-10-11 16:22:47 +08:00
parent 69fbc6102c
commit 97156897b2
78 changed files with 15433 additions and 12118 deletions

View File

@@ -55,22 +55,22 @@ namespace cv
//////////////////////////////// oclMat //////////////////////////////// //////////////////////////////// oclMat ////////////////////////////////
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
inline oclMat::oclMat() : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0), download_channels(0) {} inline oclMat::oclMat() : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0) {}
inline oclMat::oclMat(int _rows, int _cols, int _type) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0), download_channels(0) inline oclMat::oclMat(int _rows, int _cols, int _type) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0)
{ {
if( _rows > 0 && _cols > 0 ) if( _rows > 0 && _cols > 0 )
create( _rows, _cols, _type ); create( _rows, _cols, _type );
} }
inline oclMat::oclMat(Size _size, int _type) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0), download_channels(0) inline oclMat::oclMat(Size _size, int _type) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0)
{ {
if( _size.height > 0 && _size.width > 0 ) if( _size.height > 0 && _size.width > 0 )
create( _size.height, _size.width, _type ); create( _size.height, _size.width, _type );
} }
inline oclMat::oclMat(int _rows, int _cols, int _type, const Scalar &_s) inline oclMat::oclMat(int _rows, int _cols, int _type, const Scalar &_s)
: flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0), download_channels(0) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0)
{ {
if(_rows > 0 && _cols > 0) if(_rows > 0 && _cols > 0)
{ {
@@ -80,7 +80,7 @@ namespace cv
} }
inline oclMat::oclMat(Size _size, int _type, const Scalar &_s) inline oclMat::oclMat(Size _size, int _type, const Scalar &_s)
: flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0), download_channels(0) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0)
{ {
if( _size.height > 0 && _size.width > 0 ) if( _size.height > 0 && _size.width > 0 )
{ {
@@ -91,7 +91,7 @@ namespace cv
inline oclMat::oclMat(const oclMat &m) inline oclMat::oclMat(const oclMat &m)
: flags(m.flags), rows(m.rows), cols(m.cols), step(m.step), data(m.data), : flags(m.flags), rows(m.rows), cols(m.cols), step(m.step), data(m.data),
refcount(m.refcount), datastart(m.datastart), dataend(m.dataend), clCxt(m.clCxt), offset(m.offset), wholerows(m.wholerows), wholecols(m.wholecols), download_channels(m.download_channels) refcount(m.refcount), datastart(m.datastart), dataend(m.dataend), clCxt(m.clCxt), offset(m.offset), wholerows(m.wholerows), wholecols(m.wholecols)
{ {
if( refcount ) if( refcount )
CV_XADD(refcount, 1); CV_XADD(refcount, 1);
@@ -99,9 +99,9 @@ namespace cv
inline oclMat::oclMat(int _rows, int _cols, int _type, void *_data, size_t _step) inline oclMat::oclMat(int _rows, int _cols, int _type, void *_data, size_t _step)
: flags(0), rows(0), cols(0), step(0), data(0), refcount(0), : flags(0), rows(0), cols(0), step(0), data(0), refcount(0),
datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0), download_channels(0) datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0)
{ {
cv::Mat m(_rows,_cols,_type,_data,_step); cv::Mat m(_rows, _cols, _type, _data, _step);
upload(m); upload(m);
//size_t minstep = cols * elemSize(); //size_t minstep = cols * elemSize();
//if( step == Mat::AUTO_STEP ) //if( step == Mat::AUTO_STEP )
@@ -121,9 +121,9 @@ namespace cv
inline oclMat::oclMat(Size _size, int _type, void *_data, size_t _step) inline oclMat::oclMat(Size _size, int _type, void *_data, size_t _step)
: flags(0), rows(0), cols(0), : flags(0), rows(0), cols(0),
step(0), data(0), refcount(0), step(0), data(0), refcount(0),
datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0), download_channels(0) datastart(0), dataend(0), offset(0), wholerows(0), wholecols(0)
{ {
cv::Mat m(_size,_type,_data,_step); cv::Mat m(_size, _type, _data, _step);
upload(m); upload(m);
//size_t minstep = cols * elemSize(); //size_t minstep = cols * elemSize();
//if( step == Mat::AUTO_STEP ) //if( step == Mat::AUTO_STEP )
@@ -152,7 +152,6 @@ namespace cv
wholerows = m.wholerows; wholerows = m.wholerows;
wholecols = m.wholecols; wholecols = m.wholecols;
offset = m.offset; offset = m.offset;
download_channels = m.download_channels;
if( rowRange == Range::all() ) if( rowRange == Range::all() )
rows = m.rows; rows = m.rows;
else else
@@ -184,7 +183,7 @@ namespace cv
inline oclMat::oclMat(const oclMat &m, const Rect &roi) inline oclMat::oclMat(const oclMat &m, const Rect &roi)
: flags(m.flags), rows(roi.height), cols(roi.width), : flags(m.flags), rows(roi.height), cols(roi.width),
step(m.step), data(m.data), refcount(m.refcount), step(m.step), data(m.data), refcount(m.refcount),
datastart(m.datastart), dataend(m.dataend), clCxt(m.clCxt), offset(m.offset), wholerows(m.wholerows), wholecols(m.wholecols), download_channels(m.download_channels) datastart(m.datastart), dataend(m.dataend), clCxt(m.clCxt), offset(m.offset), wholerows(m.wholerows), wholecols(m.wholecols)
{ {
flags &= roi.width < m.cols ? ~Mat::CONTINUOUS_FLAG : -1; flags &= roi.width < m.cols ? ~Mat::CONTINUOUS_FLAG : -1;
offset += roi.y * step + roi.x * elemSize(); offset += roi.y * step + roi.x * elemSize();
@@ -197,7 +196,7 @@ namespace cv
} }
inline oclMat::oclMat(const Mat &m) inline oclMat::oclMat(const Mat &m)
: flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0) , offset(0), wholerows(0), wholecols(0), download_channels(0) : flags(0), rows(0), cols(0), step(0), data(0), refcount(0), datastart(0), dataend(0) , offset(0), wholerows(0), wholecols(0)
{ {
//clCxt = Context::getContext(); //clCxt = Context::getContext();
upload(m); upload(m);
@@ -227,7 +226,6 @@ namespace cv
wholerows = m.wholerows; wholerows = m.wholerows;
wholecols = m.wholecols; wholecols = m.wholecols;
refcount = m.refcount; refcount = m.refcount;
download_channels = m.download_channels;
} }
return *this; return *this;
} }
@@ -330,7 +328,6 @@ namespace cv
std::swap( clCxt, b.clCxt ); std::swap( clCxt, b.clCxt );
std::swap( wholerows, b.wholerows ); std::swap( wholerows, b.wholerows );
std::swap( wholecols, b.wholecols ); std::swap( wholecols, b.wholecols );
std::swap( download_channels, b.download_channels);
} }
inline void oclMat::locateROI( Size &wholeSize, Point &ofs ) const inline void oclMat::locateROI( Size &wholeSize, Point &ofs ) const
@@ -366,7 +363,7 @@ namespace cv
offset += (row1 - ofs.y) * step + (col1 - ofs.x) * esz; offset += (row1 - ofs.y) * step + (col1 - ofs.x) * esz;
rows = row2 - row1; rows = row2 - row1;
cols = col2 - col1; cols = col2 - col1;
if( esz *cols == step || rows == 1 ) if( esz * cols == step || rows == 1 )
flags |= Mat::CONTINUOUS_FLAG; flags |= Mat::CONTINUOUS_FLAG;
else else
flags &= ~Mat::CONTINUOUS_FLAG; flags &= ~Mat::CONTINUOUS_FLAG;
@@ -388,7 +385,7 @@ namespace cv
} }
inline size_t oclMat::elemSize() const inline size_t oclMat::elemSize() const
{ {
return CV_ELEM_SIZE(flags); return CV_ELEM_SIZE((CV_MAKE_TYPE(type(), oclchannels())));
} }
inline size_t oclMat::elemSize1() const inline size_t oclMat::elemSize1() const
{ {
@@ -398,6 +395,10 @@ namespace cv
{ {
return CV_MAT_TYPE(flags); return CV_MAT_TYPE(flags);
} }
inline int oclMat::ocltype() const
{
return CV_MAKE_TYPE(depth(), oclchannels());
}
inline int oclMat::depth() const inline int oclMat::depth() const
{ {
return CV_MAT_DEPTH(flags); return CV_MAT_DEPTH(flags);
@@ -406,6 +407,10 @@ namespace cv
{ {
return CV_MAT_CN(flags); return CV_MAT_CN(flags);
} }
inline int oclMat::oclchannels() const
{
return (CV_MAT_CN(flags)) == 3 ? 4 : (CV_MAT_CN(flags));
}
inline size_t oclMat::step1() const inline size_t oclMat::step1() const
{ {
return step / elemSize1(); return step / elemSize1();
@@ -424,28 +429,28 @@ namespace cv
inline uchar *oclMat::ptr(int y) inline uchar *oclMat::ptr(int y)
{ {
CV_DbgAssert( (unsigned)y < (unsigned)rows ); CV_DbgAssert( (unsigned)y < (unsigned)rows );
CV_Error(CV_GpuNotSupported,"This function hasn't been supported yet.\n"); CV_Error(CV_GpuNotSupported, "This function hasn't been supported yet.\n");
return data + step * y; return data + step * y;
} }
inline const uchar *oclMat::ptr(int y) const inline const uchar *oclMat::ptr(int y) const
{ {
CV_DbgAssert( (unsigned)y < (unsigned)rows ); CV_DbgAssert( (unsigned)y < (unsigned)rows );
CV_Error(CV_GpuNotSupported,"This function hasn't been supported yet.\n"); CV_Error(CV_GpuNotSupported, "This function hasn't been supported yet.\n");
return data + step * y; return data + step * y;
} }
template<typename _Tp> inline _Tp *oclMat::ptr(int y) template<typename _Tp> inline _Tp *oclMat::ptr(int y)
{ {
CV_DbgAssert( (unsigned)y < (unsigned)rows ); CV_DbgAssert( (unsigned)y < (unsigned)rows );
CV_Error(CV_GpuNotSupported,"This function hasn't been supported yet.\n"); CV_Error(CV_GpuNotSupported, "This function hasn't been supported yet.\n");
return (_Tp *)(data + step * y); return (_Tp *)(data + step * y);
} }
template<typename _Tp> inline const _Tp *oclMat::ptr(int y) const template<typename _Tp> inline const _Tp *oclMat::ptr(int y) const
{ {
CV_DbgAssert( (unsigned)y < (unsigned)rows ); CV_DbgAssert( (unsigned)y < (unsigned)rows );
CV_Error(CV_GpuNotSupported,"This function hasn't been supported yet.\n"); CV_Error(CV_GpuNotSupported, "This function hasn't been supported yet.\n");
return (const _Tp *)(data + step * y); return (const _Tp *)(data + step * y);
} }
@@ -461,7 +466,7 @@ namespace cv
a.swap(b); a.swap(b);
} }
inline void ensureSizeIsEnough(int rows, int cols, int type, oclMat& m) inline void ensureSizeIsEnough(int rows, int cols, int type, oclMat &m)
{ {
if (m.type() == type && m.rows >= rows && m.cols >= cols) if (m.type() == type && m.rows >= rows && m.cols >= cols)
m = m(Rect(0, 0, cols, rows)); m = m(Rect(0, 0, cols, rows));
@@ -469,10 +474,12 @@ namespace cv
m.create(rows, cols, type); m.create(rows, cols, type);
} }
inline void ensureSizeIsEnough(Size size, int type, oclMat& m) inline void ensureSizeIsEnough(Size size, int type, oclMat &m)
{ {
ensureSizeIsEnough(size.height, size.width, type, m); ensureSizeIsEnough(size.height, size.width, type, m);
} }
} /* end of namespace ocl */ } /* end of namespace ocl */
} /* end of namespace cv */ } /* end of namespace cv */

File diff suppressed because it is too large Load Diff

View File

@@ -42,7 +42,7 @@
#ifndef __OPENCV_TEST_INTERPOLATION_HPP__ #ifndef __OPENCV_TEST_INTERPOLATION_HPP__
#define __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()) 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) 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 (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]);
@@ -52,7 +52,7 @@ template <typename T> T readVal(const cv::Mat& src, int y, int x, int c, int bor
template <typename T> struct NearestInterpolator 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()) 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, cvFloor(y), cvFloor(x), c, border_type, borderVal); return readVal<T>(src, cvFloor(y), cvFloor(x), c, border_type, borderVal);
} }
@@ -60,7 +60,7 @@ template <typename T> struct NearestInterpolator
template <typename T> struct LinearInterpolator 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()) static T getValue(const cv::Mat &src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
{ {
x -= 0.5f; x -= 0.5f;
y -= 0.5f; y -= 0.5f;
@@ -85,7 +85,7 @@ template <typename T> struct CubicInterpolator
{ {
static float getValue(float p[4], float x) static float getValue(float p[4], float x)
{ {
return p[1] + 0.5 * x * (p[2] - p[0] + x*(2.0*p[0] - 5.0*p[1] + 4.0*p[2] - p[3] + x*(3.0*(p[1] - p[2]) + p[3] - p[0]))); return p[1] + 0.5 * x * (p[2] - p[0] + x * (2.0 * p[0] - 5.0 * p[1] + 4.0 * p[2] - p[3] + x * (3.0 * (p[1] - p[2]) + p[3] - p[0])));
} }
static float getValue(float p[4][4], float x, float y) static float getValue(float p[4][4], float x, float y)
@@ -100,7 +100,7 @@ template <typename T> struct CubicInterpolator
return getValue(arr, y); return getValue(arr, y);
} }
static T getValue(const cv::Mat& src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar()) static T getValue(const cv::Mat &src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar())
{ {
int ix = cvRound(x); int ix = cvRound(x);
int iy = cvRound(y); int iy = cvRound(y);

View File

@@ -74,7 +74,7 @@ void print_info()
} }
int main(int argc, char** argv) int main(int argc, char **argv)
{ {
std::vector<cv::ocl::Info> oclinfo; std::vector<cv::ocl::Info> oclinfo;
TS::ptr()->init("ocl"); TS::ptr()->init("ocl");
@@ -82,7 +82,7 @@ int main(int argc, char** argv)
print_info(); print_info();
int devnums = getDevice(oclinfo); int devnums = getDevice(oclinfo);
if(devnums<1) if(devnums < 1)
{ {
std::cout << "no device found\n"; std::cout << "no device found\n";
return -1; return -1;

File diff suppressed because it is too large Load Diff

View File

@@ -101,7 +101,7 @@ PARAM_TEST_CASE(Canny1, AppertureSize, L2gradient)
TEST_P(Canny1, Performance) TEST_P(Canny1, Performance)
{ {
cv::Mat img = readImage(FILTER_IMAGE,cv::IMREAD_GRAYSCALE); cv::Mat img = readImage(FILTER_IMAGE, cv::IMREAD_GRAYSCALE);
ASSERT_FALSE(img.empty()); ASSERT_FALSE(img.empty());
double low_thresh = 100.0; double low_thresh = 100.0;
@@ -110,19 +110,19 @@ TEST_P(Canny1, Performance)
cv::Mat edges_gold; cv::Mat edges_gold;
cv::ocl::oclMat edges; cv::ocl::oclMat edges;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
cv::ocl::oclMat ocl_img = cv::ocl::oclMat(img);//upload cv::ocl::oclMat ocl_img = cv::ocl::oclMat(img);//upload
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::Canny(ocl_img, edges, low_thresh, high_thresh, apperture_size, useL2gradient); cv::ocl::Canny(ocl_img, edges, low_thresh, high_thresh, apperture_size, useL2gradient);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
@@ -134,14 +134,14 @@ TEST_P(Canny1, Performance)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }

View File

@@ -75,24 +75,24 @@ PARAM_TEST_CASE(ColumnSum)
TEST_F(ColumnSum, Performance) TEST_F(ColumnSum, Performance)
{ {
cv::Size size(MWIDTH,MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
cv::Mat src = randomMat(size, CV_32FC1); cv::Mat src = randomMat(size, CV_32FC1);
cv::ocl::oclMat d_dst; cv::ocl::oclMat d_dst;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
cv::ocl::oclMat d_src(src); cv::ocl::oclMat d_src(src);
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::columnSum(d_src,d_dst); cv::ocl::columnSum(d_src, d_dst);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -103,13 +103,13 @@ TEST_F(ColumnSum, Performance)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;

View File

@@ -69,19 +69,19 @@ TEST_P(Dft, C2C)
cv::ocl::oclMat d_b; cv::ocl::oclMat d_b;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
cv::ocl::oclMat ga=cv::ocl::oclMat(a);//upload cv::ocl::oclMat ga = cv::ocl::oclMat(a); //upload
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::dft(ga, d_b, a.size(), flags); cv::ocl::dft(ga, d_b, a.size(), flags);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
@@ -93,13 +93,13 @@ TEST_P(Dft, C2C)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }

View File

@@ -101,7 +101,7 @@ PARAM_TEST_CASE(FilterTestBase, MatType, bool)
{ {
type = GET_PARAM(0); type = GET_PARAM(0);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
mat1 = randomMat(rng, size, type, 5, 16, false); mat1 = randomMat(rng, size, type, 5, 16, false);
@@ -117,7 +117,7 @@ PARAM_TEST_CASE(FilterTestBase, MatType, bool)
void random_roi() void random_roi()
{ {
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
//randomize ROI //randomize ROI
roicols = rng.uniform(1, mat1.cols); roicols = rng.uniform(1, mat1.cols);
@@ -131,17 +131,17 @@ PARAM_TEST_CASE(FilterTestBase, MatType, bool)
maskx = rng.uniform(0, mask.cols - roicols); maskx = rng.uniform(0, mask.cols - roicols);
masky = rng.uniform(0, mask.rows - roirows); masky = rng.uniform(0, mask.rows - roirows);
mat1_roi = mat1(Rect(src1x,src1y,roicols,roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
mat2_roi = mat2(Rect(src2x,src2y,roicols,roirows)); mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows));
mask_roi = mask(Rect(maskx,masky,roicols,roirows)); mask_roi = mask(Rect(maskx, masky, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
dst1_roi = dst1(Rect(dstx,dsty,roicols,roirows)); dst1_roi = dst1(Rect(dstx, dsty, roicols, roirows));
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gdst1_whole = dst1; gdst1_whole = dst1;
gdst1 = gdst1_whole(Rect(dstx,dsty,roicols,roirows)); gdst1 = gdst1_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
gmat2 = mat2_roi; gmat2 = mat2_roi;
@@ -188,7 +188,7 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int)
ksize = GET_PARAM(1); ksize = GET_PARAM(1);
bordertype = GET_PARAM(2); bordertype = GET_PARAM(2);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
mat1 = randomMat(rng, size, type, 5, 16, false); mat1 = randomMat(rng, size, type, 5, 16, false);
@@ -205,13 +205,14 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int)
{ {
if(b) if(b)
{ {
roicols = mat1.cols-1; roicols = mat1.cols - 1;
roirows = mat1.rows-1; roirows = mat1.rows - 1;
src1x = 1; src1x = 1;
src1y = 1; src1y = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat1.cols; roicols = mat1.cols;
roirows = mat1.rows; roirows = mat1.rows;
@@ -221,8 +222,8 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int)
dsty = 0; dsty = 0;
}; };
mat1_roi = mat1(Rect(src1x,src1y,roicols,roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
} }
@@ -231,31 +232,32 @@ PARAM_TEST_CASE(Blur, MatType, cv::Size, int)
TEST_P(Blur, Mat) TEST_P(Blur, Mat)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
t0 = (double)cvGetTickCount();//cpu start t0 = (double)cvGetTickCount();//cpu start
cv::blur(mat1_roi, dst_roi, ksize, Point(-1,-1), bordertype); cv::blur(mat1_roi, dst_roi, ksize, Point(-1, -1), bordertype);
t0 = (double)cvGetTickCount() - t0;//cpu end t0 = (double)cvGetTickCount() - t0;//cpu end
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::blur(gmat1, gdst, ksize, Point(-1,-1), bordertype); cv::ocl::blur(gmat1, gdst, ksize, Point(-1, -1), bordertype);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
gdst_whole.download (cpu_dst);//download gdst_whole.download (cpu_dst);//download
@@ -264,25 +266,39 @@ TEST_P(Blur, Mat)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
cv::ocl::blur(gmat1, gdst, ksize, Point(-1,-1), bordertype); {
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::blur(gmat1, gdst, ksize, Point(-1, -1), bordertype);
}; };
#endif #endif
@@ -324,7 +340,7 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int)
type = GET_PARAM(0); type = GET_PARAM(0);
ksize = GET_PARAM(1); ksize = GET_PARAM(1);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size = cv::Size(MWIDTH, MHEIGHT); cv::Size size = cv::Size(MWIDTH, MHEIGHT);
mat = randomMat(rng, size, type, 5, 16, false); mat = randomMat(rng, size, type, 5, 16, false);
@@ -340,13 +356,14 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int)
{ {
if(b) if(b)
{ {
roicols = mat.cols-1; roicols = mat.cols - 1;
roirows = mat.rows-1; roirows = mat.rows - 1;
srcx = 1; srcx = 1;
srcy = 1; srcy = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat.cols; roicols = mat.cols;
roirows = mat.rows; roirows = mat.rows;
@@ -356,8 +373,8 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int)
dsty = 0; dsty = 0;
}; };
mat_roi = mat(Rect(srcx,srcy,roicols,roirows)); mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
} }
@@ -369,17 +386,18 @@ TEST_P(Laplacian, Accuracy)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -389,10 +407,10 @@ TEST_P(Laplacian, Accuracy)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::Laplacian(gmat, gdst, -1, ksize, 1); cv::ocl::Laplacian(gmat, gdst, -1, ksize, 1);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -402,26 +420,40 @@ TEST_P(Laplacian, Accuracy)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::Laplacian(gmat, gdst, -1, ksize, 1); cv::ocl::Laplacian(gmat, gdst, -1, ksize, 1);
}; };
#endif #endif
@@ -467,13 +499,13 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, bool)
type = GET_PARAM(0); type = GET_PARAM(0);
// iterations = GET_PARAM(1); // iterations = GET_PARAM(1);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size = cv::Size(MWIDTH, MHEIGHT); cv::Size size = cv::Size(MWIDTH, MHEIGHT);
mat1 = randomMat(rng, size, type, 5, 16, false); mat1 = randomMat(rng, size, type, 5, 16, false);
dst = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false);
// rng.fill(kernel, cv::RNG::UNIFORM, cv::Scalar::all(0), cv::Scalar::all(3)); // rng.fill(kernel, cv::RNG::UNIFORM, cv::Scalar::all(0), cv::Scalar::all(3));
kernel = randomMat(rng, Size(3,3), CV_8UC1, 0, 3, false); kernel = randomMat(rng, Size(3, 3), CV_8UC1, 0, 3, false);
//int devnums = getDevice(oclinfo); //int devnums = getDevice(oclinfo);
//CV_Assert(devnums > 0); //CV_Assert(devnums > 0);
////if you want to use undefault device, set it here ////if you want to use undefault device, set it here
@@ -485,13 +517,14 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, bool)
{ {
if(b) if(b)
{ {
roicols = mat1.cols-1; roicols = mat1.cols - 1;
roirows = mat1.rows-1; roirows = mat1.rows - 1;
src1x = 1; src1x = 1;
src1y = 1; src1y = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat1.cols; roicols = mat1.cols;
roirows = mat1.rows; roirows = mat1.rows;
@@ -501,8 +534,8 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, bool)
dsty = 0; dsty = 0;
}; };
mat1_roi = mat1(Rect(src1x,src1y,roicols,roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
} }
@@ -510,22 +543,23 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, bool)
// erode // erode
struct Erode : ErodeDilateBase{}; struct Erode : ErodeDilateBase {};
TEST_P(Erode, Mat) TEST_P(Erode, Mat)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -535,11 +569,11 @@ TEST_P(Erode, Mat)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::erode(gmat1, gdst, kernel); cv::ocl::erode(gmat1, gdst, kernel);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -549,25 +583,39 @@ TEST_P(Erode, Mat)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::erode(gmat1, gdst, kernel); cv::ocl::erode(gmat1, gdst, kernel);
}; };
#endif #endif
@@ -576,23 +624,24 @@ TEST_P(Erode, Mat)
// dilate // dilate
struct Dilate : ErodeDilateBase{}; struct Dilate : ErodeDilateBase {};
TEST_P(Dilate, Mat) TEST_P(Dilate, Mat)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
t0 = (double)cvGetTickCount();//cpu start t0 = (double)cvGetTickCount();//cpu start
@@ -601,10 +650,10 @@ TEST_P(Dilate, Mat)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::dilate(gmat1, gdst, kernel); cv::ocl::dilate(gmat1, gdst, kernel);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -614,24 +663,38 @@ TEST_P(Dilate, Mat)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::dilate(gmat1, gdst, kernel); cv::ocl::dilate(gmat1, gdst, kernel);
}; };
#endif #endif
@@ -676,9 +739,10 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int)
dy = GET_PARAM(2); dy = GET_PARAM(2);
ksize = GET_PARAM(3); ksize = GET_PARAM(3);
bordertype = GET_PARAM(4); bordertype = GET_PARAM(4);
dx = 2; dy=0; dx = 2;
dy = 0;
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size = cv::Size(MWIDTH, MHEIGHT); cv::Size size = cv::Size(MWIDTH, MHEIGHT);
mat1 = randomMat(rng, size, type, 5, 16, false); mat1 = randomMat(rng, size, type, 5, 16, false);
@@ -694,13 +758,14 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int)
{ {
if(b) if(b)
{ {
roicols = mat1.cols-1; roicols = mat1.cols - 1;
roirows = mat1.rows-1; roirows = mat1.rows - 1;
src1x = 1; src1x = 1;
src1y = 1; src1y = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat1.cols; roicols = mat1.cols;
roirows = mat1.rows; roirows = mat1.rows;
@@ -710,8 +775,8 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int)
dsty = 0; dsty = 0;
}; };
mat1_roi = mat1(Rect(src1x,src1y,roicols,roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
} }
@@ -720,17 +785,18 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int)
TEST_P(Sobel, Mat) TEST_P(Sobel, Mat)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -740,11 +806,11 @@ TEST_P(Sobel, Mat)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::Sobel(gmat1, gdst,-1, dx,dy,ksize,/*scale*/0.00001,/*delta*/0, bordertype); cv::ocl::Sobel(gmat1, gdst, -1, dx, dy, ksize,/*scale*/0.00001,/*delta*/0, bordertype);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
gdst_whole.download (cpu_dst);//download gdst_whole.download (cpu_dst);//download
@@ -753,25 +819,39 @@ TEST_P(Sobel, Mat)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
cv::ocl::Sobel(gmat1, gdst,-1, dx,dy,ksize,/*scale*/0.00001,/*delta*/0, bordertype); {
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::Sobel(gmat1, gdst, -1, dx, dy, ksize,/*scale*/0.00001,/*delta*/0, bordertype);
}; };
#endif #endif
@@ -814,9 +894,10 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int)
dx = GET_PARAM(1); dx = GET_PARAM(1);
dy = GET_PARAM(2); dy = GET_PARAM(2);
bordertype = GET_PARAM(3); bordertype = GET_PARAM(3);
dx = 1; dy=0; dx = 1;
dy = 0;
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size = cv::Size(MWIDTH, MHEIGHT); cv::Size size = cv::Size(MWIDTH, MHEIGHT);
mat1 = randomMat(rng, size, type, 5, 16, false); mat1 = randomMat(rng, size, type, 5, 16, false);
@@ -832,13 +913,14 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int)
{ {
if(b) if(b)
{ {
roicols = mat1.cols-1; roicols = mat1.cols - 1;
roirows = mat1.rows-1; roirows = mat1.rows - 1;
src1x = 1; src1x = 1;
src1y = 1; src1y = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat1.cols; roicols = mat1.cols;
roirows = mat1.rows; roirows = mat1.rows;
@@ -848,8 +930,8 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int)
dsty = 0; dsty = 0;
}; };
mat1_roi = mat1(Rect(src1x,src1y,roicols,roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
} }
}; };
@@ -857,17 +939,18 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int)
TEST_P(Scharr, Mat) TEST_P(Scharr, Mat)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -877,11 +960,11 @@ TEST_P(Scharr, Mat)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::Scharr(gmat1, gdst,-1, dx,dy,/*scale*/1,/*delta*/0, bordertype); cv::ocl::Scharr(gmat1, gdst, -1, dx, dy,/*scale*/1,/*delta*/0, bordertype);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
gdst_whole.download (cpu_dst);//download gdst_whole.download (cpu_dst);//download
@@ -890,26 +973,40 @@ TEST_P(Scharr, Mat)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
cv::ocl::Scharr(gmat1, gdst,-1, dx,dy,/*scale*/1,/*delta*/0, bordertype); {
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::Scharr(gmat1, gdst, -1, dx, dy,/*scale*/1,/*delta*/0, bordertype);
}; };
#endif #endif
@@ -955,7 +1052,7 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int)
ksize = GET_PARAM(1); ksize = GET_PARAM(1);
bordertype = GET_PARAM(2); bordertype = GET_PARAM(2);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size = cv::Size(MWIDTH, MHEIGHT); cv::Size size = cv::Size(MWIDTH, MHEIGHT);
sigma1 = rng.uniform(0.1, 1.0); sigma1 = rng.uniform(0.1, 1.0);
@@ -974,13 +1071,14 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int)
{ {
if(b) if(b)
{ {
roicols = mat1.cols-1; roicols = mat1.cols - 1;
roirows = mat1.rows-1; roirows = mat1.rows - 1;
src1x = 1; src1x = 1;
src1y = 1; src1y = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat1.cols; roicols = mat1.cols;
roirows = mat1.rows; roirows = mat1.rows;
@@ -990,8 +1088,8 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int)
dsty = 0; dsty = 0;
}; };
mat1_roi = mat1(Rect(src1x,src1y,roicols,roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
} }
@@ -1000,17 +1098,18 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int)
TEST_P(GaussianBlur, Mat) TEST_P(GaussianBlur, Mat)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -1020,10 +1119,10 @@ TEST_P(GaussianBlur, Mat)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::GaussianBlur(gmat1, gdst, ksize, sigma1, sigma2, bordertype); cv::ocl::GaussianBlur(gmat1, gdst, ksize, sigma1, sigma2, bordertype);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -1033,25 +1132,39 @@ TEST_P(GaussianBlur, Mat)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat1 = mat1_roi; gmat1 = mat1_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::GaussianBlur(gmat1, gdst, ksize, sigma1, sigma2, bordertype); cv::ocl::GaussianBlur(gmat1, gdst, ksize, sigma1, sigma2, bordertype);
}; };
#endif #endif

View File

@@ -71,12 +71,12 @@ TEST_P(Gemm, Performance)
cv::Mat c = randomMat(mat_size, type, 0.0, 10.0); cv::Mat c = randomMat(mat_size, type, 0.0, 10.0);
cv::ocl::oclMat ocl_dst; cv::ocl::oclMat ocl_dst;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
@@ -85,8 +85,8 @@ TEST_P(Gemm, Performance)
cv::ocl::oclMat gb = cv::ocl::oclMat(b);//upload cv::ocl::oclMat gb = cv::ocl::oclMat(b);//upload
cv::ocl::oclMat gc = cv::ocl::oclMat(c);//upload cv::ocl::oclMat gc = cv::ocl::oclMat(c);//upload
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::gemm(ga, gb, 1.0,gc, 1.0, ocl_dst, flags); cv::ocl::gemm(ga, gb, 1.0, gc, 1.0, ocl_dst, flags);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -97,12 +97,12 @@ TEST_P(Gemm, Performance)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }

View File

@@ -53,7 +53,13 @@ using namespace testing;
using namespace std; using namespace std;
using namespace cv; using namespace cv;
struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } }; struct getRect
{
Rect operator ()(const CvAvgComp &e) const
{
return e.rect;
}
};
PARAM_TEST_CASE(HaarTestBase, int, int) PARAM_TEST_CASE(HaarTestBase, int, int)
{ {
@@ -68,8 +74,8 @@ PARAM_TEST_CASE(HaarTestBase, int, int)
virtual void SetUp() virtual void SetUp()
{ {
scale = 1.0; scale = 1.0;
index=0; index = 0;
string cascadeName="../../../data/haarcascades/haarcascade_frontalface_alt.xml"; string cascadeName = "../../../data/haarcascades/haarcascade_frontalface_alt.xml";
if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName))) if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName)))
{ {
@@ -98,7 +104,7 @@ TEST_F(Haar, FaceDetect)
if(img.empty()) if(img.empty())
{ {
std::cout << "Couldn't read test" << index <<".jpg" << std::endl; std::cout << "Couldn't read test" << index << ".jpg" << std::endl;
return ; return ;
} }
@@ -106,45 +112,46 @@ TEST_F(Haar, FaceDetect)
double t = 0; double t = 0;
vector<Rect> faces, oclfaces; vector<Rect> faces, oclfaces;
const static Scalar colors[] = { CV_RGB(0,0,255), const static Scalar colors[] = { CV_RGB(0, 0, 255),
CV_RGB(0,128,255), CV_RGB(0, 128, 255),
CV_RGB(0,255,255), CV_RGB(0, 255, 255),
CV_RGB(0,255,0), CV_RGB(0, 255, 0),
CV_RGB(255,128,0), CV_RGB(255, 128, 0),
CV_RGB(255,255,0), CV_RGB(255, 255, 0),
CV_RGB(255,0,0), CV_RGB(255, 0, 0),
CV_RGB(255,0,255)} ; CV_RGB(255, 0, 255)
} ;
Mat gray, smallImg(cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); Mat gray, smallImg(cvRound (img.rows / scale), cvRound(img.cols / scale), CV_8UC1 );
MemStorage storage(cvCreateMemStorage(0)); MemStorage storage(cvCreateMemStorage(0));
cvtColor( img, gray, CV_BGR2GRAY ); cvtColor( img, gray, CV_BGR2GRAY );
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
equalizeHist( smallImg, smallImg ); equalizeHist( smallImg, smallImg );
t = (double)cvGetTickCount(); t = (double)cvGetTickCount();
for(int k= 0; k<LOOP_TIMES; k++) for(int k = 0; k < LOOP_TIMES; k++)
{ {
cpucascade.detectMultiScale( smallImg, faces, 1.1, cpucascade.detectMultiScale( smallImg, faces, 1.1,
3, 0 3, 0
|CV_HAAR_SCALE_IMAGE | CV_HAAR_SCALE_IMAGE
, Size(30,30), Size(0, 0) ); , Size(30, 30), Size(0, 0) );
} }
t = (double)cvGetTickCount() - t ; t = (double)cvGetTickCount() - t ;
printf( "cpudetection time = %g ms\n", t/(LOOP_TIMES*(double)cvGetTickFrequency()*1000.) ); printf( "cpudetection time = %g ms\n", t / (LOOP_TIMES * (double)cvGetTickFrequency() * 1000.) );
cv::ocl::oclMat image; cv::ocl::oclMat image;
CvSeq* _objects; CvSeq *_objects;
t = (double)cvGetTickCount(); t = (double)cvGetTickCount();
for(int k= 0; k<LOOP_TIMES; k++) for(int k = 0; k < LOOP_TIMES; k++)
{ {
image.upload(smallImg); image.upload(smallImg);
_objects = cascade.oclHaarDetectObjects( image, storage, 1.1, _objects = cascade.oclHaarDetectObjects( image, storage, 1.1,
3, 0 3, 0
|CV_HAAR_SCALE_IMAGE | CV_HAAR_SCALE_IMAGE
, Size(30,30), Size(0, 0) ); , Size(30, 30), Size(0, 0) );
} }
t = (double)cvGetTickCount() - t ; t = (double)cvGetTickCount() - t ;
printf( "ocldetection time = %g ms\n", t/(LOOP_TIMES*(double)cvGetTickFrequency()*1000.) ); printf( "ocldetection time = %g ms\n", t / (LOOP_TIMES * (double)cvGetTickFrequency() * 1000.) );
vector<CvAvgComp> vecAvgComp; vector<CvAvgComp> vecAvgComp;
Seq<CvAvgComp>(_objects).copyTo(vecAvgComp); Seq<CvAvgComp>(_objects).copyTo(vecAvgComp);
oclfaces.resize(vecAvgComp.size()); oclfaces.resize(vecAvgComp.size());

View File

@@ -100,7 +100,7 @@ PARAM_TEST_CASE(HOG, WinSizw48, bool)
TEST_P(HOG, Performance) TEST_P(HOG, Performance)
{ {
cv::Mat img = readImage(FILTER_IMAGE,cv::IMREAD_GRAYSCALE); cv::Mat img = readImage(FILTER_IMAGE, cv::IMREAD_GRAYSCALE);
ASSERT_FALSE(img.empty()); ASSERT_FALSE(img.empty());
// define HOG related arguments // define HOG related arguments
@@ -110,7 +110,7 @@ TEST_P(HOG, Performance)
float hit_threshold = 1.4; float hit_threshold = 1.4;
bool hit_threshold_auto = true; bool hit_threshold_auto = true;
int win_width = is48? 48 : 64; int win_width = is48 ? 48 : 64;
int win_stride_width = 8; int win_stride_width = 8;
int win_stride_height = 8; int win_stride_height = 8;
@@ -125,18 +125,18 @@ TEST_P(HOG, Performance)
gpu_hog.setSVMDetector(detector); gpu_hog.setSVMDetector(detector);
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
ocl::oclMat d_src(img);//upload ocl::oclMat d_src(img);//upload
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
vector<Rect> found; vector<Rect> found;
gpu_hog.detectMultiScale(d_src, found, hit_threshold, win_stride, gpu_hog.detectMultiScale(d_src, found, hit_threshold, win_stride,
@@ -151,14 +151,14 @@ TEST_P(HOG, Performance)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }

File diff suppressed because it is too large Load Diff

View File

@@ -87,7 +87,7 @@ IMPLEMENT_PARAM_CLASS(Channels, int)
IMPLEMENT_PARAM_CLASS(TemplateSize, cv::Size); IMPLEMENT_PARAM_CLASS(TemplateSize, cv::Size);
const char* TEMPLATE_METHOD_NAMES[6] = {"TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR", "TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED"}; const char *TEMPLATE_METHOD_NAMES[6] = {"TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR", "TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED"};
PARAM_TEST_CASE(MatchTemplate, cv::Size, TemplateSize, Channels, TemplateMethod) PARAM_TEST_CASE(MatchTemplate, cv::Size, TemplateSize, Channels, TemplateMethod)
{ {
@@ -112,8 +112,8 @@ struct MatchTemplate8U : MatchTemplate {};
TEST_P(MatchTemplate8U, Performance) TEST_P(MatchTemplate8U, Performance)
{ {
std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl; std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl;
std::cout << "Image Size: (" << size.width << ", " << size.height << ")"<< std::endl; std::cout << "Image Size: (" << size.width << ", " << size.height << ")" << std::endl;
std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")"<< std::endl; std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")" << std::endl;
std::cout << "Channels: " << cn << std::endl; std::cout << "Channels: " << cn << std::endl;
cv::Mat image = randomMat(size, CV_MAKETYPE(CV_8U, cn)); cv::Mat image = randomMat(size, CV_MAKETYPE(CV_8U, cn));
@@ -125,12 +125,12 @@ TEST_P(MatchTemplate8U, Performance)
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
@@ -138,7 +138,7 @@ TEST_P(MatchTemplate8U, Performance)
cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload
cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method); cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
@@ -150,13 +150,13 @@ TEST_P(MatchTemplate8U, Performance)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
@@ -166,8 +166,8 @@ struct MatchTemplate32F : MatchTemplate {};
TEST_P(MatchTemplate32F, Performance) TEST_P(MatchTemplate32F, Performance)
{ {
std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl; std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl;
std::cout << "Image Size: (" << size.width << ", " << size.height << ")"<< std::endl; std::cout << "Image Size: (" << size.width << ", " << size.height << ")" << std::endl;
std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")"<< std::endl; std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")" << std::endl;
std::cout << "Channels: " << cn << std::endl; std::cout << "Channels: " << cn << std::endl;
cv::Mat image = randomMat(size, CV_MAKETYPE(CV_32F, cn)); cv::Mat image = randomMat(size, CV_MAKETYPE(CV_32F, cn));
cv::Mat templ = randomMat(templ_size, CV_MAKETYPE(CV_32F, cn)); cv::Mat templ = randomMat(templ_size, CV_MAKETYPE(CV_32F, cn));
@@ -178,11 +178,11 @@ TEST_P(MatchTemplate32F, Performance)
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES; j ++) for(int j = 0; j < LOOP_TIMES; j ++)
{ {
@@ -191,7 +191,7 @@ TEST_P(MatchTemplate32F, Performance)
cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload cv::ocl::oclMat ocl_image = cv::ocl::oclMat(image);//upload
cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload cv::ocl::oclMat ocl_templ = cv::ocl::oclMat(templ);//upload
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method); cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
@@ -200,14 +200,14 @@ TEST_P(MatchTemplate32F, Performance)
t1 = (double)cvGetTickCount() - t1;//gpu end1 t1 = (double)cvGetTickCount() - t1;//gpu end1
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
@@ -216,15 +216,15 @@ TEST_P(MatchTemplate32F, Performance)
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U, INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U,
testing::Combine( testing::Combine(
testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT),cv::Size(1800, 1500)), testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT), cv::Size(1800, 1500)),
testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/),
testing::Values(Channels(1), Channels(4)/*, Channels(3)*/), testing::Values(Channels(1), Channels(4)/*, Channels(3)*/),
ALL_TEMPLATE_METHODS ALL_TEMPLATE_METHODS
) )
); );
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine( INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine(
testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT),cv::Size(1800, 1500)), testing::Values(cv::Size(1280, 1024), cv::Size(MWIDTH, MHEIGHT), cv::Size(1800, 1500)),
testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/),
testing::Values(Channels(1), Channels(4) /*, Channels(3)*/), testing::Values(Channels(1), Channels(4) /*, Channels(3)*/),
testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR)))); testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR))));

View File

@@ -85,7 +85,7 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType)
type = GET_PARAM(0); type = GET_PARAM(0);
dst_type = GET_PARAM(1); dst_type = GET_PARAM(1);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
mat = randomMat(rng, size, type, 5, 16, false); mat = randomMat(rng, size, type, 5, 16, false);
@@ -103,13 +103,14 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType)
if(b) if(b)
{ {
//randomize ROI //randomize ROI
roicols = mat.cols-1; //start roicols = mat.cols - 1; //start
roirows = mat.rows-1; roirows = mat.rows - 1;
srcx = 1; srcx = 1;
srcy = 1; srcy = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat.cols; roicols = mat.cols;
roirows = mat.rows; roirows = mat.rows;
@@ -119,8 +120,8 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType)
dsty = 0; dsty = 0;
}; };
mat_roi = mat(Rect(srcx,srcy,roicols,roirows)); mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
//gdst_whole = dst; //gdst_whole = dst;
//gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); //gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows));
@@ -130,22 +131,23 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType)
}; };
struct ConvertTo :ConvertToTestBase {}; struct ConvertTo : ConvertToTestBase {};
TEST_P(ConvertTo, Accuracy) TEST_P(ConvertTo, Accuracy)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -155,10 +157,10 @@ TEST_P(ConvertTo, Accuracy)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
gmat.convertTo(gdst, dst_type); gmat.convertTo(gdst, dst_type);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -166,25 +168,39 @@ TEST_P(ConvertTo, Accuracy)
t1 = (double)cvGetTickCount() - t1;//gpu end1 t1 = (double)cvGetTickCount() - t1;//gpu end1
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
gmat.convertTo(gdst, dst_type); gmat.convertTo(gdst, dst_type);
}; };
#endif #endif
@@ -229,7 +245,7 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool)
{ {
type = GET_PARAM(0); type = GET_PARAM(0);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
mat = randomMat(rng, size, type, 5, 16, false); mat = randomMat(rng, size, type, 5, 16, false);
@@ -250,15 +266,16 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool)
if(b) if(b)
{ {
//randomize ROI //randomize ROI
roicols = mat.cols-1; //start roicols = mat.cols - 1; //start
roirows = mat.rows-1; roirows = mat.rows - 1;
srcx = 1; srcx = 1;
srcy = 1; srcy = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
maskx = 1; maskx = 1;
masky = 1; masky = 1;
}else }
else
{ {
roicols = mat.cols; roicols = mat.cols;
roirows = mat.rows; roirows = mat.rows;
@@ -270,9 +287,9 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool)
masky = 0; masky = 0;
}; };
mat_roi = mat(Rect(srcx,srcy,roicols,roirows)); mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
mask_roi = mask(Rect(maskx,masky,roicols,roirows)); mask_roi = mask(Rect(maskx, masky, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
//gdst_whole = dst; //gdst_whole = dst;
//gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); //gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows));
@@ -282,22 +299,23 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool)
} }
}; };
struct CopyTo :CopyToTestBase {}; struct CopyTo : CopyToTestBase {};
TEST_P(CopyTo, Without_mask) TEST_P(CopyTo, Without_mask)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -307,10 +325,10 @@ TEST_P(CopyTo, Without_mask)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
gmat.copyTo(gdst); gmat.copyTo(gdst);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -318,26 +336,40 @@ TEST_P(CopyTo, Without_mask)
t1 = (double)cvGetTickCount() - t1;//gpu end1 t1 = (double)cvGetTickCount() - t1;//gpu end1
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
gmat.copyTo(gdst); gmat.copyTo(gdst);
}; };
#endif #endif
@@ -346,31 +378,32 @@ TEST_P(CopyTo, Without_mask)
TEST_P(CopyTo, With_mask) TEST_P(CopyTo, With_mask)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
t0 = (double)cvGetTickCount();//cpu start t0 = (double)cvGetTickCount();//cpu start
mat_roi.copyTo(dst_roi,mask_roi); mat_roi.copyTo(dst_roi, mask_roi);
t0 = (double)cvGetTickCount() - t0;//cpu end t0 = (double)cvGetTickCount() - t0;//cpu end
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
gmask = mask_roi; gmask = mask_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
gmat.copyTo(gdst, gmask); gmat.copyTo(gdst, gmask);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -378,27 +411,41 @@ TEST_P(CopyTo, With_mask)
t1 = (double)cvGetTickCount() - t1;//gpu end1 t1 = (double)cvGetTickCount() - t1;//gpu end1
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
gmask = mask_roi; gmask = mask_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
gmat.copyTo(gdst, gmask); gmat.copyTo(gdst, gmask);
}; };
#endif #endif
@@ -437,7 +484,7 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool)
{ {
type = GET_PARAM(0); type = GET_PARAM(0);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
mat = randomMat(rng, size, type, 5, 16, false); mat = randomMat(rng, size, type, 5, 16, false);
@@ -458,13 +505,14 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool)
if(b) if(b)
{ {
//randomize ROI //randomize ROI
roicols = mat.cols-1; //start roicols = mat.cols - 1; //start
roirows = mat.rows-1; roirows = mat.rows - 1;
srcx = 1; srcx = 1;
srcy = 1; srcy = 1;
maskx = 1; maskx = 1;
masky = 1; masky = 1;
}else }
else
{ {
roicols = mat.cols; roicols = mat.cols;
roirows = mat.rows; roirows = mat.rows;
@@ -474,8 +522,8 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool)
masky = 0; masky = 0;
}; };
mat_roi = mat(Rect(srcx,srcy,roicols,roirows)); mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
mask_roi = mask(Rect(maskx,masky,roicols,roirows)); mask_roi = mask(Rect(maskx, masky, roicols, roirows));
//gmat_whole = mat; //gmat_whole = mat;
//gmat = gmat_whole(Rect(srcx,srcy,roicols,roirows)); //gmat = gmat_whole(Rect(srcx,srcy,roicols,roirows));
@@ -484,22 +532,23 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool)
} }
}; };
struct SetTo :SetToTestBase {}; struct SetTo : SetToTestBase {};
TEST_P(SetTo, Without_mask) TEST_P(SetTo, Without_mask)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -509,8 +558,8 @@ TEST_P(SetTo, Without_mask)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gmat_whole = mat; gmat_whole = mat;
gmat = gmat_whole(Rect(srcx,srcy,roicols,roirows)); gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
gmat.setTo(val); gmat.setTo(val);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -518,24 +567,38 @@ TEST_P(SetTo, Without_mask)
t1 = (double)cvGetTickCount() - t1;//gpu end1 t1 = (double)cvGetTickCount() - t1;//gpu end1
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gmat_whole = mat; gmat_whole = mat;
gmat = gmat_whole(Rect(srcx,srcy,roicols,roirows)); gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
gmat.setTo(val); gmat.setTo(val);
}; };
#endif #endif
@@ -544,17 +607,18 @@ TEST_P(SetTo, Without_mask)
TEST_P(SetTo, With_mask) TEST_P(SetTo, With_mask)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
@@ -564,10 +628,10 @@ TEST_P(SetTo, With_mask)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gmat_whole = mat; gmat_whole = mat;
gmat = gmat_whole(Rect(srcx,srcy,roicols,roirows)); gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
gmask = mask_roi; gmask = mask_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
gmat.setTo(val, gmask); gmat.setTo(val, gmask);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -575,31 +639,87 @@ TEST_P(SetTo, With_mask)
t1 = (double)cvGetTickCount() - t1;//gpu end1 t1 = (double)cvGetTickCount() - t1;//gpu end1
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
{ {
Has_roi(j); Has_roi(j);
gmat_whole = mat; gmat_whole = mat;
gmat = gmat_whole(Rect(srcx,srcy,roicols,roirows)); gmat = gmat_whole(Rect(srcx, srcy, roicols, roirows));
gmask = mask_roi; gmask = mask_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
gmat.setTo(val, gmask); gmat.setTo(val, gmask);
}; };
#endif #endif
} }
PARAM_TEST_CASE(DataTransfer, MatType, bool)
{
int type;
cv::Mat mat;
cv::ocl::oclMat gmat_whole;
virtual void SetUp()
{
type = GET_PARAM(0);
cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT);
mat = randomMat(rng, size, type, 5, 16, false);
}
};
TEST_P(DataTransfer, perf)
{
double totaluploadtick = 0;
double totaldownloadtick = 0;
double totaltick = 0;
double t0 = 0;
double t1 = 0;
cv::Mat cpu_dst;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{
t0 = (double)cvGetTickCount();
gmat_whole.upload(mat);//upload
t0 = (double)cvGetTickCount() - t0;
t1 = (double)cvGetTickCount();
gmat_whole.download(cpu_dst);//download
t1 = (double)cvGetTickCount() - t1;
if(j == 0)
continue;
totaluploadtick = t0 + totaluploadtick;
totaldownloadtick = t1 + totaldownloadtick;
}
EXPECT_MAT_SIMILAR(mat, cpu_dst, 0.0);
totaltick = totaluploadtick + totaldownloadtick;
cout << "average upload time is " << totaluploadtick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average download time is " << totaldownloadtick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average data transfer time is " << totaltick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
}
//**********test************ //**********test************
INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine( INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine(
@@ -613,4 +733,7 @@ INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine(
INSTANTIATE_TEST_CASE_P(MatrixOperation, SetTo, Combine( INSTANTIATE_TEST_CASE_P(MatrixOperation, SetTo, Combine(
Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(MatrixOperation, DataTransfer, Combine(
Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter
#endif #endif

View File

@@ -103,7 +103,7 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int)
type = GET_PARAM(0); type = GET_PARAM(0);
channels = GET_PARAM(1); channels = GET_PARAM(1);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
mat1 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); mat1 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false);
@@ -123,8 +123,8 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int)
if(b) if(b)
{ {
//randomize ROI //randomize ROI
roicols = mat1.cols-1; //start roicols = mat1.cols - 1; //start
roirows = mat1.rows-1; roirows = mat1.rows - 1;
src1x = 1; src1x = 1;
src1y = 1; src1y = 1;
src2x = 1; src2x = 1;
@@ -134,9 +134,10 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int)
src4x = 1; src4x = 1;
src4y = 1; src4y = 1;
dstx = 1; dstx = 1;
dsty =1; dsty = 1;
}else }
else
{ {
roicols = mat1.cols; roicols = mat1.cols;
roirows = mat1.rows; roirows = mat1.rows;
@@ -152,13 +153,13 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int)
dsty = 0; dsty = 0;
}; };
mat1_roi = mat1(Rect(src1x,src1y,roicols,roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
mat2_roi = mat2(Rect(src2x,src2y,roicols,roirows)); mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows));
mat3_roi = mat3(Rect(src3x,src3y,roicols,roirows)); mat3_roi = mat3(Rect(src3x, src3y, roicols, roirows));
mat4_roi = mat4(Rect(src4x,src4y,roicols,roirows)); mat4_roi = mat4(Rect(src4x, src4y, roicols, roirows));
dst_roi = dst(Rect(dstx,dsty,roicols,roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows));
} }
}; };
@@ -168,17 +169,18 @@ struct Merge : MergeTestBase {};
TEST_P(Merge, Accuracy) TEST_P(Merge, Accuracy)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
std::vector<cv::Mat> dev_src; std::vector<cv::Mat> dev_src;
@@ -196,13 +198,13 @@ TEST_P(Merge, Accuracy)
gmat3 = mat3_roi; gmat3 = mat3_roi;
gmat4 = mat4_roi; gmat4 = mat4_roi;
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
std::vector<cv::ocl::oclMat> dev_gsrc; std::vector<cv::ocl::oclMat> dev_gsrc;
dev_gsrc.push_back(gmat1); dev_gsrc.push_back(gmat1);
dev_gsrc.push_back(gmat2); dev_gsrc.push_back(gmat2);
dev_gsrc.push_back(gmat3); dev_gsrc.push_back(gmat3);
dev_gsrc.push_back(gmat4); dev_gsrc.push_back(gmat4);
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::merge(dev_gsrc, gdst); cv::ocl::merge(dev_gsrc, gdst);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst; cv::Mat cpu_dst;
@@ -212,15 +214,22 @@ TEST_P(Merge, Accuracy)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
@@ -231,14 +240,21 @@ TEST_P(Merge, Accuracy)
gmat3 = mat3_roi; gmat3 = mat3_roi;
gmat4 = mat4_roi; gmat4 = mat4_roi;
gdst_whole = dst; gdst_whole = dst;
gdst = gdst_whole(Rect(dstx,dsty,roicols,roirows)); gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows));
std::vector<cv::ocl::oclMat> dev_gsrc; std::vector<cv::ocl::oclMat> dev_gsrc;
dev_gsrc.push_back(gmat1); dev_gsrc.push_back(gmat1);
dev_gsrc.push_back(gmat2); dev_gsrc.push_back(gmat2);
dev_gsrc.push_back(gmat3); dev_gsrc.push_back(gmat3);
dev_gsrc.push_back(gmat4); dev_gsrc.push_back(gmat4);
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::merge(dev_gsrc, gdst); cv::ocl::merge(dev_gsrc, gdst);
}; };
#endif #endif
@@ -300,7 +316,7 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int)
type = GET_PARAM(0); type = GET_PARAM(0);
channels = GET_PARAM(1); channels = GET_PARAM(1);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
mat = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false); mat = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false);
@@ -321,19 +337,20 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int)
if(b) if(b)
{ {
//randomize ROI //randomize ROI
roicols = mat.cols-1; //start roicols = mat.cols - 1; //start
roirows = mat.rows-1; roirows = mat.rows - 1;
srcx = 1; srcx = 1;
srcx = 1; srcx = 1;
dst1x = 1; dst1x = 1;
dst1y =1; dst1y = 1;
dst2x = 1; dst2x = 1;
dst2y =1; dst2y = 1;
dst3x = 1; dst3x = 1;
dst3y =1; dst3y = 1;
dst4x = 1; dst4x = 1;
dst4y =1; dst4y = 1;
}else }
else
{ {
roicols = mat.cols; roicols = mat.cols;
roirows = mat.rows; roirows = mat.rows;
@@ -342,39 +359,40 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int)
dst1x = 0; dst1x = 0;
dst1y = 0; dst1y = 0;
dst2x = 0; dst2x = 0;
dst2y =0; dst2y = 0;
dst3x = 0; dst3x = 0;
dst3y =0; dst3y = 0;
dst4x = 0; dst4x = 0;
dst4y =0; dst4y = 0;
}; };
mat_roi = mat(Rect(srcx,srcy,roicols,roirows)); mat_roi = mat(Rect(srcx, srcy, roicols, roirows));
dst1_roi = dst1(Rect(dst1x,dst1y,roicols,roirows)); dst1_roi = dst1(Rect(dst1x, dst1y, roicols, roirows));
dst2_roi = dst2(Rect(dst2x,dst2y,roicols,roirows)); dst2_roi = dst2(Rect(dst2x, dst2y, roicols, roirows));
dst3_roi = dst3(Rect(dst3x,dst3y,roicols,roirows)); dst3_roi = dst3(Rect(dst3x, dst3y, roicols, roirows));
dst4_roi = dst4(Rect(dst4x,dst4y,roicols,roirows)); dst4_roi = dst4(Rect(dst4x, dst4y, roicols, roirows));
} }
}; };
struct Split :SplitTestBase {}; struct Split : SplitTestBase {};
TEST_P(Split, Accuracy) TEST_P(Split, Accuracy)
{ {
#ifndef PRINT_KERNEL_RUN_TIME #ifndef PRINT_KERNEL_RUN_TIME
double totalcputick=0; double totalcputick = 0;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t0=0; double t0 = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int k=LOOPROISTART;k<LOOPROIEND;k++){ for(int k = LOOPROISTART; k < LOOPROIEND; k++)
totalcputick=0; {
totalgputick=0; totalcputick = 0;
totalgputick_kernel=0; totalgputick = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) totalgputick_kernel = 0;
for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
Has_roi(k); Has_roi(k);
cv::Mat dev_dst[4] = {dst1_roi, dst2_roi, dst3_roi, dst4_roi}; cv::Mat dev_dst[4] = {dst1_roi, dst2_roi, dst3_roi, dst4_roi};
@@ -385,19 +403,19 @@ TEST_P(Split, Accuracy)
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
gdst1_whole = dst1; gdst1_whole = dst1;
gdst1 = gdst1_whole(Rect(dst1x,dst1y,roicols,roirows)); gdst1 = gdst1_whole(Rect(dst1x, dst1y, roicols, roirows));
gdst2_whole = dst2; gdst2_whole = dst2;
gdst2 = gdst2_whole(Rect(dst2x,dst2y,roicols,roirows)); gdst2 = gdst2_whole(Rect(dst2x, dst2y, roicols, roirows));
gdst3_whole = dst3; gdst3_whole = dst3;
gdst3 = gdst3_whole(Rect(dst3x,dst3y,roicols,roirows)); gdst3 = gdst3_whole(Rect(dst3x, dst3y, roicols, roirows));
gdst4_whole = dst4; gdst4_whole = dst4;
gdst4 = gdst4_whole(Rect(dst4x,dst4y,roicols,roirows)); gdst4 = gdst4_whole(Rect(dst4x, dst4y, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
cv::ocl::split(gmat, dev_gdst); cv::ocl::split(gmat, dev_gdst);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
cv::Mat cpu_dst1; cv::Mat cpu_dst1;
@@ -411,15 +429,22 @@ TEST_P(Split, Accuracy)
t1 = (double)cvGetTickCount() - t1;//gpu end1 t1 = (double)cvGetTickCount() - t1;//gpu end1
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalcputick=t0+totalcputick; totalcputick = t0 + totalcputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
if(k==0){cout<<"no roi\n";}else{cout<<"with roi\n";}; if(k == 0)
cout << "average cpu runtime is " << totalcputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; {
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "no roi\n";
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; }
else
{
cout << "with roi\n";
};
cout << "average cpu runtime is " << totalcputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }
#else #else
for(int j = LOOPROISTART; j < LOOPROIEND; j ++) for(int j = LOOPROISTART; j < LOOPROIEND; j ++)
@@ -428,18 +453,25 @@ TEST_P(Split, Accuracy)
cv::Mat dev_dst[4] = {dst1_roi, dst2_roi, dst3_roi, dst4_roi}; cv::Mat dev_dst[4] = {dst1_roi, dst2_roi, dst3_roi, dst4_roi};
cv::ocl::oclMat dev_gdst[4] = {gdst1, gdst2, gdst3, gdst4}; cv::ocl::oclMat dev_gdst[4] = {gdst1, gdst2, gdst3, gdst4};
gdst1_whole = dst1; gdst1_whole = dst1;
gdst1 = gdst1_whole(Rect(dst1x,dst1y,roicols,roirows)); gdst1 = gdst1_whole(Rect(dst1x, dst1y, roicols, roirows));
gdst2_whole = dst2; gdst2_whole = dst2;
gdst2 = gdst2_whole(Rect(dst2x,dst2y,roicols,roirows)); gdst2 = gdst2_whole(Rect(dst2x, dst2y, roicols, roirows));
gdst3_whole = dst3; gdst3_whole = dst3;
gdst3 = gdst3_whole(Rect(dst3x,dst3y,roicols,roirows)); gdst3 = gdst3_whole(Rect(dst3x, dst3y, roicols, roirows));
gdst4_whole = dst4; gdst4_whole = dst4;
gdst4 = gdst4_whole(Rect(dst4x,dst4y,roicols,roirows)); gdst4 = gdst4_whole(Rect(dst4x, dst4y, roicols, roirows));
gmat = mat_roi; gmat = mat_roi;
if(j==0){cout<<"no roi:";}else{cout<<"\nwith roi:";}; if(j == 0)
{
cout << "no roi:";
}
else
{
cout << "\nwith roi:";
};
cv::ocl::split(gmat, dev_gdst); cv::ocl::split(gmat, dev_gdst);
}; };
#endif #endif

View File

@@ -58,25 +58,25 @@ using namespace std;
TEST(SURF, Performance) TEST(SURF, Performance)
{ {
cv::Mat img = readImage(FILTER_IMAGE,cv::IMREAD_GRAYSCALE); cv::Mat img = readImage(FILTER_IMAGE, cv::IMREAD_GRAYSCALE);
ASSERT_FALSE(img.empty()); ASSERT_FALSE(img.empty());
ocl::SURF_OCL d_surf; ocl::SURF_OCL d_surf;
ocl::oclMat d_keypoints; ocl::oclMat d_keypoints;
ocl::oclMat d_descriptors; ocl::oclMat d_descriptors;
double totalgputick=0; double totalgputick = 0;
double totalgputick_kernel=0; double totalgputick_kernel = 0;
double t1=0; double t1 = 0;
double t2=0; double t2 = 0;
for(int j = 0; j < LOOP_TIMES+1; j ++) for(int j = 0; j < LOOP_TIMES + 1; j ++)
{ {
t1 = (double)cvGetTickCount();//gpu start1 t1 = (double)cvGetTickCount();//gpu start1
ocl::oclMat d_src(img);//upload ocl::oclMat d_src(img);//upload
t2=(double)cvGetTickCount();//kernel t2 = (double)cvGetTickCount(); //kernel
d_surf(d_src, ocl::oclMat(), d_keypoints, d_descriptors); d_surf(d_src, ocl::oclMat(), d_keypoints, d_descriptors);
t2 = (double)cvGetTickCount() - t2;//kernel t2 = (double)cvGetTickCount() - t2;//kernel
@@ -89,14 +89,14 @@ TEST(SURF, Performance)
if(j == 0) if(j == 0)
continue; continue;
totalgputick=t1+totalgputick; totalgputick = t1 + totalgputick;
totalgputick_kernel=t2+totalgputick_kernel; totalgputick_kernel = t2 + totalgputick_kernel;
} }
cout << "average gpu runtime is " << totalgputick/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime is " << totalgputick / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
cout << "average gpu runtime without data transfer is " << totalgputick_kernel/((double)cvGetTickFrequency()* LOOP_TIMES *1000.) << "ms" << endl; cout << "average gpu runtime without data transfer is " << totalgputick_kernel / ((double)cvGetTickFrequency()* LOOP_TIMES * 1000.) << "ms" << endl;
} }

View File

@@ -42,4 +42,3 @@
#include "precomp.hpp" #include "precomp.hpp"

View File

@@ -75,13 +75,13 @@ using namespace cvtest;
int randomInt(int minVal, int maxVal) int randomInt(int minVal, int maxVal)
{ {
RNG& rng = TS::ptr()->get_rng(); RNG &rng = TS::ptr()->get_rng();
return rng.uniform(minVal, maxVal); return rng.uniform(minVal, maxVal);
} }
double randomDouble(double minVal, double maxVal) double randomDouble(double minVal, double maxVal)
{ {
RNG& rng = TS::ptr()->get_rng(); RNG &rng = TS::ptr()->get_rng();
return rng.uniform(minVal, maxVal); return rng.uniform(minVal, maxVal);
} }
@@ -207,19 +207,19 @@ vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end)
return v; return v;
} }
const vector<MatType>& all_types() const vector<MatType> &all_types()
{ {
static vector<MatType> v = types(CV_8U, CV_64F, 1, 4); static vector<MatType> v = types(CV_8U, CV_64F, 1, 4);
return v; return v;
} }
Mat readImage(const string& fileName, int flags) Mat readImage(const string &fileName, int flags)
{ {
return imread(string(cvtest::TS::ptr()->get_data_path()) + fileName, flags); return imread(string(cvtest::TS::ptr()->get_data_path()) + fileName, flags);
} }
Mat readImageType(const string& fname, int type) Mat readImageType(const string &fname, int type)
{ {
Mat src = readImage(fname, CV_MAT_CN(type) == 1 ? IMREAD_GRAYSCALE : IMREAD_COLOR); Mat src = readImage(fname, CV_MAT_CN(type) == 1 ? IMREAD_GRAYSCALE : IMREAD_COLOR);
if (CV_MAT_CN(type) == 4) if (CV_MAT_CN(type) == 4)
@@ -232,17 +232,17 @@ Mat readImageType(const string& fname, int type)
return src; return src;
} }
double checkNorm(const Mat& m) double checkNorm(const Mat &m)
{ {
return norm(m, NORM_INF); return norm(m, NORM_INF);
} }
double checkNorm(const Mat& m1, const Mat& m2) double checkNorm(const Mat &m1, const Mat &m2)
{ {
return norm(m1, m2, NORM_INF); return norm(m1, m2, NORM_INF);
} }
double checkSimilarity(const Mat& m1, const Mat& m2) double checkSimilarity(const Mat &m1, const Mat &m2)
{ {
Mat diff; Mat diff;
matchTemplate(m1, m2, diff, CV_TM_CCORR_NORMED); matchTemplate(m1, m2, diff, CV_TM_CCORR_NORMED);
@@ -256,7 +256,7 @@ void cv::ocl::PrintTo(const DeviceInfo& info, ostream* os)
} }
*/ */
void PrintTo(const Inverse& inverse, std::ostream* os) void PrintTo(const Inverse &inverse, std::ostream *os)
{ {
if (inverse) if (inverse)
(*os) << "inverse"; (*os) << "inverse";

View File

@@ -56,7 +56,7 @@ int randomInt(int minVal, int maxVal);
double randomDouble(double minVal, double maxVal); double randomDouble(double minVal, double maxVal);
//std::string generateVarList(int first,...); //std::string generateVarList(int first,...);
std::string generateVarList(int& p1,int& p2); std::string generateVarList(int &p1, int &p2);
cv::Size randomSize(int minVal, int maxVal); cv::Size randomSize(int minVal, int maxVal);
cv::Scalar randomScalar(double minVal, double maxVal); cv::Scalar randomScalar(double minVal, double maxVal);
cv::Mat randomMat(cv::Size size, int type, double minVal = 0.0, double maxVal = 255.0); cv::Mat randomMat(cv::Size size, int type, double minVal = 0.0, double maxVal = 255.0);
@@ -72,12 +72,12 @@ void showDiff(cv::InputArray gold, cv::InputArray actual, double eps);
//std::vector<cv::ocl::DeviceInfo> devices(cv::gpu::FeatureSet feature); //std::vector<cv::ocl::DeviceInfo> devices(cv::gpu::FeatureSet feature);
//! read image from testdata folder. //! read image from testdata folder.
cv::Mat readImage(const std::string& fileName, int flags = cv::IMREAD_COLOR); cv::Mat readImage(const std::string &fileName, int flags = cv::IMREAD_COLOR);
cv::Mat readImageType(const std::string& fname, int type); cv::Mat readImageType(const std::string &fname, int type);
double checkNorm(const cv::Mat& m); double checkNorm(const cv::Mat &m);
double checkNorm(const cv::Mat& m1, const cv::Mat& m2); double checkNorm(const cv::Mat &m1, const cv::Mat &m2);
double checkSimilarity(const cv::Mat& m1, const cv::Mat& m2); double checkSimilarity(const cv::Mat &m1, const cv::Mat &m2);
#define EXPECT_MAT_NORM(mat, eps) \ #define EXPECT_MAT_NORM(mat, eps) \
{ \ { \
@@ -120,31 +120,34 @@ using perf::MatType;
std::vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end); 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). //! return vector with all types (depth: CV_8U-CV_64F, channels: 1-4).
const std::vector<MatType>& all_types(); const std::vector<MatType> &all_types();
class Inverse class Inverse
{ {
public: public:
inline Inverse(bool val = false) : val_(val) {} inline Inverse(bool val = false) : val_(val) {}
inline operator bool() const { return val_; } inline operator bool() const
{
return val_;
}
private: private:
bool val_; bool val_;
}; };
void PrintTo(const Inverse& useRoi, std::ostream* os); void PrintTo(const Inverse &useRoi, std::ostream *os);
CV_ENUM(CmpCode, cv::CMP_EQ, cv::CMP_GT, cv::CMP_GE, cv::CMP_LT, cv::CMP_LE, cv::CMP_NE) CV_ENUM(CmpCode, cv::CMP_EQ, cv::CMP_GT, cv::CMP_GE, cv::CMP_LT, cv::CMP_LE, cv::CMP_NE)
CV_ENUM(NormCode, cv::NORM_INF, cv::NORM_L1, cv::NORM_L2, cv::NORM_TYPE_MASK, cv::NORM_RELATIVE, cv::NORM_MINMAX) CV_ENUM(NormCode, cv::NORM_INF, cv::NORM_L1, cv::NORM_L2, cv::NORM_TYPE_MASK, cv::NORM_RELATIVE, cv::NORM_MINMAX)
enum {FLIP_BOTH = 0, FLIP_X = 1, FLIP_Y = -1}; enum {FLIP_BOTH = 0, FLIP_X = 1, FLIP_Y = -1};
CV_ENUM(FlipCode, FLIP_BOTH, FLIP_X, FLIP_Y) CV_ENUM(FlipCode, FLIP_BOTH, FLIP_X, FLIP_Y)
CV_ENUM(ReduceOp, CV_REDUCE_SUM, CV_REDUCE_AVG, CV_REDUCE_MAX, CV_REDUCE_MIN) CV_ENUM(ReduceOp, CV_REDUCE_SUM, CV_REDUCE_AVG, CV_REDUCE_MAX, CV_REDUCE_MIN)
CV_FLAGS(GemmFlags, cv::GEMM_1_T, cv::GEMM_2_T, cv::GEMM_3_T); CV_FLAGS(GemmFlags, cv::GEMM_1_T, cv::GEMM_2_T, cv::GEMM_3_T);
CV_ENUM(MorphOp, cv::MORPH_OPEN, cv::MORPH_CLOSE, cv::MORPH_GRADIENT, cv::MORPH_TOPHAT, cv::MORPH_BLACKHAT) CV_ENUM(MorphOp, cv::MORPH_OPEN, cv::MORPH_CLOSE, cv::MORPH_GRADIENT, cv::MORPH_TOPHAT, cv::MORPH_BLACKHAT)

File diff suppressed because it is too large Load Diff

View File

@@ -51,8 +51,11 @@ using namespace cv::ocl;
using namespace std; using namespace std;
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
void cv::ocl::blendLinear(const oclMat& img1, const oclMat& img2, const oclMat& weights1, const oclMat& weights2, void cv::ocl::blendLinear(const oclMat &img1, const oclMat &img2, const oclMat &weights1, const oclMat &weights2,
oclMat& result){throw_nogpu();} oclMat &result)
{
throw_nogpu();
}
#else #else
namespace cv namespace cv
{ {
@@ -63,12 +66,12 @@ namespace cv
} }
} }
void cv::ocl::blendLinear(const oclMat& img1, const oclMat& img2, const oclMat& weights1, const oclMat& weights2, void cv::ocl::blendLinear(const oclMat &img1, const oclMat &img2, const oclMat &weights1, const oclMat &weights2,
oclMat& result) oclMat &result)
{ {
cv::ocl::Context *ctx = img1.clCxt; cv::ocl::Context *ctx = img1.clCxt;
assert(ctx == img2.clCxt && ctx == weights1.clCxt && ctx == weights2.clCxt); assert(ctx == img2.clCxt && ctx == weights1.clCxt && ctx == weights2.clCxt);
int channels = img1.channels(); int channels = img1.oclchannels();
int depth = img1.depth(); int depth = img1.depth();
int rows = img1.rows; int rows = img1.rows;
int cols = img1.cols; int cols = img1.cols;
@@ -79,7 +82,7 @@ void cv::ocl::blendLinear(const oclMat& img1, const oclMat& img2, const oclMat&
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
if(globalSize[0]!=0) if(globalSize[0] != 0)
{ {
args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data ));
args.push_back( make_pair( sizeof(cl_mem), (void *)&img1.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&img1.data ));

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,280 @@
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// @Authors
// Peng Xiao, pengxiao@multicorewareinc.com
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other oclMaterials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors as is and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#include "precomp.hpp"
using namespace cv;
using namespace cv::ocl;
using namespace std;
#if !defined (HAVE_OPENCL)
void cv::ocl::buildWarpPlaneMaps(Size, Rect, const Mat &, const Mat &, const Mat &, float, oclMat &, oclMat &, Stream &)
{
throw_nogpu();
}
void cv::ocl::buildWarpCylindricalMaps(Size, Rect, const Mat &, const Mat &, float, oclMat &, oclMat &, Stream &)
{
throw_nogpu();
}
void cv::ocl::buildWarpSphericalMaps(Size, Rect, const Mat &, const Mat &, float, oclMat &, oclMat &, Stream &)
{
throw_nogpu();
}
#else
namespace cv
{
namespace ocl
{
///////////////////////////OpenCL kernel strings///////////////////////////
extern const char *build_warps;
}
}
//////////////////////////////////////////////////////////////////////////////
// buildWarpPlaneMaps
void cv::ocl::buildWarpPlaneMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, const Mat &T,
float scale, oclMat &map_x, oclMat &map_y)
{
CV_Assert(K.size() == Size(3, 3) && K.type() == CV_32F);
CV_Assert(R.size() == Size(3, 3) && R.type() == CV_32F);
CV_Assert((T.size() == Size(3, 1) || T.size() == Size(1, 3)) && T.type() == CV_32F && T.isContinuous());
Mat K_Rinv = K * R.t();
CV_Assert(K_Rinv.isContinuous());
Mat KRT_mat(1, 12, CV_32FC1); // 9 + 3
KRT_mat(Range::all(), Range(0, 8)) = K_Rinv.reshape(1, 1);
KRT_mat(Range::all(), Range(9, 11)) = T;
oclMat KRT_oclMat(KRT_mat);
// transfer K_Rinv and T into a single cl_mem
map_x.create(dst_roi.size(), CV_32F);
map_y.create(dst_roi.size(), CV_32F);
int tl_u = dst_roi.tl().x;
int tl_v = dst_roi.tl().y;
Context *clCxt = Context::getContext();
string kernelName = "buildWarpPlaneMaps";
vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&map_x.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&map_y.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&KRT_mat.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&tl_u));
args.push_back( make_pair( sizeof(cl_int), (void *)&tl_v));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.rows));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.step));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_y.step));
args.push_back( make_pair( sizeof(cl_float), (void *)&scale));
size_t globalThreads[3] = {map_x.cols, map_x.rows, 1};
size_t localThreads[3] = {32, 8, 1};
openCLExecuteKernel(clCxt, &build_warps, kernelName, globalThreads, localThreads, args, -1, -1);
}
//////////////////////////////////////////////////////////////////////////////
// buildWarpCylyndricalMaps
void cv::ocl::buildWarpCylindricalMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, float scale,
oclMat &map_x, oclMat &map_y)
{
CV_Assert(K.size() == Size(3, 3) && K.type() == CV_32F);
CV_Assert(R.size() == Size(3, 3) && R.type() == CV_32F);
Mat K_Rinv = K * R.t();
CV_Assert(K_Rinv.isContinuous());
oclMat KR_oclMat(K_Rinv.reshape(1, 1));
map_x.create(dst_roi.size(), CV_32F);
map_y.create(dst_roi.size(), CV_32F);
int tl_u = dst_roi.tl().x;
int tl_v = dst_roi.tl().y;
Context *clCxt = Context::getContext();
string kernelName = "buildWarpCylindricalMaps";
vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&map_x.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&map_y.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&KR_oclMat.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&tl_u));
args.push_back( make_pair( sizeof(cl_int), (void *)&tl_v));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.rows));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.step));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_y.step));
args.push_back( make_pair( sizeof(cl_float), (void *)&scale));
size_t globalThreads[3] = {map_x.cols, map_x.rows, 1};
size_t localThreads[3] = {32, 8, 1};
openCLExecuteKernel(clCxt, &build_warps, kernelName, globalThreads, localThreads, args, -1, -1);
}
//////////////////////////////////////////////////////////////////////////////
// buildWarpSphericalMaps
void cv::ocl::buildWarpSphericalMaps(Size src_size, Rect dst_roi, const Mat &K, const Mat &R, float scale,
oclMat &map_x, oclMat &map_y)
{
CV_Assert(K.size() == Size(3, 3) && K.type() == CV_32F);
CV_Assert(R.size() == Size(3, 3) && R.type() == CV_32F);
Mat K_Rinv = K * R.t();
CV_Assert(K_Rinv.isContinuous());
oclMat KR_oclMat(K_Rinv.reshape(1, 1));
// transfer K_Rinv, R_Kinv into a single cl_mem
map_x.create(dst_roi.size(), CV_32F);
map_y.create(dst_roi.size(), CV_32F);
int tl_u = dst_roi.tl().x;
int tl_v = dst_roi.tl().y;
Context *clCxt = Context::getContext();
string kernelName = "buildWarpSphericalMaps";
vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&map_x.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&map_y.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&KR_oclMat.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&tl_u));
args.push_back( make_pair( sizeof(cl_int), (void *)&tl_v));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.rows));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_x.step));
args.push_back( make_pair( sizeof(cl_int), (void *)&map_y.step));
args.push_back( make_pair( sizeof(cl_float), (void *)&scale));
size_t globalThreads[3] = {map_x.cols, map_x.rows, 1};
size_t localThreads[3] = {32, 8, 1};
openCLExecuteKernel(clCxt, &build_warps, kernelName, globalThreads, localThreads, args, -1, -1);
}
void cv::ocl::buildWarpAffineMaps(const Mat &M, bool inverse, Size dsize, oclMat &xmap, oclMat &ymap)
{
CV_Assert(M.rows == 2 && M.cols == 3);
xmap.create(dsize, CV_32FC1);
ymap.create(dsize, CV_32FC1);
float coeffs[2 * 3];
Mat coeffsMat(2, 3, CV_32F, (void *)coeffs);
if (inverse)
M.convertTo(coeffsMat, coeffsMat.type());
else
{
cv::Mat iM;
invertAffineTransform(M, iM);
iM.convertTo(coeffsMat, coeffsMat.type());
}
oclMat coeffsOclMat(coeffsMat.reshape(1, 1));
Context *clCxt = Context::getContext();
string kernelName = "buildWarpAffineMaps";
vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&xmap.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&ymap.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&coeffsOclMat.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&xmap.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&xmap.rows));
args.push_back( make_pair( sizeof(cl_int), (void *)&xmap.step));
args.push_back( make_pair( sizeof(cl_int), (void *)&ymap.step));
size_t globalThreads[3] = {xmap.cols, xmap.rows, 1};
size_t localThreads[3] = {32, 8, 1};
openCLExecuteKernel(clCxt, &build_warps, kernelName, globalThreads, localThreads, args, -1, -1);
}
void cv::ocl::buildWarpPerspectiveMaps(const Mat &M, bool inverse, Size dsize, oclMat &xmap, oclMat &ymap)
{
CV_Assert(M.rows == 3 && M.cols == 3);
xmap.create(dsize, CV_32FC1);
ymap.create(dsize, CV_32FC1);
float coeffs[3 * 3];
Mat coeffsMat(3, 3, CV_32F, (void *)coeffs);
if (inverse)
M.convertTo(coeffsMat, coeffsMat.type());
else
{
cv::Mat iM;
invert(M, iM);
iM.convertTo(coeffsMat, coeffsMat.type());
}
oclMat coeffsOclMat(coeffsMat.reshape(1, 1));
Context *clCxt = Context::getContext();
string kernelName = "buildWarpPerspectiveMaps";
vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&xmap.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&ymap.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&coeffsOclMat.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&xmap.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&xmap.rows));
args.push_back( make_pair( sizeof(cl_int), (void *)&xmap.step));
args.push_back( make_pair( sizeof(cl_int), (void *)&ymap.step));
size_t globalThreads[3] = {xmap.cols, xmap.rows, 1};
size_t localThreads[3] = {32, 8, 1};
openCLExecuteKernel(clCxt, &build_warps, kernelName, globalThreads, localThreads, args, -1, -1);
}
#endif // HAVE_OPENCL

View File

@@ -52,10 +52,22 @@ using namespace cv::ocl;
using namespace std; using namespace std;
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
void cv::ocl::Canny(const oclMat& image, oclMat& edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false) { throw_nogpu(); } void cv::ocl::Canny(const oclMat &image, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false)
void cv::ocl::Canny(const oclMat& image, CannyBuf& buf, oclMat& edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false){ throw_nogpu(); } {
void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, oclMat& edges, double low_thresh, double high_thresh, bool L2gradient = false){ throw_nogpu(); } throw_nogpu();
void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& edges, double low_thresh, double high_thresh, bool L2gradient = false){ throw_nogpu(); } }
void cv::ocl::Canny(const oclMat &image, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false)
{
throw_nogpu();
}
void cv::ocl::Canny(const oclMat &dx, const oclMat &dy, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false)
{
throw_nogpu();
}
void cv::ocl::Canny(const oclMat &dx, const oclMat &dy, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false)
{
throw_nogpu();
}
#else #else
namespace cv namespace cv
@@ -67,14 +79,14 @@ namespace cv
} }
} }
cv::ocl::CannyBuf::CannyBuf(const oclMat& dx_, const oclMat& dy_) : dx(dx_), dy(dy_), counter(NULL) cv::ocl::CannyBuf::CannyBuf(const oclMat &dx_, const oclMat &dy_) : dx(dx_), dy(dy_), counter(NULL)
{ {
CV_Assert(dx_.type() == CV_32SC1 && dy_.type() == CV_32SC1 && dx_.size() == dy_.size()); CV_Assert(dx_.type() == CV_32SC1 && dy_.type() == CV_32SC1 && dx_.size() == dy_.size());
create(dx_.size(), -1); create(dx_.size(), -1);
} }
void cv::ocl::CannyBuf::create(const Size& image_size, int apperture_size) void cv::ocl::CannyBuf::create(const Size &image_size, int apperture_size)
{ {
ensureSizeIsEnough(image_size, CV_32SC1, dx); ensureSizeIsEnough(image_size, CV_32SC1, dx);
ensureSizeIsEnough(image_size, CV_32SC1, dy); ensureSizeIsEnough(image_size, CV_32SC1, dy);
@@ -123,27 +135,31 @@ void cv::ocl::CannyBuf::release()
openCLFree(counter); openCLFree(counter);
} }
namespace cv { namespace ocl { namespace cv
{
namespace ocl
{
namespace canny namespace canny
{ {
void calcSobelRowPass_gpu(const oclMat& src, oclMat& dx_buf, oclMat& dy_buf, int rows, int cols); void calcSobelRowPass_gpu(const oclMat &src, oclMat &dx_buf, oclMat &dy_buf, int rows, int cols);
void calcMagnitude_gpu(const oclMat& dx_buf, const oclMat& dy_buf, oclMat& dx, oclMat& dy, oclMat& mag, int rows, int cols, bool L2Grad); void calcMagnitude_gpu(const oclMat &dx_buf, const oclMat &dy_buf, oclMat &dx, oclMat &dy, oclMat &mag, int rows, int cols, bool L2Grad);
void calcMagnitude_gpu(const oclMat& dx, const oclMat& dy, oclMat& mag, int rows, int cols, bool L2Grad); void calcMagnitude_gpu(const oclMat &dx, const oclMat &dy, oclMat &mag, int rows, int cols, bool L2Grad);
void calcMap_gpu(oclMat& dx, oclMat& dy, oclMat& mag, oclMat& map, int rows, int cols, float low_thresh, float high_thresh); void calcMap_gpu(oclMat &dx, oclMat &dy, oclMat &mag, oclMat &map, int rows, int cols, float low_thresh, float high_thresh);
void edgesHysteresisLocal_gpu(oclMat& map, oclMat& st1, void * counter, int rows, int cols); void edgesHysteresisLocal_gpu(oclMat &map, oclMat &st1, void *counter, int rows, int cols);
void edgesHysteresisGlobal_gpu(oclMat& map, oclMat& st1, oclMat& st2, void * counter, int rows, int cols); void edgesHysteresisGlobal_gpu(oclMat &map, oclMat &st1, oclMat &st2, void *counter, int rows, int cols);
void getEdges_gpu(oclMat& map, oclMat& dst, int rows, int cols); void getEdges_gpu(oclMat &map, oclMat &dst, int rows, int cols);
} }
}}// cv::ocl }
}// cv::ocl
namespace namespace
{ {
void CannyCaller(CannyBuf& buf, oclMat& dst, float low_thresh, float high_thresh) void CannyCaller(CannyBuf &buf, oclMat &dst, float low_thresh, float high_thresh)
{ {
using namespace ::cv::ocl::canny; using namespace ::cv::ocl::canny;
calcMap_gpu(buf.dx, buf.dy, buf.edgeBuf, buf.edgeBuf, dst.rows, dst.cols, low_thresh, high_thresh); calcMap_gpu(buf.dx, buf.dy, buf.edgeBuf, buf.edgeBuf, dst.rows, dst.cols, low_thresh, high_thresh);
@@ -156,13 +172,13 @@ namespace
} }
} }
void cv::ocl::Canny(const oclMat& src, oclMat& dst, double low_thresh, double high_thresh, int apperture_size, bool L2gradient) void cv::ocl::Canny(const oclMat &src, oclMat &dst, double low_thresh, double high_thresh, int apperture_size, bool L2gradient)
{ {
CannyBuf buf(src.size(), apperture_size); CannyBuf buf(src.size(), apperture_size);
Canny(src, buf, dst, low_thresh, high_thresh, apperture_size, L2gradient); Canny(src, buf, dst, low_thresh, high_thresh, apperture_size, L2gradient);
} }
void cv::ocl::Canny(const oclMat& src, CannyBuf& buf, oclMat& dst, double low_thresh, double high_thresh, int apperture_size, bool L2gradient) void cv::ocl::Canny(const oclMat &src, CannyBuf &buf, oclMat &dst, double low_thresh, double high_thresh, int apperture_size, bool L2gradient)
{ {
using namespace ::cv::ocl::canny; using namespace ::cv::ocl::canny;
@@ -192,13 +208,13 @@ void cv::ocl::Canny(const oclMat& src, CannyBuf& buf, oclMat& dst, double low_th
} }
CannyCaller(buf, dst, static_cast<float>(low_thresh), static_cast<float>(high_thresh)); CannyCaller(buf, dst, static_cast<float>(low_thresh), static_cast<float>(high_thresh));
} }
void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, oclMat& dst, double low_thresh, double high_thresh, bool L2gradient) void cv::ocl::Canny(const oclMat &dx, const oclMat &dy, oclMat &dst, double low_thresh, double high_thresh, bool L2gradient)
{ {
CannyBuf buf(dx, dy); CannyBuf buf(dx, dy);
Canny(dx, dy, buf, dst, low_thresh, high_thresh, L2gradient); Canny(dx, dy, buf, dst, low_thresh, high_thresh, L2gradient);
} }
void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& dst, double low_thresh, double high_thresh, bool L2gradient) void cv::ocl::Canny(const oclMat &dx, const oclMat &dy, CannyBuf &buf, oclMat &dst, double low_thresh, double high_thresh, bool L2gradient)
{ {
using namespace ::cv::ocl::canny; using namespace ::cv::ocl::canny;
@@ -210,7 +226,8 @@ void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& d
dst.create(dx.size(), CV_8U); dst.create(dx.size(), CV_8U);
dst.setTo(Scalar::all(0)); dst.setTo(Scalar::all(0));
buf.dx = dx; buf.dy = dy; buf.dx = dx;
buf.dy = dy;
buf.create(dx.size(), -1); buf.create(dx.size(), -1);
buf.edgeBuf.setTo(Scalar::all(0)); buf.edgeBuf.setTo(Scalar::all(0));
calcMagnitude_gpu(buf.dx, buf.dy, buf.edgeBuf, dx.rows, dx.cols, L2gradient); calcMagnitude_gpu(buf.dx, buf.dy, buf.edgeBuf, dx.rows, dx.cols, L2gradient);
@@ -218,7 +235,7 @@ void cv::ocl::Canny(const oclMat& dx, const oclMat& dy, CannyBuf& buf, oclMat& d
CannyCaller(buf, dst, static_cast<float>(low_thresh), static_cast<float>(high_thresh)); CannyCaller(buf, dst, static_cast<float>(low_thresh), static_cast<float>(high_thresh));
} }
void canny::calcSobelRowPass_gpu(const oclMat& src, oclMat& dx_buf, oclMat& dy_buf, int rows, int cols) void canny::calcSobelRowPass_gpu(const oclMat &src, oclMat &dx_buf, oclMat &dy_buf, int rows, int cols)
{ {
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
string kernelName = "calcSobelRowPass"; string kernelName = "calcSobelRowPass";
@@ -241,7 +258,7 @@ void canny::calcSobelRowPass_gpu(const oclMat& src, oclMat& dx_buf, oclMat& dy_b
openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void canny::calcMagnitude_gpu(const oclMat& dx_buf, const oclMat& dy_buf, oclMat& dx, oclMat& dy, oclMat& mag, int rows, int cols, bool L2Grad) void canny::calcMagnitude_gpu(const oclMat &dx_buf, const oclMat &dy_buf, oclMat &dx, oclMat &dy, oclMat &mag, int rows, int cols, bool L2Grad)
{ {
Context *clCxt = dx_buf.clCxt; Context *clCxt = dx_buf.clCxt;
string kernelName = "calcMagnitude_buf"; string kernelName = "calcMagnitude_buf";
@@ -275,7 +292,7 @@ void canny::calcMagnitude_gpu(const oclMat& dx_buf, const oclMat& dy_buf, oclMat
} }
openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options); openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options);
} }
void canny::calcMagnitude_gpu(const oclMat& dx, const oclMat& dy, oclMat& mag, int rows, int cols, bool L2Grad) void canny::calcMagnitude_gpu(const oclMat &dx, const oclMat &dy, oclMat &mag, int rows, int cols, bool L2Grad)
{ {
Context *clCxt = dx.clCxt; Context *clCxt = dx.clCxt;
string kernelName = "calcMagnitude"; string kernelName = "calcMagnitude";
@@ -304,7 +321,7 @@ void canny::calcMagnitude_gpu(const oclMat& dx, const oclMat& dy, oclMat& mag, i
openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options); openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, build_options);
} }
void canny::calcMap_gpu(oclMat& dx, oclMat& dy, oclMat& mag, oclMat& map, int rows, int cols, float low_thresh, float high_thresh) void canny::calcMap_gpu(oclMat &dx, oclMat &dy, oclMat &mag, oclMat &map, int rows, int cols, float low_thresh, float high_thresh)
{ {
Context *clCxt = dx.clCxt; Context *clCxt = dx.clCxt;
@@ -335,7 +352,7 @@ void canny::calcMap_gpu(oclMat& dx, oclMat& dy, oclMat& mag, oclMat& map, int ro
openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void canny::edgesHysteresisLocal_gpu(oclMat& map, oclMat& st1, void * counter, int rows, int cols) void canny::edgesHysteresisLocal_gpu(oclMat &map, oclMat &st1, void *counter, int rows, int cols)
{ {
Context *clCxt = map.clCxt; Context *clCxt = map.clCxt;
string kernelName = "edgesHysteresisLocal"; string kernelName = "edgesHysteresisLocal";
@@ -355,7 +372,7 @@ void canny::edgesHysteresisLocal_gpu(oclMat& map, oclMat& st1, void * counter, i
openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void canny::edgesHysteresisGlobal_gpu(oclMat& map, oclMat& st1, oclMat& st2, void * counter, int rows, int cols) void canny::edgesHysteresisGlobal_gpu(oclMat &map, oclMat &st1, oclMat &st2, void *counter, int rows, int cols)
{ {
unsigned int count; unsigned int count;
openCLSafeCall(clEnqueueReadBuffer(Context::getContext()->impl->clCmdQueue, (cl_mem)counter, 1, 0, sizeof(float), &count, 0, NULL, NULL)); openCLSafeCall(clEnqueueReadBuffer(Context::getContext()->impl->clCmdQueue, (cl_mem)counter, 1, 0, sizeof(float), &count, 0, NULL, NULL));
@@ -389,7 +406,7 @@ void canny::edgesHysteresisGlobal_gpu(oclMat& map, oclMat& st1, oclMat& st2, voi
#undef DIVUP #undef DIVUP
} }
void canny::getEdges_gpu(oclMat& map, oclMat& dst, int rows, int cols) void canny::getEdges_gpu(oclMat &map, oclMat &dst, int rows, int cols)
{ {
Context *clCxt = map.clCxt; Context *clCxt = map.clCxt;
string kernelName = "getEdges"; string kernelName = "getEdges";

View File

@@ -81,9 +81,9 @@ namespace
void RGB2Gray_caller(const oclMat &src, oclMat &dst, int bidx) void RGB2Gray_caller(const oclMat &src, oclMat &dst, int bidx)
{ {
vector<pair<size_t , const void *> > args; vector<pair<size_t , const void *> > args;
int channels = src.channels(); int channels = src.oclchannels();
char build_options[50]; char build_options[50];
//printf("depth:%d,channels:%d,bidx:%d\n",src.depth(),src.channels(),bidx); //printf("depth:%d,channels:%d,bidx:%d\n",src.depth(),src.oclchannels(),bidx);
sprintf(build_options, "-D DEPTH_%d", src.depth()); sprintf(build_options, "-D DEPTH_%d", src.depth());
args.push_back( make_pair( sizeof(cl_int) , (void *)&src.cols)); args.push_back( make_pair( sizeof(cl_int) , (void *)&src.cols));
args.push_back( make_pair( sizeof(cl_int) , (void *)&src.rows)); args.push_back( make_pair( sizeof(cl_int) , (void *)&src.rows));
@@ -99,7 +99,7 @@ namespace
void cvtColor_caller(const oclMat &src, oclMat &dst, int code, int dcn) void cvtColor_caller(const oclMat &src, oclMat &dst, int code, int dcn)
{ {
Size sz = src.size(); Size sz = src.size();
int scn = src.channels(), depth = src.depth(), bidx; int scn = src.oclchannels(), depth = src.depth(), bidx;
CV_Assert(depth == CV_8U || depth == CV_16U); CV_Assert(depth == CV_8U || depth == CV_16U);

View File

@@ -53,7 +53,10 @@ using namespace std;
#if !defined(HAVE_OPENCL) #if !defined(HAVE_OPENCL)
void cv::ocl::columnSum(const oclMat& src,oclMat& dst){ throw_nogpu(); } void cv::ocl::columnSum(const oclMat &src, oclMat &dst)
{
throw_nogpu();
}
#else /*!HAVE_OPENCL */ #else /*!HAVE_OPENCL */
@@ -61,11 +64,11 @@ namespace cv
{ {
namespace ocl namespace ocl
{ {
extern const char* imgproc_columnsum; extern const char *imgproc_columnsum;
} }
} }
void cv::ocl::columnSum(const oclMat& src,oclMat& dst) void cv::ocl::columnSum(const oclMat &src, oclMat &dst)
{ {
CV_Assert(src.type() == CV_32FC1); CV_Assert(src.type() == CV_32FC1);

View File

@@ -52,12 +52,18 @@ using namespace cv::ocl;
using namespace std; using namespace std;
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
void cv::ocl::dft(const oclMat& src, oclMat& dst, int flags) { throw_nogpu(); } void cv::ocl::dft(const oclMat &src, oclMat &dst, int flags)
{
throw_nogpu();
}
#else #else
#include <clAmdFft.h> #include <clAmdFft.h>
namespace cv{ namespace ocl { namespace cv
{
namespace ocl
{
enum FftType enum FftType
{ {
C2R = 1, // complex to complex C2R = 1, // complex to complex
@@ -76,19 +82,20 @@ namespace cv{ namespace ocl {
const int flags; const int flags;
const FftType type; const FftType type;
clAmdFftPlanHandle plHandle; clAmdFftPlanHandle plHandle;
static vector<FftPlan*> planStore; static vector<FftPlan *> planStore;
static bool started; static bool started;
static clAmdFftSetupData * setupData; static clAmdFftSetupData *setupData;
public: public:
// return a baked plan-> // return a baked plan->
// if there is one matched plan, return it // if there is one matched plan, return it
// if not, bake a new one, put it into the planStore and return it. // if not, bake a new one, put it into the planStore and return it.
static clAmdFftPlanHandle getPlan(Size _dft_size, int _src_step, int _dst_step, int _flags, FftType _type); static clAmdFftPlanHandle getPlan(Size _dft_size, int _src_step, int _dst_step, int _flags, FftType _type);
}; };
}} }
}
bool cv::ocl::FftPlan::started = false; bool cv::ocl::FftPlan::started = false;
vector<cv::ocl::FftPlan*> cv::ocl::FftPlan::planStore = vector<cv::ocl::FftPlan*>(); vector<cv::ocl::FftPlan *> cv::ocl::FftPlan::planStore = vector<cv::ocl::FftPlan *>();
clAmdFftSetupData * cv::ocl::FftPlan::setupData = 0; clAmdFftSetupData *cv::ocl::FftPlan::setupData = 0;
void cv::ocl::fft_setup() void cv::ocl::fft_setup()
{ {
@@ -134,9 +141,9 @@ cv::ocl::FftPlan::FftPlan(Size _dft_size, int _src_step, int _dst_step, int _fla
clAmdFftResultLocation place; clAmdFftResultLocation place;
clAmdFftLayout inLayout; clAmdFftLayout inLayout;
clAmdFftLayout outLayout; clAmdFftLayout outLayout;
clAmdFftDim dim = is_1d_input||is_row_dft ? CLFFT_1D : CLFFT_2D; clAmdFftDim dim = is_1d_input || is_row_dft ? CLFFT_1D : CLFFT_2D;
size_t batchSize = is_row_dft?dft_size.height : 1; size_t batchSize = is_row_dft ? dft_size.height : 1;
size_t clLengthsIn[ 3 ] = {1, 1, 1}; size_t clLengthsIn[ 3 ] = {1, 1, 1};
size_t clStridesIn[ 3 ] = {1, 1, 1}; size_t clStridesIn[ 3 ] = {1, 1, 1};
size_t clLengthsOut[ 3 ] = {1, 1, 1}; size_t clLengthsOut[ 3 ] = {1, 1, 1};
@@ -195,7 +202,7 @@ cv::ocl::FftPlan::~FftPlan()
{ {
if(planStore[i]->plHandle == plHandle) if(planStore[i]->plHandle == plHandle)
{ {
planStore.erase(planStore.begin()+ i); planStore.erase(planStore.begin() + i);
} }
} }
openCLSafeCall( clAmdFftDestroyPlan( &plHandle ) ); openCLSafeCall( clAmdFftDestroyPlan( &plHandle ) );
@@ -206,7 +213,7 @@ clAmdFftPlanHandle cv::ocl::FftPlan::getPlan(Size _dft_size, int _src_step, int
// go through search // go through search
for(int i = 0; i < planStore.size(); i ++) for(int i = 0; i < planStore.size(); i ++)
{ {
FftPlan * plan = planStore[i]; FftPlan *plan = planStore[i];
if( if(
plan->dft_size.width == _dft_size.width && plan->dft_size.width == _dft_size.width &&
plan->dft_size.height == _dft_size.height && plan->dft_size.height == _dft_size.height &&
@@ -225,9 +232,9 @@ clAmdFftPlanHandle cv::ocl::FftPlan::getPlan(Size _dft_size, int _src_step, int
return newPlan->plHandle; return newPlan->plHandle;
} }
void cv::ocl::dft(const oclMat& src, oclMat& dst, Size dft_size, int flags) void cv::ocl::dft(const oclMat &src, oclMat &dst, Size dft_size, int flags)
{ {
if(dft_size == Size(0,0)) if(dft_size == Size(0, 0))
{ {
dft_size = src.size(); dft_size = src.size();
} }
@@ -258,7 +265,7 @@ void cv::ocl::dft(const oclMat& src, oclMat& dst, Size dft_size, int flags)
break; break;
case R2C: case R2C:
CV_Assert(!is_row_dft); // this is not supported yet CV_Assert(!is_row_dft); // this is not supported yet
dst.create(src.rows, src.cols/2 + 1, CV_32FC2); dst.create(src.rows, src.cols / 2 + 1, CV_32FC2);
break; break;
case C2R: case C2R:
CV_Assert(dft_size.width / 2 + 1 == src.cols && dft_size.height == src.rows); CV_Assert(dft_size.width / 2 + 1 == src.cols && dft_size.height == src.rows);
@@ -274,11 +281,11 @@ void cv::ocl::dft(const oclMat& src, oclMat& dst, Size dft_size, int flags)
clAmdFftPlanHandle plHandle = FftPlan::getPlan(dft_size, src.step, dst.step, flags, type); clAmdFftPlanHandle plHandle = FftPlan::getPlan(dft_size, src.step, dst.step, flags, type);
//get the buffersize //get the buffersize
size_t buffersize=0; size_t buffersize = 0;
openCLSafeCall( clAmdFftGetTmpBufSize(plHandle, &buffersize ) ); openCLSafeCall( clAmdFftGetTmpBufSize(plHandle, &buffersize ) );
//allocate the intermediate buffer //allocate the intermediate buffer
cl_mem clMedBuffer=NULL; cl_mem clMedBuffer = NULL;
if (buffersize) if (buffersize)
{ {
cl_int medstatus; cl_int medstatus;
@@ -286,11 +293,11 @@ void cv::ocl::dft(const oclMat& src, oclMat& dst, Size dft_size, int flags)
openCLSafeCall( medstatus ); openCLSafeCall( medstatus );
} }
openCLSafeCall( clAmdFftEnqueueTransform( plHandle, openCLSafeCall( clAmdFftEnqueueTransform( plHandle,
is_inverse?CLFFT_BACKWARD:CLFFT_FORWARD, is_inverse ? CLFFT_BACKWARD : CLFFT_FORWARD,
1, 1,
&src.clCxt->impl->clCmdQueue, &src.clCxt->impl->clCmdQueue,
0, NULL, NULL, 0, NULL, NULL,
(cl_mem*)&src.data, (cl_mem*)&dst.data, clMedBuffer ) ); (cl_mem *)&src.data, (cl_mem *)&dst.data, clMedBuffer ) );
openCLSafeCall( clFinish(src.clCxt->impl->clCmdQueue) ); openCLSafeCall( clFinish(src.clCxt->impl->clCmdQueue) );
if(clMedBuffer) if(clMedBuffer)
{ {

View File

@@ -244,7 +244,7 @@ namespace
class Filter2DEngine_GPU : public FilterEngine_GPU class Filter2DEngine_GPU : public FilterEngine_GPU
{ {
public: public:
Filter2DEngine_GPU(const Ptr<BaseFilter_GPU>& filter2D_) : filter2D(filter2D_) {} Filter2DEngine_GPU(const Ptr<BaseFilter_GPU> &filter2D_) : filter2D(filter2D_) {}
virtual void apply(const oclMat &src, oclMat &dst, Rect roi = Rect(0, 0, -1, -1)) virtual void apply(const oclMat &src, oclMat &dst, Rect roi = Rect(0, 0, -1, -1))
{ {
@@ -328,30 +328,30 @@ void GPUErode(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize, c
CV_Assert(src.clCxt == dst.clCxt); CV_Assert(src.clCxt == dst.clCxt);
CV_Assert( (src.cols == dst.cols) && CV_Assert( (src.cols == dst.cols) &&
(src.rows == dst.rows) ); (src.rows == dst.rows) );
CV_Assert( (src.channels() == dst.channels()) ); CV_Assert( (src.oclchannels() == dst.oclchannels()) );
int srcStep = src.step1() / src.channels(); int srcStep = src.step1() / src.oclchannels();
int dstStep = dst.step1() / dst.channels(); int dstStep = dst.step1() / dst.oclchannels();
int srcOffset = src.offset / src.elemSize(); int srcOffset = src.offset / src.elemSize();
int dstOffset = dst.offset / dst.elemSize(); int dstOffset = dst.offset / dst.elemSize();
int srcOffset_x=srcOffset%srcStep; int srcOffset_x = srcOffset % srcStep;
int srcOffset_y=srcOffset/srcStep; int srcOffset_y = srcOffset / srcStep;
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
string kernelName; string kernelName;
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
size_t globalThreads[3] = {(src.cols + localThreads[0]) / localThreads[0] * localThreads[0], (src.rows + localThreads[1]) / localThreads[1] * localThreads[1], 1}; size_t globalThreads[3] = {(src.cols + localThreads[0]) / localThreads[0] *localThreads[0], (src.rows + localThreads[1]) / localThreads[1] *localThreads[1], 1};
if(src.type()==CV_8UC1) if(src.type() == CV_8UC1)
{ {
kernelName = "morph_C1_D0"; kernelName = "morph_C1_D0";
globalThreads[0] = ((src.cols + 3) / 4 + localThreads[0]) / localThreads[0] * localThreads[0]; globalThreads[0] = ((src.cols + 3) / 4 + localThreads[0]) / localThreads[0] * localThreads[0];
CV_Assert( localThreads[0]*localThreads[1]*8 >= (localThreads[0]*4+ksize.width-1)*(localThreads[1]+ksize.height-1) ); CV_Assert( localThreads[0]*localThreads[1] * 8 >= (localThreads[0] * 4 + ksize.width - 1) * (localThreads[1] + ksize.height - 1) );
} }
else else
{ {
kernelName = "morph"; kernelName = "morph";
CV_Assert( localThreads[0]*localThreads[1]*2 >= (localThreads[0]+ksize.width-1)*(localThreads[1]+ksize.height-1) ); CV_Assert( localThreads[0]*localThreads[1] * 2 >= (localThreads[0] + ksize.width - 1) * (localThreads[1] + ksize.height - 1) );
} }
char s[64]; char s[64];
switch(src.type()) switch(src.type())
@@ -371,10 +371,10 @@ void GPUErode(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize, c
sprintf(s, "-D VAL=FLT_MAX -D GENTYPE=float4"); sprintf(s, "-D VAL=FLT_MAX -D GENTYPE=float4");
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported type"); CV_Error(CV_StsUnsupportedFormat, "unsupported type");
} }
char compile_option[128]; char compile_option[128];
sprintf(compile_option, "-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D ERODE %s", anchor.x, anchor.y, localThreads[0], localThreads[1],s); sprintf(compile_option, "-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D ERODE %s", anchor.x, anchor.y, localThreads[0], localThreads[1], s);
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data));
@@ -385,9 +385,9 @@ void GPUErode(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize, c
args.push_back( make_pair( sizeof(cl_int), (void *)&srcStep)); args.push_back( make_pair( sizeof(cl_int), (void *)&srcStep));
args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep)); args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep));
args.push_back( make_pair( sizeof(cl_mem), (void *)&mat_kernel.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&mat_kernel.data));
args.push_back( make_pair( sizeof(cl_int),(void*)&src.wholecols)); args.push_back( make_pair( sizeof(cl_int), (void *)&src.wholecols));
args.push_back( make_pair( sizeof(cl_int),(void*)&src.wholerows)); args.push_back( make_pair( sizeof(cl_int), (void *)&src.wholerows));
args.push_back( make_pair( sizeof(cl_int),(void*)&dstOffset)); args.push_back( make_pair( sizeof(cl_int), (void *)&dstOffset));
openCLExecuteKernel(clCxt, &filtering_morph, kernelName, globalThreads, localThreads, args, -1, -1, compile_option); openCLExecuteKernel(clCxt, &filtering_morph, kernelName, globalThreads, localThreads, args, -1, -1, compile_option);
} }
@@ -400,30 +400,30 @@ void GPUDilate(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize,
CV_Assert(src.clCxt == dst.clCxt); CV_Assert(src.clCxt == dst.clCxt);
CV_Assert( (src.cols == dst.cols) && CV_Assert( (src.cols == dst.cols) &&
(src.rows == dst.rows) ); (src.rows == dst.rows) );
CV_Assert( (src.channels() == dst.channels()) ); CV_Assert( (src.oclchannels() == dst.oclchannels()) );
int srcStep = src.step1() / src.channels(); int srcStep = src.step1() / src.oclchannels();
int dstStep = dst.step1() / dst.channels(); int dstStep = dst.step1() / dst.oclchannels();
int srcOffset = src.offset / src.elemSize(); int srcOffset = src.offset / src.elemSize();
int dstOffset = dst.offset / dst.elemSize(); int dstOffset = dst.offset / dst.elemSize();
int srcOffset_x=srcOffset%srcStep; int srcOffset_x = srcOffset % srcStep;
int srcOffset_y=srcOffset/srcStep; int srcOffset_y = srcOffset / srcStep;
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
string kernelName; string kernelName;
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
size_t globalThreads[3] = {(src.cols + localThreads[0]) / localThreads[0] * localThreads[0], (src.rows + localThreads[1]) / localThreads[1] * localThreads[1], 1}; size_t globalThreads[3] = {(src.cols + localThreads[0]) / localThreads[0] *localThreads[0], (src.rows + localThreads[1]) / localThreads[1] *localThreads[1], 1};
if(src.type()==CV_8UC1) if(src.type() == CV_8UC1)
{ {
kernelName = "morph_C1_D0"; kernelName = "morph_C1_D0";
globalThreads[0] = ((src.cols + 3) / 4 + localThreads[0]) / localThreads[0] * localThreads[0]; globalThreads[0] = ((src.cols + 3) / 4 + localThreads[0]) / localThreads[0] * localThreads[0];
CV_Assert( localThreads[0]*localThreads[1]*8 >= (localThreads[0]*4+ksize.width-1)*(localThreads[1]+ksize.height-1) ); CV_Assert( localThreads[0]*localThreads[1] * 8 >= (localThreads[0] * 4 + ksize.width - 1) * (localThreads[1] + ksize.height - 1) );
} }
else else
{ {
kernelName = "morph"; kernelName = "morph";
CV_Assert( localThreads[0]*localThreads[1]*2 >= (localThreads[0]+ksize.width-1)*(localThreads[1]+ksize.height-1) ); CV_Assert( localThreads[0]*localThreads[1] * 2 >= (localThreads[0] + ksize.width - 1) * (localThreads[1] + ksize.height - 1) );
} }
char s[64]; char s[64];
switch(src.type()) switch(src.type())
@@ -443,10 +443,10 @@ void GPUDilate(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize,
sprintf(s, "-D VAL=-FLT_MAX -D GENTYPE=float4"); sprintf(s, "-D VAL=-FLT_MAX -D GENTYPE=float4");
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported type"); CV_Error(CV_StsUnsupportedFormat, "unsupported type");
} }
char compile_option[128]; char compile_option[128];
sprintf(compile_option, "-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D DILATE %s", anchor.x, anchor.y, localThreads[0], localThreads[1],s); sprintf(compile_option, "-D RADIUSX=%d -D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D DILATE %s", anchor.x, anchor.y, localThreads[0], localThreads[1], s);
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data));
@@ -457,9 +457,9 @@ void GPUDilate(const oclMat &src, oclMat &dst, oclMat &mat_kernel, Size &ksize,
args.push_back( make_pair( sizeof(cl_int), (void *)&srcStep)); args.push_back( make_pair( sizeof(cl_int), (void *)&srcStep));
args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep)); args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep));
args.push_back( make_pair( sizeof(cl_mem), (void *)&mat_kernel.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&mat_kernel.data));
args.push_back( make_pair( sizeof(cl_int),(void*)&src.wholecols)); args.push_back( make_pair( sizeof(cl_int), (void *)&src.wholecols));
args.push_back( make_pair( sizeof(cl_int),(void*)&src.wholerows)); args.push_back( make_pair( sizeof(cl_int), (void *)&src.wholerows));
args.push_back( make_pair( sizeof(cl_int),(void*)&dstOffset)); args.push_back( make_pair( sizeof(cl_int), (void *)&dstOffset));
openCLExecuteKernel(clCxt, &filtering_morph, kernelName, globalThreads, localThreads, args, -1, -1, compile_option); openCLExecuteKernel(clCxt, &filtering_morph, kernelName, globalThreads, localThreads, args, -1, -1, compile_option);
} }
@@ -467,12 +467,12 @@ Ptr<BaseFilter_GPU> cv::ocl::getMorphologyFilter_GPU(int op, int type, const Mat
{ {
static const GPUMorfFilter_t GPUMorfFilter_callers[2][5] = static const GPUMorfFilter_t GPUMorfFilter_callers[2][5] =
{ {
{0, GPUErode, 0, 0, GPUErode }, {0, GPUErode, 0, GPUErode, GPUErode },
{0, GPUDilate, 0, 0, GPUDilate} {0, GPUDilate, 0, GPUDilate, GPUDilate}
}; };
CV_Assert(op == MORPH_ERODE || op == MORPH_DILATE); CV_Assert(op == MORPH_ERODE || op == MORPH_DILATE);
CV_Assert(type == CV_8UC1 || type == CV_8UC4 || type == CV_32FC1 || type == CV_32FC4); CV_Assert(type == CV_8UC1 || type == CV_8UC3 || type == CV_8UC4 || type == CV_32FC1 || type == CV_32FC1 || type == CV_32FC4);
oclMat gpu_krnl; oclMat gpu_krnl;
normalizeKernel(kernel, gpu_krnl); normalizeKernel(kernel, gpu_krnl);
@@ -486,7 +486,7 @@ namespace
class MorphologyFilterEngine_GPU : public Filter2DEngine_GPU class MorphologyFilterEngine_GPU : public Filter2DEngine_GPU
{ {
public: public:
MorphologyFilterEngine_GPU(const Ptr<BaseFilter_GPU>& filter2D_, int iters_) : MorphologyFilterEngine_GPU(const Ptr<BaseFilter_GPU> &filter2D_, int iters_) :
Filter2DEngine_GPU(filter2D_), iters(iters_) {} Filter2DEngine_GPU(filter2D_), iters(iters_) {}
virtual void apply(const oclMat &src, oclMat &dst, Rect roi = Rect(0, 0, -1, -1)) virtual void apply(const oclMat &src, oclMat &dst, Rect roi = Rect(0, 0, -1, -1))
@@ -539,18 +539,18 @@ Ptr<FilterEngine_GPU> cv::ocl::createMorphologyFilter_GPU(int op, int type, cons
namespace namespace
{ {
void morphOp(int op, const oclMat &src, oclMat &dst, const Mat &_kernel, Point anchor, int iterations,int borderType,const Scalar& borderValue) void morphOp(int op, const oclMat &src, oclMat &dst, const Mat &_kernel, Point anchor, int iterations, int borderType, const Scalar &borderValue)
{ {
if((borderType != cv::BORDER_CONSTANT) || (borderValue!=morphologyDefaultBorderValue())) if((borderType != cv::BORDER_CONSTANT) || (borderValue != morphologyDefaultBorderValue()))
{ {
CV_Error(CV_StsBadArg,"unsupported border type"); CV_Error(CV_StsBadArg, "unsupported border type");
} }
Mat kernel; Mat kernel;
Size ksize = _kernel.data ? _kernel.size() : Size(3, 3); Size ksize = _kernel.data ? _kernel.size() : Size(3, 3);
normalizeAnchor(anchor, ksize); normalizeAnchor(anchor, ksize);
if (iterations == 0 || _kernel.rows *_kernel.cols == 1) if (iterations == 0 || _kernel.rows * _kernel.cols == 1)
{ {
src.copyTo(dst); src.copyTo(dst);
return; return;
@@ -581,7 +581,7 @@ namespace
} }
void cv::ocl::erode( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor, int iterations, void cv::ocl::erode( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor, int iterations,
int borderType,const Scalar& borderValue) int borderType, const Scalar &borderValue)
{ {
bool allZero = true; bool allZero = true;
for(int i = 0; i < kernel.rows * kernel.cols; ++i) for(int i = 0; i < kernel.rows * kernel.cols; ++i)
@@ -591,48 +591,48 @@ void cv::ocl::erode( const oclMat &src, oclMat &dst, const Mat &kernel, Point an
{ {
kernel.data[0] = 1; kernel.data[0] = 1;
} }
morphOp(MORPH_ERODE, src, dst, kernel, anchor, iterations,borderType, borderValue); morphOp(MORPH_ERODE, src, dst, kernel, anchor, iterations, borderType, borderValue);
} }
void cv::ocl::dilate( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor, int iterations, void cv::ocl::dilate( const oclMat &src, oclMat &dst, const Mat &kernel, Point anchor, int iterations,
int borderType,const Scalar& borderValue) int borderType, const Scalar &borderValue)
{ {
morphOp(MORPH_DILATE, src, dst, kernel, anchor, iterations,borderType, borderValue); morphOp(MORPH_DILATE, src, dst, kernel, anchor, iterations, borderType, borderValue);
} }
void cv::ocl::morphologyEx( const oclMat &src, oclMat &dst, int op, const Mat &kernel, Point anchor, int iterations, void cv::ocl::morphologyEx( const oclMat &src, oclMat &dst, int op, const Mat &kernel, Point anchor, int iterations,
int borderType,const Scalar& borderValue) int borderType, const Scalar &borderValue)
{ {
oclMat temp; oclMat temp;
switch( op ) switch( op )
{ {
case MORPH_ERODE: case MORPH_ERODE:
erode( src, dst, kernel, anchor, iterations,borderType, borderValue); erode( src, dst, kernel, anchor, iterations, borderType, borderValue);
break; break;
case MORPH_DILATE: case MORPH_DILATE:
dilate( src, dst, kernel, anchor, iterations,borderType, borderValue); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue);
break; break;
case MORPH_OPEN: case MORPH_OPEN:
erode( src, temp, kernel, anchor, iterations,borderType, borderValue); erode( src, temp, kernel, anchor, iterations, borderType, borderValue);
dilate( temp, dst, kernel, anchor, iterations,borderType, borderValue); dilate( temp, dst, kernel, anchor, iterations, borderType, borderValue);
break; break;
case CV_MOP_CLOSE: case CV_MOP_CLOSE:
dilate( src, temp, kernel, anchor, iterations,borderType, borderValue); dilate( src, temp, kernel, anchor, iterations, borderType, borderValue);
erode( temp, dst, kernel, anchor, iterations,borderType, borderValue); erode( temp, dst, kernel, anchor, iterations, borderType, borderValue);
break; break;
case CV_MOP_GRADIENT: case CV_MOP_GRADIENT:
erode( src, temp, kernel, anchor, iterations,borderType, borderValue); erode( src, temp, kernel, anchor, iterations, borderType, borderValue);
dilate( src, dst, kernel, anchor, iterations,borderType, borderValue); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue);
subtract(dst, temp, dst); subtract(dst, temp, dst);
break; break;
case CV_MOP_TOPHAT: case CV_MOP_TOPHAT:
erode( src, dst, kernel, anchor, iterations,borderType, borderValue); erode( src, dst, kernel, anchor, iterations, borderType, borderValue);
dilate( dst, temp, kernel, anchor, iterations,borderType, borderValue); dilate( dst, temp, kernel, anchor, iterations, borderType, borderValue);
subtract(src, temp, dst); subtract(src, temp, dst);
break; break;
case CV_MOP_BLACKHAT: case CV_MOP_BLACKHAT:
dilate( src, dst, kernel, anchor, iterations,borderType, borderValue); dilate( src, dst, kernel, anchor, iterations, borderType, borderValue);
erode( dst, temp, kernel, anchor, iterations,borderType, borderValue); erode( dst, temp, kernel, anchor, iterations, borderType, borderValue);
subtract(temp, src, dst); subtract(temp, src, dst);
break; break;
default: default:
@@ -670,12 +670,12 @@ void GPUFilter2D(const oclMat &src, oclMat &dst, oclMat &mat_kernel,
CV_Assert(src.clCxt == dst.clCxt); CV_Assert(src.clCxt == dst.clCxt);
CV_Assert( (src.cols == dst.cols) && CV_Assert( (src.cols == dst.cols) &&
(src.rows == dst.rows) ); (src.rows == dst.rows) );
CV_Assert( (src.channels() == dst.channels()) ); CV_Assert( (src.oclchannels() == dst.oclchannels()) );
CV_Assert( (borderType != 0) ); CV_Assert( (borderType != 0) );
CV_Assert(ksize.height > 0 && ksize.width > 0 && ((ksize.height & 1) == 1) && ((ksize.width & 1) == 1)); CV_Assert(ksize.height > 0 && ksize.width > 0 && ((ksize.height & 1) == 1) && ((ksize.width & 1) == 1));
CV_Assert((anchor.x == -1 && anchor.y == -1) || (anchor.x == ksize.width >> 1 && anchor.y == ksize.height >> 1)); CV_Assert((anchor.x == -1 && anchor.y == -1) || (anchor.x == ksize.width >> 1 && anchor.y == ksize.height >> 1));
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
int cn = src.channels(); int cn = src.oclchannels();
int depth = src.depth(); int depth = src.depth();
string kernelName = "filter2D"; string kernelName = "filter2D";
@@ -692,14 +692,14 @@ void GPUFilter2D(const oclMat &src, oclMat &dst, oclMat &mat_kernel,
{4, 4, 4, 4, 1, 1, 4} {4, 4, 4, 4, 1, 1, 4}
}; };
int vector_length = vector_lengths[cn-1][depth]; int vector_length = vector_lengths[cn - 1][depth];
int offset_cols = (dst_offset_x) & (vector_length - 1); int offset_cols = (dst_offset_x) & (vector_length - 1);
int cols = dst.cols + offset_cols; int cols = dst.cols + offset_cols;
int rows = divUp(dst.rows, vector_length); int rows = divUp(dst.rows, vector_length);
size_t localThreads[3] = {256, 1, 1}; size_t localThreads[3] = {256, 1, 1};
size_t globalThreads[3] = { divUp(cols, localThreads[0]) * localThreads[0], size_t globalThreads[3] = { divUp(cols, localThreads[0]) *localThreads[0],
divUp(rows, localThreads[1]) * localThreads[1], 1 divUp(rows, localThreads[1]) *localThreads[1], 1
}; };
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
@@ -723,9 +723,9 @@ void GPUFilter2D(const oclMat &src, oclMat &dst, oclMat &mat_kernel,
Ptr<BaseFilter_GPU> cv::ocl::getLinearFilter_GPU(int srcType, int dstType, const Mat &kernel, const Size &ksize, Ptr<BaseFilter_GPU> cv::ocl::getLinearFilter_GPU(int srcType, int dstType, const Mat &kernel, const Size &ksize,
Point anchor, int borderType) Point anchor, int borderType)
{ {
static const GPUFilter2D_t GPUFilter2D_callers[] = {0, GPUFilter2D, 0, 0, GPUFilter2D}; static const GPUFilter2D_t GPUFilter2D_callers[] = {0, GPUFilter2D, 0, GPUFilter2D, GPUFilter2D};
CV_Assert((srcType == CV_8UC1 || srcType == CV_8UC4 || srcType == CV_32FC1 || srcType == CV_32FC4) && dstType == srcType); CV_Assert((srcType == CV_8UC1 || srcType == CV_8UC3 || srcType == CV_8UC4 || srcType == CV_32FC1 || srcType == CV_32FC3 || srcType == CV_32FC4) && dstType == srcType);
oclMat gpu_krnl; oclMat gpu_krnl;
int nDivisor; int nDivisor;
@@ -767,8 +767,8 @@ namespace
class SeparableFilterEngine_GPU : public FilterEngine_GPU class SeparableFilterEngine_GPU : public FilterEngine_GPU
{ {
public: public:
SeparableFilterEngine_GPU(const Ptr<BaseRowFilter_GPU>& rowFilter_, SeparableFilterEngine_GPU(const Ptr<BaseRowFilter_GPU> &rowFilter_,
const Ptr<BaseColumnFilter_GPU>& columnFilter_) : const Ptr<BaseColumnFilter_GPU> &columnFilter_) :
rowFilter(rowFilter_), columnFilter(columnFilter_) rowFilter(rowFilter_), columnFilter(columnFilter_)
{ {
ksize = Size(rowFilter->ksize, columnFilter->ksize); ksize = Size(rowFilter->ksize, columnFilter->ksize);
@@ -780,7 +780,7 @@ namespace
Size src_size = src.size(); Size src_size = src.size();
int src_type = src.type(); int src_type = src.type();
int cn = src.channels(); int cn = src.oclchannels();
//dst.create(src_size, src_type); //dst.create(src_size, src_type);
dst = Scalar(0.0); dst = Scalar(0.0);
//dstBuf.create(src_size, src_type); //dstBuf.create(src_size, src_type);
@@ -810,8 +810,8 @@ namespace
}; };
} }
Ptr<FilterEngine_GPU> cv::ocl::createSeparableFilter_GPU(const Ptr<BaseRowFilter_GPU>& rowFilter, Ptr<FilterEngine_GPU> cv::ocl::createSeparableFilter_GPU(const Ptr<BaseRowFilter_GPU> &rowFilter,
const Ptr<BaseColumnFilter_GPU>& columnFilter) const Ptr<BaseColumnFilter_GPU> &columnFilter)
{ {
return Ptr<FilterEngine_GPU>(new SeparableFilterEngine_GPU(rowFilter, columnFilter)); return Ptr<FilterEngine_GPU>(new SeparableFilterEngine_GPU(rowFilter, columnFilter));
} }
@@ -1071,12 +1071,12 @@ void GPUFilterBox_32F_C4R(const oclMat &src, oclMat &dst,
Ptr<BaseFilter_GPU> cv::ocl::getBoxFilter_GPU(int srcType, int dstType, Ptr<BaseFilter_GPU> cv::ocl::getBoxFilter_GPU(int srcType, int dstType,
const Size &ksize, Point anchor, int borderType) const Size &ksize, Point anchor, int borderType)
{ {
static const FilterBox_t FilterBox_callers[2][5] = {{0, GPUFilterBox_8u_C1R, 0, 0, GPUFilterBox_8u_C4R}, static const FilterBox_t FilterBox_callers[2][5] = {{0, GPUFilterBox_8u_C1R, 0, GPUFilterBox_8u_C4R, GPUFilterBox_8u_C4R},
{0, GPUFilterBox_32F_C1R, 0, 0, GPUFilterBox_32F_C4R} {0, GPUFilterBox_32F_C1R, 0, GPUFilterBox_32F_C4R, GPUFilterBox_32F_C4R}
}; };
//Remove this check if more data types need to be supported. //Remove this check if more data types need to be supported.
CV_Assert((srcType == CV_8UC1 || srcType == CV_8UC4 || srcType == CV_32FC1 || srcType == CV_32FC4) CV_Assert((srcType == CV_8UC1 || srcType == CV_8UC3 || srcType == CV_8UC4 || srcType == CV_32FC1 ||
&& dstType == srcType); srcType == CV_32FC3 || srcType == CV_32FC4) && dstType == srcType);
normalizeAnchor(anchor, ksize); normalizeAnchor(anchor, ksize);
@@ -1155,7 +1155,7 @@ template <typename T>
void linearRowFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_kernel, int ksize, int anchor, int bordertype) void linearRowFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_kernel, int ksize, int anchor, int bordertype)
{ {
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
int channels = src.channels(); int channels = src.oclchannels();
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
string kernelName = "row_filter"; string kernelName = "row_filter";
@@ -1208,7 +1208,7 @@ void linearRowFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_kernel
//sanity checks //sanity checks
CV_Assert(clCxt == dst.clCxt); CV_Assert(clCxt == dst.clCxt);
CV_Assert(src.cols == dst.cols); CV_Assert(src.cols == dst.cols);
CV_Assert(src.channels() == dst.channels()); CV_Assert(src.oclchannels() == dst.oclchannels());
CV_Assert(ksize == (anchor << 1) + 1); CV_Assert(ksize == (anchor << 1) + 1);
int src_pix_per_row, dst_pix_per_row; int src_pix_per_row, dst_pix_per_row;
int src_offset_x, src_offset_y, dst_offset_in_pixel; int src_offset_x, src_offset_y, dst_offset_in_pixel;
@@ -1283,7 +1283,7 @@ template <typename T>
void linearColumnFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_kernel, int ksize, int anchor, int bordertype) void linearColumnFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_kernel, int ksize, int anchor, int bordertype)
{ {
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
int channels = src.channels(); int channels = src.oclchannels();
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
string kernelName = "col_filter"; string kernelName = "col_filter";
@@ -1320,18 +1320,18 @@ void linearColumnFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_ker
case 1: case 1:
globalThreads[0] = (dst.cols + localThreads[0] - 1) / localThreads[0] * localThreads[0]; globalThreads[0] = (dst.cols + localThreads[0] - 1) / localThreads[0] * localThreads[0];
sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s", sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
anchor, localThreads[0], localThreads[1], channels, btype,"float","uchar","convert_uchar_sat"); anchor, localThreads[0], localThreads[1], channels, btype, "float", "uchar", "convert_uchar_sat");
break; break;
case 2: case 2:
globalThreads[0] = ((dst.cols + 1) / 2 + localThreads[0] - 1) / localThreads[0] * localThreads[0]; globalThreads[0] = ((dst.cols + 1) / 2 + localThreads[0] - 1) / localThreads[0] * localThreads[0];
sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s", sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
anchor, localThreads[0], localThreads[1], channels, btype,"float2","uchar2","convert_uchar2_sat"); anchor, localThreads[0], localThreads[1], channels, btype, "float2", "uchar2", "convert_uchar2_sat");
break; break;
case 3: case 3:
case 4: case 4:
globalThreads[0] = (dst.cols + localThreads[0] - 1) / localThreads[0] * localThreads[0]; globalThreads[0] = (dst.cols + localThreads[0] - 1) / localThreads[0] * localThreads[0];
sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s", sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
anchor, localThreads[0], localThreads[1], channels, btype,"float4","uchar4","convert_uchar4_sat"); anchor, localThreads[0], localThreads[1], channels, btype, "float4", "uchar4", "convert_uchar4_sat");
break; break;
} }
} }
@@ -1342,21 +1342,21 @@ void linearColumnFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_ker
{ {
case CV_32SC1: case CV_32SC1:
sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s", sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
anchor, localThreads[0], localThreads[1], channels, btype,"float","int","convert_int_sat"); anchor, localThreads[0], localThreads[1], channels, btype, "float", "int", "convert_int_sat");
break; break;
case CV_32SC3: case CV_32SC3:
case CV_32SC4: case CV_32SC4:
sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s", sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
anchor, localThreads[0], localThreads[1], channels, btype,"float4","int4","convert_int4_sat"); anchor, localThreads[0], localThreads[1], channels, btype, "float4", "int4", "convert_int4_sat");
break; break;
case CV_32FC1: case CV_32FC1:
sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s", sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
anchor, localThreads[0], localThreads[1], channels, btype,"float","float",""); anchor, localThreads[0], localThreads[1], channels, btype, "float", "float", "");
break; break;
case CV_32FC3: case CV_32FC3:
case CV_32FC4: case CV_32FC4:
sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s", sprintf(compile_option, "-D RADIUSY=%d -D LSIZE0=%d -D LSIZE1=%d -D CN=%d -D %s -D GENTYPE_SRC=%s -D GENTYPE_DST=%s -D convert_to_DST=%s",
anchor, localThreads[0], localThreads[1], channels, btype,"float4","float4",""); anchor, localThreads[0], localThreads[1], channels, btype, "float4", "float4", "");
break; break;
} }
} }
@@ -1364,7 +1364,7 @@ void linearColumnFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_ker
//sanity checks //sanity checks
CV_Assert(clCxt == dst.clCxt); CV_Assert(clCxt == dst.clCxt);
CV_Assert(src.cols == dst.cols); CV_Assert(src.cols == dst.cols);
CV_Assert(src.channels() == dst.channels()); CV_Assert(src.oclchannels() == dst.oclchannels());
CV_Assert(ksize == (anchor << 1) + 1); CV_Assert(ksize == (anchor << 1) + 1);
int src_pix_per_row, dst_pix_per_row; int src_pix_per_row, dst_pix_per_row;
int src_offset_x, src_offset_y, dst_offset_in_pixel; int src_offset_x, src_offset_y, dst_offset_in_pixel;
@@ -1379,8 +1379,8 @@ void linearColumnFilter_gpu(const oclMat &src, const oclMat &dst, oclMat mat_ker
args.push_back(make_pair(sizeof(cl_mem), &dst.data)); args.push_back(make_pair(sizeof(cl_mem), &dst.data));
args.push_back(make_pair(sizeof(cl_int), (void *)&dst.cols)); args.push_back(make_pair(sizeof(cl_int), (void *)&dst.cols));
args.push_back(make_pair(sizeof(cl_int), (void *)&dst.rows)); args.push_back(make_pair(sizeof(cl_int), (void *)&dst.rows));
args.push_back(make_pair(sizeof(cl_int),(void*)&src.wholecols)); args.push_back(make_pair(sizeof(cl_int), (void *)&src.wholecols));
args.push_back(make_pair(sizeof(cl_int),(void*)&src.wholerows)); args.push_back(make_pair(sizeof(cl_int), (void *)&src.wholerows));
args.push_back(make_pair(sizeof(cl_int), (void *)&src_pix_per_row)); args.push_back(make_pair(sizeof(cl_int), (void *)&src_pix_per_row));
//args.push_back(make_pair(sizeof(cl_int),(void*)&src_offset_x)); //args.push_back(make_pair(sizeof(cl_int),(void*)&src_offset_x));
//args.push_back(make_pair(sizeof(cl_int),(void*)&src_offset_y)); //args.push_back(make_pair(sizeof(cl_int),(void*)&src_offset_y));
@@ -1441,7 +1441,7 @@ Ptr<FilterEngine_GPU> cv::ocl::createSeparableLinearFilter_GPU(int srcType, int
void cv::ocl::sepFilter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat &kernelX, const Mat &kernelY, Point anchor, double delta, int bordertype) void cv::ocl::sepFilter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat &kernelX, const Mat &kernelY, Point anchor, double delta, int bordertype)
{ {
if((dst.cols!=dst.wholecols) || (dst.rows!=dst.wholerows))//has roi if((dst.cols != dst.wholecols) || (dst.rows != dst.wholerows)) //has roi
{ {
if((bordertype & cv::BORDER_ISOLATED) != 0) if((bordertype & cv::BORDER_ISOLATED) != 0)
{ {
@@ -1449,7 +1449,7 @@ void cv::ocl::sepFilter2D(const oclMat &src, oclMat &dst, int ddepth, const Mat
if((bordertype != cv::BORDER_CONSTANT) && if((bordertype != cv::BORDER_CONSTANT) &&
(bordertype != cv::BORDER_REPLICATE)) (bordertype != cv::BORDER_REPLICATE))
{ {
CV_Error(CV_StsBadArg,"unsupported border type"); CV_Error(CV_StsBadArg, "unsupported border type");
} }
} }
} }
@@ -1467,7 +1467,7 @@ Ptr<FilterEngine_GPU> cv::ocl::createDerivFilter_GPU( int srcType, int dstType,
Mat kx, ky; Mat kx, ky;
getDerivKernels( kx, ky, dx, dy, ksize, false, CV_32F ); getDerivKernels( kx, ky, dx, dy, ksize, false, CV_32F );
return createSeparableLinearFilter_GPU(srcType, dstType, return createSeparableLinearFilter_GPU(srcType, dstType,
kx, ky, Point(-1,-1), 0, borderType ); kx, ky, Point(-1, -1), 0, borderType );
} }
//////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1517,9 +1517,9 @@ void cv::ocl::Scharr(const oclMat &src, oclMat &dst, int ddepth, int dx, int dy,
void cv::ocl::Laplacian(const oclMat &src, oclMat &dst, int ddepth, int ksize, double scale) void cv::ocl::Laplacian(const oclMat &src, oclMat &dst, int ddepth, int ksize, double scale)
{ {
if(src.clCxt -> impl -> double_support ==0 && src.type() == CV_64F) if(src.clCxt -> impl -> double_support == 0 && src.type() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); CV_Error(CV_GpuNotSupported, "Selected device don't support double\r\n");
return; return;
} }
@@ -1576,7 +1576,7 @@ void cv::ocl::GaussianBlur(const oclMat &src, oclMat &dst, Size ksize, double si
src.copyTo(dst); src.copyTo(dst);
return; return;
} }
if((dst.cols!=dst.wholecols) || (dst.rows!=dst.wholerows))//has roi if((dst.cols != dst.wholecols) || (dst.rows != dst.wholerows)) //has roi
{ {
if((bordertype & cv::BORDER_ISOLATED) != 0) if((bordertype & cv::BORDER_ISOLATED) != 0)
{ {
@@ -1584,7 +1584,7 @@ void cv::ocl::GaussianBlur(const oclMat &src, oclMat &dst, Size ksize, double si
if((bordertype != cv::BORDER_CONSTANT) && if((bordertype != cv::BORDER_CONSTANT) &&
(bordertype != cv::BORDER_REPLICATE)) (bordertype != cv::BORDER_REPLICATE))
{ {
CV_Error(CV_StsBadArg,"unsupported border type"); CV_Error(CV_StsBadArg, "unsupported border type");
} }
} }
} }

View File

@@ -51,14 +51,17 @@
#include "clAmdBlas.h" #include "clAmdBlas.h"
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
void cv::ocl::dft(const oclMat& src, oclMat& dst, int flags) { throw_nogpu(); } void cv::ocl::dft(const oclMat &src, oclMat &dst, int flags)
{
throw_nogpu();
}
#else #else
using namespace cv; using namespace cv;
void cv::ocl::gemm(const oclMat& src1, const oclMat& src2, double alpha, void cv::ocl::gemm(const oclMat &src1, const oclMat &src2, double alpha,
const oclMat& src3, double beta, oclMat& dst, int flags) const oclMat &src3, double beta, oclMat &dst, int flags)
{ {
CV_Assert(src1.cols == src2.rows && CV_Assert(src1.cols == src2.rows &&
(src3.empty() || src1.rows == src3.rows && src2.cols == src3.cols)); (src3.empty() || src1.rows == src3.rows && src2.cols == src3.cols));
CV_Assert(!(cv::GEMM_3_T & flags)); // cv::GEMM_3_T is not supported CV_Assert(!(cv::GEMM_3_T & flags)); // cv::GEMM_3_T is not supported
@@ -73,8 +76,8 @@ using namespace cv;
} }
openCLSafeCall( clAmdBlasSetup() ); openCLSafeCall( clAmdBlasSetup() );
const clAmdBlasTranspose transA = (cv::GEMM_1_T & flags)?clAmdBlasTrans:clAmdBlasNoTrans; const clAmdBlasTranspose transA = (cv::GEMM_1_T & flags) ? clAmdBlasTrans : clAmdBlasNoTrans;
const clAmdBlasTranspose transB = (cv::GEMM_2_T & flags)?clAmdBlasTrans:clAmdBlasNoTrans; const clAmdBlasTranspose transB = (cv::GEMM_2_T & flags) ? clAmdBlasTrans : clAmdBlasNoTrans;
const clAmdBlasOrder order = clAmdBlasRowMajor; const clAmdBlasOrder order = clAmdBlasRowMajor;
const int M = src1.rows; const int M = src1.rows;
@@ -156,6 +159,6 @@ using namespace cv;
break; break;
} }
clAmdBlasTeardown(); clAmdBlasTeardown();
} }
#endif #endif
#endif #endif

View File

@@ -52,6 +52,7 @@
#include "precomp.hpp" #include "precomp.hpp"
#include <stdio.h> #include <stdio.h>
#include <string>
#ifdef EMU #ifdef EMU
#include "runCL.h" #include "runCL.h"
#endif #endif
@@ -299,7 +300,7 @@ const float icv_stage_threshold_bias = 0.0001f;
double globaltime = 0; double globaltime = 0;
CvHaarClassifierCascade* CvHaarClassifierCascade *
gpuCreateHaarClassifierCascade( int stage_count ) gpuCreateHaarClassifierCascade( int stage_count )
{ {
CvHaarClassifierCascade *cascade = 0; CvHaarClassifierCascade *cascade = 0;
@@ -331,7 +332,7 @@ gpuReleaseHidHaarClassifierCascade( GpuHidHaarClassifierCascade **_cascade )
} }
/* create more efficient internal representation of haar classifier cascade */ /* create more efficient internal representation of haar classifier cascade */
GpuHidHaarClassifierCascade* GpuHidHaarClassifierCascade *
gpuCreateHidHaarClassifierCascade( CvHaarClassifierCascade *cascade, int *size, int *totalclassifier) gpuCreateHidHaarClassifierCascade( CvHaarClassifierCascade *cascade, int *size, int *totalclassifier)
{ {
GpuHidHaarClassifierCascade *out = 0; GpuHidHaarClassifierCascade *out = 0;
@@ -888,6 +889,13 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
bool findBiggestObject = (flags & CV_HAAR_FIND_BIGGEST_OBJECT) != 0; bool findBiggestObject = (flags & CV_HAAR_FIND_BIGGEST_OBJECT) != 0;
bool roughSearch = (flags & CV_HAAR_DO_ROUGH_SEARCH) != 0; bool roughSearch = (flags & CV_HAAR_DO_ROUGH_SEARCH) != 0;
//the Intel HD Graphics is unsupported
if (gimg.clCxt->impl->devName.find("Intel(R) HD Graphics") != string::npos)
{
cout << " Intel HD GPU device unsupported " << endl;
return NULL;
}
//double t = 0; //double t = 0;
if( maxSize.height == 0 || maxSize.width == 0 ) if( maxSize.height == 0 || maxSize.width == 0 )
{ {
@@ -948,7 +956,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
vector<float> scalev; vector<float> scalev;
for(factor = 1.f;; factor *= scaleFactor) for(factor = 1.f;; factor *= scaleFactor)
{ {
CvSize winSize = { cvRound(winSize0.width *factor), cvRound(winSize0.height *factor) }; CvSize winSize = { cvRound(winSize0.width * factor), cvRound(winSize0.height * factor) };
sz.width = cvRound( gimg.cols / factor ) + 1; sz.width = cvRound( gimg.cols / factor ) + 1;
sz.height = cvRound( gimg.rows / factor ) + 1; sz.height = cvRound( gimg.rows / factor ) + 1;
CvSize sz1 = { sz.width - winSize0.width - 1, sz.height - winSize0.height - 1 }; CvSize sz1 = { sz.width - winSize0.width - 1, sz.height - winSize0.height - 1 };
@@ -985,7 +993,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
size_t blocksize = 8; size_t blocksize = 8;
size_t localThreads[3] = { blocksize, blocksize , 1 }; size_t localThreads[3] = { blocksize, blocksize , 1 };
size_t globalThreads[3] = { grp_per_CU * ((gsum.clCxt)->impl->maxComputeUnits) *localThreads[0], size_t globalThreads[3] = { grp_per_CU *((gsum.clCxt)->impl->maxComputeUnits) *localThreads[0],
localThreads[1], 1 localThreads[1], 1
}; };
int outputsz = 256 * globalThreads[0] / localThreads[0]; int outputsz = 256 * globalThreads[0] / localThreads[0];
@@ -1067,7 +1075,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
//classifierbuffer = clCreateBuffer(gsum.clCxt->clContext,CL_MEM_READ_ONLY,sizeof(GpuHidHaarClassifier)*totalclassifier,NULL,&status); //classifierbuffer = clCreateBuffer(gsum.clCxt->clContext,CL_MEM_READ_ONLY,sizeof(GpuHidHaarClassifier)*totalclassifier,NULL,&status);
//status = clEnqueueWriteBuffer(gsum.clCxt->clCmdQueue,classifierbuffer,1,0,sizeof(GpuHidHaarClassifier)*totalclassifier,classifier,0,NULL,NULL); //status = clEnqueueWriteBuffer(gsum.clCxt->clCmdQueue,classifierbuffer,1,0,sizeof(GpuHidHaarClassifier)*totalclassifier,classifier,0,NULL,NULL);
nodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY,nodenum * sizeof(GpuHidHaarTreeNode)); nodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, nodenum * sizeof(GpuHidHaarTreeNode));
//openCLVerifyCall(status); //openCLVerifyCall(status);
openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, nodebuffer, 1, 0, openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->impl->clCmdQueue, nodebuffer, 1, 0,
nodenum * sizeof(GpuHidHaarTreeNode), nodenum * sizeof(GpuHidHaarTreeNode),
@@ -1107,7 +1115,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
// openCLVerifyKernel(gsum.clCxt, kernel, &blocksize, globalThreads, localThreads); // openCLVerifyKernel(gsum.clCxt, kernel, &blocksize, globalThreads, localThreads);
//openCLSafeCall(clSetKernelArg(kernel,argcount++,sizeof(cl_mem),(void*)&cascadebuffer)); //openCLSafeCall(clSetKernelArg(kernel,argcount++,sizeof(cl_mem),(void*)&cascadebuffer));
vector<pair<size_t,const void *> > args; vector<pair<size_t, const void *> > args;
args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer ));
args.push_back ( make_pair(sizeof(cl_mem) , (void *)&scaleinfobuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&scaleinfobuffer ));
args.push_back ( make_pair(sizeof(cl_mem) , (void *)&nodebuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&nodebuffer ));
@@ -1156,8 +1164,8 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
openCLReadBuffer( gsum.clCxt, candidatebuffer, candidate, 4 * sizeof(int)*outputsz ); openCLReadBuffer( gsum.clCxt, candidatebuffer, candidate, 4 * sizeof(int)*outputsz );
for(int i = 0; i < outputsz; i++) for(int i = 0; i < outputsz; i++)
if(candidate[4*i+2] != 0) if(candidate[4 * i + 2] != 0)
allCandidates.push_back(Rect(candidate[4*i], candidate[4*i+1], candidate[4*i+2], candidate[4*i+3])); allCandidates.push_back(Rect(candidate[4 * i], candidate[4 * i + 1], candidate[4 * i + 2], candidate[4 * i + 3]));
// t = (double)cvGetTickCount() - t; // t = (double)cvGetTickCount() - t;
//printf( "post time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); //printf( "post time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) );
//t = (double)cvGetTickCount(); //t = (double)cvGetTickCount();
@@ -1200,8 +1208,8 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
cvRound(factor * winsize0.height) < gimg.rows - 10; cvRound(factor * winsize0.height) < gimg.rows - 10;
n_factors++, factor *= scaleFactor ) n_factors++, factor *= scaleFactor )
{ {
CvSize winSize = { cvRound( winsize0.width *factor ), CvSize winSize = { cvRound( winsize0.width * factor ),
cvRound( winsize0.height *factor ) cvRound( winsize0.height * factor )
}; };
if( winSize.width < minSize.width || winSize.height < minSize.height ) if( winSize.width < minSize.width || winSize.height < minSize.height )
{ {
@@ -1278,15 +1286,15 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
openCLSafeCall(clSetKernelArg(kernel2, argcounts++, sizeof(cl_int), (void *)&startnodenum)); openCLSafeCall(clSetKernelArg(kernel2, argcounts++, sizeof(cl_int), (void *)&startnodenum));
*/ */
vector<pair<size_t,const void *> > args1; vector<pair<size_t, const void *> > args1;
args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&nodebuffer )); args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&nodebuffer ));
args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&newnodebuffer )); args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&newnodebuffer ));
args1.push_back ( make_pair(sizeof(cl_float) , (void *)&factor2 )); args1.push_back ( make_pair(sizeof(cl_float) , (void *)&factor2 ));
args1.push_back ( make_pair(sizeof(cl_float) , (void *)&correction[i] )); args1.push_back ( make_pair(sizeof(cl_float) , (void *)&correction[i] ));
args1.push_back ( make_pair(sizeof(cl_int) , (void *)&startnodenum )); args1.push_back ( make_pair(sizeof(cl_int) , (void *)&startnodenum ));
size_t globalThreads2[3] = {nodenum,1,1}; size_t globalThreads2[3] = {nodenum, 1, 1};
size_t localThreads2[3] = {256,1,1}; size_t localThreads2[3] = {256, 1, 1};
openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier", globalThreads2, NULL/*localThreads2*/, args1, -1, -1); openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier", globalThreads2, NULL/*localThreads2*/, args1, -1, -1);
@@ -1328,7 +1336,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&correctionbuffer)); openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_mem), (void *)&correctionbuffer));
openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int), (void *)&nodenum));*/ openCLSafeCall(clSetKernelArg(kernel, argcount++, sizeof(cl_int), (void *)&nodenum));*/
vector<pair<size_t,const void *> > args; vector<pair<size_t, const void *> > args;
args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer ));
args.push_back ( make_pair(sizeof(cl_mem) , (void *)&scaleinfobuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&scaleinfobuffer ));
args.push_back ( make_pair(sizeof(cl_mem) , (void *)&newnodebuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&newnodebuffer ));
@@ -1356,8 +1364,8 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
for(int i = 0; i < outputsz; i++) for(int i = 0; i < outputsz; i++)
{ {
if(candidate[4*i+2] != 0) if(candidate[4 * i + 2] != 0)
allCandidates.push_back(Rect(candidate[4*i], candidate[4*i+1], candidate[4*i+2], candidate[4*i+3])); allCandidates.push_back(Rect(candidate[4 * i], candidate[4 * i + 1], candidate[4 * i + 2], candidate[4 * i + 3]));
} }
free(scaleinfo); free(scaleinfo);
@@ -1420,7 +1428,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS
} }
CvHaarClassifierCascade* CvHaarClassifierCascade *
gpuLoadCascadeCART( const char **input_cascade, int n, CvSize orig_window_size ) gpuLoadCascadeCART( const char **input_cascade, int n, CvSize orig_window_size )
{ {
int i; int i;
@@ -1536,7 +1544,7 @@ gpuLoadCascadeCART( const char **input_cascade, int n, CvSize orig_window_size )
#define _MAX_PATH 1024 #define _MAX_PATH 1024
#endif #endif
CV_IMPL CvHaarClassifierCascade* CV_IMPL CvHaarClassifierCascade *
gpuLoadHaarClassifierCascade( const char *directory, CvSize orig_window_size ) gpuLoadHaarClassifierCascade( const char *directory, CvSize orig_window_size )
{ {
const char **input_cascade = 0; const char **input_cascade = 0;
@@ -1649,7 +1657,7 @@ gpuIsHaarClassifier( const void *struct_ptr )
return CV_IS_HAAR_CLASSIFIER( struct_ptr ); return CV_IS_HAAR_CLASSIFIER( struct_ptr );
} }
void* void *
gpuReadHaarClassifier( CvFileStorage *fs, CvFileNode *node ) gpuReadHaarClassifier( CvFileStorage *fs, CvFileNode *node )
{ {
CvHaarClassifierCascade *cascade = NULL; CvHaarClassifierCascade *cascade = NULL;
@@ -1993,7 +2001,7 @@ gpuReadHaarClassifier( CvFileStorage *fs, CvFileNode *node )
void void
gpuWriteHaarClassifier( CvFileStorage *fs, const char *name, const void *struct_ptr, gpuWriteHaarClassifier( CvFileStorage *fs, const char *name, const void *struct_ptr,
CvAttrList attributes ) CvAttrList attributes )
{ {
int i, j, k, l; int i, j, k, l;
char buf[256]; char buf[256];
@@ -2098,7 +2106,7 @@ CvAttrList attributes )
cvEndWriteStruct( fs ); /* root */ cvEndWriteStruct( fs ); /* root */
} }
void* void *
gpuCloneHaarClassifier( const void *struct_ptr ) gpuCloneHaarClassifier( const void *struct_ptr )
{ {
CvHaarClassifierCascade *cascade = NULL; CvHaarClassifierCascade *cascade = NULL;
@@ -2164,9 +2172,9 @@ gpuCloneHaarClassifier( const void *struct_ptr )
#if 0 #if 0
CvType haar_type( CV_TYPE_NAME_HAAR, gpuIsHaarClassifier, CvType haar_type( CV_TYPE_NAME_HAAR, gpuIsHaarClassifier,
(CvReleaseFunc)gpuReleaseHaarClassifierCascade, (CvReleaseFunc)gpuReleaseHaarClassifierCascade,
gpuReadHaarClassifier, gpuWriteHaarClassifier, gpuReadHaarClassifier, gpuWriteHaarClassifier,
gpuCloneHaarClassifier ); gpuCloneHaarClassifier );
namespace cv namespace cv
@@ -2185,7 +2193,7 @@ namespace cv
} }
void HaarClassifierCascade::detectMultiScale( const Mat &image, void HaarClassifierCascade::detectMultiScale( const Mat &image,
Vector<Rect>& objects, double scaleFactor, Vector<Rect> &objects, double scaleFactor,
int minNeighbors, int flags, int minNeighbors, int flags,
Size minSize ) Size minSize )
{ {
@@ -2473,8 +2481,8 @@ else
CV_INLINE CV_INLINE
double gpuEvalHidHaarClassifier( GpuHidHaarClassifier *classifier, double gpuEvalHidHaarClassifier( GpuHidHaarClassifier *classifier,
double variance_norm_factor, double variance_norm_factor,
size_t p_offset ) size_t p_offset )
{ {
/* /*
int idx = 0; int idx = 0;
@@ -2500,7 +2508,7 @@ size_t p_offset )
CV_IMPL int CV_IMPL int
gpuRunHaarClassifierCascade( const CvHaarClassifierCascade *_cascade, gpuRunHaarClassifierCascade( const CvHaarClassifierCascade *_cascade,
CvPoint pt, int start_stage ) CvPoint pt, int start_stage )
{ {
/* /*
int result = -1; int result = -1;

View File

@@ -51,19 +51,65 @@ using namespace std;
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
cv::ocl::HOGDescriptor::HOGDescriptor(Size, Size, Size, Size, int, double, double, bool, int) { throw_nogpu(); } cv::ocl::HOGDescriptor::HOGDescriptor(Size, Size, Size, Size, int, double, double, bool, int)
size_t cv::ocl::HOGDescriptor::getDescriptorSize() const { throw_nogpu(); return 0; } {
size_t cv::ocl::HOGDescriptor::getBlockHistogramSize() const { throw_nogpu(); return 0; } throw_nogpu();
double cv::ocl::HOGDescriptor::getWinSigma() const { throw_nogpu(); return 0; } }
bool cv::ocl::HOGDescriptor::checkDetectorSize() const { throw_nogpu(); return false; } size_t cv::ocl::HOGDescriptor::getDescriptorSize() const
void cv::ocl::HOGDescriptor::setSVMDetector(const vector<float>&) { throw_nogpu(); } {
void cv::ocl::HOGDescriptor::detect(const oclMat&, vector<Point>&, double, Size, Size) { throw_nogpu(); } throw_nogpu();
void cv::ocl::HOGDescriptor::detectMultiScale(const oclMat&, vector<Rect>&, double, Size, Size, double, int) { throw_nogpu(); } return 0;
void cv::ocl::HOGDescriptor::computeBlockHistograms(const oclMat&) { throw_nogpu(); } }
void cv::ocl::HOGDescriptor::getDescriptors(const oclMat&, Size, oclMat&, int) { throw_nogpu(); } size_t cv::ocl::HOGDescriptor::getBlockHistogramSize() const
std::vector<float> cv::ocl::HOGDescriptor::getDefaultPeopleDetector() { throw_nogpu(); return std::vector<float>(); } {
std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector48x96() { throw_nogpu(); return std::vector<float>(); } throw_nogpu();
std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector64x128() { throw_nogpu(); return std::vector<float>(); } return 0;
}
double cv::ocl::HOGDescriptor::getWinSigma() const
{
throw_nogpu();
return 0;
}
bool cv::ocl::HOGDescriptor::checkDetectorSize() const
{
throw_nogpu();
return false;
}
void cv::ocl::HOGDescriptor::setSVMDetector(const vector<float> &)
{
throw_nogpu();
}
void cv::ocl::HOGDescriptor::detect(const oclMat &, vector<Point> &, double, Size, Size)
{
throw_nogpu();
}
void cv::ocl::HOGDescriptor::detectMultiScale(const oclMat &, vector<Rect> &, double, Size, Size, double, int)
{
throw_nogpu();
}
void cv::ocl::HOGDescriptor::computeBlockHistograms(const oclMat &)
{
throw_nogpu();
}
void cv::ocl::HOGDescriptor::getDescriptors(const oclMat &, Size, oclMat &, int)
{
throw_nogpu();
}
std::vector<float> cv::ocl::HOGDescriptor::getDefaultPeopleDetector()
{
throw_nogpu();
return std::vector<float>();
}
std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector48x96()
{
throw_nogpu();
return std::vector<float>();
}
std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector64x128()
{
throw_nogpu();
return std::vector<float>();
}
#else #else
@@ -73,14 +119,21 @@ std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector64x128() { throw_nog
#define CELLS_PER_BLOCK_Y 2 #define CELLS_PER_BLOCK_Y 2
#define NTHREADS 256 #define NTHREADS 256
namespace cv { namespace ocl namespace cv
{ {
namespace ocl
{
///////////////////////////OpenCL kernel strings/////////////////////////// ///////////////////////////OpenCL kernel strings///////////////////////////
extern const char *objdetect_hog; extern const char *objdetect_hog;
}} }
}
namespace cv { namespace ocl { namespace device namespace cv
{ {
namespace ocl
{
namespace device
{
namespace hog namespace hog
{ {
int cnbins; int cnbins;
@@ -97,32 +150,34 @@ namespace cv { namespace ocl { namespace device
int nblocks_win_x, int nblocks_win_y); int nblocks_win_x, int nblocks_win_y);
void compute_hists(int nbins, int block_stride_x, int blovck_stride_y, void compute_hists(int nbins, int block_stride_x, int blovck_stride_y,
int height, int width, const cv::ocl::oclMat& grad, int height, int width, const cv::ocl::oclMat &grad,
const cv::ocl::oclMat& qangle, float sigma, cv::ocl::oclMat& block_hists); const cv::ocl::oclMat &qangle, float sigma, cv::ocl::oclMat &block_hists);
void normalize_hists(int nbins, int block_stride_x, int block_stride_y, void normalize_hists(int nbins, int block_stride_x, int block_stride_y,
int height, int width, cv::ocl::oclMat& block_hists, float threshold); int height, int width, cv::ocl::oclMat &block_hists, float threshold);
void classify_hists(int win_height, int win_width, int block_stride_y, void classify_hists(int win_height, int win_width, int block_stride_y,
int block_stride_x, int win_stride_y, int win_stride_x, int height, int block_stride_x, int win_stride_y, int win_stride_x, int height,
int width, const cv::ocl::oclMat& block_hists, const cv::ocl::oclMat& coefs, float free_coef, int width, const cv::ocl::oclMat &block_hists, const cv::ocl::oclMat &coefs, float free_coef,
float threshold, cv::ocl::oclMat& labels); float threshold, cv::ocl::oclMat &labels);
void extract_descrs_by_rows(int win_height, int win_width, int block_stride_y, int block_stride_x, void extract_descrs_by_rows(int win_height, int win_width, int block_stride_y, int block_stride_x,
int win_stride_y, int win_stride_x, int height, int width, const cv::ocl::oclMat& block_hists, int win_stride_y, int win_stride_x, int height, int width, const cv::ocl::oclMat &block_hists,
cv::ocl::oclMat& descriptors); cv::ocl::oclMat &descriptors);
void extract_descrs_by_cols(int win_height, int win_width, int block_stride_y, int block_stride_x, void extract_descrs_by_cols(int win_height, int win_width, int block_stride_y, int block_stride_x,
int win_stride_y, int win_stride_x, int height, int width, const cv::ocl::oclMat& block_hists, int win_stride_y, int win_stride_x, int height, int width, const cv::ocl::oclMat &block_hists,
cv::ocl::oclMat& descriptors); cv::ocl::oclMat &descriptors);
void compute_gradients_8UC1(int height, int width, const cv::ocl::oclMat& img, void compute_gradients_8UC1(int height, int width, const cv::ocl::oclMat &img,
float angle_scale, cv::ocl::oclMat& grad, cv::ocl::oclMat& qangle, bool correct_gamma); float angle_scale, cv::ocl::oclMat &grad, cv::ocl::oclMat &qangle, bool correct_gamma);
void compute_gradients_8UC4(int height, int width, const cv::ocl::oclMat& img, void compute_gradients_8UC4(int height, int width, const cv::ocl::oclMat &img,
float angle_scale, cv::ocl::oclMat& grad, cv::ocl::oclMat& qangle, bool correct_gamma); float angle_scale, cv::ocl::oclMat &grad, cv::ocl::oclMat &qangle, bool correct_gamma);
void resize( const oclMat &src, oclMat &dst, const Size sz); void resize( const oclMat &src, oclMat &dst, const Size sz);
} }
}}} }
}
}
using namespace ::cv::ocl::device; using namespace ::cv::ocl::device;
@@ -179,7 +234,7 @@ bool cv::ocl::HOGDescriptor::checkDetectorSize() const
return detector_size == 0 || detector_size == descriptor_size || detector_size == descriptor_size + 1; return detector_size == 0 || detector_size == descriptor_size || detector_size == descriptor_size + 1;
} }
void cv::ocl::HOGDescriptor::setSVMDetector(const vector<float>& _detector) void cv::ocl::HOGDescriptor::setSVMDetector(const vector<float> &_detector)
{ {
std::vector<float> detector_reordered(_detector.size()); std::vector<float> detector_reordered(_detector.size());
@@ -189,8 +244,8 @@ void cv::ocl::HOGDescriptor::setSVMDetector(const vector<float>& _detector)
for (int i = 0; i < blocks_per_img.height; ++i) for (int i = 0; i < blocks_per_img.height; ++i)
for (int j = 0; j < blocks_per_img.width; ++j) for (int j = 0; j < blocks_per_img.width; ++j)
{ {
const float* src = &_detector[0] + (j * blocks_per_img.height + i) * block_hist_size; const float *src = &_detector[0] + (j * blocks_per_img.height + i) * block_hist_size;
float* dst = &detector_reordered[0] + (i * blocks_per_img.width + j) * block_hist_size; float *dst = &detector_reordered[0] + (i * blocks_per_img.width + j) * block_hist_size;
for (size_t k = 0; k < block_hist_size; ++k) for (size_t k = 0; k < block_hist_size; ++k)
dst[k] = src[k]; dst[k] = src[k];
} }
@@ -203,7 +258,7 @@ void cv::ocl::HOGDescriptor::setSVMDetector(const vector<float>& _detector)
CV_Assert(checkDetectorSize()); CV_Assert(checkDetectorSize());
} }
void cv::ocl::HOGDescriptor::init_buffer(const oclMat& img, Size win_stride) void cv::ocl::HOGDescriptor::init_buffer(const oclMat &img, Size win_stride)
{ {
if (!image_scale.empty()) if (!image_scale.empty())
return; return;
@@ -222,7 +277,7 @@ void cv::ocl::HOGDescriptor::init_buffer(const oclMat& img, Size win_stride)
labels.create(1, wins_per_img.area(), CV_8U); labels.create(1, wins_per_img.area(), CV_8U);
} }
void cv::ocl::HOGDescriptor::computeGradient(const oclMat& img, oclMat& grad, oclMat& qangle) void cv::ocl::HOGDescriptor::computeGradient(const oclMat &img, oclMat &grad, oclMat &qangle)
{ {
CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4); CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4);
@@ -239,7 +294,7 @@ void cv::ocl::HOGDescriptor::computeGradient(const oclMat& img, oclMat& grad, oc
} }
void cv::ocl::HOGDescriptor::computeBlockHistograms(const oclMat& img) void cv::ocl::HOGDescriptor::computeBlockHistograms(const oclMat &img)
{ {
computeGradient(img, grad, qangle); computeGradient(img, grad, qangle);
@@ -251,7 +306,7 @@ void cv::ocl::HOGDescriptor::computeBlockHistograms(const oclMat& img)
} }
void cv::ocl::HOGDescriptor::getDescriptors(const oclMat& img, Size win_stride, oclMat& descriptors, int descr_format) void cv::ocl::HOGDescriptor::getDescriptors(const oclMat &img, Size win_stride, oclMat &descriptors, int descr_format)
{ {
CV_Assert(win_stride.width % block_stride.width == 0 && win_stride.height % block_stride.height == 0); CV_Assert(win_stride.width % block_stride.width == 0 && win_stride.height % block_stride.height == 0);
@@ -281,7 +336,7 @@ void cv::ocl::HOGDescriptor::getDescriptors(const oclMat& img, Size win_stride,
} }
void cv::ocl::HOGDescriptor::detect(const oclMat& img, vector<Point>& hits, double hit_threshold, Size win_stride, Size padding) void cv::ocl::HOGDescriptor::detect(const oclMat &img, vector<Point> &hits, double hit_threshold, Size win_stride, Size padding)
{ {
CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4); CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4);
CV_Assert(padding == Size(0, 0)); CV_Assert(padding == Size(0, 0));
@@ -303,7 +358,7 @@ void cv::ocl::HOGDescriptor::detect(const oclMat& img, vector<Point>& hits, doub
detector, (float)free_coef, (float)hit_threshold, labels); detector, (float)free_coef, (float)hit_threshold, labels);
labels.download(labels_host); labels.download(labels_host);
unsigned char* vec = labels_host.ptr(); unsigned char *vec = labels_host.ptr();
Size wins_per_img = numPartsWithin(effect_size, win_size, win_stride); Size wins_per_img = numPartsWithin(effect_size, win_size, win_stride);
for (int i = 0; i < wins_per_img.area(); i++) for (int i = 0; i < wins_per_img.area(); i++)
{ {
@@ -316,7 +371,7 @@ void cv::ocl::HOGDescriptor::detect(const oclMat& img, vector<Point>& hits, doub
void cv::ocl::HOGDescriptor::detectMultiScale(const oclMat& img, vector<Rect>& found_locations, double hit_threshold, void cv::ocl::HOGDescriptor::detectMultiScale(const oclMat &img, vector<Rect> &found_locations, double hit_threshold,
Size win_stride, Size padding, double scale0, int group_threshold) Size win_stride, Size padding, double scale0, int group_threshold)
{ {
CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4); CV_Assert(img.type() == CV_8UC1 || img.type() == CV_8UC4);
@@ -329,8 +384,8 @@ void cv::ocl::HOGDescriptor::detectMultiScale(const oclMat& img, vector<Rect>& f
for (levels = 0; levels < nlevels; levels++) for (levels = 0; levels < nlevels; levels++)
{ {
level_scale.push_back(scale); level_scale.push_back(scale);
if (cvRound(img.cols/scale) < win_size.width || if (cvRound(img.cols / scale) < win_size.width ||
cvRound(img.rows/scale) < win_size.height || scale0 <= 1) cvRound(img.rows / scale) < win_size.height || scale0 <= 1)
break; break;
scale *= scale0; scale *= scale0;
} }
@@ -386,7 +441,8 @@ std::vector<float> cv::ocl::HOGDescriptor::getDefaultPeopleDetector()
std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector48x96() std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector48x96()
{ {
static const float detector[] = { static const float detector[] =
{
0.294350f, -0.098796f, -0.129522f, 0.078753f, 0.387527f, 0.261529f, 0.294350f, -0.098796f, -0.129522f, 0.078753f, 0.387527f, 0.261529f,
0.145939f, 0.061520f, 0.328699f, 0.227148f, -0.066467f, -0.086723f, 0.145939f, 0.061520f, 0.328699f, 0.227148f, -0.066467f, -0.086723f,
0.047559f, 0.106714f, 0.037897f, 0.111461f, -0.024406f, 0.304769f, 0.047559f, 0.106714f, 0.037897f, 0.111461f, -0.024406f, 0.304769f,
@@ -717,8 +773,9 @@ std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector48x96()
0.099937f, 0.091059f, 0.247307f, 0.204226f, -0.042753f, -0.068580f, 0.099937f, 0.091059f, 0.247307f, 0.204226f, -0.042753f, -0.068580f,
-0.119002f, 0.026722f, 0.034853f, -0.060934f, -0.025054f, -0.093026f, -0.119002f, 0.026722f, 0.034853f, -0.060934f, -0.025054f, -0.093026f,
-0.035372f, -0.233209f, -0.049869f, -0.039151f, -0.022279f, -0.065380f, -0.035372f, -0.233209f, -0.049869f, -0.039151f, -0.022279f, -0.065380f,
-9.063785f }; -9.063785f
return vector<float>(detector, detector + sizeof(detector)/sizeof(detector[0])); };
return vector<float>(detector, detector + sizeof(detector) / sizeof(detector[0]));
} }
@@ -726,7 +783,8 @@ std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector48x96()
std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector64x128() std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector64x128()
{ {
static const float detector[] = { static const float detector[] =
{
0.05359386f, -0.14721455f, -0.05532170f, 0.05077307f, 0.05359386f, -0.14721455f, -0.05532170f, 0.05077307f,
0.11547081f, -0.04268804f, 0.04635834f, -0.05468199f, 0.08232084f, 0.11547081f, -0.04268804f, 0.04635834f, -0.05468199f, 0.08232084f,
0.10424068f, -0.02294518f, 0.01108519f, 0.01378693f, 0.11193510f, 0.10424068f, -0.02294518f, 0.01108519f, 0.01378693f, 0.11193510f,
@@ -1531,8 +1589,9 @@ std::vector<float> cv::ocl::HOGDescriptor::getPeopleDetector64x128()
-0.05826827f, 0.06254654f, 0.02895772f, -0.01664000f, -0.03620280f, -0.05826827f, 0.06254654f, 0.02895772f, -0.01664000f, -0.03620280f,
-0.01612278f, -1.46097376e-003f, 0.14013411f, -8.96181818e-003f, -0.01612278f, -1.46097376e-003f, 0.14013411f, -8.96181818e-003f,
-0.03250246f, 3.38630192e-003f, 2.64779478e-003f, 0.03359732f, -0.03250246f, 3.38630192e-003f, 2.64779478e-003f, 0.03359732f,
-0.02411991f, -0.04229729f, 0.10666174f, -6.66579151f }; -0.02411991f, -0.04229729f, 0.10666174f, -6.66579151f
return vector<float>(detector, detector + sizeof(detector)/sizeof(detector[0])); };
return vector<float>(detector, detector + sizeof(detector) / sizeof(detector[0]));
} }
/* Returns the nearest upper power of two, works only for /* Returns the nearest upper power of two, works only for
@@ -1576,8 +1635,8 @@ void cv::ocl::device::hog::set_up_constants(int nbins, int block_stride_x, int b
} }
void cv::ocl::device::hog::compute_hists(int nbins, int block_stride_x, int block_stride_y, void cv::ocl::device::hog::compute_hists(int nbins, int block_stride_x, int block_stride_y,
int height, int width, const cv::ocl::oclMat& grad, int height, int width, const cv::ocl::oclMat &grad,
const cv::ocl::oclMat& qangle, float sigma, cv::ocl::oclMat& block_hists) const cv::ocl::oclMat &qangle, float sigma, cv::ocl::oclMat &block_hists)
{ {
Context *clCxt = Context::getContext(); Context *clCxt = Context::getContext();
string kernelName = "compute_hists_kernel"; string kernelName = "compute_hists_kernel";
@@ -1617,7 +1676,7 @@ void cv::ocl::device::hog::compute_hists(int nbins, int block_stride_x, int bloc
} }
void cv::ocl::device::hog::normalize_hists(int nbins, int block_stride_x, int block_stride_y, void cv::ocl::device::hog::normalize_hists(int nbins, int block_stride_x, int block_stride_y,
int height, int width, cv::ocl::oclMat& block_hists, float threshold) int height, int width, cv::ocl::oclMat &block_hists, float threshold)
{ {
Context *clCxt = Context::getContext(); Context *clCxt = Context::getContext();
string kernelName = "normalize_hists_kernel"; string kernelName = "normalize_hists_kernel";
@@ -1646,8 +1705,8 @@ void cv::ocl::device::hog::normalize_hists(int nbins, int block_stride_x, int bl
void cv::ocl::device::hog::classify_hists(int win_height, int win_width, int block_stride_y, void cv::ocl::device::hog::classify_hists(int win_height, int win_width, int block_stride_y,
int block_stride_x, int win_stride_y, int win_stride_x, int height, int block_stride_x, int win_stride_y, int win_stride_x, int height,
int width, const cv::ocl::oclMat& block_hists, const cv::ocl::oclMat& coefs, float free_coef, int width, const cv::ocl::oclMat &block_hists, const cv::ocl::oclMat &coefs, float free_coef,
float threshold, cv::ocl::oclMat& labels) float threshold, cv::ocl::oclMat &labels)
{ {
Context *clCxt = Context::getContext(); Context *clCxt = Context::getContext();
string kernelName = "classify_hists_kernel"; string kernelName = "classify_hists_kernel";
@@ -1680,7 +1739,7 @@ void cv::ocl::device::hog::classify_hists(int win_height, int win_width, int blo
void cv::ocl::device::hog::extract_descrs_by_rows(int win_height, int win_width, int block_stride_y, int block_stride_x, void cv::ocl::device::hog::extract_descrs_by_rows(int win_height, int win_width, int block_stride_y, int block_stride_x,
int win_stride_y, int win_stride_x, int height, int width, int win_stride_y, int win_stride_x, int height, int width,
const cv::ocl::oclMat& block_hists, cv::ocl::oclMat& descriptors) const cv::ocl::oclMat &block_hists, cv::ocl::oclMat &descriptors)
{ {
Context *clCxt = Context::getContext(); Context *clCxt = Context::getContext();
string kernelName = "extract_descrs_by_rows_kernel"; string kernelName = "extract_descrs_by_rows_kernel";
@@ -1711,7 +1770,7 @@ void cv::ocl::device::hog::extract_descrs_by_rows(int win_height, int win_width,
void cv::ocl::device::hog::extract_descrs_by_cols(int win_height, int win_width, int block_stride_y, int block_stride_x, void cv::ocl::device::hog::extract_descrs_by_cols(int win_height, int win_width, int block_stride_y, int block_stride_x,
int win_stride_y, int win_stride_x, int height, int width, int win_stride_y, int win_stride_x, int height, int width,
const cv::ocl::oclMat& block_hists, cv::ocl::oclMat& descriptors) const cv::ocl::oclMat &block_hists, cv::ocl::oclMat &descriptors)
{ {
Context *clCxt = Context::getContext(); Context *clCxt = Context::getContext();
string kernelName = "extract_descrs_by_cols_kernel"; string kernelName = "extract_descrs_by_cols_kernel";
@@ -1746,8 +1805,8 @@ static inline int divUp(int total, int grain)
return (total + grain - 1) / grain; return (total + grain - 1) / grain;
} }
void cv::ocl::device::hog::compute_gradients_8UC1(int height, int width, const cv::ocl::oclMat& img, void cv::ocl::device::hog::compute_gradients_8UC1(int height, int width, const cv::ocl::oclMat &img,
float angle_scale, cv::ocl::oclMat& grad, cv::ocl::oclMat& qangle, bool correct_gamma) float angle_scale, cv::ocl::oclMat &grad, cv::ocl::oclMat &qangle, bool correct_gamma)
{ {
Context *clCxt = Context::getContext(); Context *clCxt = Context::getContext();
string kernelName = "compute_gradients_8UC1_kernel"; string kernelName = "compute_gradients_8UC1_kernel";
@@ -1775,8 +1834,8 @@ void cv::ocl::device::hog::compute_gradients_8UC1(int height, int width, const c
openCLExecuteKernel2(clCxt, &objdetect_hog, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel2(clCxt, &objdetect_hog, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void cv::ocl::device::hog::compute_gradients_8UC4(int height, int width, const cv::ocl::oclMat& img, void cv::ocl::device::hog::compute_gradients_8UC4(int height, int width, const cv::ocl::oclMat &img,
float angle_scale, cv::ocl::oclMat& grad, cv::ocl::oclMat& qangle, bool correct_gamma) float angle_scale, cv::ocl::oclMat &grad, cv::ocl::oclMat &qangle, bool correct_gamma)
{ {
Context *clCxt = Context::getContext(); Context *clCxt = Context::getContext();
string kernelName = "compute_gradients_8UC4_kernel"; string kernelName = "compute_gradients_8UC4_kernel";

View File

@@ -77,7 +77,10 @@ void cv::ocl::resize(const oclMat &, oclMat &, Size, double, double, int)
{ {
throw_nogpu(); throw_nogpu();
} }
void cv::ocl::remap(const oclMat&, oclMat&, oclMat&, oclMat&, int, int ,const Scalar&) { throw_nogpu(); } void cv::ocl::remap(const oclMat &, oclMat &, oclMat &, oclMat &, int, int , const Scalar &)
{
throw_nogpu();
}
void cv::ocl::copyMakeBorder(const oclMat &, oclMat &, int, int, int, int, const Scalar &) void cv::ocl::copyMakeBorder(const oclMat &, oclMat &, int, int, int, int, const Scalar &)
{ {
@@ -103,7 +106,7 @@ void cv::ocl::bilateralFilter(const oclMat &, oclMat &, int, double, double, int
{ {
throw_nogpu(); throw_nogpu();
} }
void cv::ocl::convolve(const oclMat&, const oclMat&, oclMat&) void cv::ocl::convolve(const oclMat &, const oclMat &, oclMat &)
{ {
throw_nogpu(); throw_nogpu();
} }
@@ -196,7 +199,7 @@ namespace cv
args.push_back( make_pair(sizeof(cl_uchar), (void *)&thresh_uchar)); args.push_back( make_pair(sizeof(cl_uchar), (void *)&thresh_uchar));
args.push_back( make_pair(sizeof(cl_uchar), (void *)&max_val)); args.push_back( make_pair(sizeof(cl_uchar), (void *)&max_val));
args.push_back( make_pair(sizeof(cl_int), (void *)&type)); args.push_back( make_pair(sizeof(cl_int), (void *)&type));
openCLExecuteKernel(clCxt, &imgproc_threshold, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &imgproc_threshold, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
void threshold_32f(const oclMat &src, oclMat &dst, double thresh, double maxVal, int type) void threshold_32f(const oclMat &src, oclMat &dst, double thresh, double maxVal, int type)
@@ -233,7 +236,7 @@ namespace cv
args.push_back( make_pair(sizeof(cl_float), (void *)&thresh_f)); args.push_back( make_pair(sizeof(cl_float), (void *)&thresh_f));
args.push_back( make_pair(sizeof(cl_float), (void *)&max_val)); args.push_back( make_pair(sizeof(cl_float), (void *)&max_val));
args.push_back( make_pair(sizeof(cl_int), (void *)&type)); args.push_back( make_pair(sizeof(cl_int), (void *)&type));
openCLExecuteKernel(clCxt, &imgproc_threshold, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &imgproc_threshold, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
@@ -256,13 +259,13 @@ namespace cv
/////////////////////////////// remap ////////////////////////////////////////////////// /////////////////////////////// remap //////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////
void remap( const oclMat& src, oclMat& dst, oclMat& map1, oclMat& map2, int interpolation, int borderType, const Scalar& borderValue ) void remap( const oclMat &src, oclMat &dst, oclMat &map1, oclMat &map2, int interpolation, int borderType, const Scalar &borderValue )
{ {
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
CV_Assert(interpolation == INTER_LINEAR || interpolation == INTER_NEAREST CV_Assert(interpolation == INTER_LINEAR || interpolation == INTER_NEAREST
|| interpolation == INTER_CUBIC || interpolation== INTER_LANCZOS4); || interpolation == INTER_CUBIC || interpolation == INTER_LANCZOS4);
CV_Assert((map1.type() == CV_16SC2 && !map2.data) || (map1.type()== CV_32FC2 && !map2.data) || (map1.type() == CV_32FC1 && map2.type() == CV_32FC1)); CV_Assert((map1.type() == CV_16SC2 && !map2.data) || (map1.type() == CV_32FC2 && !map2.data) || (map1.type() == CV_32FC1 && map2.type() == CV_32FC1));
CV_Assert(!map2.data || map2.size()== map1.size()); CV_Assert(!map2.data || map2.size() == map1.size());
CV_Assert(dst.size() == map1.size()); CV_Assert(dst.size() == map1.size());
dst.create(map1.size(), src.type()); dst.create(map1.size(), src.type());
@@ -293,7 +296,7 @@ namespace cv
kernelName = "remapNNF1Constant"; kernelName = "remapNNF1Constant";
} }
int channels = dst.channels(); int channels = dst.oclchannels();
int depth = dst.depth(); int depth = dst.depth();
int type = src.type(); int type = src.type();
size_t blkSizeX = 16, blkSizeY = 16; size_t blkSizeX = 16, blkSizeY = 16;
@@ -301,24 +304,24 @@ namespace cv
int cols = dst.cols; int cols = dst.cols;
if(src.type() == CV_8UC1) if(src.type() == CV_8UC1)
{ {
cols = (dst.cols + dst.offset%4 + 3)/4; cols = (dst.cols + dst.offset % 4 + 3) / 4;
glbSizeX = cols %blkSizeX==0 ? cols : (cols/blkSizeX+1)*blkSizeX; glbSizeX = cols % blkSizeX == 0 ? cols : (cols / blkSizeX + 1) * blkSizeX;
} }
else if(src.type() == CV_8UC4 || src.type() == CV_32FC1) else if(src.type() == CV_8UC3 || src.type() == CV_8UC4 || src.type() == CV_32FC1)
{ {
cols = (dst.cols + (dst.offset>>2)%4 + 3)/4; cols = (dst.cols + (dst.offset >> 2) % 4 + 3) / 4;
glbSizeX = cols %blkSizeX==0 ? cols : (cols/blkSizeX+1)*blkSizeX; glbSizeX = cols % blkSizeX == 0 ? cols : (cols / blkSizeX + 1) * blkSizeX;
} }
else else
{ {
glbSizeX = dst.cols%blkSizeX==0 ? dst.cols : (dst.cols/blkSizeX+1)*blkSizeX; glbSizeX = dst.cols % blkSizeX == 0 ? dst.cols : (dst.cols / blkSizeX + 1) * blkSizeX;
} }
size_t glbSizeY = dst.rows%blkSizeY==0 ? dst.rows : (dst.rows/blkSizeY+1)*blkSizeY; size_t glbSizeY = dst.rows % blkSizeY == 0 ? dst.rows : (dst.rows / blkSizeY + 1) * blkSizeY;
size_t globalThreads[3] = {glbSizeX,glbSizeY,1}; size_t globalThreads[3] = {glbSizeX, glbSizeY, 1};
size_t localThreads[3] = {blkSizeX,blkSizeY,1}; size_t localThreads[3] = {blkSizeX, blkSizeY, 1};
/* /*
///////////////////////////// /////////////////////////////
//using the image buffer //using the image buffer
@@ -391,64 +394,64 @@ namespace cv
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
if(map1.channels() == 2) if(map1.channels() == 2)
{ {
args.push_back( make_pair(sizeof(cl_mem),(void*)&dst.data)); args.push_back( make_pair(sizeof(cl_mem), (void *)&dst.data));
args.push_back( make_pair(sizeof(cl_mem),(void*)&src.data)); args.push_back( make_pair(sizeof(cl_mem), (void *)&src.data));
// args.push_back( make_pair(sizeof(cl_mem),(void*)&srcImage)); //imageBuffer // args.push_back( make_pair(sizeof(cl_mem),(void*)&srcImage)); //imageBuffer
args.push_back( make_pair(sizeof(cl_mem),(void*)&map1.data)); args.push_back( make_pair(sizeof(cl_mem), (void *)&map1.data));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.offset)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.offset));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.offset)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.offset));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.offset)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.offset));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.step)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.step));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.step)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.step));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.step)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.step));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.cols));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.rows)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.rows));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.cols));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.rows)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.rows));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.cols));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.rows)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.rows));
args.push_back( make_pair(sizeof(cl_int), (void *)&cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&cols));
if(src.clCxt -> impl -> double_support != 0) if(src.clCxt -> impl -> double_support != 0)
{ {
args.push_back( make_pair(sizeof(cl_double4),(void*)&borderValue)); args.push_back( make_pair(sizeof(cl_double4), (void *)&borderValue));
} }
else else
{ {
float borderFloat[4] = {(float)borderValue[0], (float)borderValue[1], (float)borderValue[2], (float)borderValue[3]}; float borderFloat[4] = {(float)borderValue[0], (float)borderValue[1], (float)borderValue[2], (float)borderValue[3]};
args.push_back( make_pair(sizeof(cl_float4),(void*)&borderFloat)); args.push_back( make_pair(sizeof(cl_float4), (void *)&borderFloat));
} }
} }
if(map1.channels() == 1) if(map1.channels() == 1)
{ {
args.push_back( make_pair(sizeof(cl_mem),(void*)&dst.data)); args.push_back( make_pair(sizeof(cl_mem), (void *)&dst.data));
args.push_back( make_pair(sizeof(cl_mem),(void*)&src.data)); args.push_back( make_pair(sizeof(cl_mem), (void *)&src.data));
// args.push_back( make_pair(sizeof(cl_mem),(void*)&srcImage)); //imageBuffer // args.push_back( make_pair(sizeof(cl_mem),(void*)&srcImage)); //imageBuffer
args.push_back( make_pair(sizeof(cl_mem),(void*)&map1.data)); args.push_back( make_pair(sizeof(cl_mem), (void *)&map1.data));
args.push_back( make_pair(sizeof(cl_mem),(void*)&map2.data)); args.push_back( make_pair(sizeof(cl_mem), (void *)&map2.data));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.offset)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.offset));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.offset)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.offset));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.offset)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.offset));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.step)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.step));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.step)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.step));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.step)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.step));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.cols));
args.push_back( make_pair(sizeof(cl_int),(void*)&src.rows)); args.push_back( make_pair(sizeof(cl_int), (void *)&src.rows));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.cols));
args.push_back( make_pair(sizeof(cl_int),(void*)&dst.rows)); args.push_back( make_pair(sizeof(cl_int), (void *)&dst.rows));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.cols));
args.push_back( make_pair(sizeof(cl_int),(void*)&map1.rows)); args.push_back( make_pair(sizeof(cl_int), (void *)&map1.rows));
args.push_back( make_pair(sizeof(cl_int), (void *)&cols)); args.push_back( make_pair(sizeof(cl_int), (void *)&cols));
if(src.clCxt -> impl -> double_support != 0) if(src.clCxt -> impl -> double_support != 0)
{ {
args.push_back( make_pair(sizeof(cl_double4),(void*)&borderValue)); args.push_back( make_pair(sizeof(cl_double4), (void *)&borderValue));
} }
else else
{ {
float borderFloat[4] = {(float)borderValue[0], (float)borderValue[1], (float)borderValue[2], (float)borderValue[3]}; float borderFloat[4] = {(float)borderValue[0], (float)borderValue[1], (float)borderValue[2], (float)borderValue[3]};
args.push_back( make_pair(sizeof(cl_float4),(void*)&borderFloat)); args.push_back( make_pair(sizeof(cl_float4), (void *)&borderFloat));
} }
} }
openCLExecuteKernel(clCxt,&imgproc_remap,kernelName,globalThreads,localThreads,args,src.channels(),src.depth()); openCLExecuteKernel(clCxt, &imgproc_remap, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
//////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////
@@ -462,9 +465,9 @@ namespace cv
float ify = 1. / fy; float ify = 1. / fy;
double ifx_d = 1. / fx; double ifx_d = 1. / fx;
double ify_d = 1. / fy; double ify_d = 1. / fy;
int srcStep_in_pixel = src.step1() / src.channels(); int srcStep_in_pixel = src.step1() / src.oclchannels();
int srcoffset_in_pixel = src.offset / src.elemSize(); int srcoffset_in_pixel = src.offset / src.elemSize();
int dstStep_in_pixel = dst.step1() / dst.channels(); int dstStep_in_pixel = dst.step1() / dst.oclchannels();
int dstoffset_in_pixel = dst.offset / dst.elemSize(); int dstoffset_in_pixel = dst.offset / dst.elemSize();
//printf("%d %d\n",src.step1() , dst.elemSize()); //printf("%d %d\n",src.step1() , dst.elemSize());
string kernelName; string kernelName;
@@ -479,13 +482,13 @@ namespace cv
if(src.type() == CV_8UC1) if(src.type() == CV_8UC1)
{ {
size_t cols = (dst.cols + dst.offset % 4 + 3) / 4; size_t cols = (dst.cols + dst.offset % 4 + 3) / 4;
glbSizeX = cols % blkSizeX == 0 && cols != 0? cols : (cols / blkSizeX + 1) * blkSizeX; glbSizeX = cols % blkSizeX == 0 && cols != 0 ? cols : (cols / blkSizeX + 1) * blkSizeX;
} }
else else
{ {
glbSizeX = dst.cols % blkSizeX == 0 && dst.cols !=0? dst.cols : (dst.cols / blkSizeX + 1) * blkSizeX; glbSizeX = dst.cols % blkSizeX == 0 && dst.cols != 0 ? dst.cols : (dst.cols / blkSizeX + 1) * blkSizeX;
} }
size_t glbSizeY = dst.rows % blkSizeY == 0 && dst.rows != 0? dst.rows : (dst.rows / blkSizeY + 1) * blkSizeY; size_t glbSizeY = dst.rows % blkSizeY == 0 && dst.rows != 0 ? dst.rows : (dst.rows / blkSizeY + 1) * blkSizeY;
size_t globalThreads[3] = {glbSizeX, glbSizeY, 1}; size_t globalThreads[3] = {glbSizeX, glbSizeY, 1};
size_t localThreads[3] = {blkSizeX, blkSizeY, 1}; size_t localThreads[3] = {blkSizeX, blkSizeY, 1};
@@ -529,15 +532,15 @@ namespace cv
args.push_back( make_pair(sizeof(cl_float), (void *)&ify)); args.push_back( make_pair(sizeof(cl_float), (void *)&ify));
} }
openCLExecuteKernel(clCxt, &imgproc_resize, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &imgproc_resize, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
void resize(const oclMat &src, oclMat &dst, Size dsize, void resize(const oclMat &src, oclMat &dst, Size dsize,
double fx, double fy, int interpolation) double fx, double fy, int interpolation)
{ {
CV_Assert(src.type() == CV_8UC1 || src.type() == CV_8UC4 CV_Assert(src.type() == CV_8UC1 || src.type() == CV_8UC3 || src.type() == CV_8UC4
|| src.type() == CV_32FC1 || src.type() == CV_32FC4); || src.type() == CV_32FC1 || src.type() == CV_32FC3 || src.type() == CV_32FC4);
CV_Assert(interpolation == INTER_LINEAR || interpolation == INTER_NEAREST); CV_Assert(interpolation == INTER_LINEAR || interpolation == INTER_NEAREST);
CV_Assert( src.size().area() > 0 ); CV_Assert( src.size().area() > 0 );
CV_Assert( !(dsize == Size()) || (fx > 0 && fy > 0) ); CV_Assert( !(dsize == Size()) || (fx > 0 && fy > 0) );
@@ -546,7 +549,7 @@ namespace cv
{ {
if(dsize.width != (int)(src.cols * fx) || dsize.height != (int)(src.rows * fy)) if(dsize.width != (int)(src.cols * fx) || dsize.height != (int)(src.rows * fy))
{ {
CV_Error(CV_StsUnmatchedSizes,"invalid dsize and fx, fy!"); CV_Error(CV_StsUnmatchedSizes, "invalid dsize and fx, fy!");
} }
} }
if( dsize == Size() ) if( dsize == Size() )
@@ -585,10 +588,10 @@ namespace cv
return medianFilter(src1, dst, m); return medianFilter(src1, dst, m);
} }
int srcStep = src.step1() / src.channels(); int srcStep = src.step1() / src.oclchannels();
int dstStep = dst.step1() / dst.channels(); int dstStep = dst.step1() / dst.oclchannels();
int srcOffset = src.offset / src.channels() / src.elemSize1(); int srcOffset = src.offset / src.oclchannels() / src.elemSize1();
int dstOffset = dst.offset / dst.channels() / dst.elemSize1(); int dstOffset = dst.offset / dst.oclchannels() / dst.elemSize1();
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
string kernelName = "medianFilter"; string kernelName = "medianFilter";
@@ -610,12 +613,12 @@ namespace cv
if(m == 3) if(m == 3)
{ {
string kernelName = "medianFilter3"; string kernelName = "medianFilter3";
openCLExecuteKernel(clCxt, &imgproc_median, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &imgproc_median, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
else if(m == 5) else if(m == 5)
{ {
string kernelName = "medianFilter5"; string kernelName = "medianFilter5";
openCLExecuteKernel(clCxt, &imgproc_median, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &imgproc_median, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
else else
{ {
@@ -623,7 +626,7 @@ namespace cv
//string kernelName = "medianFilter"; //string kernelName = "medianFilter";
//args.push_back( make_pair( sizeof(cl_int),(void*)&m)); //args.push_back( make_pair( sizeof(cl_int),(void*)&m));
//openCLExecuteKernel(clCxt,&imgproc_median,kernelName,globalThreads,localThreads,args,src.channels(),-1); //openCLExecuteKernel(clCxt,&imgproc_median,kernelName,globalThreads,localThreads,args,src.oclchannels(),-1);
} }
} }
@@ -632,47 +635,48 @@ namespace cv
// copyMakeBorder // copyMakeBorder
void copyMakeBorder(const oclMat &src, oclMat &dst, int top, int bottom, int left, int right, int bordertype, const Scalar &scalar) void copyMakeBorder(const oclMat &src, oclMat &dst, int top, int bottom, int left, int right, int bordertype, const Scalar &scalar)
{ {
//CV_Assert(src.channels() != 2); //CV_Assert(src.oclchannels() != 2);
CV_Assert(top >= 0 && bottom >= 0 && left >= 0 && right >= 0); CV_Assert(top >= 0 && bottom >= 0 && left >= 0 && right >= 0);
if((dst.cols!=dst.wholecols) || (dst.rows!=dst.wholerows))//has roi if((dst.cols != dst.wholecols) || (dst.rows != dst.wholerows)) //has roi
{ {
if(((bordertype & cv::BORDER_ISOLATED) == 0) && if(((bordertype & cv::BORDER_ISOLATED) == 0) &&
(bordertype != cv::BORDER_CONSTANT) && (bordertype != cv::BORDER_CONSTANT) &&
(bordertype != cv::BORDER_REPLICATE)) (bordertype != cv::BORDER_REPLICATE))
{ {
CV_Error(CV_StsBadArg,"unsupported border type"); CV_Error(CV_StsBadArg, "unsupported border type");
} }
} }
bordertype &= ~cv::BORDER_ISOLATED; bordertype &= ~cv::BORDER_ISOLATED;
if((bordertype == cv::BORDER_REFLECT) || (bordertype == cv::BORDER_WRAP)) if((bordertype == cv::BORDER_REFLECT) || (bordertype == cv::BORDER_WRAP))
{ {
CV_Assert((src.cols>=left) && (src.cols>=right) && (src.rows >= top) && (src.rows >= bottom)); CV_Assert((src.cols >= left) && (src.cols >= right) && (src.rows >= top) && (src.rows >= bottom));
} }
if(bordertype == cv::BORDER_REFLECT_101) if(bordertype == cv::BORDER_REFLECT_101)
{ {
CV_Assert((src.cols>left) && (src.cols>right) && (src.rows > top) && (src.rows > bottom)); CV_Assert((src.cols > left) && (src.cols > right) && (src.rows > top) && (src.rows > bottom));
} }
dst.create(src.rows + top + bottom, src.cols + left + right, src.type()); dst.create(src.rows + top + bottom, src.cols + left + right, src.type());
int srcStep = src.step1() / src.channels(); int srcStep = src.step1() / src.oclchannels();
int dstStep = dst.step1() / dst.channels(); int dstStep = dst.step1() / dst.oclchannels();
int srcOffset = src.offset / src.elemSize(); int srcOffset = src.offset / src.elemSize();
int dstOffset = dst.offset / dst.elemSize(); int dstOffset = dst.offset / dst.elemSize();
int __bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE,BORDER_REFLECT,BORDER_WRAP,BORDER_REFLECT_101}; int __bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, BORDER_REFLECT, BORDER_WRAP, BORDER_REFLECT_101};
const char* borderstr[]={"BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT","BORDER_WRAP","BORDER_REFLECT_101"}; const char *borderstr[] = {"BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP", "BORDER_REFLECT_101"};
int bordertype_index; int bordertype_index;
for(bordertype_index=0;bordertype_index<sizeof(__bordertype) / sizeof(int); bordertype_index++) for(bordertype_index = 0; bordertype_index < sizeof(__bordertype) / sizeof(int); bordertype_index++)
{ {
if(__bordertype[bordertype_index]==bordertype) if(__bordertype[bordertype_index] == bordertype)
break; break;
} }
if(bordertype_index==sizeof(__bordertype) / sizeof(int)) if(bordertype_index == sizeof(__bordertype) / sizeof(int))
{ {
CV_Error(CV_StsBadArg,"unsupported border type"); CV_Error(CV_StsBadArg, "unsupported border type");
} }
string kernelName = "copymakeborder"; string kernelName = "copymakeborder";
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
size_t globalThreads[3] = {(dst.cols + localThreads[0]-1) / localThreads[0] * localThreads[0], size_t globalThreads[3] = {(dst.cols + localThreads[0] - 1) / localThreads[0] *localThreads[0],
(dst.rows + localThreads[1]-1) / localThreads[1] * localThreads[1], 1}; (dst.rows + localThreads[1] - 1) / localThreads[1] *localThreads[1], 1
};
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data));
@@ -697,7 +701,7 @@ namespace cv
cl_int4 ival; cl_int4 ival;
cl_float4 fval; cl_float4 fval;
cl_double4 dval; cl_double4 dval;
}val; } val;
switch(dst.depth()) switch(dst.depth())
{ {
case CV_8U: case CV_8U:
@@ -705,23 +709,23 @@ namespace cv
val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]); val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]);
val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]); val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]);
val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]); val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=uchar -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=uchar -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_uchar) , (void *)&val.uval.s[0] )); args.push_back( make_pair( sizeof(cl_uchar) , (void *)&val.uval.s[0] ));
if(((dst.offset & 3) ==0) && ((dst.cols & 3) == 0)) if(((dst.offset & 3) == 0) && ((dst.cols & 3) == 0))
{ {
kernelName = "copymakeborder_C1_D0"; kernelName = "copymakeborder_C1_D0";
globalThreads[0] = (dst.cols/4 + localThreads[0]-1) / localThreads[0] * localThreads[0]; globalThreads[0] = (dst.cols / 4 + localThreads[0] - 1) / localThreads[0] * localThreads[0];
} }
break; break;
case 4: case 4:
sprintf(compile_option, "-D GENTYPE=uchar4 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=uchar4 -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval )); args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_8S: case CV_8S:
@@ -729,18 +733,18 @@ namespace cv
val.cval.s[1] = saturate_cast<char>(scalar.val[1]); val.cval.s[1] = saturate_cast<char>(scalar.val[1]);
val.cval.s[2] = saturate_cast<char>(scalar.val[2]); val.cval.s[2] = saturate_cast<char>(scalar.val[2]);
val.cval.s[3] = saturate_cast<char>(scalar.val[3]); val.cval.s[3] = saturate_cast<char>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=char -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=char -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_char) , (void *)&val.cval.s[0] )); args.push_back( make_pair( sizeof(cl_char) , (void *)&val.cval.s[0] ));
break; break;
case 4: case 4:
sprintf(compile_option, "-D GENTYPE=char4 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=char4 -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval )); args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_16U: case CV_16U:
@@ -748,18 +752,18 @@ namespace cv
val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]); val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]);
val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]); val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]);
val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]); val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=ushort -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=ushort -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_ushort) , (void *)&val.usval.s[0] )); args.push_back( make_pair( sizeof(cl_ushort) , (void *)&val.usval.s[0] ));
break; break;
case 4: case 4:
sprintf(compile_option, "-D GENTYPE=ushort4 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=ushort4 -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval )); args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_16S: case CV_16S:
@@ -767,18 +771,18 @@ namespace cv
val.shval.s[1] = saturate_cast<short>(scalar.val[1]); val.shval.s[1] = saturate_cast<short>(scalar.val[1]);
val.shval.s[2] = saturate_cast<short>(scalar.val[2]); val.shval.s[2] = saturate_cast<short>(scalar.val[2]);
val.shval.s[3] = saturate_cast<short>(scalar.val[3]); val.shval.s[3] = saturate_cast<short>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=short -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=short -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_short) , (void *)&val.shval.s[0] )); args.push_back( make_pair( sizeof(cl_short) , (void *)&val.shval.s[0] ));
break; break;
case 4: case 4:
sprintf(compile_option, "-D GENTYPE=short4 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=short4 -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval )); args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_32S: case CV_32S:
@@ -786,25 +790,25 @@ namespace cv
val.ival.s[1] = saturate_cast<int>(scalar.val[1]); val.ival.s[1] = saturate_cast<int>(scalar.val[1]);
val.ival.s[2] = saturate_cast<int>(scalar.val[2]); val.ival.s[2] = saturate_cast<int>(scalar.val[2]);
val.ival.s[3] = saturate_cast<int>(scalar.val[3]); val.ival.s[3] = saturate_cast<int>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=int -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=int -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_int) , (void *)&val.ival.s[0] )); args.push_back( make_pair( sizeof(cl_int) , (void *)&val.ival.s[0] ));
break; break;
case 2: case 2:
sprintf(compile_option, "-D GENTYPE=int2 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=int2 -D %s", borderstr[bordertype_index]);
cl_int2 i2val; cl_int2 i2val;
i2val.s[0] = val.ival.s[0]; i2val.s[0] = val.ival.s[0];
i2val.s[1] = val.ival.s[1]; i2val.s[1] = val.ival.s[1];
args.push_back( make_pair( sizeof(cl_int2) , (void *)&i2val )); args.push_back( make_pair( sizeof(cl_int2) , (void *)&i2val ));
break; break;
case 4: case 4:
sprintf(compile_option, "-D GENTYPE=int4 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=int4 -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival )); args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_32F: case CV_32F:
@@ -812,18 +816,18 @@ namespace cv
val.fval.s[1] = scalar.val[1]; val.fval.s[1] = scalar.val[1];
val.fval.s[2] = scalar.val[2]; val.fval.s[2] = scalar.val[2];
val.fval.s[3] = scalar.val[3]; val.fval.s[3] = scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=float -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=float -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_float) , (void *)&val.fval.s[0] )); args.push_back( make_pair( sizeof(cl_float) , (void *)&val.fval.s[0] ));
break; break;
case 4: case 4:
sprintf(compile_option, "-D GENTYPE=float4 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=float4 -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval )); args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_64F: case CV_64F:
@@ -831,25 +835,25 @@ namespace cv
val.dval.s[1] = scalar.val[1]; val.dval.s[1] = scalar.val[1];
val.dval.s[2] = scalar.val[2]; val.dval.s[2] = scalar.val[2];
val.dval.s[3] = scalar.val[3]; val.dval.s[3] = scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=double -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=double -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_double) , (void *)&val.dval.s[0] )); args.push_back( make_pair( sizeof(cl_double) , (void *)&val.dval.s[0] ));
break; break;
case 4: case 4:
sprintf(compile_option, "-D GENTYPE=double4 -D %s",borderstr[bordertype_index]); sprintf(compile_option, "-D GENTYPE=double4 -D %s", borderstr[bordertype_index]);
args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval )); args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unknown depth"); CV_Error(CV_StsUnsupportedFormat, "unknown depth");
} }
openCLExecuteKernel(src.clCxt, &imgproc_copymakeboder, kernelName, globalThreads, localThreads, args, -1, -1,compile_option); openCLExecuteKernel(src.clCxt, &imgproc_copymakeboder, kernelName, globalThreads, localThreads, args, -1, -1, compile_option);
//uchar* cputemp=new uchar[32*dst.wholerows]; //uchar* cputemp=new uchar[32*dst.wholerows];
////int* cpudata=new int[this->step*this->wholerows/sizeof(int)]; ////int* cpudata=new int[this->step*this->wholerows/sizeof(int)];
//openCLSafeCall(clEnqueueReadBuffer(src.clCxt->impl->clCmdQueue, (cl_mem)dst.data, CL_TRUE, //openCLSafeCall(clEnqueueReadBuffer(src.clCxt->impl->clCmdQueue, (cl_mem)dst.data, CL_TRUE,
@@ -931,7 +935,7 @@ namespace cv
void warpAffine_gpu(const oclMat &src, oclMat &dst, F coeffs[2][3], int interpolation) void warpAffine_gpu(const oclMat &src, oclMat &dst, F coeffs[2][3], int interpolation)
{ {
CV_Assert( (src.channels() == dst.channels()) ); CV_Assert( (src.oclchannels() == dst.oclchannels()) );
int srcStep = src.step1(); int srcStep = src.step1();
int dstStep = dst.step1(); int dstStep = dst.step1();
float float_coeffs[2][3]; float float_coeffs[2][3];
@@ -948,12 +952,14 @@ namespace cv
coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(F) * 2 * 3, NULL, &st ); coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(F) * 2 * 3, NULL, &st );
openCLVerifyCall(st); openCLVerifyCall(st);
openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)coeffs_cm, 1, 0, sizeof(F) * 2 * 3, coeffs, 0, 0, 0)); openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)coeffs_cm, 1, 0, sizeof(F) * 2 * 3, coeffs, 0, 0, 0));
}else{ }
cl_int st; else
for(int m=0;m<2;m++)
for(int n=0;n<3;n++)
{ {
float_coeffs[m][n]=coeffs[m][n]; cl_int st;
for(int m = 0; m < 2; m++)
for(int n = 0; n < 3; n++)
{
float_coeffs[m][n] = coeffs[m][n];
} }
coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(float) * 2 * 3, NULL, &st ); coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(float) * 2 * 3, NULL, &st );
openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)coeffs_cm, 1, 0, sizeof(float) * 2 * 3, float_coeffs, 0, 0, 0)); openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)coeffs_cm, 1, 0, sizeof(float) * 2 * 3, float_coeffs, 0, 0, 0));
@@ -993,14 +999,14 @@ namespace cv
args.push_back(make_pair(sizeof(cl_mem), (void *)&coeffs_cm)); args.push_back(make_pair(sizeof(cl_mem), (void *)&coeffs_cm));
args.push_back(make_pair(sizeof(cl_int), (void *)&cols)); args.push_back(make_pair(sizeof(cl_int), (void *)&cols));
openCLExecuteKernel(clCxt, &imgproc_warpAffine, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &imgproc_warpAffine, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
openCLSafeCall(clReleaseMemObject(coeffs_cm)); openCLSafeCall(clReleaseMemObject(coeffs_cm));
} }
void warpPerspective_gpu(const oclMat &src, oclMat &dst, double coeffs[3][3], int interpolation) void warpPerspective_gpu(const oclMat &src, oclMat &dst, double coeffs[3][3], int interpolation)
{ {
CV_Assert( (src.channels() == dst.channels()) ); CV_Assert( (src.oclchannels() == dst.oclchannels()) );
int srcStep = src.step1(); int srcStep = src.step1();
int dstStep = dst.step1(); int dstStep = dst.step1();
float float_coeffs[3][3]; float float_coeffs[3][3];
@@ -1016,11 +1022,13 @@ namespace cv
coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(double) * 3 * 3, NULL, &st ); coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(double) * 3 * 3, NULL, &st );
openCLVerifyCall(st); openCLVerifyCall(st);
openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)coeffs_cm, 1, 0, sizeof(double) * 3 * 3, coeffs, 0, 0, 0)); openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)coeffs_cm, 1, 0, sizeof(double) * 3 * 3, coeffs, 0, 0, 0));
}else{ }
else
{
cl_int st; cl_int st;
for(int m=0;m<3;m++) for(int m = 0; m < 3; m++)
for(int n=0;n<3;n++) for(int n = 0; n < 3; n++)
float_coeffs[m][n]=coeffs[m][n]; float_coeffs[m][n] = coeffs[m][n];
coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(float) * 3 * 3, NULL, &st ); coeffs_cm = clCreateBuffer( clCxt->impl->clContext, CL_MEM_READ_WRITE, sizeof(float) * 3 * 3, NULL, &st );
openCLVerifyCall(st); openCLVerifyCall(st);
@@ -1061,7 +1069,7 @@ namespace cv
args.push_back(make_pair(sizeof(cl_mem), (void *)&coeffs_cm)); args.push_back(make_pair(sizeof(cl_mem), (void *)&coeffs_cm));
args.push_back(make_pair(sizeof(cl_int), (void *)&cols)); args.push_back(make_pair(sizeof(cl_int), (void *)&cols));
openCLExecuteKernel(clCxt, &imgproc_warpPerspective, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &imgproc_warpPerspective, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
openCLSafeCall(clReleaseMemObject(coeffs_cm)); openCLSafeCall(clReleaseMemObject(coeffs_cm));
} }
} }
@@ -1070,7 +1078,7 @@ namespace cv
{ {
int interpolation = flags & INTER_MAX; int interpolation = flags & INTER_MAX;
CV_Assert((src.depth() == CV_8U || src.depth() == CV_32F) && src.channels() != 2 && src.channels() != 3); CV_Assert((src.depth() == CV_8U || src.depth() == CV_32F) && src.oclchannels() != 2 && src.oclchannels() != 3);
CV_Assert(interpolation == INTER_NEAREST || interpolation == INTER_LINEAR || interpolation == INTER_CUBIC); CV_Assert(interpolation == INTER_NEAREST || interpolation == INTER_LINEAR || interpolation == INTER_CUBIC);
dst.create(dsize, src.type()); dst.create(dsize, src.type());
@@ -1092,7 +1100,7 @@ namespace cv
{ {
int interpolation = flags & INTER_MAX; int interpolation = flags & INTER_MAX;
CV_Assert((src.depth() == CV_8U || src.depth() == CV_32F) && src.channels() != 2 && src.channels() != 3); CV_Assert((src.depth() == CV_8U || src.depth() == CV_32F) && src.oclchannels() != 2 && src.oclchannels() != 3);
CV_Assert(interpolation == INTER_NEAREST || interpolation == INTER_LINEAR || interpolation == INTER_CUBIC); CV_Assert(interpolation == INTER_NEAREST || interpolation == INTER_LINEAR || interpolation == INTER_CUBIC);
dst.create(dsize, src.type()); dst.create(dsize, src.type());
@@ -1119,9 +1127,9 @@ namespace cv
void integral(const oclMat &src, oclMat &sum, oclMat &sqsum) void integral(const oclMat &src, oclMat &sum, oclMat &sqsum)
{ {
CV_Assert(src.type() == CV_8UC1); CV_Assert(src.type() == CV_8UC1);
if(src.clCxt->impl->double_support == 0 && src.depth() ==CV_64F) if(src.clCxt->impl->double_support == 0 && src.depth() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported,"select device don't support double"); CV_Error(CV_GpuNotSupported, "select device don't support double");
} }
int vlen = 4; int vlen = 4;
int offset = src.offset / vlen; int offset = src.offset / vlen;
@@ -1213,10 +1221,13 @@ namespace cv
if (ksize < 0) if (ksize < 0)
scale *= 2.; scale *= 2.;
if (src.depth() == CV_8U){ if (src.depth() == CV_8U)
{
scale *= 255.; scale *= 255.;
scale = 1. / scale; scale = 1. / scale;
}else{ }
else
{
scale = 1. / scale; scale = 1. / scale;
} }
if (ksize > 0) if (ksize > 0)
@@ -1290,11 +1301,11 @@ namespace cv
void cornerHarris(const oclMat &src, oclMat &dst, int blockSize, int ksize, void cornerHarris(const oclMat &src, oclMat &dst, int blockSize, int ksize,
double k, int borderType) double k, int borderType)
{ {
if(src.clCxt->impl->double_support == 0 && src.depth() ==CV_64F) if(src.clCxt->impl->double_support == 0 && src.depth() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported,"select device don't support double"); CV_Error(CV_GpuNotSupported, "select device don't support double");
} }
CV_Assert(src.cols >= blockSize/2 && src.rows >= blockSize/2); CV_Assert(src.cols >= blockSize / 2 && src.rows >= blockSize / 2);
oclMat Dx, Dy; oclMat Dx, Dy;
CV_Assert(borderType == cv::BORDER_CONSTANT || borderType == cv::BORDER_REFLECT101 || borderType == cv::BORDER_REPLICATE || borderType == cv::BORDER_REFLECT); CV_Assert(borderType == cv::BORDER_CONSTANT || borderType == cv::BORDER_REFLECT101 || borderType == cv::BORDER_REPLICATE || borderType == cv::BORDER_REFLECT);
extractCovData(src, Dx, Dy, blockSize, ksize, borderType); extractCovData(src, Dx, Dy, blockSize, ksize, borderType);
@@ -1304,11 +1315,11 @@ namespace cv
void cornerMinEigenVal(const oclMat &src, oclMat &dst, int blockSize, int ksize, int borderType) void cornerMinEigenVal(const oclMat &src, oclMat &dst, int blockSize, int ksize, int borderType)
{ {
if(src.clCxt->impl->double_support == 0 && src.depth() ==CV_64F) if(src.clCxt->impl->double_support == 0 && src.depth() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported,"select device don't support double"); CV_Error(CV_GpuNotSupported, "select device don't support double");
} }
CV_Assert(src.cols >= blockSize/2 && src.rows >= blockSize/2); CV_Assert(src.cols >= blockSize / 2 && src.rows >= blockSize / 2);
oclMat Dx, Dy; oclMat Dx, Dy;
CV_Assert(borderType == cv::BORDER_CONSTANT || borderType == cv::BORDER_REFLECT101 || borderType == cv::BORDER_REPLICATE || borderType == cv::BORDER_REFLECT); CV_Assert(borderType == cv::BORDER_CONSTANT || borderType == cv::BORDER_REFLECT101 || borderType == cv::BORDER_REPLICATE || borderType == cv::BORDER_REFLECT);
extractCovData(src, Dx, Dy, blockSize, ksize, borderType); extractCovData(src, Dx, Dy, blockSize, ksize, borderType);
@@ -1355,7 +1366,7 @@ namespace cv
if( src.empty() ) if( src.empty() )
CV_Error( CV_StsBadArg, "The input image is empty" ); CV_Error( CV_StsBadArg, "The input image is empty" );
if( src.depth() != CV_8U || src.channels() != 4 ) if( src.depth() != CV_8U || src.oclchannels() != 4 )
CV_Error( CV_StsUnsupportedFormat, "Only 8-bit, 4-channel images are supported" ); CV_Error( CV_StsUnsupportedFormat, "Only 8-bit, 4-channel images are supported" );
if(src.clCxt->impl->double_support == 0) if(src.clCxt->impl->double_support == 0)
@@ -1423,7 +1434,7 @@ namespace cv
if( src.empty() ) if( src.empty() )
CV_Error( CV_StsBadArg, "The input image is empty" ); CV_Error( CV_StsBadArg, "The input image is empty" );
if( src.depth() != CV_8U || src.channels() != 4 ) if( src.depth() != CV_8U || src.oclchannels() != 4 )
CV_Error( CV_StsUnsupportedFormat, "Only 8-bit, 4-channel images are supported" ); CV_Error( CV_StsUnsupportedFormat, "Only 8-bit, 4-channel images are supported" );
if(src.clCxt->impl->double_support == 0) if(src.clCxt->impl->double_support == 0)
@@ -1472,12 +1483,12 @@ namespace cv
int dataWidth_bits = 4; int dataWidth_bits = 4;
int mask = dataWidth - 1; int mask = dataWidth - 1;
int cols = mat_src.cols * mat_src.channels(); int cols = mat_src.cols * mat_src.oclchannels();
int src_offset = mat_src.offset; int src_offset = mat_src.offset;
int hist_step = mat_sub_hist.step >> 2; int hist_step = mat_sub_hist.step >> 2;
int left_col = 0, right_col = 0; int left_col = 0, right_col = 0;
if(cols >= dataWidth*2 -1) if(cols >= dataWidth * 2 - 1)
{ {
left_col = dataWidth - (src_offset & mask); left_col = dataWidth - (src_offset & mask);
left_col &= mask; left_col &= mask;
@@ -1586,16 +1597,16 @@ namespace cv
LUT(mat_src, lut, mat_dst); LUT(mat_src, lut, mat_dst);
} }
//////////////////////////////////bilateralFilter//////////////////////////////////////////////////// //////////////////////////////////bilateralFilter////////////////////////////////////////////////////
static void static void
oclbilateralFilter_8u( const oclMat& src, oclMat& dst, int d, oclbilateralFilter_8u( const oclMat &src, oclMat &dst, int d,
double sigma_color, double sigma_space, double sigma_color, double sigma_space,
int borderType ) int borderType )
{ {
int cn = src.channels(); int cn = src.channels();
int i, j, k, maxk, radius; int i, j, k, maxk, radius;
Size size = src.size(); Size size = src.size();
CV_Assert( (src.type() == CV_8UC1 || src.download_channels == 3) && CV_Assert( (src.channels() == 1 || src.channels() == 3) &&
src.type() == dst.type() && src.size() == dst.size() && src.type() == dst.type() && src.size() == dst.size() &&
src.data != dst.data ); src.data != dst.data );
@@ -1604,66 +1615,74 @@ oclbilateralFilter_8u( const oclMat& src, oclMat& dst, int d,
if( sigma_space <= 0 ) if( sigma_space <= 0 )
sigma_space = 1; sigma_space = 1;
double gauss_color_coeff = -0.5/(sigma_color*sigma_color); double gauss_color_coeff = -0.5 / (sigma_color * sigma_color);
double gauss_space_coeff = -0.5/(sigma_space*sigma_space); double gauss_space_coeff = -0.5 / (sigma_space * sigma_space);
if( d <= 0 ) if( d <= 0 )
radius = cvRound(sigma_space*1.5); radius = cvRound(sigma_space * 1.5);
else else
radius = d/2; radius = d / 2;
radius = MAX(radius, 1); radius = MAX(radius, 1);
d = radius*2 + 1; d = radius * 2 + 1;
oclMat temp; oclMat temp;
copyMakeBorder( src, temp, radius, radius, radius, radius, borderType ); copyMakeBorder( src, temp, radius, radius, radius, radius, borderType );
vector<float> _color_weight(cn*256); vector<float> _color_weight(cn * 256);
vector<float> _space_weight(d*d); vector<float> _space_weight(d * d);
vector<int> _space_ofs(d*d); vector<int> _space_ofs(d * d);
float* color_weight = &_color_weight[0]; float *color_weight = &_color_weight[0];
float* space_weight = &_space_weight[0]; float *space_weight = &_space_weight[0];
int* space_ofs = &_space_ofs[0]; int *space_ofs = &_space_ofs[0];
int dst_step_in_pixel = dst.step / dst.elemSize();
int dst_offset_in_pixel = dst.offset / dst.elemSize();
int temp_step_in_pixel = temp.step / temp.elemSize();
// initialize color-related bilateral filter coefficients // initialize color-related bilateral filter coefficients
for( i = 0; i < 256*cn; i++ ) for( i = 0; i < 256 * cn; i++ )
color_weight[i] = (float)std::exp(i*i*gauss_color_coeff); color_weight[i] = (float)std::exp(i * i * gauss_color_coeff);
// initialize space-related bilateral filter coefficients // initialize space-related bilateral filter coefficients
for( i = -radius, maxk = 0; i <= radius; i++ ) for( i = -radius, maxk = 0; i <= radius; i++ )
for( j = -radius; j <= radius; j++ ) for( j = -radius; j <= radius; j++ )
{ {
double r = std::sqrt((double)i*i + (double)j*j); double r = std::sqrt((double)i * i + (double)j * j);
if( r > radius ) if( r > radius )
continue; continue;
space_weight[maxk] = (float)std::exp(r*r*gauss_space_coeff); space_weight[maxk] = (float)std::exp(r * r * gauss_space_coeff);
space_ofs[maxk++] = (int)(i*temp.step + j*cn); space_ofs[maxk++] = (int)(i * temp_step_in_pixel + j);
} }
oclMat oclcolor_weight(1,cn*256,CV_32FC1,color_weight); oclMat oclcolor_weight(1, cn * 256, CV_32FC1, color_weight);
oclMat oclspace_weight(1,d*d,CV_32FC1,space_weight); oclMat oclspace_weight(1, d * d, CV_32FC1, space_weight);
oclMat oclspace_ofs(1,d*d,CV_32SC1,space_ofs); oclMat oclspace_ofs(1, d * d, CV_32SC1, space_ofs);
string kernelName = "bilateral"; string kernelName = "bilateral";
size_t localThreads[3] = { 16, 16, 1 }; size_t localThreads[3] = { 16, 16, 1 };
size_t globalThreads[3] = { (dst.cols+ localThreads[0]-1)/localThreads[0] * localThreads[0], size_t globalThreads[3] = { (dst.cols + localThreads[0] - 1) / localThreads[0] *localThreads[0],
(dst.rows+ localThreads[1]-1)/localThreads[1]* localThreads[1], (dst.rows + localThreads[1] - 1) / localThreads[1] *localThreads[1],
1}; 1
vector<pair<size_t ,const void *> > args; };
if((dst.type() == CV_8UC1) && ((dst.offset & 3) == 0) && ((dst.cols & 3) == 0))
{
kernelName = "bilateral2";
globalThreads[0] = (dst.cols / 4 + localThreads[0] - 1) / localThreads[0] * localThreads[0];
}
vector<pair<size_t , const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data ));
args.push_back( make_pair( sizeof(cl_mem), (void *)&temp.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&temp.data ));
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.rows )); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.rows ));
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.cols )); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.cols ));
args.push_back( make_pair( sizeof(cl_int), (void *)&maxk )); args.push_back( make_pair( sizeof(cl_int), (void *)&maxk ));
args.push_back( make_pair( sizeof(cl_int), (void *)&radius )); args.push_back( make_pair( sizeof(cl_int), (void *)&radius ));
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step )); args.push_back( make_pair( sizeof(cl_int), (void *)&dst_step_in_pixel ));
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.offset )); args.push_back( make_pair( sizeof(cl_int), (void *)&dst_offset_in_pixel ));
args.push_back( make_pair( sizeof(cl_int), (void *)&temp.step )); args.push_back( make_pair( sizeof(cl_int), (void *)&temp_step_in_pixel ));
args.push_back( make_pair( sizeof(cl_int), (void *)&temp.rows )); args.push_back( make_pair( sizeof(cl_int), (void *)&temp.rows ));
args.push_back( make_pair( sizeof(cl_int), (void *)&temp.cols )); args.push_back( make_pair( sizeof(cl_int), (void *)&temp.cols ));
args.push_back( make_pair( sizeof(cl_mem), (void *)&oclcolor_weight.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&oclcolor_weight.data ));
args.push_back( make_pair( sizeof(cl_mem), (void *)&oclspace_weight.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&oclspace_weight.data ));
args.push_back( make_pair( sizeof(cl_mem), (void *)&oclspace_ofs.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&oclspace_ofs.data ));
openCLExecuteKernel(src.clCxt, &imgproc_bilateral, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel(src.clCxt, &imgproc_bilateral, kernelName, globalThreads, localThreads, args, dst.oclchannels(), dst.depth());
} }
void bilateralFilter(const oclMat &src, oclMat &dst, int radius, double sigmaclr, double sigmaspc, int borderType) void bilateralFilter(const oclMat &src, oclMat &dst, int radius, double sigmaclr, double sigmaspc, int borderType)
{ {
@@ -1682,32 +1701,33 @@ inline int divUp(int total, int grain)
{ {
return (total + grain - 1) / grain; return (total + grain - 1) / grain;
} }
void convolve_run(const oclMat &src, const oclMat &temp1,oclMat &dst,string kernelName,const char** kernelString) void convolve_run(const oclMat &src, const oclMat &temp1, oclMat &dst, string kernelName, const char **kernelString)
{ {
CV_Assert(src.depth() == CV_32FC1); CV_Assert(src.depth() == CV_32FC1);
CV_Assert(temp1.depth() == CV_32F); CV_Assert(temp1.depth() == CV_32F);
CV_Assert(temp1.cols <= 17 && temp1.rows <=17); CV_Assert(temp1.cols <= 17 && temp1.rows <= 17);
dst.create(src.size(),src.type()); dst.create(src.size(), src.type());
CV_Assert(src.cols == dst.cols && src.rows == dst.rows); CV_Assert(src.cols == dst.cols && src.rows == dst.rows);
CV_Assert(src.type() == dst.type()); CV_Assert(src.type() == dst.type());
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
int channels = dst.channels(); int channels = dst.oclchannels();
int depth = dst.depth(); int depth = dst.depth();
size_t vector_length =1; size_t vector_length = 1;
int offset_cols = ((dst.offset % dst.step) / dst.elemSize1()) & (vector_length-1); int offset_cols = ((dst.offset % dst.step) / dst.elemSize1()) & (vector_length - 1);
int cols = divUp(dst.cols * channels + offset_cols, vector_length); int cols = divUp(dst.cols * channels + offset_cols, vector_length);
int rows = dst.rows; int rows = dst.rows;
size_t localThreads[3] = { 16, 16, 1 }; size_t localThreads[3] = { 16, 16, 1 };
size_t globalThreads[3] = { divUp(cols, localThreads[0]) * localThreads[0], size_t globalThreads[3] = { divUp(cols, localThreads[0]) *localThreads[0],
divUp(rows, localThreads[1]) * localThreads[1], divUp(rows, localThreads[1]) *localThreads[1],
1}; 1
};
vector<pair<size_t ,const void *> > args; vector<pair<size_t , const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data ));
args.push_back( make_pair( sizeof(cl_mem), (void *)&temp1.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&temp1.data ));
args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_mem), (void *)&dst.data ));
@@ -1721,12 +1741,12 @@ void convolve_run(const oclMat &src, const oclMat &temp1,oclMat &dst,string kern
openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, -1, depth); openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, -1, depth);
} }
void cv::ocl::convolve(const oclMat& x, const oclMat& t, oclMat& y) void cv::ocl::convolve(const oclMat &x, const oclMat &t, oclMat &y)
{ {
CV_Assert(x.depth() == CV_32F); CV_Assert(x.depth() == CV_32F);
CV_Assert(t.depth() == CV_32F); CV_Assert(t.depth() == CV_32F);
CV_Assert(x.type() == y.type() && x.size() == y.size()); CV_Assert(x.type() == y.type() && x.size() == y.size());
y.create(x.size(),x.type()); y.create(x.size(), x.type());
string kernelName = "convolve"; string kernelName = "convolve";
convolve_run(x, t, y, kernelName, &imgproc_convolve); convolve_run(x, t, y, kernelName, &imgproc_convolve);

View File

@@ -96,12 +96,12 @@ namespace cv
throw_nogpu(); throw_nogpu();
} }
cl_mem openCLCreateBuffer(Context *,size_t, size_t) cl_mem openCLCreateBuffer(Context *, size_t, size_t)
{ {
throw_nogpu(); throw_nogpu();
} }
void openCLReadBuffer(Context *, cl_mem, void*, size_t) void openCLReadBuffer(Context *, cl_mem, void *, size_t)
{ {
throw_nogpu(); throw_nogpu();
} }
@@ -226,7 +226,7 @@ namespace cv
int double_support; int double_support;
Impl() Impl()
{ {
memset(extra_options,0,512); memset(extra_options, 0, 512);
} }
}; };
@@ -256,7 +256,7 @@ namespace cv
_devicetype = CL_DEVICE_TYPE_ALL; _devicetype = CL_DEVICE_TYPE_ALL;
break; break;
default: default:
CV_Error(CV_GpuApiCallError,"Unkown device type"); CV_Error(CV_GpuApiCallError, "Unkown device type");
} }
int devcienums = 0; int devcienums = 0;
// Platform info // Platform info
@@ -288,6 +288,7 @@ namespace cv
ocltmpinfo.impl->devices.push_back(devices[j]); ocltmpinfo.impl->devices.push_back(devices[j]);
openCLSafeCall(clGetDeviceInfo(devices[j], CL_DEVICE_NAME, 256, deviceName, NULL)); openCLSafeCall(clGetDeviceInfo(devices[j], CL_DEVICE_NAME, 256, deviceName, NULL));
ocltmpinfo.impl->devName.push_back(std::string(deviceName)); ocltmpinfo.impl->devName.push_back(std::string(deviceName));
ocltmpinfo.DeviceName.push_back(std::string(deviceName));
} }
delete[] devices; delete[] devices;
oclinfo.push_back(ocltmpinfo); oclinfo.push_back(ocltmpinfo);
@@ -336,7 +337,7 @@ namespace cv
openCLSafeCall(clGetDeviceInfo(oclinfo.impl->devices[devnum], CL_DEVICE_EXTENSIONS, openCLSafeCall(clGetDeviceInfo(oclinfo.impl->devices[devnum], CL_DEVICE_EXTENSIONS,
EXT_LEN, (void *)extends_set, &extends_size)); EXT_LEN, (void *)extends_set, &extends_size));
CV_Assert(extends_size < EXT_LEN); CV_Assert(extends_size < EXT_LEN);
extends_set[EXT_LEN-1] = 0; extends_set[EXT_LEN - 1] = 0;
//oclinfo.extra_options = NULL; //oclinfo.extra_options = NULL;
int fp64_khr = string(extends_set).find("cl_khr_fp64"); int fp64_khr = string(extends_set).find("cl_khr_fp64");
@@ -347,11 +348,15 @@ namespace cv
} }
Context::setContext(oclinfo); Context::setContext(oclinfo);
} }
void* getoclContext() void *getoclContext()
{ {
return &(Context::getContext()->impl->clContext); return &(Context::getContext()->impl->clContext);
} }
void* getoclCommandQueue()
void *getoclCommandQueue()
{ {
return &(Context::getContext()->impl->clCmdQueue); return &(Context::getContext()->impl->clCmdQueue);
} }
@@ -366,7 +371,7 @@ namespace cv
cl_mem openCLCreateBuffer(Context *clCxt, size_t flag , size_t size) cl_mem openCLCreateBuffer(Context *clCxt, size_t flag , size_t size)
{ {
cl_int status; cl_int status;
cl_mem buffer = clCreateBuffer(clCxt->impl->clContext,(cl_mem_flags)flag, size, NULL, &status); cl_mem buffer = clCreateBuffer(clCxt->impl->clContext, (cl_mem_flags)flag, size, NULL, &status);
openCLVerifyCall(status); openCLVerifyCall(status);
return buffer; return buffer;
} }
@@ -391,10 +396,10 @@ namespace cv
size_t region[3] = {width, height, 1}; size_t region[3] = {width, height, 1};
if(kind == clMemcpyHostToDevice) if(kind == clMemcpyHostToDevice)
{ {
if(dpitch == width || channels==3 || height == 1) if(dpitch == width || channels == 3 || height == 1)
{ {
openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)dst, CL_TRUE, openCLSafeCall(clEnqueueWriteBuffer(clCxt->impl->clCmdQueue, (cl_mem)dst, CL_TRUE,
0, width*height, src, 0, NULL, NULL)); 0, width * height, src, 0, NULL, NULL));
} }
else else
{ {
@@ -404,10 +409,10 @@ namespace cv
} }
else if(kind == clMemcpyDeviceToHost) else if(kind == clMemcpyDeviceToHost)
{ {
if(spitch == width || channels==3 || height == 1) if(spitch == width || channels == 3 || height == 1)
{ {
openCLSafeCall(clEnqueueReadBuffer(clCxt->impl->clCmdQueue, (cl_mem)src, CL_TRUE, openCLSafeCall(clEnqueueReadBuffer(clCxt->impl->clCmdQueue, (cl_mem)src, CL_TRUE,
0, width*height, dst, 0, NULL, NULL)); 0, width * height, dst, 0, NULL, NULL));
} }
else else
{ {
@@ -462,7 +467,7 @@ namespace cv
char **binaries = (char **)malloc( sizeof(char *) * numDevices ); char **binaries = (char **)malloc( sizeof(char *) * numDevices );
if(binaries == NULL) if(binaries == NULL)
{ {
CV_Error(CV_StsNoMem,"Failed to allocate host memory.(binaries)\r\n"); CV_Error(CV_StsNoMem, "Failed to allocate host memory.(binaries)\r\n");
} }
for(i = 0; i < numDevices; i++) for(i = 0; i < numDevices; i++)
@@ -472,7 +477,7 @@ namespace cv
binaries[i] = (char *)malloc( sizeof(char) * binarySizes[i]); binaries[i] = (char *)malloc( sizeof(char) * binarySizes[i]);
if(binaries[i] == NULL) if(binaries[i] == NULL)
{ {
CV_Error(CV_StsNoMem,"Failed to allocate host memory.(binaries[i])\r\n"); CV_Error(CV_StsNoMem, "Failed to allocate host memory.(binaries[i])\r\n");
} }
} }
else else
@@ -554,8 +559,8 @@ namespace cv
//config build programs //config build programs
char all_build_options[1024]; char all_build_options[1024];
memset(all_build_options, 0, 1024); memset(all_build_options, 0, 1024);
char zeromem[512]={0}; char zeromem[512] = {0};
if(0!=memcmp(clCxt -> impl->extra_options, zeromem,512)) if(0 != memcmp(clCxt -> impl->extra_options, zeromem, 512))
strcat(all_build_options, clCxt -> impl->extra_options); strcat(all_build_options, clCxt -> impl->extra_options);
strcat(all_build_options, " "); strcat(all_build_options, " ");
if(build_options != NULL) if(build_options != NULL)
@@ -873,6 +878,7 @@ namespace cv
//} //}
impl->devices.clear(); impl->devices.clear();
impl->devName.clear(); impl->devName.clear();
DeviceName.clear();
} }
Info::~Info() Info::~Info()
{ {
@@ -895,6 +901,7 @@ namespace cv
{ {
impl->devices.push_back(m.impl->devices[i]); impl->devices.push_back(m.impl->devices[i]);
impl->devName.push_back(m.impl->devName[i]); impl->devName.push_back(m.impl->devName[i]);
DeviceName.push_back(m.DeviceName[i]);
} }
return *this; return *this;
} }

View File

@@ -0,0 +1,315 @@
/*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 Comuter Vision Library
//
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// @Authors
// Peng Xiao, pengxiao@multicorewareinc.com
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other oclMaterials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors as is and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular urpose 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 <iomanip>
#include "precomp.hpp"
using namespace std;
using namespace cv;
using namespace cv::ocl;
#if !defined (HAVE_OPENCL)
void cv::ocl::interpolateFrames(const oclMat &frame0, const oclMat &frame1,
const oclMat &fu, const oclMat &fv,
const oclMat &bu, const oclMat &bv,
float pos, oclMat &newFrame, oclMat &buf)
{
throw_nogpu();
}
#else
namespace cv
{
namespace ocl
{
///////////////////////////OpenCL kernel strings///////////////////////////
extern const char *interpolate_frames;
namespace interpolate
{
//The following are ported from NPP_staging.cu
// As it is not valid to do pointer offset operations on host for default oclMat's native cl_mem pointer,
// we may have to do this on kernel
void memsetKernel(float val, oclMat &img, int height, int offset);
void normalizeKernel(oclMat &buffer, int height, int factor_offset, int dst_offset);
void forwardWarpKernel(const oclMat &src, oclMat &buffer, const oclMat &u, const oclMat &v, const float time_scale,
int b_offset, int d_offset); // buffer, dst offset
//OpenCL conversion of nppiStVectorWarp_PSF2x2_32f_C1
void vectorWarp(const oclMat &src, const oclMat &u, const oclMat &v,
oclMat &buffer, int buf_offset, float timeScale, int dst_offset);
//OpenCL conversion of BlendFrames
void blendFrames(const oclMat &frame0, const oclMat &frame1, const oclMat &buffer,
float pos, oclMat &newFrame, cl_mem &, cl_mem &);
// bind a buffer to an image
void bindImgTex(const oclMat &img, cl_mem &tex);
}
}
}
void cv::ocl::interpolateFrames(const oclMat &frame0, const oclMat &frame1,
const oclMat &fu, const oclMat &fv,
const oclMat &bu, const oclMat &bv,
float pos, oclMat &newFrame, oclMat &buf)
{
CV_Assert(frame0.type() == CV_32FC1);
CV_Assert(frame1.size() == frame0.size() && frame1.type() == frame0.type());
CV_Assert(fu.size() == frame0.size() && fu.type() == frame0.type());
CV_Assert(fv.size() == frame0.size() && fv.type() == frame0.type());
CV_Assert(bu.size() == frame0.size() && bu.type() == frame0.type());
CV_Assert(bv.size() == frame0.size() && bv.type() == frame0.type());
newFrame.create(frame0.size(), frame0.type());
buf.create(6 * frame0.rows, frame0.cols, CV_32FC1);
buf.setTo(Scalar::all(0));
size_t step = frame0.step;
CV_Assert(frame1.step == step && fu.step == step && fv.step == step && bu.step == step && bv.step == step && newFrame.step == step && buf.step == step);
cl_mem tex_src0 = 0, tex_src1 = 0;
// warp flow
using namespace interpolate;
bindImgTex(frame0, tex_src0);
bindImgTex(frame1, tex_src1);
// CUDA Offsets
enum
{
cov0 = 0,
cov1,
fwdU,
fwdV,
bwdU,
bwdV
};
vectorWarp(fu, fu, fv, buf, cov0, pos, fwdU);
vectorWarp(fv, fu, fv, buf, cov0, pos, fwdV);
vectorWarp(bu, bu, bv, buf, cov1, 1.0f - pos, bwdU);
vectorWarp(bv, bu, bv, buf, cov1, 1.0f - pos, bwdU);
blendFrames(frame0, frame1, buf, pos, newFrame, tex_src0, tex_src1);
openCLFree(tex_src0);
openCLFree(tex_src1);
}
void interpolate::memsetKernel(float val, oclMat &img, int height, int offset)
{
Context *clCxt = Context::getContext();
string kernelName = "memsetKernel";
vector< pair<size_t, const void *> > args;
int step = img.step / sizeof(float);
offset = step * height * offset;
args.push_back( make_pair( sizeof(cl_float), (void *)&val));
args.push_back( make_pair( sizeof(cl_mem), (void *)&img.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&img.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&height));
args.push_back( make_pair( sizeof(cl_int), (void *)&step));
args.push_back( make_pair( sizeof(cl_int), (void *)&offset));
size_t globalThreads[3] = {img.cols, height, 1};
size_t localThreads[3] = {16, 16, 1};
openCLExecuteKernel(clCxt, &interpolate_frames, kernelName, globalThreads, localThreads, args, -1, -1);
}
void interpolate::normalizeKernel(oclMat &buffer, int height, int factor_offset, int dst_offset)
{
Context *clCxt = Context::getContext();
string kernelName = "normalizeKernel";
vector< pair<size_t, const void *> > args;
int step = buffer.step / sizeof(float);
factor_offset = step * height * factor_offset;
dst_offset = step * height * dst_offset;
args.push_back( make_pair( sizeof(cl_mem), (void *)&buffer.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&buffer.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&height));
args.push_back( make_pair( sizeof(cl_int), (void *)&step));
args.push_back( make_pair( sizeof(cl_int), (void *)&factor_offset));
args.push_back( make_pair( sizeof(cl_int), (void *)&dst_offset));
size_t globalThreads[3] = {buffer.cols, height, 1};
size_t localThreads[3] = {16, 16, 1};
openCLExecuteKernel(clCxt, &interpolate_frames, kernelName, globalThreads, localThreads, args, -1, -1);
}
void interpolate::forwardWarpKernel(const oclMat &src, oclMat &buffer, const oclMat &u, const oclMat &v, const float time_scale,
int b_offset, int d_offset)
{
Context *clCxt = Context::getContext();
string kernelName = "forwardWarpKernel";
vector< pair<size_t, const void *> > args;
int f_step = u.step / sizeof(float); // flow step
int b_step = buffer.step / sizeof(float);
b_offset = b_step * src.rows * b_offset;
d_offset = b_step * src.rows * d_offset;
args.push_back( make_pair( sizeof(cl_mem), (void *)&src.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&buffer.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&u.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&v.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&src.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&src.rows));
args.push_back( make_pair( sizeof(cl_int), (void *)&f_step));
args.push_back( make_pair( sizeof(cl_int), (void *)&b_step));
args.push_back( make_pair( sizeof(cl_int), (void *)&b_offset));
args.push_back( make_pair( sizeof(cl_int), (void *)&d_offset));
args.push_back( make_pair( sizeof(cl_float), (void *)&time_scale));
size_t globalThreads[3] = {src.cols, src.rows, 1};
size_t localThreads[3] = {16, 16, 1};
openCLExecuteKernel(clCxt, &interpolate_frames, kernelName, globalThreads, localThreads, args, -1, -1);
}
void interpolate::vectorWarp(const oclMat &src, const oclMat &u, const oclMat &v,
oclMat &buffer, int b_offset, float timeScale, int d_offset)
{
memsetKernel(0, buffer, src.rows, b_offset);
forwardWarpKernel(src, buffer, u, v, timeScale, b_offset, d_offset);
normalizeKernel(buffer, src.rows, b_offset, d_offset);
}
void interpolate::blendFrames(const oclMat &frame0, const oclMat &frame1, const oclMat &buffer, float pos, oclMat &newFrame, cl_mem &tex_src0, cl_mem &tex_src1)
{
int step = buffer.step / sizeof(float);
Context *clCxt = Context::getContext();
string kernelName = "blendFramesKernel";
vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&tex_src0));
args.push_back( make_pair( sizeof(cl_mem), (void *)&tex_src1));
args.push_back( make_pair( sizeof(cl_mem), (void *)&buffer.data));
args.push_back( make_pair( sizeof(cl_mem), (void *)&newFrame.data));
args.push_back( make_pair( sizeof(cl_int), (void *)&frame0.cols));
args.push_back( make_pair( sizeof(cl_int), (void *)&frame0.rows));
args.push_back( make_pair( sizeof(cl_int), (void *)&step));
args.push_back( make_pair( sizeof(cl_float), (void *)&pos));
size_t globalThreads[3] = {frame0.cols, frame0.rows, 1};
size_t localThreads[3] = {16, 16, 1};
openCLExecuteKernel(clCxt, &interpolate_frames, kernelName, globalThreads, localThreads, args, -1, -1);
}
void interpolate::bindImgTex(const oclMat &img, cl_mem &texture)
{
cl_image_format format;
int err;
int depth = img.depth();
int channels = img.channels();
switch(depth)
{
case CV_8U:
format.image_channel_data_type = CL_UNSIGNED_INT8;
break;
case CV_32S:
format.image_channel_data_type = CL_UNSIGNED_INT32;
break;
case CV_32F:
format.image_channel_data_type = CL_FLOAT;
break;
default:
throw std::exception();
break;
}
switch(channels)
{
case 1:
format.image_channel_order = CL_R;
break;
case 3:
format.image_channel_order = CL_RGB;
break;
case 4:
format.image_channel_order = CL_RGBA;
break;
default:
throw std::exception();
break;
}
if(texture)
{
openCLFree(texture);
}
#if CL_VERSION_1_2
cl_image_desc desc;
desc.image_type = CL_MEM_OBJECT_IMAGE2D;
desc.image_width = img.step / img.elemSize();
desc.image_height = img.rows;
desc.image_depth = 0;
desc.image_array_size = 1;
desc.image_row_pitch = 0;
desc.image_slice_pitch = 0;
desc.buffer = NULL;
desc.num_mip_levels = 0;
desc.num_samples = 0;
texture = clCreateImage(Context::getContext()->impl->clContext, CL_MEM_READ_WRITE, &format, &desc, NULL, &err);
#else
texture = clCreateImage2D(
Context::getContext()->impl->clContext,
CL_MEM_READ_WRITE,
&format,
img.step / img.elemSize(),
img.rows,
0,
NULL,
&err);
#endif
size_t origin[] = { 0, 0, 0 };
size_t region[] = { img.step / img.elemSize(), img.rows, 1 };
clEnqueueCopyBufferToImage(img.clCxt->impl->clCmdQueue, (cl_mem)img.data, texture, 0, origin, region, 0, NULL, 0);
openCLSafeCall(err);
}
#endif//(HAVE_OPENCL)

View File

@@ -70,9 +70,22 @@ __kernel void arithm_absdiff_D0 (__global uchar *src1, int src1_step, int src1_o
int dst_start = mad24(y, dst_step, dst_offset); int dst_start = mad24(y, dst_step, dst_offset);
int dst_end = mad24(y, dst_step, dst_offset + dst_step1); int dst_end = mad24(y, dst_step, dst_offset + dst_step1);
int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc);
int src1_index_fix = src1_index < 0 ? 0 : src1_index;
uchar4 src1_data = vload4(0, src1 + src1_index); int src2_index_fix = src2_index < 0 ? 0 : src2_index;
uchar4 src2_data = vload4(0, src2 + src2_index); uchar4 src1_data = vload4(0, src1 + src1_index_fix);
uchar4 src2_data = vload4(0, src2 + src2_index_fix);
if(src1_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src1_index == -2) ? src1_data.zwxy:src1_data.yzwx;
src1_data.xyzw = (src1_index == -1) ? src1_data.wxyz:tmp.xyzw;
}
if(src2_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src2_index == -2) ? src2_data.zwxy:src2_data.yzwx;
src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw;
}
uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); uchar4 dst_data = *((__global uchar4 *)(dst + dst_index));
uchar4 tmp_data = abs_diff(src1_data, src2_data); uchar4 tmp_data = abs_diff(src1_data, src2_data);
@@ -242,9 +255,15 @@ __kernel void arithm_s_absdiff_C1_D0 (__global uchar *src1, int src1_step, int
int dst_start = mad24(y, dst_step, dst_offset); int dst_start = mad24(y, dst_step, dst_offset);
int dst_end = mad24(y, dst_step, dst_offset + dst_step1); int dst_end = mad24(y, dst_step, dst_offset + dst_step1);
int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc);
int src1_index_fix = src1_index < 0 ? 0 : src1_index;
uchar4 src1_data = vload4(0, src1 + src1_index); uchar4 src1_data = vload4(0, src1 + src1_index_fix);
int4 src2_data = (int4)(src2.x, src2.x, src2.x, src2.x); int4 src2_data = (int4)(src2.x, src2.x, src2.x, src2.x);
if(src1_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src1_index == -2) ? src1_data.zwxy:src1_data.yzwx;
src1_data.xyzw = (src1_index == -1) ? src1_data.wxyz:tmp.xyzw;
}
uchar4 data = *((__global uchar4 *)(dst + dst_index)); uchar4 data = *((__global uchar4 *)(dst + dst_index));
uchar4 tmp_data = convert_uchar4_sat(abs_diff(convert_int4_sat(src1_data), src2_data)); uchar4 tmp_data = convert_uchar4_sat(abs_diff(convert_int4_sat(src1_data), src2_data));

View File

@@ -71,10 +71,22 @@ __kernel void arithm_add_D0 (__global uchar *src1, int src1_step, int src1_offse
int dst_start = mad24(y, dst_step, dst_offset); int dst_start = mad24(y, dst_step, dst_offset);
int dst_end = mad24(y, dst_step, dst_offset + dst_step1); int dst_end = mad24(y, dst_step, dst_offset + dst_step1);
int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc);
int src1_index_fix = src1_index < 0 ? 0 : src1_index;
uchar4 src1_data = vload4(0, src1 + src1_index); int src2_index_fix = src2_index < 0 ? 0 : src2_index;
uchar4 src2_data = vload4(0, src2 + src2_index); uchar4 src1_data = vload4(0, src1 + src1_index_fix);
uchar4 src2_data = vload4(0, src2 + src2_index_fix);
if(src1_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src1_index == -2) ? src1_data.zwxy:src1_data.yzwx;
src1_data.xyzw = (src1_index == -1) ? src1_data.wxyz:tmp.xyzw;
}
if(src2_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src2_index == -2) ? src2_data.zwxy:src2_data.yzwx;
src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw;
}
uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); uchar4 dst_data = *((__global uchar4 *)(dst + dst_index));
short4 tmp = convert_short4_sat(src1_data) + convert_short4_sat(src2_data); short4 tmp = convert_short4_sat(src1_data) + convert_short4_sat(src2_data);
uchar4 tmp_data = convert_uchar4_sat(tmp); uchar4 tmp_data = convert_uchar4_sat(tmp);
@@ -248,10 +260,30 @@ __kernel void arithm_add_with_mask_C1_D0 (__global uchar *src1, int src1_step, i
int dst_start = mad24(y, dst_step, dst_offset); int dst_start = mad24(y, dst_step, dst_offset);
int dst_end = mad24(y, dst_step, dst_offset + dst_step1); int dst_end = mad24(y, dst_step, dst_offset + dst_step1);
int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc);
int src1_index_fix = src1_index < 0 ? 0 : src1_index;
uchar4 src1_data = vload4(0, src1 + src1_index); int src2_index_fix = src2_index < 0 ? 0 : src2_index;
uchar4 src2_data = vload4(0, src2 + src2_index); int mask_index_fix = mask_index < 0 ? 0 : mask_index;
uchar4 mask_data = vload4(0, mask + mask_index); uchar4 src1_data = vload4(0, src1 + src1_index_fix);
uchar4 src2_data = vload4(0, src2 + src2_index_fix);
uchar4 mask_data = vload4(0, mask + mask_index_fix);
if(src1_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src1_index == -2) ? src1_data.zwxy:src1_data.yzwx;
src1_data.xyzw = (src1_index == -1) ? src1_data.wxyz:tmp.xyzw;
}
if(src2_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src2_index == -2) ? src2_data.zwxy:src2_data.yzwx;
src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw;
}
if(mask_index < 0)
{
uchar4 tmp;
tmp.xyzw = (mask_index == -2) ? mask_data.zwxy:mask_data.yzwx;
mask_data.xyzw = (mask_index == -1) ? mask_data.wxyz:tmp.xyzw;
}
uchar4 data = *((__global uchar4 *)(dst + dst_index)); uchar4 data = *((__global uchar4 *)(dst + dst_index));
short4 tmp = convert_short4_sat(src1_data) + convert_short4_sat(src2_data); short4 tmp = convert_short4_sat(src1_data) + convert_short4_sat(src2_data);

View File

@@ -65,9 +65,15 @@ __kernel void arithm_s_add_C1_D0 (__global uchar *src1, int src1_step, int src
int dst_start = mad24(y, dst_step, dst_offset); int dst_start = mad24(y, dst_step, dst_offset);
int dst_end = mad24(y, dst_step, dst_offset + dst_step1); int dst_end = mad24(y, dst_step, dst_offset + dst_step1);
int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc);
int src1_index_fix = src1_index < 0 ? 0 : src1_index;
uchar4 src1_data = vload4(0, src1 + src1_index); uchar4 src1_data = vload4(0, src1 + src1_index_fix);
int4 src2_data = (int4)(src2.x, src2.x, src2.x, src2.x); int4 src2_data = (int4)(src2.x, src2.x, src2.x, src2.x);
if(src1_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src1_index == -2) ? src1_data.zwxy:src1_data.yzwx;
src1_data.xyzw = (src1_index == -1) ? src1_data.wxyz:tmp.xyzw;
}
uchar4 data = *((__global uchar4 *)(dst + dst_index)); uchar4 data = *((__global uchar4 *)(dst + dst_index));
int4 tmp = convert_int4_sat(src1_data) + src2_data; int4 tmp = convert_int4_sat(src1_data) + src2_data;

View File

@@ -68,10 +68,23 @@ __kernel void arithm_s_add_with_mask_C1_D0 (__global uchar *src1, int src1_ste
int dst_start = mad24(y, dst_step, dst_offset); int dst_start = mad24(y, dst_step, dst_offset);
int dst_end = mad24(y, dst_step, dst_offset + dst_step1); int dst_end = mad24(y, dst_step, dst_offset + dst_step1);
int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc);
int src1_index_fix = src1_index < 0 ? 0 : src1_index;
uchar4 src1_data = vload4(0, src1 + src1_index); int mask_index_fix = mask_index < 0 ? 0 : mask_index;
uchar4 src1_data = vload4(0, src1 + src1_index_fix);
int4 src2_data = (int4)(src2.x, src2.x, src2.x, src2.x); int4 src2_data = (int4)(src2.x, src2.x, src2.x, src2.x);
uchar4 mask_data = vload4(0, mask + mask_index); uchar4 mask_data = vload4(0, mask + mask_index_fix);
if(src1_index < 0)
{
uchar4 tmp;
tmp.xyzw = (src1_index == -2) ? src1_data.zwxy:src1_data.yzwx;
src1_data.xyzw = (src1_index == -1) ? src1_data.wxyz:tmp.xyzw;
}
if(mask_index < 0)
{
uchar4 tmp;
tmp.xyzw = (mask_index == -2) ? mask_data.zwxy:mask_data.yzwx;
mask_data.xyzw = (mask_index == -1) ? mask_data.wxyz:tmp.xyzw;
}
uchar4 data = *((__global uchar4 *)(dst + dst_index)); uchar4 data = *((__global uchar4 *)(dst + dst_index));
int4 tmp = convert_int4_sat(src1_data) + src2_data; int4 tmp = convert_int4_sat(src1_data) + src2_data;

View File

@@ -71,9 +71,22 @@ __kernel void arithm_flip_rows_D0 (__global uchar *src, int src_step, int src_of
int dst_end_1 = mad24(rows - y - 1, dst_step, dst_offset + dst_step1); int dst_end_1 = mad24(rows - y - 1, dst_step, dst_offset + dst_step1);
int dst_index_0 = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index_0 = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc);
int dst_index_1 = mad24(rows - y - 1, dst_step, dst_offset + x & (int)0xfffffffc); int dst_index_1 = mad24(rows - y - 1, dst_step, dst_offset + x & (int)0xfffffffc);
int src1_index_fix = src_index_0 < 0 ? 0 : src_index_0;
uchar4 src_data_0 = vload4(0, src + src_index_0); int src2_index_fix = src_index_1 < 0 ? 0 : src_index_1;
uchar4 src_data_1 = vload4(0, src + src_index_1); uchar4 src_data_0 = vload4(0, src + src1_index_fix);
uchar4 src_data_1 = vload4(0, src + src2_index_fix);
if(src_index_0 < 0)
{
uchar4 tmp;
tmp.xyzw = (src_index_0 == -2) ? src_data_0.zwxy:src_data_0.yzwx;
src_data_0.xyzw = (src_index_0 == -1) ? src_data_0.wxyz:tmp.xyzw;
}
if(src_index_1 < 0)
{
uchar4 tmp;
tmp.xyzw = (src_index_1 == -2) ? src_data_1.zwxy:src_data_1.yzwx;
src_data_1.xyzw = (src_index_1 == -1) ? src_data_1.wxyz:tmp.xyzw;
}
uchar4 dst_data_0 = *((__global uchar4 *)(dst + dst_index_0)); uchar4 dst_data_0 = *((__global uchar4 *)(dst + dst_index_0));
uchar4 dst_data_1 = *((__global uchar4 *)(dst + dst_index_1)); uchar4 dst_data_1 = *((__global uchar4 *)(dst + dst_index_1));

View File

@@ -0,0 +1,237 @@
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// @Authors
// Peng Xiao, pengxiao@multicorewareinc.com
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other oclMaterials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors as is and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
__kernel
void buildWarpPlaneMaps
(
__global float * map_x,
__global float * map_y,
__constant float * KRT,
int tl_u,
int tl_v,
int cols,
int rows,
int step_x,
int step_y,
float scale
)
{
int du = get_global_id(0);
int dv = get_global_id(1);
step_x /= sizeof(float);
step_y /= sizeof(float);
__constant float * ck_rinv = KRT;
__constant float * ct = KRT + 9;
if (du < cols && dv < rows)
{
float u = tl_u + du;
float v = tl_v + dv;
float x, y;
float x_ = u / scale - ct[0];
float y_ = v / scale - ct[1];
float z;
x = ck_rinv[0] * x_ + ck_rinv[1] * y_ + ck_rinv[2] * (1 - ct[2]);
y = ck_rinv[3] * x_ + ck_rinv[4] * y_ + ck_rinv[5] * (1 - ct[2]);
z = ck_rinv[6] * x_ + ck_rinv[7] * y_ + ck_rinv[8] * (1 - ct[2]);
x /= z;
y /= z;
map_x[dv * step_x + du] = x;
map_y[dv * step_y + du] = y;
}
}
__kernel
void buildWarpCylindricalMaps
(
__global float * map_x,
__global float * map_y,
__constant float * ck_rinv,
int tl_u,
int tl_v,
int cols,
int rows,
int step_x,
int step_y,
float scale
)
{
int du = get_global_id(0);
int dv = get_global_id(1);
step_x /= sizeof(float);
step_y /= sizeof(float);
if (du < cols && dv < rows)
{
float u = tl_u + du;
float v = tl_v + dv;
float x, y;
u /= scale;
float x_ = sin(u);
float y_ = v / scale;
float z_ = cos(u);
float z;
x = ck_rinv[0] * x_ + ck_rinv[1] * y_ + ck_rinv[2] * z_;
y = ck_rinv[3] * x_ + ck_rinv[4] * y_ + ck_rinv[5] * z_;
z = ck_rinv[6] * x_ + ck_rinv[7] * y_ + ck_rinv[8] * z_;
if (z > 0) { x /= z; y /= z; }
else x = y = -1;
map_x[dv * step_x + du] = x;
map_y[dv * step_y + du] = y;
}
}
__kernel
void buildWarpSphericalMaps
(
__global float * map_x,
__global float * map_y,
__constant float * ck_rinv,
int tl_u,
int tl_v,
int cols,
int rows,
int step_x,
int step_y,
float scale
)
{
int du = get_global_id(0);
int dv = get_global_id(1);
step_x /= sizeof(float);
step_y /= sizeof(float);
if (du < cols && dv < rows)
{
float u = tl_u + du;
float v = tl_v + dv;
float x, y;
v /= scale;
u /= scale;
float sinv = sin(v);
float x_ = sinv * sin(u);
float y_ = - cos(v);
float z_ = sinv * cos(u);
float z;
x = ck_rinv[0] * x_ + ck_rinv[1] * y_ + ck_rinv[2] * z_;
y = ck_rinv[3] * x_ + ck_rinv[4] * y_ + ck_rinv[5] * z_;
z = ck_rinv[6] * x_ + ck_rinv[7] * y_ + ck_rinv[8] * z_;
if (z > 0) { x /= z; y /= z; }
else x = y = -1;
map_x[dv * step_x + du] = x;
map_y[dv * step_y + du] = y;
}
}
__kernel
void buildWarpAffineMaps
(
__global float * xmap,
__global float * ymap,
__constant float * c_warpMat,
int cols,
int rows,
int step_x,
int step_y
)
{
int x = get_global_id(0);
int y = get_global_id(1);
step_x /= sizeof(float);
step_y /= sizeof(float);
if (x < cols && y < rows)
{
const float xcoo = c_warpMat[0] * x + c_warpMat[1] * y + c_warpMat[2];
const float ycoo = c_warpMat[3] * x + c_warpMat[4] * y + c_warpMat[5];
map_x[y * step_x + x] = xcoo;
map_y[y * step_y + x] = ycoo;
}
}
__kernel
void buildWarpPerspectiveMaps
(
__global float * xmap,
__global float * ymap,
__constant float * c_warpMat,
int cols,
int rows,
int step_x,
int step_y
)
{
int x = get_global_id(0);
int y = get_global_id(1);
step_x /= sizeof(float);
step_y /= sizeof(float);
if (x < cols && y < rows)
{
const float coeff = 1.0f / (c_warpMat[6] * x + c_warpMat[7] * y + c_warpMat[8]);
const float xcoo = coeff * (c_warpMat[0] * x + c_warpMat[1] * y + c_warpMat[2]);
const float ycoo = coeff * (c_warpMat[3] * x + c_warpMat[4] * y + c_warpMat[5]);
map_x[y * step_x + x] = xcoo;
map_y[y * step_y + x] = ycoo;
}
}

View File

@@ -254,6 +254,7 @@ __kernel void boxFilter_C4_D0(__global const uchar4 * restrict src, __global uch
//ss = convert_uint4(src[cur_addr]); //ss = convert_uint4(src[cur_addr]);
int cur_col = clamp(startX + col, 0, src_whole_cols); int cur_col = clamp(startX + col, 0, src_whole_cols);
if(con)
ss = convert_uint4(src[(startY+i)*(src_step>>2) + cur_col]); ss = convert_uint4(src[(startY+i)*(src_step>>2) + cur_col]);
data[i] = con ? ss : 0; data[i] = con ? ss : 0;
@@ -269,6 +270,7 @@ __kernel void boxFilter_C4_D0(__global const uchar4 * restrict src, __global uch
selected_col = ADDR_L(startX+col, 0, src_whole_cols); selected_col = ADDR_L(startX+col, 0, src_whole_cols);
selected_col = ADDR_R(startX+col, src_whole_cols, selected_col); selected_col = ADDR_R(startX+col, src_whole_cols, selected_col);
data[i] = convert_uint4(src[selected_row * (src_step>>2) + selected_col]); data[i] = convert_uint4(src[selected_row * (src_step>>2) + selected_col]);
} }
@@ -334,11 +336,12 @@ __kernel void boxFilter_C1_D5(__global const float *restrict src, __global float
for(int i=0; i < ksY+1; i++) for(int i=0; i < ksY+1; i++)
{ {
con = startX+col >= 0 && startX+col < src_whole_cols && startY+i >= 0 && startY+i < src_whole_rows; con = startX+col >= 0 && startX+col < src_whole_cols && startY+i >= 0 && startY+i < src_whole_rows;
// int cur_addr = clamp((startY+i)*(src_step>>2)+(startX+col),0,end_addr); //int cur_addr = clamp((startY+i)*(src_step>>2)+(startX+col),0,end_addr);
// ss = src[cur_addr]; //ss = src[cur_addr];
int cur_col = clamp(startX + col, 0, src_whole_cols); int cur_col = clamp(startX + col, 0, src_whole_cols);
ss = src[(startY+i)*(src_step>>2) + cur_col]; //ss = src[(startY+i)*(src_step>>2) + cur_col];
ss = (startY+i)<src_whole_rows&&(startY+i)>=0&&cur_col>=0&&cur_col<src_whole_cols?src[(startY+i)*(src_step>>2) + cur_col]:0;
data[i] = con ? ss : 0.f; data[i] = con ? ss : 0.f;
} }
@@ -422,7 +425,8 @@ __kernel void boxFilter_C4_D5(__global const float4 *restrict src, __global floa
//ss = src[cur_addr]; //ss = src[cur_addr];
int cur_col = clamp(startX + col, 0, src_whole_cols); int cur_col = clamp(startX + col, 0, src_whole_cols);
ss = src[(startY+i)*(src_step>>4) + cur_col]; //ss = src[(startY+i)*(src_step>>4) + cur_col];
ss = (startY+i)<src_whole_rows&&(startY+i)>=0&&cur_col>=0&&cur_col<src_whole_cols?src[(startY+i)*(src_step>>4) + cur_col]:0;
data[i] = con ? ss : (float4)(0.0,0.0,0.0,0.0); data[i] = con ? ss : (float4)(0.0,0.0,0.0,0.0);
} }

View File

@@ -31,84 +31,8 @@
// and on any theory of liability, whether in contract, strict liability, // and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of // 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. // the use of this software, even if advised of the possibility of such damage.
//
//
__kernel void bilateral_C1_D0(__global uchar *dst,
//#pragma OPENCL EXTENSION cl_amd_printf :enable
__kernel
void bilateral4(__global uchar4 *dst,
__global uchar4 *src,
int rows,
int cols,
int channels,
int radius,
int wholerows,
int wholecols,
int src_step,
int dst_step,
int src_offset,
int dst_offset,
__constant float *sigClr,
__constant float *sigSpc)
{
uint lidx = get_local_id(0);
uint lidy = get_local_id(1);
uint gdx = get_global_id(0);
uint gdy = get_global_id(1);
uint gidx = gdx >=cols?cols-1:gdx;
uint gidy = gdy >=rows?rows-1:gdy;
uchar4 p,q,tmp;
float4 pf = 0,pq = 0,pd = 0;
float wt =0;
int r = radius;
int ij = 0;
int ct = 0;
uint index_src = src_offset/4 + gidy*src_step/4 + gidx;
uint index_dst = dst_offset/4 + gidy*dst_step/4 + gidx;
p = src[index_src];
uint gx,gy;
uint src_index,dst_index;
for(int ii = -r;ii<r+1;ii++)
{
for(int jj =-r;jj<r+1;jj++)
{
ij = ii*ii+jj*jj;
if(ij > mul24(radius,radius)) continue;
gx = gidx + jj;
gy = gidy + ii;
src_index = src_offset/4 + gy * src_step/4 + gx;
q = src[src_index];
ct = abs(p.x-q.x)+abs(p.y-q.y)+abs(p.z-q.z);
wt =sigClr[ct]*sigSpc[(ii+radius)*(2*radius+1)+jj+radius];
pf.x += q.x*wt;
pf.y += q.y*wt;
pf.z += q.z*wt;
// pf.w += q.w*wt;
pq += wt;
}
}
pd = pf/pq;
dst[index_dst] = convert_uchar4_rte(pd);
}
__kernel void bilateral(__global uchar *dst,
__global const uchar *src, __global const uchar *src,
const int dst_rows, const int dst_rows,
const int dst_cols, const int dst_cols,
@@ -128,8 +52,8 @@ __kernel void bilateral(__global uchar *dst,
if((gidy<dst_rows) && (gidx<dst_cols)) if((gidy<dst_rows) && (gidx<dst_cols))
{ {
int src_addr = mad24(gidy+radius,src_step,gidx+radius); int src_addr = mad24(gidy+radius,src_step,gidx+radius);
int dst_addr = mad24(gidy,src_step,gidx+dst_offset); int dst_addr = mad24(gidy,dst_step,gidx+dst_offset);
float sum = 0, wsum = 0; float sum = 0.f, wsum = 0.f;
int val0 = (int)src[src_addr]; int val0 = (int)src[src_addr];
for(int k = 0; k < maxk; k++ ) for(int k = 0; k < maxk; k++ )
@@ -142,4 +66,73 @@ __kernel void bilateral(__global uchar *dst,
dst[dst_addr] = convert_uchar_rtz(sum/wsum+0.5f); dst[dst_addr] = convert_uchar_rtz(sum/wsum+0.5f);
} }
} }
__kernel void bilateral2_C1_D0(__global uchar *dst,
__global const uchar *src,
const int dst_rows,
const int dst_cols,
const int maxk,
const int radius,
const int dst_step,
const int dst_offset,
const int src_step,
const int src_rows,
const int src_cols,
__constant float *color_weight,
__constant float *space_weight,
__constant int *space_ofs)
{
int gidx = get_global_id(0)<<2;
int gidy = get_global_id(1);
if((gidy<dst_rows) && (gidx<dst_cols))
{
int src_addr = mad24(gidy+radius,src_step,gidx+radius);
int dst_addr = mad24(gidy,dst_step,gidx+dst_offset);
float4 sum = (float4)(0.f), wsum = (float4)(0.f);
int4 val0 = convert_int4(vload4(0,src+src_addr));
for(int k = 0; k < maxk; k++ )
{
int4 val = convert_int4(vload4(0,src+src_addr + space_ofs[k]));
float4 w = (float4)(space_weight[k])*(float4)(color_weight[abs(val.x - val0.x)],color_weight[abs(val.y - val0.y)],color_weight[abs(val.z - val0.z)],color_weight[abs(val.w - val0.w)]);
sum += convert_float4(val)*w;
wsum += w;
}
*(__global uchar4*)(dst+dst_addr) = convert_uchar4_rtz(sum/wsum+0.5f);
}
}
__kernel void bilateral_C4_D0(__global uchar4 *dst,
__global const uchar4 *src,
const int dst_rows,
const int dst_cols,
const int maxk,
const int radius,
const int dst_step,
const int dst_offset,
const int src_step,
const int src_rows,
const int src_cols,
__constant float *color_weight,
__constant float *space_weight,
__constant int *space_ofs)
{
int gidx = get_global_id(0);
int gidy = get_global_id(1);
if((gidy<dst_rows) && (gidx<dst_cols))
{
int src_addr = mad24(gidy+radius,src_step,gidx+radius);
int dst_addr = mad24(gidy,dst_step,gidx+dst_offset);
float4 sum = (float4)0.f;
float wsum = 0.f;
int4 val0 = convert_int4(src[src_addr]);
for(int k = 0; k < maxk; k++ )
{
int4 val = convert_int4(src[src_addr + space_ofs[k]]);
float w = space_weight[k]*color_weight[abs(val.x - val0.x)+abs(val.y - val0.y)+abs(val.z - val0.z)];
sum += convert_float4(val)*(float4)w;
wsum += w;
}
wsum=1.f/wsum;
dst[dst_addr] = convert_uchar4_rtz(sum*(float4)wsum+(float4)0.5f);
}
}

View File

@@ -144,16 +144,18 @@ __kernel void __attribute__((reqd_work_group_size(1,HISTOGRAM256_BIN_COUNT,1)))c
int rowIndex = mad24(gy, gn, gx); int rowIndex = mad24(gy, gn, gx);
// rowIndex &= (PARTIAL_HISTOGRAM256_COUNT - 1); // rowIndex &= (PARTIAL_HISTOGRAM256_COUNT - 1);
__local int subhist[HISTOGRAM256_LOCAL_MEM_SIZE + 1]; __local int subhist[HISTOGRAM256_LOCAL_MEM_SIZE];
subhist[lidy] = 0; subhist[lidy] = 0;
barrier(CLK_LOCAL_MEM_FENCE); barrier(CLK_LOCAL_MEM_FENCE);
gidx = ((gidx>=left_col) ? (gidx+cols) : gidx); gidx = ((gidx>=left_col) ? (gidx+cols) : gidx);
if(gidy<rows)
{
int src_index = src_offset + mad24(gidy, src_step, gidx); int src_index = src_offset + mad24(gidy, src_step, gidx);
barrier(CLK_LOCAL_MEM_FENCE);
int p = (int)src[src_index]; int p = (int)src[src_index];
p = gidy >= rows ? HISTOGRAM256_LOCAL_MEM_SIZE : p; // p = gidy >= rows ? HISTOGRAM256_LOCAL_MEM_SIZE : p;
atomic_inc(subhist + p); atomic_inc(subhist + p);
}
barrier(CLK_LOCAL_MEM_FENCE); barrier(CLK_LOCAL_MEM_FENCE);
globalHist[mad24(rowIndex, hist_step, lidy)] += subhist[lidy]; globalHist[mad24(rowIndex, hist_step, lidy)] += subhist[lidy];

View File

@@ -0,0 +1,252 @@
/*M///////////////////////////////////////////////////////////////////////////////////////
//
// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
//
// By downloading, copying, installing or using the software you agree to this license.
// If you do not agree to this license, do not download, install,
// copy or use the software.
//
//
// License Agreement
// For Open Source Computer Vision Library
//
// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved.
// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved.
// Third party copyrights are property of their respective owners.
//
// @Authors
// Peng Xiao, pengxiao@multicorewareinc.com
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
// * Redistribution's of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// * Redistribution's in binary form must reproduce the above copyright notice,
// this list of conditions and the following disclaimer in the documentation
// and/or other oclMaterials provided with the distribution.
//
// * The name of the copyright holders may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// This software is provided by the copyright holders and contributors as is and
// any express or implied warranties, including, but not limited to, the implied
// warranties of merchantability and fitness for a particular purpose are disclaimed.
// In no event shall the Intel Corporation or contributors be liable for any direct,
// indirect, incidental, special, exemplary, or consequential damages
// (including, but not limited to, procurement of substitute goods or services;
// loss of use, data, or profits; or business interruption) however caused
// and on any theory of liability, whether in contract, strict liability,
// or tort (including negligence or otherwise) arising in any way out of
// the use of this software, even if advised of the possibility of such damage.
//
//M*/
#pragma OPENCL EXTENSION cl_khr_global_int32_base_atomics : enable
#pragma OPENCL EXTENSION cl_khr_local_int32_base_atomics : enable
// Image read mode
__constant sampler_t sampler = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_LINEAR;
// atomic add for 32bit floating point
inline void atomic_addf(volatile __global float *source, const float operand) {
union {
unsigned int intVal;
float floatVal;
} newVal;
union {
unsigned int intVal;
float floatVal;
} prevVal;
do {
prevVal.floatVal = *source;
newVal.floatVal = prevVal.floatVal + operand;
} while (atomic_cmpxchg((volatile __global unsigned int *)source, prevVal.intVal, newVal.intVal) != prevVal.intVal);
}
__kernel void memsetKernel(
float val,
__global float * image,
int width,
int height,
int step, // in element
int offset
)
{
if(get_global_id(0) >= width || get_global_id(1) >= height)
{
return;
}
image += offset;
image[get_global_id(0) + get_global_id(1) * step] = val;
}
__kernel void normalizeKernel(
__global float * buffer,
int width,
int height,
int step,
int f_offset,
int d_offset
)
{
__global float * factors = buffer + f_offset;
__global float * dst = buffer + d_offset;
int j = get_global_id(0);
int i = get_global_id(1);
if(j >= width || i >= height)
{
return;
}
float scale = factors[step * i + j];
float invScale = (scale == 0.0f) ? 1.0f : (1.0f / scale);
dst[step * i + j] *= invScale;
}
__kernel void forwardWarpKernel(
__global const float * src,
__global float * buffer,
__global const float * u,
__global const float * v,
const int w,
const int h,
const int flow_stride,
const int image_stride,
const int factor_offset,
const int dst_offset,
const float time_scale
)
{
int j = get_global_id(0);
int i = get_global_id(1);
if (i >= h || j >= w) return;
volatile __global float * normalization_factor = (volatile __global float *) buffer + factor_offset;
volatile __global float * dst = (volatile __global float *)buffer + dst_offset;
int flow_row_offset = i * flow_stride;
int image_row_offset = i * image_stride;
//bottom left corner of a target pixel
float cx = u[flow_row_offset + j] * time_scale + (float)j + 1.0f;
float cy = v[flow_row_offset + j] * time_scale + (float)i + 1.0f;
// pixel containing bottom left corner
float px;
float py;
float dx = modf(cx, &px);
float dy = modf(cy, &py);
// target pixel integer coords
int tx;
int ty;
tx = (int) px;
ty = (int) py;
float value = src[image_row_offset + j];
float weight;
// fill pixel containing bottom right corner
if (!((tx >= w) || (tx < 0) || (ty >= h) || (ty < 0)))
{
weight = dx * dy;
atomic_addf(dst + ty * image_stride + tx, value * weight);
atomic_addf(normalization_factor + ty * image_stride + tx, weight);
}
// fill pixel containing bottom left corner
tx -= 1;
if (!((tx >= w) || (tx < 0) || (ty >= h) || (ty < 0)))
{
weight = (1.0f - dx) * dy;
atomic_addf(dst + ty * image_stride + tx, value * weight);
atomic_addf(normalization_factor + ty * image_stride + tx, weight);
}
// fill pixel containing upper left corner
ty -= 1;
if (!((tx >= w) || (tx < 0) || (ty >= h) || (ty < 0)))
{
weight = (1.0f - dx) * (1.0f - dy);
atomic_addf(dst + ty * image_stride + tx, value * weight);
atomic_addf(normalization_factor + ty * image_stride + tx, weight);
}
// fill pixel containing upper right corner
tx += 1;
if (!((tx >= w) || (tx < 0) || (ty >= h) || (ty < 0)))
{
weight = dx * (1.0f - dy);
atomic_addf(dst + ty * image_stride + tx, value * weight);
atomic_addf(normalization_factor + ty * image_stride + tx, weight);
}
}
// define buffer offsets
enum
{
O0_OS = 0,
O1_OS,
U_OS,
V_OS,
UR_OS,
VR_OS
};
__kernel void blendFramesKernel(
image2d_t tex_src0,
image2d_t tex_src1,
__global float * buffer,
__global float * out,
int w,
int h,
int step,
float theta
)
{
__global float * u = buffer + h * step * U_OS;
__global float * v = buffer + h * step * V_OS;
__global float * ur = buffer + h * step * UR_OS;
__global float * vr = buffer + h * step * VR_OS;
__global float * o0 = buffer + h * step * O0_OS;
__global float * o1 = buffer + h * step * O1_OS;
int ix = get_global_id(0);
int iy = get_global_id(1);
if(ix >= w || iy >= h) return;
int pos = ix + step * iy;
float _u = u[pos];
float _v = v[pos];
float _ur = ur[pos];
float _vr = vr[pos];
float x = (float)ix + 0.5f;
float y = (float)iy + 0.5f;
bool b0 = o0[pos] > 1e-4f;
bool b1 = o1[pos] > 1e-4f;
float2 coord0 = (float2)(x - _u * theta, y - _v * theta);
float2 coord1 = (float2)(x + _u * (1.0f - theta), y + _v * (1.0f - theta));
if (b0 && b1)
{
// pixel is visible on both frames
out[pos] = read_imagef(tex_src0, sampler, coord0).x * (1.0f - theta) +
read_imagef(tex_src1, sampler, coord1).x * theta;
}
else if (b0)
{
// visible on the first frame only
out[pos] = read_imagef(tex_src0, sampler, coord0).x;
}
else
{
// visible on the second frame only
out[pos] = read_imagef(tex_src1, sampler, coord1).x;
}
}

View File

@@ -52,7 +52,10 @@ using namespace cv::ocl;
using namespace std; using namespace std;
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
void cv::ocl::matchTemplate(const oclMat&, const oclMat&, oclMat&) { throw_nogpu(); } void cv::ocl::matchTemplate(const oclMat &, const oclMat &, oclMat &)
{
throw_nogpu();
}
#else #else
//helper routines //helper routines
namespace cv namespace cv
@@ -64,32 +67,34 @@ namespace cv
} }
} }
namespace cv { namespace ocl namespace cv
{ {
namespace ocl
{
void matchTemplate_SQDIFF( void matchTemplate_SQDIFF(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf); const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf);
void matchTemplate_SQDIFF_NORMED( void matchTemplate_SQDIFF_NORMED(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf); const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf);
void matchTemplate_CCORR( void matchTemplate_CCORR(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf); const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf);
void matchTemplate_CCORR_NORMED( void matchTemplate_CCORR_NORMED(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf); const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf);
void matchTemplate_CCOFF( void matchTemplate_CCOFF(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf); const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf);
void matchTemplate_CCOFF_NORMED( void matchTemplate_CCOFF_NORMED(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf); const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf);
void matchTemplateNaive_SQDIFF( void matchTemplateNaive_SQDIFF(
const oclMat& image, const oclMat& templ, oclMat& result, int cn); const oclMat &image, const oclMat &templ, oclMat &result, int cn);
void matchTemplateNaive_CCORR( void matchTemplateNaive_CCORR(
const oclMat& image, const oclMat& templ, oclMat& result, int cn); const oclMat &image, const oclMat &templ, oclMat &result, int cn);
// Evaluates optimal template's area threshold. If // Evaluates optimal template's area threshold. If
// template's area is less than the threshold, we use naive match // template's area is less than the threshold, we use naive match
@@ -114,7 +119,7 @@ namespace cv { namespace ocl
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// SQDIFF // SQDIFF
void matchTemplate_SQDIFF( void matchTemplate_SQDIFF(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &) const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &)
{ {
result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F); result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F);
if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth())) if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth()))
@@ -130,20 +135,15 @@ namespace cv { namespace ocl
} }
void matchTemplate_SQDIFF_NORMED( void matchTemplate_SQDIFF_NORMED(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf)
{ {
matchTemplate_CCORR(image,templ,result,buf); matchTemplate_CCORR(image, templ, result, buf);
buf.image_sums.resize(1); buf.image_sums.resize(1);
integral(image.reshape(1), buf.image_sums[0]); integral(image.reshape(1), buf.image_sums[0]);
#if SQRSUM_FIXED
unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0];
#else
Mat sqr_mat = templ.reshape(1);
unsigned long long templ_sqsum = (unsigned long long)sum(sqr_mat.mul(sqr_mat))[0];
#endif
Context *clCxt = image.clCxt; Context *clCxt = image.clCxt;
string kernelName = "matchTemplate_Prepared_SQDIFF_NORMED"; string kernelName = "matchTemplate_Prepared_SQDIFF_NORMED";
@@ -167,12 +167,12 @@ namespace cv { namespace ocl
} }
void matchTemplateNaive_SQDIFF( void matchTemplateNaive_SQDIFF(
const oclMat& image, const oclMat& templ, oclMat& result, int) const oclMat &image, const oclMat &templ, oclMat &result, int)
{ {
CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U ) CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U )
|| ((image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F) || ((image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F)
); );
CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1); CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.oclchannels() == 4) && result.channels() == 1);
CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1); CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1);
Context *clCxt = image.clCxt; Context *clCxt = image.clCxt;
@@ -198,13 +198,13 @@ namespace cv { namespace ocl
size_t globalThreads[3] = {result.cols, result.rows, 1}; size_t globalThreads[3] = {result.cols, result.rows, 1};
size_t localThreads[3] = {32, 8, 1}; size_t localThreads[3] = {32, 8, 1};
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.oclchannels(), image.depth());
} }
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// CCORR // CCORR
void matchTemplate_CCORR( void matchTemplate_CCORR(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf)
{ {
result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F); result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F);
if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth())) if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth()))
@@ -222,26 +222,22 @@ namespace cv { namespace ocl
} }
CV_Assert(image.channels() == 1); CV_Assert(image.channels() == 1);
oclMat o_result(image.size(), CV_MAKETYPE(CV_32F, image.channels())); oclMat o_result(image.size(), CV_MAKETYPE(CV_32F, image.channels()));
filter2D(buf.imagef,o_result,CV_32F,buf.templf, Point(0,0)); filter2D(buf.imagef, o_result, CV_32F, buf.templf, Point(0, 0));
result = o_result(Rect(0,0,image.rows - templ.rows + 1, image.cols - templ.cols + 1)); result = o_result(Rect(0, 0, image.rows - templ.rows + 1, image.cols - templ.cols + 1));
} }
} }
void matchTemplate_CCORR_NORMED( void matchTemplate_CCORR_NORMED(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf)
{ {
matchTemplate_CCORR(image,templ,result,buf); matchTemplate_CCORR(image, templ, result, buf);
buf.image_sums.resize(1); buf.image_sums.resize(1);
buf.image_sqsums.resize(1); buf.image_sqsums.resize(1);
integral(image.reshape(1), buf.image_sums[0], buf.image_sqsums[0]); integral(image.reshape(1), buf.image_sums[0], buf.image_sqsums[0]);
#if SQRSUM_FIXED
unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0];
#else
oclMat templ_c1 = templ.reshape(1);
multiply(templ_c1, templ_c1, templ_c1);
unsigned long long templ_sqsum = (unsigned long long)sum(templ_c1)[0];
#endif
Context *clCxt = image.clCxt; Context *clCxt = image.clCxt;
string kernelName = "normalizeKernel"; string kernelName = "normalizeKernel";
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
@@ -264,12 +260,12 @@ namespace cv { namespace ocl
} }
void matchTemplateNaive_CCORR( void matchTemplateNaive_CCORR(
const oclMat& image, const oclMat& templ, oclMat& result, int) const oclMat &image, const oclMat &templ, oclMat &result, int)
{ {
CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U ) CV_Assert((image.depth() == CV_8U && templ.depth() == CV_8U )
|| ((image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F) || ((image.depth() == CV_32F && templ.depth() == CV_32F) && result.depth() == CV_32F)
); );
CV_Assert(image.channels() == templ.channels() && (image.channels() == 1 || image.channels() == 4) && result.channels() == 1); CV_Assert(image.channels() == templ.channels() && (image.oclchannels() == 1 || image.oclchannels() == 4) && result.channels() == 1);
CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1); CV_Assert(result.rows == image.rows - templ.rows + 1 && result.cols == image.cols - templ.cols + 1);
Context *clCxt = image.clCxt; Context *clCxt = image.clCxt;
@@ -295,16 +291,16 @@ namespace cv { namespace ocl
size_t globalThreads[3] = {result.cols, result.rows, 1}; size_t globalThreads[3] = {result.cols, result.rows, 1};
size_t localThreads[3] = {32, 8, 1}; size_t localThreads[3] = {32, 8, 1};
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.oclchannels(), image.depth());
} }
////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////
// CCOFF // CCOFF
void matchTemplate_CCOFF( void matchTemplate_CCOFF(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf)
{ {
CV_Assert(image.depth() == CV_8U && templ.depth() == CV_8U); CV_Assert(image.depth() == CV_8U && templ.depth() == CV_8U);
matchTemplate_CCORR(image,templ,result,buf); matchTemplate_CCORR(image, templ, result, buf);
Context *clCxt = image.clCxt; Context *clCxt = image.clCxt;
string kernelName; string kernelName;
@@ -334,12 +330,12 @@ namespace cv { namespace ocl
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum) );
} }
else else
{ {
Vec4f templ_sum = Vec4f::all(0); Vec4f templ_sum = Vec4f::all(0);
split(image,buf.images); split(image, buf.images);
templ_sum = sum(templ) / templ.size().area(); templ_sum = sum(templ) / templ.size().area();
buf.image_sums.resize(buf.images.size()); buf.image_sums.resize(buf.images.size());
@@ -348,7 +344,7 @@ namespace cv { namespace ocl
{ {
integral(buf.images[i], buf.image_sums[i]); integral(buf.images[i], buf.image_sums[i]);
} }
switch(image.channels()) switch(image.oclchannels())
{ {
case 4: case 4:
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) );
@@ -357,27 +353,27 @@ namespace cv { namespace ocl
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) ); args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[3].data) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[0]) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[1]) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[2]) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[3]) );
break; break;
default: default:
CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels"); CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels");
break; break;
} }
} }
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.oclchannels(), image.depth());
} }
void matchTemplate_CCOFF_NORMED( void matchTemplate_CCOFF_NORMED(
const oclMat& image, const oclMat& templ, oclMat& result, MatchTemplateBuf &buf) const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf)
{ {
image.convertTo(buf.imagef, CV_32F); image.convertTo(buf.imagef, CV_32F);
templ.convertTo(buf.templf, CV_32F); templ.convertTo(buf.templf, CV_32F);
matchTemplate_CCORR(buf.imagef, buf.templf, result, buf); matchTemplate_CCORR(buf.imagef, buf.templf, result, buf);
float scale = 1.f/templ.size().area(); float scale = 1.f / templ.size().area();
Context *clCxt = image.clCxt; Context *clCxt = image.clCxt;
string kernelName; string kernelName;
@@ -396,7 +392,7 @@ namespace cv { namespace ocl
args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) ); args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) );
args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset));
args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); args.push_back( make_pair( sizeof(cl_int), (void *)&result.step));
args.push_back( make_pair( sizeof(cl_float),(void *)&scale) ); args.push_back( make_pair( sizeof(cl_float), (void *)&scale) );
// to be continued in the following section // to be continued in the following section
if(image.channels() == 1) if(image.channels() == 1)
{ {
@@ -406,13 +402,9 @@ namespace cv { namespace ocl
float templ_sum = 0; float templ_sum = 0;
float templ_sqsum = 0; float templ_sqsum = 0;
templ_sum = (float)sum(templ)[0]; templ_sum = (float)sum(templ)[0];
#if SQRSUM_FIXED
templ_sqsum = sqrSum(templ)[0]; templ_sqsum = sqrSum(templ)[0];
#else
oclMat templ_sqr = templ;
multiply(templ,templ, templ_sqr);
templ_sqsum = saturate_cast<float>(sum(templ_sqr)[0]);
#endif //SQRSUM_FIXED
templ_sqsum -= scale * templ_sum * templ_sum; templ_sqsum -= scale * templ_sum * templ_sum;
templ_sum *= scale; templ_sum *= scale;
@@ -422,27 +414,23 @@ namespace cv { namespace ocl
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) ); args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sqsum) );
} }
else else
{ {
Vec4f templ_sum = Vec4f::all(0); Vec4f templ_sum = Vec4f::all(0);
Vec4f templ_sqsum = Vec4f::all(0); Vec4f templ_sqsum = Vec4f::all(0);
split(image,buf.images); split(image, buf.images);
templ_sum = sum(templ); templ_sum = sum(templ);
#if SQRSUM_FIXED
templ_sqsum = sqrSum(templ); templ_sqsum = sqrSum(templ);
#else
oclMat templ_sqr = templ;
multiply(templ,templ, templ_sqr);
templ_sqsum = sum(templ_sqr);
#endif //SQRSUM_FIXED
templ_sqsum -= scale * templ_sum * templ_sum; templ_sqsum -= scale * templ_sum * templ_sum;
float templ_sqsum_sum = 0; float templ_sqsum_sum = 0;
for(int i = 0; i < image.channels(); i ++) for(int i = 0; i < image.oclchannels(); i ++)
{ {
templ_sqsum_sum += templ_sqsum[i] - scale * templ_sum[i] * templ_sum[i]; templ_sqsum_sum += templ_sqsum[i] - scale * templ_sum[i] * templ_sum[i];
} }
@@ -450,12 +438,12 @@ namespace cv { namespace ocl
buf.image_sums.resize(buf.images.size()); buf.image_sums.resize(buf.images.size());
buf.image_sqsums.resize(buf.images.size()); buf.image_sqsums.resize(buf.images.size());
for(int i = 0; i < image.channels(); i ++) for(int i = 0; i < image.oclchannels(); i ++)
{ {
integral(buf.images[i], buf.image_sums[i], buf.image_sqsums[i]); integral(buf.images[i], buf.image_sums[i], buf.image_sqsums[i]);
} }
switch(image.channels()) switch(image.oclchannels())
{ {
case 4: case 4:
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) );
@@ -470,35 +458,37 @@ namespace cv { namespace ocl
args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[3].data) ); args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[3].data) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) );
args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[0]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[0]) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[1]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[1]) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[2]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[2]) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sum[3]) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[3]) );
args.push_back( make_pair( sizeof(cl_float),(void *)&templ_sqsum_sum) ); args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sqsum_sum) );
break; break;
default: default:
CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels"); CV_Error(CV_StsBadArg, "matchTemplate: unsupported number of channels");
break; break;
} }
} }
openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.channels(), image.depth()); openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.oclchannels(), image.depth());
} }
}/*ocl*/} /*cv*/ }/*ocl*/
} /*cv*/
void cv::ocl::matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method) void cv::ocl::matchTemplate(const oclMat &image, const oclMat &templ, oclMat &result, int method)
{ {
MatchTemplateBuf buf; MatchTemplateBuf buf;
matchTemplate(image,templ, result, method,buf); matchTemplate(image, templ, result, method, buf);
} }
void cv::ocl::matchTemplate(const oclMat& image, const oclMat& templ, oclMat& result, int method, MatchTemplateBuf& buf) void cv::ocl::matchTemplate(const oclMat &image, const oclMat &templ, oclMat &result, int method, MatchTemplateBuf &buf)
{ {
CV_Assert(image.type() == templ.type()); CV_Assert(image.type() == templ.type());
CV_Assert(image.cols >= templ.cols && image.rows >= templ.rows); CV_Assert(image.cols >= templ.cols && image.rows >= templ.rows);
typedef void (*Caller)(const oclMat&, const oclMat&, oclMat&, MatchTemplateBuf&); typedef void (*Caller)(const oclMat &, const oclMat &, oclMat &, MatchTemplateBuf &);
const Caller callers[] = { const Caller callers[] =
{
::matchTemplate_SQDIFF, ::matchTemplate_SQDIFF_NORMED, ::matchTemplate_SQDIFF, ::matchTemplate_SQDIFF_NORMED,
::matchTemplate_CCORR, ::matchTemplate_CCORR_NORMED, ::matchTemplate_CCORR, ::matchTemplate_CCORR_NORMED,
::matchTemplate_CCOFF, ::matchTemplate_CCOFF_NORMED ::matchTemplate_CCOFF, ::matchTemplate_CCOFF_NORMED

View File

@@ -62,32 +62,32 @@ namespace cv
{ {
namespace ocl namespace ocl
{ {
void oclMat::upload(const Mat& /*m*/) void oclMat::upload(const Mat & /*m*/)
{ {
throw_nogpu(); throw_nogpu();
} }
void oclMat::download(cv::Mat& /*m*/) const void oclMat::download(cv::Mat & /*m*/) const
{ {
throw_nogpu(); throw_nogpu();
} }
void oclMat::copyTo( oclMat& /*m*/ ) const void oclMat::copyTo( oclMat & /*m*/ ) const
{ {
throw_nogpu(); throw_nogpu();
} }
void oclMat::copyTo( oclMat& /*m*/, const oclMat&/* mask */) const void oclMat::copyTo( oclMat & /*m*/, const oclMat &/* mask */) const
{ {
throw_nogpu(); throw_nogpu();
} }
void oclMat::convertTo( oclMat& /*m*/, int /*rtype*/, double /*alpha*/, double /*beta*/ ) const void oclMat::convertTo( oclMat & /*m*/, int /*rtype*/, double /*alpha*/, double /*beta*/ ) const
{ {
throw_nogpu(); throw_nogpu();
} }
oclMat &oclMat::operator = (const Scalar& /*s*/) oclMat &oclMat::operator = (const Scalar & /*s*/)
{ {
throw_nogpu(); throw_nogpu();
return *this; return *this;
} }
oclMat &oclMat::setTo(const Scalar& /*s*/, const oclMat& /*mask*/) oclMat &oclMat::setTo(const Scalar & /*s*/, const oclMat & /*mask*/)
{ {
throw_nogpu(); throw_nogpu();
return *this; return *this;
@@ -128,8 +128,8 @@ namespace cv
// convert_C3C4 // convert_C3C4
void convert_C3C4(const cl_mem &src, oclMat &dst, int srcStep) void convert_C3C4(const cl_mem &src, oclMat &dst, int srcStep)
{ {
int dstStep_in_pixel = dst.step1() / dst.channels(); int dstStep_in_pixel = dst.step1() / dst.oclchannels();
int pixel_end = dst.wholecols * dst.wholerows -1; int pixel_end = dst.wholecols * dst.wholerows - 1;
Context *clCxt = dst.clCxt; Context *clCxt = dst.clCxt;
string kernelName = "convertC3C4"; string kernelName = "convertC3C4";
char compile_option[32]; char compile_option[32];
@@ -157,7 +157,7 @@ void convert_C3C4(const cl_mem &src, oclMat &dst, int srcStep)
sprintf(compile_option, "-D GENTYPE4=double4"); sprintf(compile_option, "-D GENTYPE4=double4");
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unknown depth"); CV_Error(CV_StsUnsupportedFormat, "unknown depth");
} }
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
args.push_back( make_pair( sizeof(cl_mem), (void *)&src)); args.push_back( make_pair( sizeof(cl_mem), (void *)&src));
@@ -167,17 +167,17 @@ void convert_C3C4(const cl_mem &src, oclMat &dst, int srcStep)
args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep_in_pixel)); args.push_back( make_pair( sizeof(cl_int), (void *)&dstStep_in_pixel));
args.push_back( make_pair( sizeof(cl_int), (void *)&pixel_end)); args.push_back( make_pair( sizeof(cl_int), (void *)&pixel_end));
size_t globalThreads[3] = {((dst.wholecols *dst.wholerows+3)/4 + 255) / 256 * 256, 1, 1}; size_t globalThreads[3] = {((dst.wholecols * dst.wholerows + 3) / 4 + 255) / 256 * 256, 1, 1};
size_t localThreads[3] = {256, 1, 1}; size_t localThreads[3] = {256, 1, 1};
openCLExecuteKernel(clCxt, &convertC3C4, kernelName, globalThreads, localThreads, args, -1, -1,compile_option); openCLExecuteKernel(clCxt, &convertC3C4, kernelName, globalThreads, localThreads, args, -1, -1, compile_option);
} }
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
// convert_C4C3 // convert_C4C3
void convert_C4C3(const oclMat &src, cl_mem &dst, int dstStep) void convert_C4C3(const oclMat &src, cl_mem &dst, int dstStep)
{ {
int srcStep_in_pixel = src.step1() / src.channels(); int srcStep_in_pixel = src.step1() / src.oclchannels();
int pixel_end = src.wholecols*src.wholerows -1; int pixel_end = src.wholecols * src.wholerows - 1;
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
string kernelName = "convertC4C3"; string kernelName = "convertC4C3";
char compile_option[32]; char compile_option[32];
@@ -205,7 +205,7 @@ void convert_C4C3(const oclMat &src, cl_mem &dst, int dstStep)
sprintf(compile_option, "-D GENTYPE4=double4"); sprintf(compile_option, "-D GENTYPE4=double4");
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unknown depth"); CV_Error(CV_StsUnsupportedFormat, "unknown depth");
} }
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
@@ -216,10 +216,10 @@ void convert_C4C3(const oclMat &src, cl_mem &dst, int dstStep)
args.push_back( make_pair( sizeof(cl_int), (void *)&srcStep_in_pixel)); args.push_back( make_pair( sizeof(cl_int), (void *)&srcStep_in_pixel));
args.push_back( make_pair( sizeof(cl_int), (void *)&pixel_end)); args.push_back( make_pair( sizeof(cl_int), (void *)&pixel_end));
size_t globalThreads[3] = {((src.wholecols *src.wholerows+3)/4 + 255) / 256 * 256, 1, 1}; size_t globalThreads[3] = {((src.wholecols * src.wholerows + 3) / 4 + 255) / 256 * 256, 1, 1};
size_t localThreads[3] = {256, 1, 1}; size_t localThreads[3] = {256, 1, 1};
openCLExecuteKernel(clCxt, &convertC3C4, kernelName, globalThreads, localThreads, args, -1, -1,compile_option); openCLExecuteKernel(clCxt, &convertC3C4, kernelName, globalThreads, localThreads, args, -1, -1, compile_option);
} }
void cv::ocl::oclMat::upload(const Mat &m) void cv::ocl::oclMat::upload(const Mat &m)
@@ -228,23 +228,23 @@ void cv::ocl::oclMat::upload(const Mat &m)
Size wholeSize; Size wholeSize;
Point ofs; Point ofs;
m.locateROI(wholeSize, ofs); m.locateROI(wholeSize, ofs);
int type = m.type(); // int type = m.type();
if(m.channels() == 3) // if(m.oclchannels() == 3)
{ //{
type = CV_MAKETYPE(m.depth(), 4); // type = CV_MAKETYPE(m.depth(), 4);
} //}
create(wholeSize, type); create(wholeSize, m.type());
if(m.channels() == 3) if(m.channels() == 3)
{ {
int pitch = wholeSize.width * 3 * m.elemSize1(); int pitch = wholeSize.width * 3 * m.elemSize1();
int tail_padding = m.elemSize1()*3072; int tail_padding = m.elemSize1() * 3072;
int err; int err;
cl_mem temp = clCreateBuffer(clCxt->impl->clContext,CL_MEM_READ_WRITE, cl_mem temp = clCreateBuffer(clCxt->impl->clContext, CL_MEM_READ_WRITE,
(pitch*wholeSize.height+tail_padding-1)/tail_padding*tail_padding,0,&err); (pitch * wholeSize.height + tail_padding - 1) / tail_padding * tail_padding, 0, &err);
openCLVerifyCall(err); openCLVerifyCall(err);
openCLMemcpy2D(clCxt,temp,pitch,m.datastart,m.step,wholeSize.width*m.elemSize(),wholeSize.height,clMemcpyHostToDevice,3); openCLMemcpy2D(clCxt, temp, pitch, m.datastart, m.step, wholeSize.width * m.elemSize(), wholeSize.height, clMemcpyHostToDevice, 3);
convert_C3C4(temp, *this, pitch); convert_C3C4(temp, *this, pitch);
//int* cputemp=new int[wholeSize.height*wholeSize.width * 3]; //int* cputemp=new int[wholeSize.height*wholeSize.width * 3];
//int* cpudata=new int[this->step*this->wholerows/sizeof(int)]; //int* cpudata=new int[this->step*this->wholerows/sizeof(int)];
@@ -274,30 +274,30 @@ void cv::ocl::oclMat::upload(const Mat &m)
rows = m.rows; rows = m.rows;
cols = m.cols; cols = m.cols;
offset = ofs.y * step + ofs.x * elemSize(); offset = ofs.y * step + ofs.x * elemSize();
download_channels = m.channels(); //download_channels = m.channels();
} }
void cv::ocl::oclMat::download(cv::Mat &m) const void cv::ocl::oclMat::download(cv::Mat &m) const
{ {
CV_DbgAssert(!this->empty()); CV_DbgAssert(!this->empty());
int t = type(); // int t = type();
if(download_channels == 3) // if(download_channels == 3)
{ //{
t = CV_MAKETYPE(depth(), 3); // t = CV_MAKETYPE(depth(), 3);
} //}
m.create(wholerows, wholecols, t); m.create(wholerows, wholecols, type());
if(download_channels == 3) if(m.channels() == 3)
{ {
int pitch = wholecols * 3 * m.elemSize1(); int pitch = wholecols * 3 * m.elemSize1();
int tail_padding = m.elemSize1()*3072; int tail_padding = m.elemSize1() * 3072;
int err; int err;
cl_mem temp = clCreateBuffer(clCxt->impl->clContext,CL_MEM_READ_WRITE, cl_mem temp = clCreateBuffer(clCxt->impl->clContext, CL_MEM_READ_WRITE,
(pitch*wholerows+tail_padding-1)/tail_padding*tail_padding,0,&err); (pitch * wholerows + tail_padding - 1) / tail_padding * tail_padding, 0, &err);
openCLVerifyCall(err); openCLVerifyCall(err);
convert_C4C3(*this, temp, pitch/m.elemSize1()); convert_C4C3(*this, temp, pitch / m.elemSize1());
openCLMemcpy2D(clCxt,m.data,m.step,temp,pitch,wholecols*m.elemSize(),wholerows,clMemcpyDeviceToHost,3); openCLMemcpy2D(clCxt, m.data, m.step, temp, pitch, wholecols * m.elemSize(), wholerows, clMemcpyDeviceToHost, 3);
//int* cputemp=new int[wholecols*wholerows * 3]; //int* cputemp=new int[wholecols*wholerows * 3];
//int* cpudata=new int[this->step*this->wholerows/sizeof(int)]; //int* cpudata=new int[this->step*this->wholerows/sizeof(int)];
//openCLSafeCall(clEnqueueReadBuffer(clCxt->impl->clCmdQueue, temp, CL_TRUE, //openCLSafeCall(clEnqueueReadBuffer(clCxt->impl->clCmdQueue, temp, CL_TRUE,
@@ -350,7 +350,7 @@ void copy_to_with_mask(const oclMat &src, oclMat &dst, const oclMat &mask, strin
{"uchar4", "char4", "ushort4", "short4", "int4", "float4", "double4"} {"uchar4", "char4", "ushort4", "short4", "int4", "float4", "double4"}
}; };
char compile_option[32]; char compile_option[32];
sprintf(compile_option, "-D GENTYPE=%s", string_types[dst.channels()-1][dst.depth()].c_str()); sprintf(compile_option, "-D GENTYPE=%s", string_types[dst.oclchannels() - 1][dst.depth()].c_str());
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
size_t globalThreads[3]; size_t globalThreads[3];
@@ -374,7 +374,7 @@ void copy_to_with_mask(const oclMat &src, oclMat &dst, const oclMat &mask, strin
args.push_back( make_pair( sizeof(cl_int) , (void *)&mask.offset )); args.push_back( make_pair( sizeof(cl_int) , (void *)&mask.offset ));
openCLExecuteKernel(dst.clCxt , &operator_copyToM, kernelName, globalThreads, openCLExecuteKernel(dst.clCxt , &operator_copyToM, kernelName, globalThreads,
localThreads, args, -1, -1,compile_option); localThreads, args, -1, -1, compile_option);
} }
void cv::ocl::oclMat::copyTo( oclMat &m ) const void cv::ocl::oclMat::copyTo( oclMat &m ) const
@@ -432,7 +432,7 @@ void convert_run(const oclMat &src, oclMat &dst, double alpha, double beta)
args.push_back( make_pair( sizeof(cl_float) , (void *)&alpha_f )); args.push_back( make_pair( sizeof(cl_float) , (void *)&alpha_f ));
args.push_back( make_pair( sizeof(cl_float) , (void *)&beta_f )); args.push_back( make_pair( sizeof(cl_float) , (void *)&beta_f ));
openCLExecuteKernel(dst.clCxt , &operator_convertTo, kernelName, globalThreads, openCLExecuteKernel(dst.clCxt , &operator_convertTo, kernelName, globalThreads,
localThreads, args, dst.channels(), dst.depth()); localThreads, args, dst.oclchannels(), dst.depth());
} }
void cv::ocl::oclMat::convertTo( oclMat &dst, int rtype, double alpha, double beta ) const void cv::ocl::oclMat::convertTo( oclMat &dst, int rtype, double alpha, double beta ) const
{ {
@@ -496,7 +496,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
cl_int4 ival; cl_int4 ival;
cl_float4 fval; cl_float4 fval;
cl_double4 dval; cl_double4 dval;
}val; } val;
switch(dst.depth()) switch(dst.depth())
{ {
case CV_8U: case CV_8U:
@@ -504,7 +504,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]); val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]);
val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]); val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]);
val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]); val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=uchar"); sprintf(compile_option, "-D GENTYPE=uchar");
@@ -515,7 +515,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval )); args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_8S: case CV_8S:
@@ -523,7 +523,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
val.cval.s[1] = saturate_cast<char>(scalar.val[1]); val.cval.s[1] = saturate_cast<char>(scalar.val[1]);
val.cval.s[2] = saturate_cast<char>(scalar.val[2]); val.cval.s[2] = saturate_cast<char>(scalar.val[2]);
val.cval.s[3] = saturate_cast<char>(scalar.val[3]); val.cval.s[3] = saturate_cast<char>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=char"); sprintf(compile_option, "-D GENTYPE=char");
@@ -534,7 +534,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval )); args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_16U: case CV_16U:
@@ -542,7 +542,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]); val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]);
val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]); val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]);
val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]); val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=ushort"); sprintf(compile_option, "-D GENTYPE=ushort");
@@ -553,7 +553,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval )); args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_16S: case CV_16S:
@@ -561,7 +561,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
val.shval.s[1] = saturate_cast<short>(scalar.val[1]); val.shval.s[1] = saturate_cast<short>(scalar.val[1]);
val.shval.s[2] = saturate_cast<short>(scalar.val[2]); val.shval.s[2] = saturate_cast<short>(scalar.val[2]);
val.shval.s[3] = saturate_cast<short>(scalar.val[3]); val.shval.s[3] = saturate_cast<short>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=short"); sprintf(compile_option, "-D GENTYPE=short");
@@ -572,7 +572,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval )); args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_32S: case CV_32S:
@@ -580,7 +580,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
val.ival.s[1] = saturate_cast<int>(scalar.val[1]); val.ival.s[1] = saturate_cast<int>(scalar.val[1]);
val.ival.s[2] = saturate_cast<int>(scalar.val[2]); val.ival.s[2] = saturate_cast<int>(scalar.val[2]);
val.ival.s[3] = saturate_cast<int>(scalar.val[3]); val.ival.s[3] = saturate_cast<int>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=int"); sprintf(compile_option, "-D GENTYPE=int");
@@ -598,7 +598,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival )); args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_32F: case CV_32F:
@@ -606,7 +606,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
val.fval.s[1] = scalar.val[1]; val.fval.s[1] = scalar.val[1];
val.fval.s[2] = scalar.val[2]; val.fval.s[2] = scalar.val[2];
val.fval.s[3] = scalar.val[3]; val.fval.s[3] = scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=float"); sprintf(compile_option, "-D GENTYPE=float");
@@ -617,7 +617,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval )); args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_64F: case CV_64F:
@@ -625,7 +625,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
val.dval.s[1] = scalar.val[1]; val.dval.s[1] = scalar.val[1];
val.dval.s[2] = scalar.val[2]; val.dval.s[2] = scalar.val[2];
val.dval.s[3] = scalar.val[3]; val.dval.s[3] = scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=double"); sprintf(compile_option, "-D GENTYPE=double");
@@ -636,16 +636,16 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval )); args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unknown depth"); CV_Error(CV_StsUnsupportedFormat, "unknown depth");
} }
#if CL_VERSION_1_2 #if CL_VERSION_1_2
if(dst.offset==0 && dst.cols==dst.wholecols) if(dst.offset == 0 && dst.cols == dst.wholecols)
{ {
clEnqueueFillBuffer(dst.clCxt->impl->clCmdQueue,(cl_mem)dst.data,args[0].second,args[0].first,0,dst.step*dst.rows,0,NULL,NULL); clEnqueueFillBuffer(dst.clCxt->impl->clCmdQueue, (cl_mem)dst.data, args[0].second, args[0].first, 0, dst.step * dst.rows, 0, NULL, NULL);
} }
else else
{ {
@@ -655,7 +655,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel )); args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel ));
args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel));
openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads, openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads,
localThreads, args, -1, -1,compile_option); localThreads, args, -1, -1, compile_option);
} }
#else #else
args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data ));
@@ -664,7 +664,7 @@ void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, string kern
args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel )); args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel ));
args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel));
openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads, openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads,
localThreads, args, -1, -1,compile_option); localThreads, args, -1, -1, compile_option);
#endif #endif
} }
@@ -688,7 +688,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
cl_int4 ival; cl_int4 ival;
cl_float4 fval; cl_float4 fval;
cl_double4 dval; cl_double4 dval;
}val; } val;
switch(dst.depth()) switch(dst.depth())
{ {
case CV_8U: case CV_8U:
@@ -696,7 +696,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]); val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]);
val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]); val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]);
val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]); val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=uchar"); sprintf(compile_option, "-D GENTYPE=uchar");
@@ -707,7 +707,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval )); args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_8S: case CV_8S:
@@ -715,7 +715,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
val.cval.s[1] = saturate_cast<char>(scalar.val[1]); val.cval.s[1] = saturate_cast<char>(scalar.val[1]);
val.cval.s[2] = saturate_cast<char>(scalar.val[2]); val.cval.s[2] = saturate_cast<char>(scalar.val[2]);
val.cval.s[3] = saturate_cast<char>(scalar.val[3]); val.cval.s[3] = saturate_cast<char>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=char"); sprintf(compile_option, "-D GENTYPE=char");
@@ -726,7 +726,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval )); args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_16U: case CV_16U:
@@ -734,7 +734,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]); val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]);
val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]); val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]);
val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]); val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=ushort"); sprintf(compile_option, "-D GENTYPE=ushort");
@@ -745,7 +745,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval )); args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_16S: case CV_16S:
@@ -753,7 +753,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
val.shval.s[1] = saturate_cast<short>(scalar.val[1]); val.shval.s[1] = saturate_cast<short>(scalar.val[1]);
val.shval.s[2] = saturate_cast<short>(scalar.val[2]); val.shval.s[2] = saturate_cast<short>(scalar.val[2]);
val.shval.s[3] = saturate_cast<short>(scalar.val[3]); val.shval.s[3] = saturate_cast<short>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=short"); sprintf(compile_option, "-D GENTYPE=short");
@@ -764,7 +764,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval )); args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_32S: case CV_32S:
@@ -772,7 +772,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
val.ival.s[1] = saturate_cast<int>(scalar.val[1]); val.ival.s[1] = saturate_cast<int>(scalar.val[1]);
val.ival.s[2] = saturate_cast<int>(scalar.val[2]); val.ival.s[2] = saturate_cast<int>(scalar.val[2]);
val.ival.s[3] = saturate_cast<int>(scalar.val[3]); val.ival.s[3] = saturate_cast<int>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=int"); sprintf(compile_option, "-D GENTYPE=int");
@@ -783,7 +783,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival )); args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_32F: case CV_32F:
@@ -791,7 +791,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
val.fval.s[1] = scalar.val[1]; val.fval.s[1] = scalar.val[1];
val.fval.s[2] = scalar.val[2]; val.fval.s[2] = scalar.val[2];
val.fval.s[3] = scalar.val[3]; val.fval.s[3] = scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=float"); sprintf(compile_option, "-D GENTYPE=float");
@@ -802,7 +802,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval )); args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case CV_64F: case CV_64F:
@@ -810,7 +810,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
val.dval.s[1] = scalar.val[1]; val.dval.s[1] = scalar.val[1];
val.dval.s[2] = scalar.val[2]; val.dval.s[2] = scalar.val[2];
val.dval.s[3] = scalar.val[3]; val.dval.s[3] = scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=double"); sprintf(compile_option, "-D GENTYPE=double");
@@ -821,11 +821,11 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval )); args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unknown depth"); CV_Error(CV_StsUnsupportedFormat, "unknown depth");
} }
args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data ));
args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.cols )); args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.cols ));
@@ -836,7 +836,7 @@ void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &
args.push_back( make_pair( sizeof(cl_int) , (void *)&mask.step )); args.push_back( make_pair( sizeof(cl_int) , (void *)&mask.step ));
args.push_back( make_pair( sizeof(cl_int) , (void *)&mask.offset )); args.push_back( make_pair( sizeof(cl_int) , (void *)&mask.offset ));
openCLExecuteKernel(dst.clCxt , &operator_setToM, kernelName, globalThreads, openCLExecuteKernel(dst.clCxt , &operator_setToM, kernelName, globalThreads,
localThreads, args, -1, -1,compile_option); localThreads, args, -1, -1, compile_option);
} }
oclMat &cv::ocl::oclMat::setTo(const Scalar &scalar, const oclMat &mask) oclMat &cv::ocl::oclMat::setTo(const Scalar &scalar, const oclMat &mask)
@@ -855,7 +855,7 @@ oclMat &cv::ocl::oclMat::setTo(const Scalar &scalar, const oclMat &mask)
// (cl_mem)mem,1,0,sizeof(double)*4,s,0,0,0)); // (cl_mem)mem,1,0,sizeof(double)*4,s,0,0,0));
if (mask.empty()) if (mask.empty())
{ {
if(type()==CV_8UC1) if(type() == CV_8UC1)
{ {
set_to_withoutmask_run(*this, scalar, "set_to_without_mask_C1_D0"); set_to_withoutmask_run(*this, scalar, "set_to_without_mask_C1_D0");
} }
@@ -875,50 +875,91 @@ oclMat &cv::ocl::oclMat::setTo(const Scalar &scalar, const oclMat &mask)
oclMat cv::ocl::oclMat::reshape(int new_cn, int new_rows) const oclMat cv::ocl::oclMat::reshape(int new_cn, int new_rows) const
{ {
if( new_rows != 0 && new_rows != rows) if( new_rows != 0 && new_rows != rows)
{ {
CV_Error( CV_StsBadFunc, CV_Error( CV_StsBadFunc,
"oclMat's number of rows can not be changed for current version" ); "oclMat's number of rows can not be changed for current version" );
} }
oclMat hdr = *this; oclMat hdr = *this;
int cn = channels(); int cn = oclchannels();
if (new_cn == 0) if (new_cn == 0)
new_cn = cn; new_cn = cn;
int total_width = cols * cn; int total_width = cols * cn;
if ((new_cn > total_width || total_width % new_cn != 0) && new_rows == 0) if ((new_cn > total_width || total_width % new_cn != 0) && new_rows == 0)
new_rows = rows * total_width / new_cn; new_rows = rows * total_width / new_cn;
if (new_rows != 0 && new_rows != rows) if (new_rows != 0 && new_rows != rows)
{ {
int total_size = total_width * rows; int total_size = total_width * rows;
if (!isContinuous()) if (!isContinuous())
CV_Error(CV_BadStep, "The matrix is not continuous, thus its number of rows can not be changed"); CV_Error(CV_BadStep, "The matrix is not continuous, thus its number of rows can not be changed");
if ((unsigned)new_rows > (unsigned)total_size) if ((unsigned)new_rows > (unsigned)total_size)
CV_Error(CV_StsOutOfRange, "Bad new number of rows"); CV_Error(CV_StsOutOfRange, "Bad new number of rows");
total_width = total_size / new_rows; total_width = total_size / new_rows;
if (total_width * new_rows != total_size) if (total_width * new_rows != total_size)
CV_Error(CV_StsBadArg, "The total number of matrix elements is not divisible by the new number of rows"); CV_Error(CV_StsBadArg, "The total number of matrix elements is not divisible by the new number of rows");
hdr.rows = new_rows; hdr.rows = new_rows;
hdr.step = total_width * elemSize1(); hdr.step = total_width * elemSize1();
} }
int new_width = total_width / new_cn; int new_width = total_width / new_cn;
if (new_width * new_cn != total_width) if (new_width * new_cn != total_width)
CV_Error(CV_BadNumChannels, "The total width is not divisible by the new number of channels"); CV_Error(CV_BadNumChannels, "The total width is not divisible by the new number of channels");
hdr.cols = new_width; hdr.cols = new_width;
hdr.wholecols = new_width; hdr.wholecols = new_width;
hdr.flags = (hdr.flags & ~CV_MAT_CN_MASK) | ((new_cn - 1) << CV_CN_SHIFT); hdr.flags = (hdr.flags & ~CV_MAT_CN_MASK) | ((new_cn - 1) << CV_CN_SHIFT);
return hdr; return hdr;
} }
@@ -926,15 +967,13 @@ oclMat cv::ocl::oclMat::reshape(int new_cn, int new_rows) const
void cv::ocl::oclMat::create(int _rows, int _cols, int _type) void cv::ocl::oclMat::create(int _rows, int _cols, int _type)
{ {
clCxt = Context::getContext(); clCxt = Context::getContext();
//cout << "cv::ocl::oclMat::create()." << endl;
/* core logic */ /* core logic */
_type &= TYPE_MASK; _type &= TYPE_MASK;
download_channels = CV_MAT_CN(_type); //download_channels = CV_MAT_CN(_type);
if(download_channels==3) //if(download_channels==3)
{ //{
_type = CV_MAKE_TYPE((CV_MAT_DEPTH(_type)),4); // _type = CV_MAKE_TYPE((CV_MAT_DEPTH(_type)),4);
} //}
if( rows == _rows && cols == _cols && type() == _type && data ) if( rows == _rows && cols == _cols && type() == _type && data )
return; return;
if( data ) if( data )
@@ -953,7 +992,7 @@ void cv::ocl::oclMat::create(int _rows, int _cols, int _type)
openCLMallocPitch(clCxt, &dev_ptr, &step, GPU_MATRIX_MALLOC_STEP(esz * cols), rows); openCLMallocPitch(clCxt, &dev_ptr, &step, GPU_MATRIX_MALLOC_STEP(esz * cols), rows);
//openCLMallocPitch(clCxt,&dev_ptr, &step, esz * cols, rows); //openCLMallocPitch(clCxt,&dev_ptr, &step, esz * cols, rows);
if (esz *cols == step) if (esz * cols == step)
flags |= Mat::CONTINUOUS_FLAG; flags |= Mat::CONTINUOUS_FLAG;
int64 _nettosize = (int64)step * rows; int64 _nettosize = (int64)step * rows;
@@ -979,7 +1018,6 @@ void cv::ocl::oclMat::release()
step = rows = cols = 0; step = rows = cols = 0;
offset = wholerows = wholecols = 0; offset = wholerows = wholecols = 0;
refcount = 0; refcount = 0;
download_channels=0;
} }
#endif /* !defined (HAVE_OPENCL) */ #endif /* !defined (HAVE_OPENCL) */

View File

@@ -97,13 +97,13 @@ namespace cv
size_t widthInBytes, size_t height); size_t widthInBytes, size_t height);
void openCLMemcpy2D(Context *clCxt, void *dst, size_t dpitch, void openCLMemcpy2D(Context *clCxt, void *dst, size_t dpitch,
const void *src, size_t spitch, const void *src, size_t spitch,
size_t width, size_t height, enum openCLMemcpyKind kind, int channels=-1); size_t width, size_t height, enum openCLMemcpyKind kind, int channels = -1);
void openCLCopyBuffer2D(Context *clCxt, void *dst, size_t dpitch, int dst_offset, void openCLCopyBuffer2D(Context *clCxt, void *dst, size_t dpitch, int dst_offset,
const void *src, size_t spitch, const void *src, size_t spitch,
size_t width, size_t height, int src_offset, enum openCLMemcpyKind kind); size_t width, size_t height, int src_offset, enum openCLMemcpyKind kind);
void openCLFree(void *devPtr); void openCLFree(void *devPtr);
cl_mem openCLCreateBuffer(Context *clCxt,size_t flag, size_t size); cl_mem openCLCreateBuffer(Context *clCxt, size_t flag, size_t size);
void openCLReadBuffer(Context *clCxt, cl_mem dst_buffer, void* host_buffer, size_t size); void openCLReadBuffer(Context *clCxt, cl_mem dst_buffer, void *host_buffer, size_t size);
cl_kernel openCLGetKernelFromSource(const Context *clCxt, cl_kernel openCLGetKernelFromSource(const Context *clCxt,
const char **source, string kernelName); const char **source, string kernelName);
cl_kernel openCLGetKernelFromSource(const Context *clCxt, cl_kernel openCLGetKernelFromSource(const Context *clCxt,

View File

@@ -100,19 +100,17 @@ void pyrdown_run(const oclMat &src, const oclMat &dst)
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step )); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step ));
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.cols)); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.cols));
openCLExecuteKernel(clCxt, &pyr_down, kernelName, globalThreads, localThreads, args, src.channels(), src.depth()); openCLExecuteKernel(clCxt, &pyr_down, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////
// pyrDown // pyrDown
void cv::ocl::pyrDown(const oclMat& src, oclMat& dst) void cv::ocl::pyrDown(const oclMat &src, oclMat &dst)
{ {
CV_Assert(src.depth() <= CV_32F && src.channels() <= 4); CV_Assert(src.depth() <= CV_32F && src.channels() <= 4);
dst.create((src.rows + 1) / 2, (src.cols + 1) / 2, src.type()); dst.create((src.rows + 1) / 2, (src.cols + 1) / 2, src.type());
dst.download_channels=src.download_channels;
pyrdown_run(src, dst); pyrdown_run(src, dst);
} }

View File

@@ -48,8 +48,8 @@ using namespace cv::ocl;
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
void cv::ocl::PyrLKOpticalFlow::sparse(const oclMat&, const oclMat&, const oclMat&, oclMat&, oclMat&, oclMat*) { } void cv::ocl::PyrLKOpticalFlow::sparse(const oclMat &, const oclMat &, const oclMat &, oclMat &, oclMat &, oclMat *) { }
void cv::ocl::PyrLKOpticalFlow::dense(const oclMat&, const oclMat&, oclMat&, oclMat&, oclMat*) { } void cv::ocl::PyrLKOpticalFlow::dense(const oclMat &, const oclMat &, oclMat &, oclMat &, oclMat *) { }
#else /* !defined (HAVE_OPENCL) */ #else /* !defined (HAVE_OPENCL) */
@@ -83,7 +83,7 @@ struct int2
namespace namespace
{ {
void calcPatchSize(cv::Size winSize, int cn, dim3& block, dim3& patch, bool isDeviceArch11) void calcPatchSize(cv::Size winSize, int cn, dim3 &block, dim3 &patch, bool isDeviceArch11)
{ {
winSize.width *= cn; winSize.width *= cn;
@@ -144,7 +144,7 @@ void convert_run_cus(const oclMat &src, oclMat &dst, double alpha, double beta)
args.push_back( make_pair( sizeof(cl_float) , (void *)&alpha_f )); args.push_back( make_pair( sizeof(cl_float) , (void *)&alpha_f ));
args.push_back( make_pair( sizeof(cl_float) , (void *)&beta_f )); args.push_back( make_pair( sizeof(cl_float) , (void *)&beta_f ));
openCLExecuteKernel2(dst.clCxt , &operator_convertTo, kernelName, globalThreads, openCLExecuteKernel2(dst.clCxt , &operator_convertTo, kernelName, globalThreads,
localThreads, args, dst.channels(), dst.depth(), CLFLUSH); localThreads, args, dst.oclchannels(), dst.depth(), CLFLUSH);
} }
void convertTo( const oclMat &src, oclMat &m, int rtype, double alpha = 1, double beta = 0 ); void convertTo( const oclMat &src, oclMat &m, int rtype, double alpha = 1, double beta = 0 );
void convertTo( const oclMat &src, oclMat &dst, int rtype, double alpha, double beta ) void convertTo( const oclMat &src, oclMat &dst, int rtype, double alpha, double beta )
@@ -157,7 +157,7 @@ void convertTo( const oclMat &src, oclMat &dst, int rtype, double alpha, double
if( rtype < 0 ) if( rtype < 0 )
rtype = src.type(); rtype = src.type();
else else
rtype = CV_MAKETYPE(CV_MAT_DEPTH(rtype), src.channels()); rtype = CV_MAKETYPE(CV_MAT_DEPTH(rtype), src.oclchannels());
int sdepth = src.depth(), ddepth = CV_MAT_DEPTH(rtype); int sdepth = src.depth(), ddepth = CV_MAT_DEPTH(rtype);
if( sdepth == ddepth && noScale ) if( sdepth == ddepth && noScale )
@@ -208,7 +208,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
cl_int4 ival; cl_int4 ival;
cl_float4 fval; cl_float4 fval;
cl_double4 dval; cl_double4 dval;
}val; } val;
switch(dst.depth()) switch(dst.depth())
{ {
case 0: case 0:
@@ -216,7 +216,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]); val.uval.s[1] = saturate_cast<uchar>(scalar.val[1]);
val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]); val.uval.s[2] = saturate_cast<uchar>(scalar.val[2]);
val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]); val.uval.s[3] = saturate_cast<uchar>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=uchar"); sprintf(compile_option, "-D GENTYPE=uchar");
@@ -227,7 +227,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval )); args.push_back( make_pair( sizeof(cl_uchar4) , (void *)&val.uval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case 1: case 1:
@@ -235,7 +235,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
val.cval.s[1] = saturate_cast<char>(scalar.val[1]); val.cval.s[1] = saturate_cast<char>(scalar.val[1]);
val.cval.s[2] = saturate_cast<char>(scalar.val[2]); val.cval.s[2] = saturate_cast<char>(scalar.val[2]);
val.cval.s[3] = saturate_cast<char>(scalar.val[3]); val.cval.s[3] = saturate_cast<char>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=char"); sprintf(compile_option, "-D GENTYPE=char");
@@ -246,7 +246,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval )); args.push_back( make_pair( sizeof(cl_char4) , (void *)&val.cval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case 2: case 2:
@@ -254,7 +254,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]); val.usval.s[1] = saturate_cast<ushort>(scalar.val[1]);
val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]); val.usval.s[2] = saturate_cast<ushort>(scalar.val[2]);
val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]); val.usval.s[3] = saturate_cast<ushort>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=ushort"); sprintf(compile_option, "-D GENTYPE=ushort");
@@ -265,7 +265,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval )); args.push_back( make_pair( sizeof(cl_ushort4) , (void *)&val.usval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case 3: case 3:
@@ -273,7 +273,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
val.shval.s[1] = saturate_cast<short>(scalar.val[1]); val.shval.s[1] = saturate_cast<short>(scalar.val[1]);
val.shval.s[2] = saturate_cast<short>(scalar.val[2]); val.shval.s[2] = saturate_cast<short>(scalar.val[2]);
val.shval.s[3] = saturate_cast<short>(scalar.val[3]); val.shval.s[3] = saturate_cast<short>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=short"); sprintf(compile_option, "-D GENTYPE=short");
@@ -284,7 +284,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval )); args.push_back( make_pair( sizeof(cl_short4) , (void *)&val.shval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case 4: case 4:
@@ -292,7 +292,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
val.ival.s[1] = saturate_cast<int>(scalar.val[1]); val.ival.s[1] = saturate_cast<int>(scalar.val[1]);
val.ival.s[2] = saturate_cast<int>(scalar.val[2]); val.ival.s[2] = saturate_cast<int>(scalar.val[2]);
val.ival.s[3] = saturate_cast<int>(scalar.val[3]); val.ival.s[3] = saturate_cast<int>(scalar.val[3]);
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=int"); sprintf(compile_option, "-D GENTYPE=int");
@@ -310,7 +310,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival )); args.push_back( make_pair( sizeof(cl_int4) , (void *)&val.ival ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case 5: case 5:
@@ -318,7 +318,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
val.fval.s[1] = (float)scalar.val[1]; val.fval.s[1] = (float)scalar.val[1];
val.fval.s[2] = (float)scalar.val[2]; val.fval.s[2] = (float)scalar.val[2];
val.fval.s[3] = (float)scalar.val[3]; val.fval.s[3] = (float)scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=float"); sprintf(compile_option, "-D GENTYPE=float");
@@ -329,7 +329,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval )); args.push_back( make_pair( sizeof(cl_float4) , (void *)&val.fval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
case 6: case 6:
@@ -337,7 +337,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
val.dval.s[1] = scalar.val[1]; val.dval.s[1] = scalar.val[1];
val.dval.s[2] = scalar.val[2]; val.dval.s[2] = scalar.val[2];
val.dval.s[3] = scalar.val[3]; val.dval.s[3] = scalar.val[3];
switch(dst.channels()) switch(dst.oclchannels())
{ {
case 1: case 1:
sprintf(compile_option, "-D GENTYPE=double"); sprintf(compile_option, "-D GENTYPE=double");
@@ -348,16 +348,16 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval )); args.push_back( make_pair( sizeof(cl_double4) , (void *)&val.dval ));
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unsupported channels"); CV_Error(CV_StsUnsupportedFormat, "unsupported channels");
} }
break; break;
default: default:
CV_Error(CV_StsUnsupportedFormat,"unknown depth"); CV_Error(CV_StsUnsupportedFormat, "unknown depth");
} }
#if CL_VERSION_1_2 #if CL_VERSION_1_2
if(dst.offset==0 && dst.cols==dst.wholecols) if(dst.offset == 0 && dst.cols == dst.wholecols)
{ {
clEnqueueFillBuffer(dst.clCxt->impl->clCmdQueue,(cl_mem)dst.data,args[0].second,args[0].first,0,dst.step*dst.rows,0,NULL,NULL); clEnqueueFillBuffer(dst.clCxt->impl->clCmdQueue, (cl_mem)dst.data, args[0].second, args[0].first, 0, dst.step * dst.rows, 0, NULL, NULL);
} }
else else
{ {
@@ -367,7 +367,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel )); args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel ));
args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel));
openCLExecuteKernel2(dst.clCxt , &operator_setTo, kernelName, globalThreads, openCLExecuteKernel2(dst.clCxt , &operator_setTo, kernelName, globalThreads,
localThreads, args, -1, -1,compile_option, CLFLUSH); localThreads, args, -1, -1, compile_option, CLFLUSH);
} }
#else #else
args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data ));
@@ -376,7 +376,7 @@ void set_to_withoutmask_run_cus(const oclMat &dst, const Scalar &scalar, string
args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel )); args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel ));
args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel));
openCLExecuteKernel2(dst.clCxt , &operator_setTo, kernelName, globalThreads, openCLExecuteKernel2(dst.clCxt , &operator_setTo, kernelName, globalThreads,
localThreads, args, -1, -1,compile_option, CLFLUSH); localThreads, args, -1, -1, compile_option, CLFLUSH);
#endif #endif
} }
@@ -385,7 +385,7 @@ oclMat &setTo(oclMat &src, const Scalar &scalar)
CV_Assert( src.depth() >= 0 && src.depth() <= 6 ); CV_Assert( src.depth() >= 0 && src.depth() <= 6 );
CV_DbgAssert( !src.empty()); CV_DbgAssert( !src.empty());
if(src.type()==CV_8UC1) if(src.type() == CV_8UC1)
{ {
set_to_withoutmask_run_cus(src, scalar, "set_to_without_mask_C1_D0"); set_to_withoutmask_run_cus(src, scalar, "set_to_without_mask_C1_D0");
} }
@@ -399,9 +399,9 @@ oclMat &setTo(oclMat &src, const Scalar &scalar)
void arithmetic_run(const oclMat &src1, oclMat &dst, string kernelName, const char **kernelString, void *_scalar) void arithmetic_run(const oclMat &src1, oclMat &dst, string kernelName, const char **kernelString, void *_scalar)
{ {
if(src1.clCxt -> impl -> double_support ==0 && src1.type() == CV_64F) if(src1.clCxt -> impl -> double_support == 0 && src1.type() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); CV_Error(CV_GpuNotSupported, "Selected device don't support double\r\n");
return; return;
} }
@@ -489,10 +489,10 @@ void pyrdown_run_cus(const oclMat &src, const oclMat &dst)
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step )); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.step ));
args.push_back( make_pair( sizeof(cl_int), (void *)&dst.cols)); args.push_back( make_pair( sizeof(cl_int), (void *)&dst.cols));
openCLExecuteKernel2(clCxt, &pyr_down, kernelName, globalThreads, localThreads, args, src.channels(), src.depth(), CLFLUSH); openCLExecuteKernel2(clCxt, &pyr_down, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth(), CLFLUSH);
} }
void pyrDown_cus(const oclMat& src, oclMat& dst) void pyrDown_cus(const oclMat &src, oclMat &dst)
{ {
CV_Assert(src.depth() <= CV_32F && src.channels() <= 4); CV_Assert(src.depth() <= CV_32F && src.channels() <= 4);
@@ -606,7 +606,7 @@ void pyrDown_cus(const oclMat& src, oclMat& dst)
// //} // //}
//} //}
cl_mem bindTexture(const oclMat& mat, int depth, int channels) cl_mem bindTexture(const oclMat &mat, int depth, int channels)
{ {
cl_mem texture; cl_mem texture;
cl_image_format format; cl_image_format format;
@@ -639,7 +639,7 @@ cl_mem bindTexture(const oclMat& mat, int depth, int channels)
desc.image_depth = NULL; desc.image_depth = NULL;
desc.image_array_size = 1; desc.image_array_size = 1;
desc.image_row_pitch = 0; desc.image_row_pitch = 0;
desc.image_slice_pitch= 0; desc.image_slice_pitch = 0;
desc.buffer = NULL; desc.buffer = NULL;
desc.num_mip_levels = 0; desc.num_mip_levels = 0;
desc.num_samples = 0; desc.num_samples = 0;
@@ -668,8 +668,8 @@ void releaseTexture(cl_mem texture)
openCLFree(texture); openCLFree(texture);
} }
void lkSparse_run(oclMat& I, oclMat& J, void lkSparse_run(oclMat &I, oclMat &J,
const oclMat& prevPts, oclMat& nextPts, oclMat& status, oclMat* err, bool GET_MIN_EIGENVALS, int ptcount, const oclMat &prevPts, oclMat &nextPts, oclMat &status, oclMat *err, bool GET_MIN_EIGENVALS, int ptcount,
int level, /*dim3 block, */dim3 patch, Size winSize, int iters) int level, /*dim3 block, */dim3 patch, Size winSize, int iters)
{ {
Context *clCxt = I.clCxt; Context *clCxt = I.clCxt;
@@ -679,7 +679,7 @@ void lkSparse_run(oclMat& I, oclMat& J,
size_t localThreads[3] = { 8, 32, 1 }; size_t localThreads[3] = { 8, 32, 1 };
size_t globalThreads[3] = { 8 * ptcount, 32, 1}; size_t globalThreads[3] = { 8 * ptcount, 32, 1};
int cn = I.channels(); int cn = I.oclchannels();
bool calcErr; bool calcErr;
if (err) if (err)
@@ -718,13 +718,13 @@ void lkSparse_run(oclMat& I, oclMat& J,
args.push_back( make_pair( sizeof(cl_char), (void *)&calcErr )); args.push_back( make_pair( sizeof(cl_char), (void *)&calcErr ));
args.push_back( make_pair( sizeof(cl_char), (void *)&GET_MIN_EIGENVALS )); args.push_back( make_pair( sizeof(cl_char), (void *)&GET_MIN_EIGENVALS ));
openCLExecuteKernel2(clCxt, &pyrlk, kernelName, globalThreads, localThreads, args, I.channels(), I.depth(), CLFLUSH); openCLExecuteKernel2(clCxt, &pyrlk, kernelName, globalThreads, localThreads, args, I.oclchannels(), I.depth(), CLFLUSH);
releaseTexture(ITex); releaseTexture(ITex);
releaseTexture(JTex); releaseTexture(JTex);
} }
void cv::ocl::PyrLKOpticalFlow::sparse(const oclMat& prevImg, const oclMat& nextImg, const oclMat& prevPts, oclMat& nextPts, oclMat& status, oclMat* err) void cv::ocl::PyrLKOpticalFlow::sparse(const oclMat &prevImg, const oclMat &nextImg, const oclMat &prevPts, oclMat &nextPts, oclMat &status, oclMat *err)
{ {
if (prevPts.empty()) if (prevPts.empty())
{ {
@@ -738,7 +738,7 @@ void cv::ocl::PyrLKOpticalFlow::sparse(const oclMat& prevImg, const oclMat& next
iters = std::min(std::max(iters, 0), 100); iters = std::min(std::max(iters, 0), 100);
const int cn = prevImg.channels(); const int cn = prevImg.oclchannels();
dim3 block, patch; dim3 block, patch;
calcPatchSize(winSize, cn, block, patch, isDeviceArch11_); calcPatchSize(winSize, cn, block, patch, isDeviceArch11_);
@@ -807,8 +807,8 @@ void cv::ocl::PyrLKOpticalFlow::sparse(const oclMat& prevImg, const oclMat& next
clFinish(prevImg.clCxt->impl->clCmdQueue); clFinish(prevImg.clCxt->impl->clCmdQueue);
} }
void lkDense_run(oclMat& I, oclMat& J, oclMat& u, oclMat& v, void lkDense_run(oclMat &I, oclMat &J, oclMat &u, oclMat &v,
oclMat& prevU, oclMat& prevV, oclMat* err, Size winSize, int iters) oclMat &prevU, oclMat &prevV, oclMat *err, Size winSize, int iters)
{ {
Context *clCxt = I.clCxt; Context *clCxt = I.clCxt;
@@ -817,7 +817,7 @@ void lkDense_run(oclMat& I, oclMat& J, oclMat& u, oclMat& v,
size_t localThreads[3] = { 16, 16, 1 }; size_t localThreads[3] = { 16, 16, 1 };
size_t globalThreads[3] = { I.cols, I.rows, 1}; size_t globalThreads[3] = { I.cols, I.rows, 1};
int cn = I.channels(); int cn = I.oclchannels();
bool calcErr; bool calcErr;
if (err) if (err)
@@ -859,13 +859,13 @@ void lkDense_run(oclMat& I, oclMat& J, oclMat& u, oclMat& v,
args.push_back( make_pair( sizeof(cl_int), (void *)&iters )); args.push_back( make_pair( sizeof(cl_int), (void *)&iters ));
args.push_back( make_pair( sizeof(cl_char), (void *)&calcErr )); args.push_back( make_pair( sizeof(cl_char), (void *)&calcErr ));
openCLExecuteKernel2(clCxt, &pyrlk, kernelName, globalThreads, localThreads, args, I.channels(), I.depth(), CLFLUSH); openCLExecuteKernel2(clCxt, &pyrlk, kernelName, globalThreads, localThreads, args, I.oclchannels(), I.depth(), CLFLUSH);
releaseTexture(ITex); releaseTexture(ITex);
releaseTexture(JTex); releaseTexture(JTex);
} }
void cv::ocl::PyrLKOpticalFlow::dense(const oclMat& prevImg, const oclMat& nextImg, oclMat& u, oclMat& v, oclMat* err) void cv::ocl::PyrLKOpticalFlow::dense(const oclMat &prevImg, const oclMat &nextImg, oclMat &u, oclMat &v, oclMat *err)
{ {
CV_Assert(prevImg.type() == CV_8UC1); CV_Assert(prevImg.type() == CV_8UC1);
CV_Assert(prevImg.size() == nextImg.size() && prevImg.type() == nextImg.type()); CV_Assert(prevImg.size() == nextImg.size() && prevImg.type() == nextImg.type());

View File

@@ -55,16 +55,21 @@ using namespace cv::ocl;
using namespace std; using namespace std;
#ifndef HAVE_OPENCL #ifndef HAVE_OPENCL
void cv::ocl::pyrUp(const oclMat&, GpuMat&, oclMat&) { throw_nogpu(); } void cv::ocl::pyrUp(const oclMat &, GpuMat &, oclMat &)
{
throw_nogpu();
}
#else #else
namespace cv { namespace ocl namespace cv
{ {
namespace ocl
{
extern const char *pyr_up; extern const char *pyr_up;
void pyrUp(const cv::ocl::oclMat& src,cv::ocl::oclMat& dst) void pyrUp(const cv::ocl::oclMat &src, cv::ocl::oclMat &dst)
{ {
dst.create(src.rows * 2, src.cols * 2, src.type()); dst.create(src.rows * 2, src.cols * 2, src.type());
dst.download_channels=src.download_channels;
Context *clCxt = src.clCxt; Context *clCxt = src.clCxt;
const std::string kernelName = "pyrUp"; const std::string kernelName = "pyrUp";
@@ -84,7 +89,9 @@ namespace cv { namespace ocl
size_t globalThreads[3] = {dst.cols, dst.rows, 1}; size_t globalThreads[3] = {dst.cols, dst.rows, 1};
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
openCLExecuteKernel(clCxt, &pyr_up, kernelName, globalThreads, localThreads, args, src.channels(), src.depth());
openCLExecuteKernel(clCxt, &pyr_up, kernelName, globalThreads, localThreads, args, src.oclchannels(), src.depth());
} }
}}; }
};
#endif // HAVE_OPENCL #endif // HAVE_OPENCL

View File

@@ -114,7 +114,7 @@ namespace cv
void merge_vector_run_no_roi(const oclMat *mat_src, size_t n, oclMat &mat_dst) void merge_vector_run_no_roi(const oclMat *mat_src, size_t n, oclMat &mat_dst)
{ {
Context *clCxt = mat_dst.clCxt; Context *clCxt = mat_dst.clCxt;
int channels = mat_dst.channels(); int channels = mat_dst.oclchannels();
int depth = mat_dst.depth(); int depth = mat_dst.depth();
string kernelName = "merge_vector"; string kernelName = "merge_vector";
@@ -125,11 +125,11 @@ namespace cv
{4, 4, 2, 2, 1, 1, 1} {4, 4, 2, 2, 1, 1, 1}
}; };
size_t index = indexes[channels-1][mat_dst.depth()]; size_t index = indexes[channels - 1][mat_dst.depth()];
int cols = divUp(mat_dst.cols, index); int cols = divUp(mat_dst.cols, index);
size_t localThreads[3] = { 64, 4, 1 }; size_t localThreads[3] = { 64, 4, 1 };
size_t globalThreads[3] = { divUp(cols, localThreads[0]) * localThreads[0], size_t globalThreads[3] = { divUp(cols, localThreads[0]) *localThreads[0],
divUp(mat_dst.rows, localThreads[1]) * localThreads[1], divUp(mat_dst.rows, localThreads[1]) *localThreads[1],
1 1
}; };
@@ -158,14 +158,14 @@ namespace cv
void merge_vector_run(const oclMat *mat_src, size_t n, oclMat &mat_dst) void merge_vector_run(const oclMat *mat_src, size_t n, oclMat &mat_dst)
{ {
if(mat_dst.clCxt -> impl -> double_support ==0 && mat_dst.type() == CV_64F) if(mat_dst.clCxt -> impl -> double_support == 0 && mat_dst.type() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); CV_Error(CV_GpuNotSupported, "Selected device don't support double\r\n");
return; return;
} }
Context *clCxt = mat_dst.clCxt; Context *clCxt = mat_dst.clCxt;
int channels = mat_dst.channels(); int channels = mat_dst.oclchannels();
int depth = mat_dst.depth(); int depth = mat_dst.depth();
string kernelName = "merge_vector"; string kernelName = "merge_vector";
@@ -176,13 +176,13 @@ namespace cv
{1, 1, 1, 1, 1, 1, 1} {1, 1, 1, 1, 1, 1, 1}
}; };
size_t vector_length = vector_lengths[channels-1][depth]; size_t vector_length = vector_lengths[channels - 1][depth];
int offset_cols = (mat_dst.offset / mat_dst.elemSize()) & (vector_length - 1); int offset_cols = (mat_dst.offset / mat_dst.elemSize()) & (vector_length - 1);
int cols = divUp(mat_dst.cols + offset_cols, vector_length); int cols = divUp(mat_dst.cols + offset_cols, vector_length);
size_t localThreads[3] = { 64, 4, 1 }; size_t localThreads[3] = { 64, 4, 1 };
size_t globalThreads[3] = { divUp(cols, localThreads[0]) * localThreads[0], size_t globalThreads[3] = { divUp(cols, localThreads[0]) *localThreads[0],
divUp(mat_dst.rows, localThreads[1]) * localThreads[1], divUp(mat_dst.rows, localThreads[1]) *localThreads[1],
1 1
}; };
@@ -214,7 +214,7 @@ namespace cv
args.push_back( make_pair( sizeof(cl_int), (void *)&mat_src[2].step)); args.push_back( make_pair( sizeof(cl_int), (void *)&mat_src[2].step));
args.push_back( make_pair( sizeof(cl_int), (void *)&mat_src[2].offset)); args.push_back( make_pair( sizeof(cl_int), (void *)&mat_src[2].offset));
} }
else if( n== 4) else if( n == 4)
{ {
args.push_back( make_pair( sizeof(cl_mem), (void *)&mat_src[3].data)); args.push_back( make_pair( sizeof(cl_mem), (void *)&mat_src[3].data));
args.push_back( make_pair( sizeof(cl_int), (void *)&mat_src[3].step)); args.push_back( make_pair( sizeof(cl_int), (void *)&mat_src[3].step));
@@ -243,7 +243,7 @@ namespace cv
CV_Assert(depth == mat_src[i].depth()); CV_Assert(depth == mat_src[i].depth());
CV_Assert(size == mat_src[i].size()); CV_Assert(size == mat_src[i].size());
total_channels += mat_src[i].channels(); total_channels += mat_src[i].oclchannels();
} }
CV_Assert(total_channels <= 4); CV_Assert(total_channels <= 4);
@@ -263,7 +263,7 @@ namespace cv
void split_vector_run_no_roi(const oclMat &mat_src, oclMat *mat_dst) void split_vector_run_no_roi(const oclMat &mat_src, oclMat *mat_dst)
{ {
Context *clCxt = mat_src.clCxt; Context *clCxt = mat_src.clCxt;
int channels = mat_src.channels(); int channels = mat_src.oclchannels();
int depth = mat_src.depth(); int depth = mat_src.depth();
string kernelName = "split_vector"; string kernelName = "split_vector";
@@ -274,11 +274,11 @@ namespace cv
{4, 4, 2, 2, 1, 1, 1} {4, 4, 2, 2, 1, 1, 1}
}; };
size_t index = indexes[channels-1][mat_dst[0].depth()]; size_t index = indexes[channels - 1][mat_dst[0].depth()];
int cols = divUp(mat_src.cols, index); int cols = divUp(mat_src.cols, index);
size_t localThreads[3] = { 64, 4, 1 }; size_t localThreads[3] = { 64, 4, 1 };
size_t globalThreads[3] = { divUp(cols, localThreads[0]) * localThreads[0], size_t globalThreads[3] = { divUp(cols, localThreads[0]) *localThreads[0],
divUp(mat_src.rows, localThreads[1]) * localThreads[1], divUp(mat_src.rows, localThreads[1]) *localThreads[1],
1 1
}; };
@@ -307,14 +307,14 @@ namespace cv
void split_vector_run(const oclMat &mat_src, oclMat *mat_dst) void split_vector_run(const oclMat &mat_src, oclMat *mat_dst)
{ {
if(mat_src.clCxt -> impl -> double_support ==0 && mat_src.type() == CV_64F) if(mat_src.clCxt -> impl -> double_support == 0 && mat_src.type() == CV_64F)
{ {
CV_Error(CV_GpuNotSupported,"Selected device don't support double\r\n"); CV_Error(CV_GpuNotSupported, "Selected device don't support double\r\n");
return; return;
} }
Context *clCxt = mat_src.clCxt; Context *clCxt = mat_src.clCxt;
int channels = mat_src.channels(); int channels = mat_src.oclchannels();
int depth = mat_src.depth(); int depth = mat_src.depth();
string kernelName = "split_vector"; string kernelName = "split_vector";
@@ -325,7 +325,7 @@ namespace cv
{4, 4, 2, 2, 1, 1, 1} {4, 4, 2, 2, 1, 1, 1}
}; };
size_t vector_length = vector_lengths[channels-1][mat_dst[0].depth()]; size_t vector_length = vector_lengths[channels - 1][mat_dst[0].depth()];
int max_offset_cols = 0; int max_offset_cols = 0;
for(int i = 0; i < channels; i++) for(int i = 0; i < channels; i++)
@@ -339,8 +339,8 @@ namespace cv
: divUp(mat_src.cols + max_offset_cols, vector_length); : divUp(mat_src.cols + max_offset_cols, vector_length);
size_t localThreads[3] = { 64, 4, 1 }; size_t localThreads[3] = { 64, 4, 1 };
size_t globalThreads[3] = { divUp(cols, localThreads[0]) * localThreads[0], size_t globalThreads[3] = { divUp(cols, localThreads[0]) *localThreads[0],
divUp(mat_src.rows, localThreads[1]) * localThreads[1], 1 divUp(mat_src.rows, localThreads[1]) *localThreads[1], 1
}; };
int dst_step1 = mat_dst[0].cols * mat_dst[0].elemSize(); int dst_step1 = mat_dst[0].cols * mat_dst[0].elemSize();
@@ -379,7 +379,7 @@ namespace cv
CV_Assert(mat_dst); CV_Assert(mat_dst);
int depth = mat_src.depth(); int depth = mat_src.depth();
int num_channels = mat_src.channels(); int num_channels = mat_src.oclchannels();
Size size = mat_src.size(); Size size = mat_src.size();
if(num_channels == 1) if(num_channels == 1)
@@ -413,8 +413,8 @@ void cv::ocl::split(const oclMat &src, oclMat *dst)
} }
void cv::ocl::split(const oclMat &src, vector<oclMat> &dst) void cv::ocl::split(const oclMat &src, vector<oclMat> &dst)
{ {
dst.resize(src.channels()); dst.resize(src.oclchannels());
if(src.channels() > 0) if(src.oclchannels() > 0)
split_merge::split(src, &dst[0]); split_merge::split(src, &dst[0]);
} }
#endif /* !defined (HAVE_OPENCL) */ #endif /* !defined (HAVE_OPENCL) */

View File

@@ -44,7 +44,7 @@
//M*/ //M*/
#include <iomanip> #include <iomanip>
#include "precomp.hpp" #include "precomp.hpp"
#include "opencv2/highgui/highgui.hpp" //#include "opencv2/highgui/highgui.hpp"
using namespace cv; using namespace cv;
using namespace cv::ocl; using namespace cv::ocl;
@@ -52,25 +52,65 @@ using namespace std;
#if !defined (HAVE_OPENCL) #if !defined (HAVE_OPENCL)
cv::ocl::SURF_OCL::SURF_OCL() { throw_nogpu(); } cv::ocl::SURF_OCL::SURF_OCL()
cv::ocl::SURF_OCL::SURF_OCL(double, int, int, bool, float, bool) { throw_nogpu(); } {
int cv::ocl::SURF_OCL::descriptorSize() const { throw_nogpu(); return 0;} throw_nogpu();
void cv::ocl::SURF_OCL::uploadKeypoints(const vector<KeyPoint>&, oclMat&) { throw_nogpu(); } }
void cv::ocl::SURF_OCL::downloadKeypoints(const oclMat&, vector<KeyPoint>&) { throw_nogpu(); } cv::ocl::SURF_OCL::SURF_OCL(double, int, int, bool, float, bool)
void cv::ocl::SURF_OCL::downloadDescriptors(const oclMat&, vector<float>&) { throw_nogpu(); } {
void cv::ocl::SURF_OCL::operator()(const oclMat&, const oclMat&, oclMat&) { throw_nogpu(); } throw_nogpu();
void cv::ocl::SURF_OCL::operator()(const oclMat&, const oclMat&, oclMat&, oclMat&, bool) { throw_nogpu(); } }
void cv::ocl::SURF_OCL::operator()(const oclMat&, const oclMat&, vector<KeyPoint>&) { throw_nogpu(); } int cv::ocl::SURF_OCL::descriptorSize() const
void cv::ocl::SURF_OCL::operator()(const oclMat&, const oclMat&, vector<KeyPoint>&, oclMat&, bool) { throw_nogpu(); } {
void cv::ocl::SURF_OCL::operator()(const oclMat&, const oclMat&, vector<KeyPoint>&, vector<float>&, bool) { throw_nogpu(); } throw_nogpu();
void cv::ocl::SURF_OCL::releaseMemory() { throw_nogpu(); } return 0;
}
void cv::ocl::SURF_OCL::uploadKeypoints(const vector<KeyPoint> &, oclMat &)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::downloadKeypoints(const oclMat &, vector<KeyPoint> &)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::downloadDescriptors(const oclMat &, vector<float> &)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::operator()(const oclMat &, const oclMat &, oclMat &)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::operator()(const oclMat &, const oclMat &, oclMat &, oclMat &, bool)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::operator()(const oclMat &, const oclMat &, vector<KeyPoint> &)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::operator()(const oclMat &, const oclMat &, vector<KeyPoint> &, oclMat &, bool)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::operator()(const oclMat &, const oclMat &, vector<KeyPoint> &, vector<float> &, bool)
{
throw_nogpu();
}
void cv::ocl::SURF_OCL::releaseMemory()
{
throw_nogpu();
}
#else /* !defined (HAVE_OPENCL) */ #else /* !defined (HAVE_OPENCL) */
namespace cv { namespace ocl namespace cv
{ {
namespace ocl
{
///////////////////////////OpenCL kernel strings/////////////////////////// ///////////////////////////OpenCL kernel strings///////////////////////////
extern const char * nonfree_surf; extern const char *nonfree_surf;
}} }
}
static inline int divUp(int total, int grain) static inline int divUp(int total, int grain)
@@ -96,27 +136,27 @@ class SURF_OCL_Invoker
{ {
public: public:
// facilities // facilities
void bindImgTex(const oclMat& img, cl_mem & texture); void bindImgTex(const oclMat &img, cl_mem &texture);
//void loadGlobalConstants(int maxCandidates, int maxFeatures, int img_rows, int img_cols, int nOctaveLayers, float hessianThreshold); //void loadGlobalConstants(int maxCandidates, int maxFeatures, int img_rows, int img_cols, int nOctaveLayers, float hessianThreshold);
//void loadOctaveConstants(int octave, int layer_rows, int layer_cols); //void loadOctaveConstants(int octave, int layer_rows, int layer_cols);
// kernel callers declearations // kernel callers declearations
void icvCalcLayerDetAndTrace_gpu(oclMat& det, oclMat& trace, int octave, int nOctaveLayers, int layer_rows); void icvCalcLayerDetAndTrace_gpu(oclMat &det, oclMat &trace, int octave, int nOctaveLayers, int layer_rows);
void icvFindMaximaInLayer_gpu(const oclMat& det, const oclMat& trace, oclMat& maxPosBuffer, oclMat& maxCounter, int counterOffset, void icvFindMaximaInLayer_gpu(const oclMat &det, const oclMat &trace, oclMat &maxPosBuffer, oclMat &maxCounter, int counterOffset,
int octave, bool use_mask, int nLayers, int layer_rows, int layer_cols); int octave, bool use_mask, int nLayers, int layer_rows, int layer_cols);
void icvInterpolateKeypoint_gpu(const oclMat& det, const oclMat& maxPosBuffer, unsigned int maxCounter, void icvInterpolateKeypoint_gpu(const oclMat &det, const oclMat &maxPosBuffer, unsigned int maxCounter,
oclMat& keypoints, oclMat& counters, int octave, int layer_rows, int maxFeatures); oclMat &keypoints, oclMat &counters, int octave, int layer_rows, int maxFeatures);
void icvCalcOrientation_gpu(const oclMat& keypoints, int nFeatures); void icvCalcOrientation_gpu(const oclMat &keypoints, int nFeatures);
void compute_descriptors_gpu(const oclMat& descriptors, const oclMat& keypoints, int nFeatures); void compute_descriptors_gpu(const oclMat &descriptors, const oclMat &keypoints, int nFeatures);
// end of kernel callers declearations // end of kernel callers declearations
SURF_OCL_Invoker(SURF_OCL& surf, const oclMat& img, const oclMat& mask) : SURF_OCL_Invoker(SURF_OCL &surf, const oclMat &img, const oclMat &mask) :
surf_(surf), surf_(surf),
img_cols(img.cols), img_rows(img.rows), img_cols(img.cols), img_rows(img.rows),
use_mask(!mask.empty()), use_mask(!mask.empty()),
@@ -165,7 +205,7 @@ public:
} }
} }
void detectKeypoints(oclMat& keypoints) void detectKeypoints(oclMat &keypoints)
{ {
// create image pyramid buffers // create image pyramid buffers
// different layers have same sized buffers, but they are sampled from gaussin kernel. // different layers have same sized buffers, but they are sampled from gaussin kernel.
@@ -208,7 +248,7 @@ public:
findOrientation(keypoints); findOrientation(keypoints);
} }
void findOrientation(oclMat& keypoints) void findOrientation(oclMat &keypoints)
{ {
const int nFeatures = keypoints.cols; const int nFeatures = keypoints.cols;
if (nFeatures > 0) if (nFeatures > 0)
@@ -217,7 +257,7 @@ public:
} }
} }
void computeDescriptors(const oclMat& keypoints, oclMat& descriptors, int descriptorSize) void computeDescriptors(const oclMat &keypoints, oclMat &descriptors, int descriptorSize)
{ {
const int nFeatures = keypoints.cols; const int nFeatures = keypoints.cols;
if (nFeatures > 0) if (nFeatures > 0)
@@ -239,7 +279,7 @@ public:
} }
private: private:
SURF_OCL& surf_; SURF_OCL &surf_;
int img_cols, img_rows; int img_cols, img_rows;
@@ -257,7 +297,7 @@ private:
oclMat additioalParamBuffer; oclMat additioalParamBuffer;
SURF_OCL_Invoker& operator= (const SURF_OCL_Invoker& right) SURF_OCL_Invoker &operator= (const SURF_OCL_Invoker &right)
{ {
(*this) = right; (*this) = right;
return *this; return *this;
@@ -289,7 +329,7 @@ int cv::ocl::SURF_OCL::descriptorSize() const
return extended ? 128 : 64; return extended ? 128 : 64;
} }
void cv::ocl::SURF_OCL::uploadKeypoints(const vector<KeyPoint>& keypoints, oclMat& keypointsGPU) void cv::ocl::SURF_OCL::uploadKeypoints(const vector<KeyPoint> &keypoints, oclMat &keypointsGPU)
{ {
if (keypoints.empty()) if (keypoints.empty())
keypointsGPU.release(); keypointsGPU.release();
@@ -297,17 +337,17 @@ void cv::ocl::SURF_OCL::uploadKeypoints(const vector<KeyPoint>& keypoints, oclMa
{ {
Mat keypointsCPU(SURF_OCL::ROWS_COUNT, static_cast<int>(keypoints.size()), CV_32FC1); Mat keypointsCPU(SURF_OCL::ROWS_COUNT, static_cast<int>(keypoints.size()), CV_32FC1);
float* kp_x = keypointsCPU.ptr<float>(SURF_OCL::X_ROW); float *kp_x = keypointsCPU.ptr<float>(SURF_OCL::X_ROW);
float* kp_y = keypointsCPU.ptr<float>(SURF_OCL::Y_ROW); float *kp_y = keypointsCPU.ptr<float>(SURF_OCL::Y_ROW);
int* kp_laplacian = keypointsCPU.ptr<int>(SURF_OCL::LAPLACIAN_ROW); int *kp_laplacian = keypointsCPU.ptr<int>(SURF_OCL::LAPLACIAN_ROW);
int* kp_octave = keypointsCPU.ptr<int>(SURF_OCL::OCTAVE_ROW); int *kp_octave = keypointsCPU.ptr<int>(SURF_OCL::OCTAVE_ROW);
float* kp_size = keypointsCPU.ptr<float>(SURF_OCL::SIZE_ROW); float *kp_size = keypointsCPU.ptr<float>(SURF_OCL::SIZE_ROW);
float* kp_dir = keypointsCPU.ptr<float>(SURF_OCL::ANGLE_ROW); float *kp_dir = keypointsCPU.ptr<float>(SURF_OCL::ANGLE_ROW);
float* kp_hessian = keypointsCPU.ptr<float>(SURF_OCL::HESSIAN_ROW); float *kp_hessian = keypointsCPU.ptr<float>(SURF_OCL::HESSIAN_ROW);
for (size_t i = 0, size = keypoints.size(); i < size; ++i) for (size_t i = 0, size = keypoints.size(); i < size; ++i)
{ {
const KeyPoint& kp = keypoints[i]; const KeyPoint &kp = keypoints[i];
kp_x[i] = kp.pt.x; kp_x[i] = kp.pt.x;
kp_y[i] = kp.pt.y; kp_y[i] = kp.pt.y;
kp_octave[i] = kp.octave; kp_octave[i] = kp.octave;
@@ -321,7 +361,7 @@ void cv::ocl::SURF_OCL::uploadKeypoints(const vector<KeyPoint>& keypoints, oclMa
} }
} }
void cv::ocl::SURF_OCL::downloadKeypoints(const oclMat& keypointsGPU, vector<KeyPoint>& keypoints) void cv::ocl::SURF_OCL::downloadKeypoints(const oclMat &keypointsGPU, vector<KeyPoint> &keypoints)
{ {
const int nFeatures = keypointsGPU.cols; const int nFeatures = keypointsGPU.cols;
@@ -335,17 +375,17 @@ void cv::ocl::SURF_OCL::downloadKeypoints(const oclMat& keypointsGPU, vector<Key
keypoints.resize(nFeatures); keypoints.resize(nFeatures);
float* kp_x = keypointsCPU.ptr<float>(SURF_OCL::X_ROW); float *kp_x = keypointsCPU.ptr<float>(SURF_OCL::X_ROW);
float* kp_y = keypointsCPU.ptr<float>(SURF_OCL::Y_ROW); float *kp_y = keypointsCPU.ptr<float>(SURF_OCL::Y_ROW);
int* kp_laplacian = keypointsCPU.ptr<int>(SURF_OCL::LAPLACIAN_ROW); int *kp_laplacian = keypointsCPU.ptr<int>(SURF_OCL::LAPLACIAN_ROW);
int* kp_octave = keypointsCPU.ptr<int>(SURF_OCL::OCTAVE_ROW); int *kp_octave = keypointsCPU.ptr<int>(SURF_OCL::OCTAVE_ROW);
float* kp_size = keypointsCPU.ptr<float>(SURF_OCL::SIZE_ROW); float *kp_size = keypointsCPU.ptr<float>(SURF_OCL::SIZE_ROW);
float* kp_dir = keypointsCPU.ptr<float>(SURF_OCL::ANGLE_ROW); float *kp_dir = keypointsCPU.ptr<float>(SURF_OCL::ANGLE_ROW);
float* kp_hessian = keypointsCPU.ptr<float>(SURF_OCL::HESSIAN_ROW); float *kp_hessian = keypointsCPU.ptr<float>(SURF_OCL::HESSIAN_ROW);
for (int i = 0; i < nFeatures; ++i) for (int i = 0; i < nFeatures; ++i)
{ {
KeyPoint& kp = keypoints[i]; KeyPoint &kp = keypoints[i];
kp.pt.x = kp_x[i]; kp.pt.x = kp_x[i];
kp.pt.y = kp_y[i]; kp.pt.y = kp_y[i];
kp.class_id = kp_laplacian[i]; kp.class_id = kp_laplacian[i];
@@ -357,7 +397,7 @@ void cv::ocl::SURF_OCL::downloadKeypoints(const oclMat& keypointsGPU, vector<Key
} }
} }
void cv::ocl::SURF_OCL::downloadDescriptors(const oclMat& descriptorsGPU, vector<float>& descriptors) void cv::ocl::SURF_OCL::downloadDescriptors(const oclMat &descriptorsGPU, vector<float> &descriptors)
{ {
if (descriptorsGPU.empty()) if (descriptorsGPU.empty())
descriptors.clear(); descriptors.clear();
@@ -371,7 +411,7 @@ void cv::ocl::SURF_OCL::downloadDescriptors(const oclMat& descriptorsGPU, vector
} }
} }
void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, oclMat& keypoints) void cv::ocl::SURF_OCL::operator()(const oclMat &img, const oclMat &mask, oclMat &keypoints)
{ {
if (!img.empty()) if (!img.empty())
{ {
@@ -381,7 +421,7 @@ void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, oclMat
} }
} }
void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, oclMat& keypoints, oclMat& descriptors, void cv::ocl::SURF_OCL::operator()(const oclMat &img, const oclMat &mask, oclMat &keypoints, oclMat &descriptors,
bool useProvidedKeypoints) bool useProvidedKeypoints)
{ {
if (!img.empty()) if (!img.empty())
@@ -399,7 +439,7 @@ void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, oclMat
} }
} }
void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, vector<KeyPoint>& keypoints) void cv::ocl::SURF_OCL::operator()(const oclMat &img, const oclMat &mask, vector<KeyPoint> &keypoints)
{ {
oclMat keypointsGPU; oclMat keypointsGPU;
@@ -408,8 +448,8 @@ void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, vector
downloadKeypoints(keypointsGPU, keypoints); downloadKeypoints(keypointsGPU, keypoints);
} }
void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, vector<KeyPoint>& keypoints, void cv::ocl::SURF_OCL::operator()(const oclMat &img, const oclMat &mask, vector<KeyPoint> &keypoints,
oclMat& descriptors, bool useProvidedKeypoints) oclMat &descriptors, bool useProvidedKeypoints)
{ {
oclMat keypointsGPU; oclMat keypointsGPU;
@@ -421,8 +461,8 @@ void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, vector
downloadKeypoints(keypointsGPU, keypoints); downloadKeypoints(keypointsGPU, keypoints);
} }
void cv::ocl::SURF_OCL::operator()(const oclMat& img, const oclMat& mask, vector<KeyPoint>& keypoints, void cv::ocl::SURF_OCL::operator()(const oclMat &img, const oclMat &mask, vector<KeyPoint> &keypoints,
vector<float>& descriptors, bool useProvidedKeypoints) vector<float> &descriptors, bool useProvidedKeypoints)
{ {
oclMat descriptorsGPU; oclMat descriptorsGPU;
@@ -444,7 +484,7 @@ void cv::ocl::SURF_OCL::releaseMemory()
// bind source buffer to image oject. // bind source buffer to image oject.
void SURF_OCL_Invoker::bindImgTex(const oclMat& img, cl_mem& texture) void SURF_OCL_Invoker::bindImgTex(const oclMat &img, cl_mem &texture)
{ {
cl_image_format format; cl_image_format format;
int err; int err;
@@ -494,7 +534,7 @@ void SURF_OCL_Invoker::bindImgTex(const oclMat& img, cl_mem& texture)
desc.image_depth = 0; desc.image_depth = 0;
desc.image_array_size = 1; desc.image_array_size = 1;
desc.image_row_pitch = 0; desc.image_row_pitch = 0;
desc.image_slice_pitch= 0; desc.image_slice_pitch = 0;
desc.buffer = NULL; desc.buffer = NULL;
desc.num_mip_levels = 0; desc.num_mip_levels = 0;
desc.num_samples = 0; desc.num_samples = 0;
@@ -511,14 +551,14 @@ void SURF_OCL_Invoker::bindImgTex(const oclMat& img, cl_mem& texture)
&err); &err);
#endif #endif
size_t origin[] = { 0, 0, 0 }; size_t origin[] = { 0, 0, 0 };
size_t region[] = { img.step/img.elemSize(), img.rows, 1 }; size_t region[] = { img.step / img.elemSize(), img.rows, 1 };
clEnqueueCopyBufferToImage(img.clCxt->impl->clCmdQueue, (cl_mem)img.data, texture, 0, origin, region, 0, NULL, 0); clEnqueueCopyBufferToImage(img.clCxt->impl->clCmdQueue, (cl_mem)img.data, texture, 0, origin, region, 0, NULL, 0);
openCLSafeCall(err); openCLSafeCall(err);
} }
//////////////////////////// ////////////////////////////
// kernel caller definitions // kernel caller definitions
void SURF_OCL_Invoker::icvCalcLayerDetAndTrace_gpu(oclMat& det, oclMat& trace, int octave, int nOctaveLayers, int c_layer_rows) void SURF_OCL_Invoker::icvCalcLayerDetAndTrace_gpu(oclMat &det, oclMat &trace, int octave, int nOctaveLayers, int c_layer_rows)
{ {
const int min_size = calcSize(octave, 0); const int min_size = calcSize(octave, 0);
const int max_samples_i = 1 + ((img_rows - min_size) >> octave); const int max_samples_i = 1 + ((img_rows - min_size) >> octave);
@@ -540,14 +580,16 @@ void SURF_OCL_Invoker::icvCalcLayerDetAndTrace_gpu(oclMat& det, oclMat& trace, i
args.push_back( make_pair( sizeof(cl_int), (void *)&c_layer_rows)); args.push_back( make_pair( sizeof(cl_int), (void *)&c_layer_rows));
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
size_t globalThreads[3] = { size_t globalThreads[3] =
divUp(max_samples_j, localThreads[0]) * localThreads[0], {
divUp(max_samples_i, localThreads[1]) * localThreads[1] * (nOctaveLayers + 2), divUp(max_samples_j, localThreads[0]) *localThreads[0],
1}; divUp(max_samples_i, localThreads[1]) *localThreads[1] *(nOctaveLayers + 2),
1
};
openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void SURF_OCL_Invoker::icvFindMaximaInLayer_gpu(const oclMat& det, const oclMat& trace, oclMat& maxPosBuffer, oclMat& maxCounter, int counterOffset, void SURF_OCL_Invoker::icvFindMaximaInLayer_gpu(const oclMat &det, const oclMat &trace, oclMat &maxPosBuffer, oclMat &maxCounter, int counterOffset,
int octave, bool use_mask, int nLayers, int layer_rows, int layer_cols) int octave, bool use_mask, int nLayers, int layer_rows, int layer_cols)
{ {
const int min_margin = ((calcSize(octave, 2) >> 1) >> octave) + 1; const int min_margin = ((calcSize(octave, 2) >> 1) >> octave) + 1;
@@ -578,15 +620,16 @@ void SURF_OCL_Invoker::icvFindMaximaInLayer_gpu(const oclMat& det, const oclMat&
} }
size_t localThreads[3] = {16, 16, 1}; size_t localThreads[3] = {16, 16, 1};
size_t globalThreads[3] = {divUp(layer_cols - 2 * min_margin, localThreads[0] - 2) * localThreads[0], size_t globalThreads[3] = {divUp(layer_cols - 2 * min_margin, localThreads[0] - 2) *localThreads[0],
divUp(layer_rows - 2 * min_margin, localThreads[1] - 2) * nLayers * localThreads[1], divUp(layer_rows - 2 * min_margin, localThreads[1] - 2) *nLayers *localThreads[1],
1}; 1
};
openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void SURF_OCL_Invoker::icvInterpolateKeypoint_gpu(const oclMat& det, const oclMat& maxPosBuffer, unsigned int maxCounter, void SURF_OCL_Invoker::icvInterpolateKeypoint_gpu(const oclMat &det, const oclMat &maxPosBuffer, unsigned int maxCounter,
oclMat& keypoints, oclMat& counters, int octave, int layer_rows, int maxFeatures) oclMat &keypoints, oclMat &counters, int octave, int layer_rows, int maxFeatures)
{ {
Context *clCxt = det.clCxt; Context *clCxt = det.clCxt;
string kernelName = "icvInterpolateKeypoint"; string kernelName = "icvInterpolateKeypoint";
@@ -605,14 +648,14 @@ void SURF_OCL_Invoker::icvInterpolateKeypoint_gpu(const oclMat& det, const oclMa
args.push_back( make_pair( sizeof(cl_int), (void *)&maxFeatures)); args.push_back( make_pair( sizeof(cl_int), (void *)&maxFeatures));
size_t localThreads[3] = {3, 3, 3}; size_t localThreads[3] = {3, 3, 3};
size_t globalThreads[3] = {maxCounter * localThreads[0], localThreads[1], 1}; size_t globalThreads[3] = {maxCounter *localThreads[0], localThreads[1], 1};
openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void SURF_OCL_Invoker::icvCalcOrientation_gpu(const oclMat& keypoints, int nFeatures) void SURF_OCL_Invoker::icvCalcOrientation_gpu(const oclMat &keypoints, int nFeatures)
{ {
Context * clCxt = counters.clCxt; Context *clCxt = counters.clCxt;
string kernelName = "icvCalcOrientation"; string kernelName = "icvCalcOrientation";
vector< pair<size_t, const void *> > args; vector< pair<size_t, const void *> > args;
@@ -624,12 +667,12 @@ void SURF_OCL_Invoker::icvCalcOrientation_gpu(const oclMat& keypoints, int nFeat
args.push_back( make_pair( sizeof(cl_int), (void *)&img_cols)); args.push_back( make_pair( sizeof(cl_int), (void *)&img_cols));
size_t localThreads[3] = {32, 4, 1}; size_t localThreads[3] = {32, 4, 1};
size_t globalThreads[3] = {nFeatures * localThreads[0], localThreads[1], 1}; size_t globalThreads[3] = {nFeatures *localThreads[0], localThreads[1], 1};
openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1); openCLExecuteKernel(clCxt, &nonfree_surf, kernelName, globalThreads, localThreads, args, -1, -1);
} }
void SURF_OCL_Invoker::compute_descriptors_gpu(const oclMat& descriptors, const oclMat& keypoints, int nFeatures) void SURF_OCL_Invoker::compute_descriptors_gpu(const oclMat &descriptors, const oclMat &keypoints, int nFeatures)
{ {
// compute unnormalized descriptors, then normalize them - odd indexing since grid must be 2D // compute unnormalized descriptors, then normalize them - odd indexing since grid must be 2D
Context *clCxt = descriptors.clCxt; Context *clCxt = descriptors.clCxt;

View File

@@ -83,12 +83,12 @@ int main(int argc, char **argv)
std::vector<cv::ocl::Info> oclinfo; std::vector<cv::ocl::Info> oclinfo;
int devnums = getDevice(oclinfo); int devnums = getDevice(oclinfo);
if(devnums<1) if(devnums < 1)
{ {
std::cout << "no device found\n"; std::cout << "no device found\n";
return -1; return -1;
} }
//setDevice(oclinfo[2]); //setDevice(oclinfo[1]);
return RUN_ALL_TESTS(); return RUN_ALL_TESTS();
} }

View File

@@ -143,6 +143,10 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool)
src1y = rng.uniform(0, mat1.rows - roirows); src1y = rng.uniform(0, mat1.rows - roirows);
dstx = rng.uniform(0, dst.cols - roicols); dstx = rng.uniform(0, dst.cols - roicols);
dsty = rng.uniform(0, dst.rows - roirows); dsty = rng.uniform(0, dst.rows - roirows);
maskx = rng.uniform(0, mask.cols - roicols);
masky = rng.uniform(0, mask.rows - roirows);
src2x = rng.uniform(0, mat2.cols - roicols);
src2y = rng.uniform(0, mat2.rows - roirows);
#else #else
roicols = mat1.cols; roicols = mat1.cols;
roirows = mat1.rows; roirows = mat1.rows;
@@ -150,11 +154,11 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool)
src1y = 0; src1y = 0;
dstx = 0; dstx = 0;
dsty = 0; dsty = 0;
maskx = 0;
masky = 0;
src2x = 0;
src2y = 0;
#endif #endif
maskx = rng.uniform(0, mask.cols - roicols);
masky = rng.uniform(0, mask.rows - roirows);
src2x = rng.uniform(0, mat2.cols - roicols);
src2y = rng.uniform(0, mat2.rows - roirows);
mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows));
mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows)); mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows));
mask_roi = mask(Rect(maskx, masky, roicols, roirows)); mask_roi = mask(Rect(maskx, masky, roicols, roirows));
@@ -1454,7 +1458,7 @@ TEST_P(MagnitudeSqr, Mat)
float val1 = mat1.at<float>(i, j); float val1 = mat1.at<float>(i, j);
float val2 = mat2.at<float>(i, j); float val2 = mat2.at<float>(i, j);
((float *)(dst.data))[i *dst.step/4 +j] = val1 * val1 + val2 * val2; ((float *)(dst.data))[i * dst.step / 4 + j] = val1 * val1 + val2 * val2;
// float val1 =((float *)( mat1.data))[(i*mat1.step/8 +j)*2]; // float val1 =((float *)( mat1.data))[(i*mat1.step/8 +j)*2];
// //
@@ -1525,40 +1529,40 @@ INSTANTIATE_TEST_CASE_P(Arithm, Log, Combine(
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Add, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Add, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); Values(false)));
INSTANTIATE_TEST_CASE_P(Arithm, Mul, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Mul, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Div, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Div, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Absdiff, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Absdiff, Combine(
Values(CV_8UC1,CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, CartToPolar, Combine( INSTANTIATE_TEST_CASE_P(Arithm, CartToPolar, Combine(
Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, PolarToCart, Combine( INSTANTIATE_TEST_CASE_P(Arithm, PolarToCart, Combine(
Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Magnitude, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Magnitude, Combine(
Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Transpose, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Transpose, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32FC1), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32FC1),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Flip, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Flip, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, MinMax, Combine( INSTANTIATE_TEST_CASE_P(Arithm, MinMax, Combine(
@@ -1578,24 +1582,24 @@ INSTANTIATE_TEST_CASE_P(Arithm, CountNonZero, Combine(
Values(false))); Values(false)));
INSTANTIATE_TEST_CASE_P(Arithm, Phase, Combine(Values(CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); INSTANTIATE_TEST_CASE_P(Arithm, Phase, Combine(Values(CV_32FC1, CV_32FC3, CV_32FC4), Values(false)));
// Values(false) is the reserved parameter // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_and, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_and, Combine(
Values(CV_8UC1, CV_32SC1, CV_32SC4, CV_32FC1,CV_32FC3, CV_32FC4), Values(false))); Values(CV_8UC1, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4), Values(false)));
//Values(false) is the reserved parameter //Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_or, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_or, Combine(
Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); Values(CV_8UC1, CV_8UC3, CV_32SC1, CV_32FC1, CV_32FC3, CV_32FC4), Values(false)));
//Values(false) is the reserved parameter //Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_xor, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_xor, Combine(
Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); Values(CV_8UC1, CV_8UC3, CV_32SC1, CV_32FC1, CV_32FC3, CV_32FC4), Values(false)));
//Values(false) is the reserved parameter //Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_not, Combine( INSTANTIATE_TEST_CASE_P(Arithm, Bitwise_not, Combine(
Values(CV_8UC1, CV_32SC1, CV_32FC1, CV_32FC3,CV_32FC4), Values(false))); Values(CV_8UC1, CV_8UC3, CV_32SC1, CV_32FC1, CV_32FC3, CV_32FC4), Values(false)));
//Values(false) is the reserved parameter //Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Arithm, Compare, Combine(Values(CV_8UC1, CV_32SC1, CV_32FC1), Values(false))); INSTANTIATE_TEST_CASE_P(Arithm, Compare, Combine(Values(CV_8UC1, CV_32SC1, CV_32FC1), Values(false)));

View File

@@ -6,9 +6,9 @@ using namespace cv::ocl;
using namespace cvtest; using namespace cvtest;
using namespace testing; using namespace testing;
using namespace std; using namespace std;
#ifdef HAVE_OPENCL
template <typename T> template <typename T>
void blendLinearGold(const cv::Mat& img1, const cv::Mat& img2, const cv::Mat& weights1, const cv::Mat& weights2, cv::Mat& result_gold) void blendLinearGold(const cv::Mat &img1, const cv::Mat &img2, const cv::Mat &weights1, const cv::Mat &weights2, cv::Mat &result_gold)
{ {
result_gold.create(img1.size(), img1.type()); result_gold.create(img1.size(), img1.type());
@@ -16,11 +16,11 @@ void blendLinearGold(const cv::Mat& img1, const cv::Mat& img2, const cv::Mat& we
for (int y = 0; y < img1.rows; ++y) for (int y = 0; y < img1.rows; ++y)
{ {
const float* weights1_row = weights1.ptr<float>(y); const float *weights1_row = weights1.ptr<float>(y);
const float* weights2_row = weights2.ptr<float>(y); const float *weights2_row = weights2.ptr<float>(y);
const T* img1_row = img1.ptr<T>(y); const T *img1_row = img1.ptr<T>(y);
const T* img2_row = img2.ptr<T>(y); const T *img2_row = img2.ptr<T>(y);
T* result_gold_row = result_gold.ptr<T>(y); T *result_gold_row = result_gold.ptr<T>(y);
for (int x = 0; x < img1.cols * cn; ++x) for (int x = 0; x < img1.cols * cn; ++x)
{ {
@@ -79,5 +79,6 @@ TEST_P(Blend, Accuracy)
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Blend, Combine( INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Blend, Combine(
DIFFERENT_SIZES, DIFFERENT_SIZES,
testing::Values(MatType(CV_8UC1), MatType(CV_8UC3),MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC4)) testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC4))
)); ));
#endif

View File

@@ -40,17 +40,18 @@
//M*/ //M*/
#include "precomp.hpp" #include "precomp.hpp"
#ifdef HAVE_OPENCL
namespace { namespace
/////////////////////////////////////////////////////////////////////////////////////////////////
// BruteForceMatcher
CV_ENUM(DistType, cv::ocl::BruteForceMatcher_OCL_base::L1Dist, cv::ocl::BruteForceMatcher_OCL_base::L2Dist, cv::ocl::BruteForceMatcher_OCL_base::HammingDist)
IMPLEMENT_PARAM_CLASS(DescriptorSize, int)
PARAM_TEST_CASE(BruteForceMatcher/*, NormCode*/, DistType, DescriptorSize)
{ {
/////////////////////////////////////////////////////////////////////////////////////////////////
// BruteForceMatcher
CV_ENUM(DistType, cv::ocl::BruteForceMatcher_OCL_base::L1Dist, cv::ocl::BruteForceMatcher_OCL_base::L2Dist, cv::ocl::BruteForceMatcher_OCL_base::HammingDist)
IMPLEMENT_PARAM_CLASS(DescriptorSize, int)
PARAM_TEST_CASE(BruteForceMatcher/*, NormCode*/, DistType, DescriptorSize)
{
//std::vector<cv::ocl::Info> oclinfo; //std::vector<cv::ocl::Info> oclinfo;
cv::ocl::BruteForceMatcher_OCL_base::DistType distType; cv::ocl::BruteForceMatcher_OCL_base::DistType distType;
int normCode; int normCode;
@@ -73,7 +74,7 @@ PARAM_TEST_CASE(BruteForceMatcher/*, NormCode*/, DistType, DescriptorSize)
queryDescCount = 300; // must be even number because we split train data in some cases in two queryDescCount = 300; // must be even number because we split train data in some cases in two
countFactor = 4; // do not change it countFactor = 4; // do not change it
cv::RNG& rng = cvtest::TS::ptr()->get_rng(); cv::RNG &rng = cvtest::TS::ptr()->get_rng();
cv::Mat queryBuf, trainBuf; cv::Mat queryBuf, trainBuf;
@@ -107,10 +108,10 @@ PARAM_TEST_CASE(BruteForceMatcher/*, NormCode*/, DistType, DescriptorSize)
queryBuf.convertTo(query, CV_32F); queryBuf.convertTo(query, CV_32F);
trainBuf.convertTo(train, CV_32F); trainBuf.convertTo(train, CV_32F);
} }
}; };
TEST_P(BruteForceMatcher, Match_Single) TEST_P(BruteForceMatcher, Match_Single)
{ {
cv::ocl::BruteForceMatcher_OCL_base matcher(distType); cv::ocl::BruteForceMatcher_OCL_base matcher(distType);
std::vector<cv::DMatch> matches; std::vector<cv::DMatch> matches;
@@ -127,10 +128,10 @@ TEST_P(BruteForceMatcher, Match_Single)
} }
ASSERT_EQ(0, badCount); ASSERT_EQ(0, badCount);
} }
TEST_P(BruteForceMatcher, KnnMatch_2_Single) TEST_P(BruteForceMatcher, KnnMatch_2_Single)
{ {
const int knn = 2; const int knn = 2;
cv::ocl::BruteForceMatcher_OCL_base matcher(distType); cv::ocl::BruteForceMatcher_OCL_base matcher(distType);
@@ -159,13 +160,13 @@ TEST_P(BruteForceMatcher, KnnMatch_2_Single)
} }
ASSERT_EQ(0, badCount); ASSERT_EQ(0, badCount);
} }
TEST_P(BruteForceMatcher, RadiusMatch_Single) TEST_P(BruteForceMatcher, RadiusMatch_Single)
{ {
float radius; float radius;
if(distType == cv::ocl::BruteForceMatcher_OCL_base::L2Dist) if(distType == cv::ocl::BruteForceMatcher_OCL_base::L2Dist)
radius = 1.f / countFactor /countFactor; radius = 1.f / countFactor / countFactor;
else else
radius = 1.f / countFactor; radius = 1.f / countFactor;
@@ -201,19 +202,19 @@ TEST_P(BruteForceMatcher, RadiusMatch_Single)
else else
{ {
cv::DMatch match = matches[i][0]; cv::DMatch match = matches[i][0];
if ((match.queryIdx != (int)i) || (match.trainIdx != (int)i*countFactor) || (match.imgIdx != 0)) if ((match.queryIdx != (int)i) || (match.trainIdx != (int)i * countFactor) || (match.imgIdx != 0))
badCount++; badCount++;
} }
} }
ASSERT_EQ(0, badCount); ASSERT_EQ(0, badCount);
} }
} }
INSTANTIATE_TEST_CASE_P(GPU_Features2D, BruteForceMatcher, testing::Combine( INSTANTIATE_TEST_CASE_P(GPU_Features2D, BruteForceMatcher, testing::Combine(
//ALL_DEVICES, //ALL_DEVICES,
testing::Values(DistType(cv::ocl::BruteForceMatcher_OCL_base::L1Dist), DistType(cv::ocl::BruteForceMatcher_OCL_base::L2Dist)), testing::Values(DistType(cv::ocl::BruteForceMatcher_OCL_base::L1Dist), DistType(cv::ocl::BruteForceMatcher_OCL_base::L2Dist)),
testing::Values(DescriptorSize(57), DescriptorSize(64), DescriptorSize(83), DescriptorSize(128), DescriptorSize(179), DescriptorSize(256), DescriptorSize(304)))); testing::Values(DescriptorSize(57), DescriptorSize(64), DescriptorSize(83), DescriptorSize(128), DescriptorSize(179), DescriptorSize(256), DescriptorSize(304))));
} // namespace } // namespace
#endif

View File

@@ -44,8 +44,12 @@
//M*/ //M*/
#include "precomp.hpp" #include "precomp.hpp"
#ifdef HAVE_OPENCL
#define FILTER_IMAGE "../../../samples/gpu/road.png" #ifdef WIN32
#define FILTER_IMAGE "C:/Users/Public/Pictures/Sample Pictures/Penguins.jpg"
#else
#define FILTER_IMAGE "/Users/Test/Valve_original.PNG" // user need to specify a valid image path
#endif
#define SHOW_RESULT 0 #define SHOW_RESULT 0
//////////////////////////////////////////////////////// ////////////////////////////////////////////////////////
@@ -94,8 +98,8 @@ TEST_P(Canny, Accuracy)
cv::Mat edges_x2, ocl_edges(edges); cv::Mat edges_x2, ocl_edges(edges);
edges_x2.create(edges.rows, edges.cols * 2, edges.type()); edges_x2.create(edges.rows, edges.cols * 2, edges.type());
edges_x2.setTo(0); edges_x2.setTo(0);
cv::add(edges_gold,cv::Mat(edges_x2,cv::Rect(0,0,edges_gold.cols,edges_gold.rows)), cv::Mat(edges_x2,cv::Rect(0,0,edges_gold.cols,edges_gold.rows))); cv::add(edges_gold, cv::Mat(edges_x2, cv::Rect(0, 0, edges_gold.cols, edges_gold.rows)), cv::Mat(edges_x2, cv::Rect(0, 0, edges_gold.cols, edges_gold.rows)));
cv::add(ocl_edges,cv::Mat(edges_x2,cv::Rect(edges_gold.cols,0,edges_gold.cols,edges_gold.rows)), cv::Mat(edges_x2,cv::Rect(edges_gold.cols,0,edges_gold.cols,edges_gold.rows))); cv::add(ocl_edges, cv::Mat(edges_x2, cv::Rect(edges_gold.cols, 0, edges_gold.cols, edges_gold.rows)), cv::Mat(edges_x2, cv::Rect(edges_gold.cols, 0, edges_gold.cols, edges_gold.rows)));
cv::namedWindow("Canny result (left: cpu, right: ocl)"); cv::namedWindow("Canny result (left: cpu, right: ocl)");
cv::imshow("Canny result (left: cpu, right: ocl)", edges_x2); cv::imshow("Canny result (left: cpu, right: ocl)", edges_x2);
cv::waitKey(); cv::waitKey();
@@ -106,3 +110,4 @@ TEST_P(Canny, Accuracy)
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Canny, testing::Combine( INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Canny, testing::Combine(
testing::Values(AppertureSize(3), AppertureSize(5)), testing::Values(AppertureSize(3), AppertureSize(5)),
testing::Values(L2gradient(false), L2gradient(true)))); testing::Values(L2gradient(false), L2gradient(true))));
#endif

View File

@@ -77,7 +77,7 @@ TEST_P(ColumnSum, Accuracy)
cv::ocl::oclMat d_dst; cv::ocl::oclMat d_dst;
cv::ocl::oclMat d_src(src); cv::ocl::oclMat d_src(src);
cv::ocl::columnSum(d_src,d_dst); cv::ocl::columnSum(d_src, d_dst);
cv::Mat dst(d_dst); cv::Mat dst(d_dst);
@@ -100,7 +100,7 @@ TEST_P(ColumnSum, Accuracy)
} }
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ColumnSum, testing::Combine( INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ColumnSum, testing::Combine(
DIFFERENT_SIZES,testing::Values(Inverse(false),Inverse(true)))); DIFFERENT_SIZES, testing::Values(Inverse(false), Inverse(true))));
#endif #endif

View File

@@ -822,13 +822,13 @@ TEST_P(GaussianBlur, Mat)
INSTANTIATE_TEST_CASE_P(Filter, Blur, Combine(Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), INSTANTIATE_TEST_CASE_P(Filter, Blur, Combine(Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4),
Values(cv::Size(3, 3), cv::Size(5, 5), cv::Size(7, 7)), Values(cv::Size(3, 3), cv::Size(5, 5), cv::Size(7, 7)),
Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101))); Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE, (MatType)cv::BORDER_REFLECT, (MatType)cv::BORDER_REFLECT_101)));
INSTANTIATE_TEST_CASE_P(Filters, Laplacian, Combine( INSTANTIATE_TEST_CASE_P(Filters, Laplacian, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(1, 3))); Values(1, 3)));
//INSTANTIATE_TEST_CASE_P(Filter, ErodeDilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 2, 3))); //INSTANTIATE_TEST_CASE_P(Filter, ErodeDilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1, 2, 3)));
@@ -840,17 +840,17 @@ INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC1), Values(
INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC1), Values(false))); INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC1), Values(false)));
INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine(Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine(Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(1, 2), Values(0, 1), Values(3, 5), Values((MatType)cv::BORDER_CONSTANT, Values(1, 2), Values(0, 1), Values(3, 5), Values((MatType)cv::BORDER_CONSTANT,
(MatType)cv::BORDER_REPLICATE))); (MatType)cv::BORDER_REPLICATE)));
INSTANTIATE_TEST_CASE_P(Filter, Scharr, Combine( INSTANTIATE_TEST_CASE_P(Filter, Scharr, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(0, 1), Values(0, 1), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4), Values(0, 1), Values(0, 1),
Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE)));
INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine( INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4),
Values(cv::Size(3, 3), cv::Size(5, 5)), Values(cv::Size(3, 3), cv::Size(5, 5)),
Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE)));

View File

@@ -53,7 +53,13 @@ using namespace testing;
using namespace std; using namespace std;
using namespace cv; using namespace cv;
struct getRect { Rect operator ()(const CvAvgComp& e) const { return e.rect; } }; struct getRect
{
Rect operator ()(const CvAvgComp &e) const
{
return e.rect;
}
};
PARAM_TEST_CASE(HaarTestBase, int, int) PARAM_TEST_CASE(HaarTestBase, int, int)
{ {
@@ -68,8 +74,8 @@ PARAM_TEST_CASE(HaarTestBase, int, int)
virtual void SetUp() virtual void SetUp()
{ {
scale = 1.0; scale = 1.0;
index=0; index = 0;
string cascadeName="../../../data/haarcascades/haarcascade_frontalface_alt.xml"; string cascadeName = "../../../data/haarcascades/haarcascade_frontalface_alt.xml";
if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName))) if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName)))
{ {
@@ -98,7 +104,7 @@ TEST_F(Haar, FaceDetect)
if(img.empty()) if(img.empty())
{ {
std::cout << "Couldn't read test" << index <<".jpg" << std::endl; std::cout << "Couldn't read test" << index << ".jpg" << std::endl;
return ; return ;
} }
@@ -106,16 +112,17 @@ TEST_F(Haar, FaceDetect)
double t = 0; double t = 0;
vector<Rect> faces, oclfaces; vector<Rect> faces, oclfaces;
const static Scalar colors[] = { CV_RGB(0,0,255), const static Scalar colors[] = { CV_RGB(0, 0, 255),
CV_RGB(0,128,255), CV_RGB(0, 128, 255),
CV_RGB(0,255,255), CV_RGB(0, 255, 255),
CV_RGB(0,255,0), CV_RGB(0, 255, 0),
CV_RGB(255,128,0), CV_RGB(255, 128, 0),
CV_RGB(255,255,0), CV_RGB(255, 255, 0),
CV_RGB(255,0,0), CV_RGB(255, 0, 0),
CV_RGB(255,0,255)} ; CV_RGB(255, 0, 255)
} ;
Mat gray, smallImg(cvRound (img.rows/scale), cvRound(img.cols/scale), CV_8UC1 ); Mat gray, smallImg(cvRound (img.rows / scale), cvRound(img.cols / scale), CV_8UC1 );
MemStorage storage(cvCreateMemStorage(0)); MemStorage storage(cvCreateMemStorage(0));
cvtColor( img, gray, CV_BGR2GRAY ); cvtColor( img, gray, CV_BGR2GRAY );
resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR );
@@ -123,12 +130,12 @@ TEST_F(Haar, FaceDetect)
cv::ocl::oclMat image; cv::ocl::oclMat image;
CvSeq* _objects; CvSeq *_objects;
image.upload(smallImg); image.upload(smallImg);
_objects = cascade.oclHaarDetectObjects( image, storage, 1.1, _objects = cascade.oclHaarDetectObjects( image, storage, 1.1,
3, 0 3, 0
|CV_HAAR_SCALE_IMAGE | CV_HAAR_SCALE_IMAGE
, Size(30,30), Size(0, 0) ); , Size(30, 30), Size(0, 0) );
vector<CvAvgComp> vecAvgComp; vector<CvAvgComp> vecAvgComp;
Seq<CvAvgComp>(_objects).copyTo(vecAvgComp); Seq<CvAvgComp>(_objects).copyTo(vecAvgComp);
oclfaces.resize(vecAvgComp.size()); oclfaces.resize(vecAvgComp.size());
@@ -136,9 +143,9 @@ TEST_F(Haar, FaceDetect)
cpucascade.detectMultiScale( smallImg, faces, 1.1, cpucascade.detectMultiScale( smallImg, faces, 1.1,
3, 0 3, 0
|CV_HAAR_SCALE_IMAGE | CV_HAAR_SCALE_IMAGE
, Size(30,30), Size(0, 0) ); , Size(30, 30), Size(0, 0) );
EXPECT_EQ(faces.size(),oclfaces.size()); EXPECT_EQ(faces.size(), oclfaces.size());
/* for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) /* for( vector<Rect>::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
{ {
Mat smallImgROI; Mat smallImgROI;

View File

@@ -49,7 +49,7 @@ using namespace std;
#ifdef HAVE_OPENCL #ifdef HAVE_OPENCL
PARAM_TEST_CASE(HOG,cv::Size,int) PARAM_TEST_CASE(HOG, cv::Size, int)
{ {
cv::Size winSize; cv::Size winSize;
int type; int type;
@@ -166,18 +166,18 @@ TEST_P(HOG, Detect)
// OpenCL detection // OpenCL detection
std::vector<cv::Rect> d_found; std::vector<cv::Rect> d_found;
ocl_hog.detectMultiScale(d_img, d_found, 0, cv::Size(8,8), cv::Size(0,0), 1.05, 2); ocl_hog.detectMultiScale(d_img, d_found, 0, cv::Size(8, 8), cv::Size(0, 0), 1.05, 2);
// CPU detection // CPU detection
std::vector<cv::Rect> found; std::vector<cv::Rect> found;
switch (type) switch (type)
{ {
case CV_8UC1: case CV_8UC1:
hog.detectMultiScale(img, found, 0, cv::Size(8,8), cv::Size(0,0), 1.05, 2); hog.detectMultiScale(img, found, 0, cv::Size(8, 8), cv::Size(0, 0), 1.05, 2);
break; break;
case CV_8UC4: case CV_8UC4:
default: default:
hog.detectMultiScale(img_rgb, found, 0, cv::Size(8,8), cv::Size(0,0), 1.05, 2); hog.detectMultiScale(img_rgb, found, 0, cv::Size(8, 8), cv::Size(0, 0), 1.05, 2);
break; break;
} }
@@ -240,7 +240,7 @@ TEST_P(HOG, Detect)
} }
} }
char s[100]={0}; char s[100] = {0};
EXPECT_MAT_NEAR(cv::Mat(d_comp), cv::Mat(comp), 3, s); EXPECT_MAT_NEAR(cv::Mat(d_comp), cv::Mat(comp), 3, s);
} }

View File

@@ -125,7 +125,7 @@ COOR do_meanShift(int x0, int y0, uchar *sptr, uchar *dptr, int sstep, cv::Size
{ {
int t0, t1, t2; int t0, t1, t2;
t0 = ptr[0], t1 = ptr[1], t2 = ptr[2]; t0 = ptr[0], t1 = ptr[1], t2 = ptr[2];
if(tab[t0-c0+255] + tab[t1-c1+255] + tab[t2-c2+255] <= isr2) if(tab[t0 - c0 + 255] + tab[t1 - c1 + 255] + tab[t2 - c2 + 255] <= isr2)
{ {
s0 += t0; s0 += t0;
s1 += t1; s1 += t1;
@@ -134,7 +134,7 @@ COOR do_meanShift(int x0, int y0, uchar *sptr, uchar *dptr, int sstep, cv::Size
rowCount++; rowCount++;
} }
t0 = ptr[4], t1 = ptr[5], t2 = ptr[6]; t0 = ptr[4], t1 = ptr[5], t2 = ptr[6];
if(tab[t0-c0+255] + tab[t1-c1+255] + tab[t2-c2+255] <= isr2) if(tab[t0 - c0 + 255] + tab[t1 - c1 + 255] + tab[t2 - c2 + 255] <= isr2)
{ {
s0 += t0; s0 += t0;
s1 += t1; s1 += t1;
@@ -143,7 +143,7 @@ COOR do_meanShift(int x0, int y0, uchar *sptr, uchar *dptr, int sstep, cv::Size
rowCount++; rowCount++;
} }
t0 = ptr[8], t1 = ptr[9], t2 = ptr[10]; t0 = ptr[8], t1 = ptr[9], t2 = ptr[10];
if(tab[t0-c0+255] + tab[t1-c1+255] + tab[t2-c2+255] <= isr2) if(tab[t0 - c0 + 255] + tab[t1 - c1 + 255] + tab[t2 - c2 + 255] <= isr2)
{ {
s0 += t0; s0 += t0;
s1 += t1; s1 += t1;
@@ -152,7 +152,7 @@ COOR do_meanShift(int x0, int y0, uchar *sptr, uchar *dptr, int sstep, cv::Size
rowCount++; rowCount++;
} }
t0 = ptr[12], t1 = ptr[13], t2 = ptr[14]; t0 = ptr[12], t1 = ptr[13], t2 = ptr[14];
if(tab[t0-c0+255] + tab[t1-c1+255] + tab[t2-c2+255] <= isr2) if(tab[t0 - c0 + 255] + tab[t1 - c1 + 255] + tab[t2 - c2 + 255] <= isr2)
{ {
s0 += t0; s0 += t0;
s1 += t1; s1 += t1;
@@ -165,7 +165,7 @@ COOR do_meanShift(int x0, int y0, uchar *sptr, uchar *dptr, int sstep, cv::Size
for(; x <= maxx; x++, ptr += 4) for(; x <= maxx; x++, ptr += 4)
{ {
int t0 = ptr[0], t1 = ptr[1], t2 = ptr[2]; int t0 = ptr[0], t1 = ptr[1], t2 = ptr[2];
if(tab[t0-c0+255] + tab[t1-c1+255] + tab[t2-c2+255] <= isr2) if(tab[t0 - c0 + 255] + tab[t1 - c1 + 255] + tab[t2 - c2 + 255] <= isr2)
{ {
s0 += t0; s0 += t0;
s1 += t1; s1 += t1;
@@ -191,7 +191,7 @@ COOR do_meanShift(int x0, int y0, uchar *sptr, uchar *dptr, int sstep, cv::Size
s2 = cvFloor(s2 * icount); s2 = cvFloor(s2 * icount);
bool stopFlag = (x0 == x1 && y0 == y1) || (abs(x1 - x0) + abs(y1 - y0) + bool stopFlag = (x0 == x1 && y0 == y1) || (abs(x1 - x0) + abs(y1 - y0) +
tab[s0-c0+255] + tab[s1-c1+255] + tab[s2-c2+255] <= eps); tab[s0 - c0 + 255] + tab[s1 - c1 + 255] + tab[s2 - c2 + 255] <= eps);
//revise the pointer corresponding to the new (y0,x0) //revise the pointer corresponding to the new (y0,x0)
revx = x1 - x0; revx = x1 - x0;
@@ -488,10 +488,10 @@ TEST_P(bilateralFilter, Mat)
int radius = 9; int radius = 9;
int d = 2 * radius + 1; int d = 2 * radius + 1;
double sigmaspace = 20.0; double sigmaspace = 20.0;
int bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE,cv::BORDER_REFLECT,cv::BORDER_WRAP,cv::BORDER_REFLECT_101}; int bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, cv::BORDER_REFLECT, cv::BORDER_WRAP, cv::BORDER_REFLECT_101};
const char* borderstr[]={"BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT","BORDER_WRAP","BORDER_REFLECT_101"}; const char *borderstr[] = {"BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP", "BORDER_REFLECT_101"};
if (mat1.type() != CV_8UC1 || mat1.type() != dst.type()) if (mat1.depth() != CV_8U || mat1.type() != dst.type())
{ {
cout << "Unsupported type" << endl; cout << "Unsupported type" << endl;
EXPECT_DOUBLE_EQ(0.0, 0.0); EXPECT_DOUBLE_EQ(0.0, 0.0);
@@ -502,47 +502,41 @@ TEST_P(bilateralFilter, Mat)
for(int j = 0; j < LOOP_TIMES; j++) for(int j = 0; j < LOOP_TIMES; j++)
{ {
random_roi(); random_roi();
#ifdef RANDOMROI if(((bordertype[i] != cv::BORDER_CONSTANT) && (bordertype[i] != cv::BORDER_REPLICATE)) && (mat1_roi.cols <= radius) || (mat1_roi.cols <= radius) || (mat1_roi.rows <= radius) || (mat1_roi.rows <= radius))
if(((bordertype[i]!=cv::BORDER_CONSTANT) && (bordertype[i]!=cv::BORDER_REPLICATE))&&(mat1_roi.cols<=radius) || (mat1_roi.cols<=radius) || (mat1_roi.rows <= radius) || (mat1_roi.rows <= radius))
{ {
continue; continue;
} }
if((dstx>=radius) && (dsty >= radius) && (dstx+cldst_roi.cols+radius <=cldst_roi.wholecols) && (dsty+cldst_roi.rows+radius <= cldst_roi.wholerows)) //if((dstx>=radius) && (dsty >= radius) && (dstx+cldst_roi.cols+radius <=cldst_roi.wholecols) && (dsty+cldst_roi.rows+radius <= cldst_roi.wholerows))
{ //{
dst_roi.adjustROI(radius, radius, radius, radius); // dst_roi.adjustROI(radius, radius, radius, radius);
cldst_roi.adjustROI(radius, radius, radius, radius); // cldst_roi.adjustROI(radius, radius, radius, radius);
} //}
else //else
{ //{
continue; // continue;
} //}
#endif
cv::bilateralFilter(mat1_roi, dst_roi, d, sigmacolor, sigmaspace, bordertype[i]|cv::BORDER_ISOLATED); cv::bilateralFilter(mat1_roi, dst_roi, d, sigmacolor, sigmaspace, bordertype[i] | cv::BORDER_ISOLATED);
cv::ocl::bilateralFilter(clmat1_roi, cldst_roi, d, sigmacolor, sigmaspace, bordertype[i]|cv::BORDER_ISOLATED); cv::ocl::bilateralFilter(clmat1_roi, cldst_roi, d, sigmacolor, sigmaspace, bordertype[i] | cv::BORDER_ISOLATED);
cv::Mat cpu_cldst; cv::Mat cpu_cldst;
#ifndef RANDOMROI
cldst_roi.download(cpu_cldst);
#else
cldst.download(cpu_cldst); cldst.download(cpu_cldst);
#endif
char sss[1024]; char sss[1024];
sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,radius=%d,boredertype=%s", roicols, roirows, src1x, src1y, dstx, dsty, radius, borderstr[i]); sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,radius=%d,boredertype=%s", roicols, roirows, src1x, src1y, dstx, dsty, radius, borderstr[i]);
//for(int i=0;i<dst.rows;i++)
#ifndef RANDOMROI
EXPECT_MAT_NEAR(dst_roi, cpu_cldst, 0.0, sss);
#else
//for(int i=0;i<dst_roi.rows;i++)
//{ //{
// for(int j=0;j<dst_roi.cols;j++) // for(int j=0;j<dst.cols*dst.channels();j++)
// { // {
// cout<< (int)dst_roi.at<uchar>(i,j)<<" "<< (int)cpu_cldst.at<uchar>(i,j)<<" "; // if(dst.at<uchar>(i,j)!=cpu_cldst.at<uchar>(i,j))
// cout<< i <<" "<< j <<" "<< (int)dst.at<uchar>(i,j)<<" "<< (int)cpu_cldst.at<uchar>(i,j)<<" ";
// } // }
// cout<<endl; // cout<<endl;
//} //}
EXPECT_MAT_NEAR(dst, cpu_cldst, 0.0, sss);
#endif EXPECT_MAT_NEAR(dst, cpu_cldst, 1.0, sss);
} }
} }
} }
@@ -555,8 +549,8 @@ struct CopyMakeBorder : ImgprocTestBase {};
TEST_P(CopyMakeBorder, Mat) TEST_P(CopyMakeBorder, Mat)
{ {
int bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE,cv::BORDER_REFLECT,cv::BORDER_WRAP,cv::BORDER_REFLECT_101}; int bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE, cv::BORDER_REFLECT, cv::BORDER_WRAP, cv::BORDER_REFLECT_101};
const char* borderstr[]={"BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT","BORDER_WRAP","BORDER_REFLECT_101"}; const char *borderstr[] = {"BORDER_CONSTANT", "BORDER_REPLICATE", "BORDER_REFLECT", "BORDER_WRAP", "BORDER_REFLECT_101"};
cv::RNG &rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
int top = rng.uniform(0, 10); int top = rng.uniform(0, 10);
int bottom = rng.uniform(0, 10); int bottom = rng.uniform(0, 10);
@@ -573,12 +567,12 @@ TEST_P(CopyMakeBorder, Mat)
for(int j = 0; j < LOOP_TIMES; j++) for(int j = 0; j < LOOP_TIMES; j++)
{ {
random_roi(); random_roi();
#ifdef RANDOMROI #ifdef RANDOMROI
if(((bordertype[i]!=cv::BORDER_CONSTANT) && (bordertype[i]!=cv::BORDER_REPLICATE))&&(mat1_roi.cols<=left) || (mat1_roi.cols<=right) || (mat1_roi.rows <= top) || (mat1_roi.rows <= bottom)) if(((bordertype[i] != cv::BORDER_CONSTANT) && (bordertype[i] != cv::BORDER_REPLICATE)) && (mat1_roi.cols <= left) || (mat1_roi.cols <= right) || (mat1_roi.rows <= top) || (mat1_roi.rows <= bottom))
{ {
continue; continue;
} }
if((dstx>=left) && (dsty >= top) && (dstx+cldst_roi.cols+right <=cldst_roi.wholecols) && (dsty+cldst_roi.rows+bottom <= cldst_roi.wholerows)) if((dstx >= left) && (dsty >= top) && (dstx + cldst_roi.cols + right <= cldst_roi.wholecols) && (dsty + cldst_roi.rows + bottom <= cldst_roi.wholerows))
{ {
dst_roi.adjustROI(top, bottom, left, right); dst_roi.adjustROI(top, bottom, left, right);
cldst_roi.adjustROI(top, bottom, left, right); cldst_roi.adjustROI(top, bottom, left, right);
@@ -587,21 +581,21 @@ TEST_P(CopyMakeBorder, Mat)
{ {
continue; continue;
} }
#endif #endif
cv::copyMakeBorder(mat1_roi, dst_roi, top, bottom, left, right, bordertype[i]| cv::BORDER_ISOLATED, cv::Scalar(1.0)); cv::copyMakeBorder(mat1_roi, dst_roi, top, bottom, left, right, bordertype[i] | cv::BORDER_ISOLATED, cv::Scalar(1.0));
cv::ocl::copyMakeBorder(clmat1_roi, cldst_roi, top, bottom, left, right, bordertype[i]| cv::BORDER_ISOLATED, cv::Scalar(1.0)); cv::ocl::copyMakeBorder(clmat1_roi, cldst_roi, top, bottom, left, right, bordertype[i] | cv::BORDER_ISOLATED, cv::Scalar(1.0));
cv::Mat cpu_cldst; cv::Mat cpu_cldst;
#ifndef RANDOMROI #ifndef RANDOMROI
cldst_roi.download(cpu_cldst); cldst_roi.download(cpu_cldst);
#else #else
cldst.download(cpu_cldst); cldst.download(cpu_cldst);
#endif #endif
char sss[1024]; char sss[1024];
sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,dst1x=%d,dst1y=%d,top=%d,bottom=%d,left=%d,right=%d, bordertype=%s", roicols, roirows, src1x, src1y, dstx, dsty, dst1x, dst1y, top, bottom, left, right,borderstr[i]); sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,dst1x=%d,dst1y=%d,top=%d,bottom=%d,left=%d,right=%d, bordertype=%s", roicols, roirows, src1x, src1y, dstx, dsty, dst1x, dst1y, top, bottom, left, right, borderstr[i]);
#ifndef RANDOMROI #ifndef RANDOMROI
EXPECT_MAT_NEAR(dst_roi, cpu_cldst, 0.0, sss); EXPECT_MAT_NEAR(dst_roi, cpu_cldst, 0.0, sss);
#else #else
//for(int i=0;i<dst.rows;i++) //for(int i=0;i<dst.rows;i++)
//{ //{
//for(int j=0;j<dst.cols;j++) //for(int j=0;j<dst.cols;j++)
@@ -611,7 +605,7 @@ TEST_P(CopyMakeBorder, Mat)
//cout<<endl; //cout<<endl;
//} //}
EXPECT_MAT_NEAR(dst, cpu_cldst, 0.0, sss); EXPECT_MAT_NEAR(dst, cpu_cldst, 0.0, sss);
#endif #endif
} }
} }
} }
@@ -915,7 +909,7 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int)
//int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE);
//CV_Assert(devnums > 0); //CV_Assert(devnums > 0);
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Size srcSize = cv::Size(MWIDTH, MHEIGHT); cv::Size srcSize = cv::Size(MWIDTH, MHEIGHT);
cv::Size dstSize = cv::Size(MWIDTH, MHEIGHT); cv::Size dstSize = cv::Size(MWIDTH, MHEIGHT);
cv::Size map1Size = cv::Size(MWIDTH, MHEIGHT); cv::Size map1Size = cv::Size(MWIDTH, MHEIGHT);
@@ -937,7 +931,7 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int)
else else
{ {
cout<<"The wrong input type"<<endl; cout << "The wrong input type" << endl;
return; return;
} }
@@ -961,7 +955,7 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int)
} }
void random_roi() void random_roi()
{ {
cv::RNG& rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
dst_roicols = rng.uniform(1, dst.cols); dst_roicols = rng.uniform(1, dst.cols);
dst_roirows = rng.uniform(1, dst.rows); dst_roirows = rng.uniform(1, dst.rows);
@@ -985,18 +979,18 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int)
if((map1Type == CV_16SC2 && map2Type == nulltype) || (map1Type == CV_32FC2 && map2Type == nulltype)) if((map1Type == CV_16SC2 && map2Type == nulltype) || (map1Type == CV_32FC2 && map2Type == nulltype))
{ {
map1_roi = map1(Rect(map1x,map1y,map1_roicols,map1_roirows)); map1_roi = map1(Rect(map1x, map1y, map1_roicols, map1_roirows));
gmap1_roi = map1_roi; gmap1_roi = map1_roi;
} }
else if (map1Type == CV_32FC1 && map2Type == CV_32FC1) else if (map1Type == CV_32FC1 && map2Type == CV_32FC1)
{ {
map1_roi = map1(Rect(map1x,map1y,map1_roicols,map1_roirows)); map1_roi = map1(Rect(map1x, map1y, map1_roicols, map1_roirows));
gmap1_roi = map1_roi; gmap1_roi = map1_roi;
map2_roi = map2(Rect(map2x,map2y,map2_roicols,map2_roirows)); map2_roi = map2(Rect(map2x, map2y, map2_roicols, map2_roirows));
gmap2_roi = map2_roi; gmap2_roi = map2_roi;
} }
src_roi = src(Rect(srcx,srcy,src_roicols,src_roirows)); src_roi = src(Rect(srcx, srcy, src_roicols, src_roirows));
dst_roi = dst(Rect(dstx, dsty, dst_roicols, dst_roirows)); dst_roi = dst(Rect(dstx, dsty, dst_roicols, dst_roirows));
gsrc_roi = src_roi; gsrc_roi = src_roi;
gdst = dst; gdst = dst;
@@ -1006,15 +1000,15 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int)
TEST_P(Remap, Mat) TEST_P(Remap, Mat)
{ {
if((interpolation == 1 && map1Type == CV_16SC2) ||(map1Type == CV_32FC1 && map2Type == nulltype) || (map1Type == CV_16SC2 && map2Type == CV_32FC1) || (map1Type == CV_32FC2 && map2Type == CV_32FC1)) if((interpolation == 1 && map1Type == CV_16SC2) || (map1Type == CV_32FC1 && map2Type == nulltype) || (map1Type == CV_16SC2 && map2Type == CV_32FC1) || (map1Type == CV_32FC2 && map2Type == CV_32FC1))
{ {
cout << "Don't support the dataType" << endl; cout << "Don't support the dataType" << endl;
return; return;
} }
int bordertype[] = {cv::BORDER_CONSTANT,cv::BORDER_REPLICATE/*,BORDER_REFLECT,BORDER_WRAP,BORDER_REFLECT_101*/}; int bordertype[] = {cv::BORDER_CONSTANT, cv::BORDER_REPLICATE/*,BORDER_REFLECT,BORDER_WRAP,BORDER_REFLECT_101*/};
const char* borderstr[]={"BORDER_CONSTANT", "BORDER_REPLICATE"/*, "BORDER_REFLECT","BORDER_WRAP","BORDER_REFLECT_101"*/}; const char *borderstr[] = {"BORDER_CONSTANT", "BORDER_REPLICATE"/*, "BORDER_REFLECT","BORDER_WRAP","BORDER_REFLECT_101"*/};
// for(int i = 0; i < sizeof(bordertype)/sizeof(int); i++) // for(int i = 0; i < sizeof(bordertype)/sizeof(int); i++)
for(int j=0; j<100; j++) for(int j = 0; j < 100; j++)
{ {
random_roi(); random_roi();
cv::remap(src_roi, dst_roi, map1_roi, map2_roi, interpolation, bordertype[0], val); cv::remap(src_roi, dst_roi, map1_roi, map2_roi, interpolation, bordertype[0], val);
@@ -1111,8 +1105,8 @@ PARAM_TEST_CASE(Resize, MatType, cv::Size, double, double, int)
cv::RNG &rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
src_roicols = rng.uniform(1, mat1.cols); src_roicols = rng.uniform(1, mat1.cols);
src_roirows = rng.uniform(1, mat1.rows); src_roirows = rng.uniform(1, mat1.rows);
dst_roicols = (int)(src_roicols*fx); dst_roicols = (int)(src_roicols * fx);
dst_roirows = (int)(src_roirows*fy); dst_roirows = (int)(src_roirows * fy);
src1x = rng.uniform(0, mat1.cols - src_roicols); src1x = rng.uniform(0, mat1.cols - src_roicols);
src1y = rng.uniform(0, mat1.rows - src_roirows); src1y = rng.uniform(0, mat1.rows - src_roirows);
dstx = rng.uniform(0, dst.cols - dst_roicols); dstx = rng.uniform(0, dst.cols - dst_roicols);
@@ -1151,7 +1145,7 @@ TEST_P(Resize, Mat)
// cv::resize(mat1_roi, dst_roi, dsize, fx, fy, interpolation); // cv::resize(mat1_roi, dst_roi, dsize, fx, fy, interpolation);
// cv::ocl::resize(gmat1, gdst, dsize, fx, fy, interpolation); // cv::ocl::resize(gmat1, gdst, dsize, fx, fy, interpolation);
if(dst_roicols<1||dst_roirows<1) continue; if(dst_roicols < 1 || dst_roirows < 1) continue;
cv::resize(mat1_roi, dst_roi, dsize, fx, fy, interpolation); cv::resize(mat1_roi, dst_roi, dsize, fx, fy, interpolation);
cv::ocl::resize(gmat1, gdst, dsize, fx, fy, interpolation); cv::ocl::resize(gmat1, gdst, dsize, fx, fy, interpolation);
@@ -1411,15 +1405,15 @@ TEST_P(meanShiftProc, Mat)
/////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////
//hist //hist
void calcHistGold(const cv::Mat& src, cv::Mat& hist) void calcHistGold(const cv::Mat &src, cv::Mat &hist)
{ {
hist.create(1, 256, CV_32SC1); hist.create(1, 256, CV_32SC1);
hist.setTo(cv::Scalar::all(0)); hist.setTo(cv::Scalar::all(0));
int* hist_row = hist.ptr<int>(); int *hist_row = hist.ptr<int>();
for (int y = 0; y < src.rows; ++y) for (int y = 0; y < src.rows; ++y)
{ {
const uchar* src_row = src.ptr(y); const uchar *src_row = src.ptr(y);
for (int x = 0; x < src.cols; ++x) for (int x = 0; x < src.cols; ++x)
++hist_row[src_row[x]]; ++hist_row[src_row[x]];
@@ -1444,7 +1438,7 @@ PARAM_TEST_CASE(histTestBase, MatType, MatType)
cv::ocl::oclMat gdst_hist; cv::ocl::oclMat gdst_hist;
//ocl mat with roi //ocl mat with roi
cv::ocl::oclMat gsrc_roi; cv::ocl::oclMat gsrc_roi;
// std::vector<cv::ocl::Info> oclinfo; // std::vector<cv::ocl::Info> oclinfo;
virtual void SetUp() virtual void SetUp()
{ {
@@ -1455,8 +1449,8 @@ PARAM_TEST_CASE(histTestBase, MatType, MatType)
src = randomMat(rng, size, type_src, 0, 256, false); src = randomMat(rng, size, type_src, 0, 256, false);
// int devnums = getDevice(oclinfo); // int devnums = getDevice(oclinfo);
// CV_Assert(devnums > 0); // CV_Assert(devnums > 0);
//if you want to use undefault device, set it here //if you want to use undefault device, set it here
//setDevice(oclinfo[0]); //setDevice(oclinfo[0]);
} }
@@ -1596,44 +1590,44 @@ void conv2( cv::Mat x, cv::Mat y, cv::Mat z)
int N2 = y.rows; int N2 = y.rows;
int M2 = y.cols; int M2 = y.cols;
int i,j; int i, j;
int m,n; int m, n;
float *kerneldata = (float *)(x.data); float *kerneldata = (float *)(x.data);
float *srcdata = (float *)(y.data); float *srcdata = (float *)(y.data);
float *dstdata = (float *)(z.data); float *dstdata = (float *)(z.data);
for(i=0;i<N2;i++) for(i = 0; i < N2; i++)
for(j=0;j<M2;j++) for(j = 0; j < M2; j++)
{ {
float temp =0; float temp = 0;
for(m=0;m<N1;m++) for(m = 0; m < N1; m++)
for(n=0;n<M1;n++) for(n = 0; n < M1; n++)
{ {
int r, c; int r, c;
r = min(max((i-N1/2+m), 0), N2-1); r = min(max((i - N1 / 2 + m), 0), N2 - 1);
c = min(max((j-M1/2+n), 0), M2-1); c = min(max((j - M1 / 2 + n), 0), M2 - 1);
temp += kerneldata[m*(x.step>>2)+n]*srcdata[r*(y.step>>2)+c]; temp += kerneldata[m * (x.step >> 2) + n] * srcdata[r * (y.step >> 2) + c];
} }
dstdata[i*(z.step >> 2)+j]=temp; dstdata[i * (z.step >> 2) + j] = temp;
} }
} }
TEST_P(Convolve, Mat) TEST_P(Convolve, Mat)
{ {
if(mat1.type()!=CV_32FC1) if(mat1.type() != CV_32FC1)
{ {
cout<<"\tUnsupported type\t\n"; cout << "\tUnsupported type\t\n";
} }
for(int j=0;j<LOOP_TIMES;j++) for(int j = 0; j < LOOP_TIMES; j++)
{ {
random_roi(); random_roi();
cv::ocl::oclMat temp1; cv::ocl::oclMat temp1;
cv::Mat kernel_cpu= mat2(Rect(0,0,7,7)); cv::Mat kernel_cpu = mat2(Rect(0, 0, 7, 7));
temp1 = kernel_cpu; temp1 = kernel_cpu;
conv2(kernel_cpu,mat1_roi,dst_roi); conv2(kernel_cpu, mat1_roi, dst_roi);
cv::ocl::convolve(gmat1,temp1,gdst); cv::ocl::convolve(gmat1, temp1, gdst);
cv::Mat cpu_dst; cv::Mat cpu_dst;
gdst_whole.download(cpu_dst); gdst_whole.download(cpu_dst);
@@ -1661,18 +1655,25 @@ INSTANTIATE_TEST_CASE_P(ImgprocTestBase, equalizeHist, Combine(
// NULL_TYPE, // NULL_TYPE,
// NULL_TYPE, // NULL_TYPE,
// Values(false))); // Values(false) is the reserved parameter // Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(ImgprocTestBase, bilateralFilter, Combine(
Values(CV_8UC1, CV_8UC3),
NULL_TYPE,
Values(CV_8UC1, CV_8UC3),
NULL_TYPE,
NULL_TYPE,
Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(ImgprocTestBase, CopyMakeBorder, Combine( INSTANTIATE_TEST_CASE_P(ImgprocTestBase, CopyMakeBorder, Combine(
Values(CV_8UC1, CV_8UC4,CV_32SC1, CV_32SC4,CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
NULL_TYPE, NULL_TYPE,
Values(CV_8UC1,CV_8UC4,CV_32SC1, CV_32SC4,CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
NULL_TYPE, NULL_TYPE,
NULL_TYPE, NULL_TYPE,
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine( INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine(
Values(CV_8UC1,CV_32FC1), Values(CV_8UC1, CV_32FC1),
NULL_TYPE, NULL_TYPE,
ONE_TYPE(CV_32FC1), ONE_TYPE(CV_32FC1),
NULL_TYPE, NULL_TYPE,
@@ -1680,7 +1681,7 @@ INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerMinEigenVal, Combine(
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerHarris, Combine( INSTANTIATE_TEST_CASE_P(ImgprocTestBase, cornerHarris, Combine(
Values(CV_8UC1,CV_32FC1), Values(CV_8UC1, CV_32FC1),
NULL_TYPE, NULL_TYPE,
ONE_TYPE(CV_32FC1), ONE_TYPE(CV_32FC1),
NULL_TYPE, NULL_TYPE,
@@ -1697,21 +1698,21 @@ INSTANTIATE_TEST_CASE_P(ImgprocTestBase, integral, Combine(
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(Imgproc, WarpAffine, Combine( INSTANTIATE_TEST_CASE_P(Imgproc, WarpAffine, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR, Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR,
(MatType)cv::INTER_CUBIC, (MatType)(cv::INTER_NEAREST | cv::WARP_INVERSE_MAP), (MatType)cv::INTER_CUBIC, (MatType)(cv::INTER_NEAREST | cv::WARP_INVERSE_MAP),
(MatType)(cv::INTER_LINEAR | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_CUBIC | cv::WARP_INVERSE_MAP)))); (MatType)(cv::INTER_LINEAR | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_CUBIC | cv::WARP_INVERSE_MAP))));
INSTANTIATE_TEST_CASE_P(Imgproc, WarpPerspective, Combine INSTANTIATE_TEST_CASE_P(Imgproc, WarpPerspective, Combine
(Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), (Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR, Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR,
(MatType)cv::INTER_CUBIC, (MatType)(cv::INTER_NEAREST | cv::WARP_INVERSE_MAP), (MatType)cv::INTER_CUBIC, (MatType)(cv::INTER_NEAREST | cv::WARP_INVERSE_MAP),
(MatType)(cv::INTER_LINEAR | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_CUBIC | cv::WARP_INVERSE_MAP)))); (MatType)(cv::INTER_LINEAR | cv::WARP_INVERSE_MAP), (MatType)(cv::INTER_CUBIC | cv::WARP_INVERSE_MAP))));
INSTANTIATE_TEST_CASE_P(Imgproc, Resize, Combine( INSTANTIATE_TEST_CASE_P(Imgproc, Resize, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(cv::Size()), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4), Values(cv::Size()),
Values(0.5, 1.5, 2), Values(0.5, 1.5, 2), Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR))); Values(0.5, 1.5, 2), Values(0.5, 1.5, 2), Values((MatType)cv::INTER_NEAREST, (MatType)cv::INTER_LINEAR)));
@@ -1735,12 +1736,12 @@ INSTANTIATE_TEST_CASE_P(Imgproc, meanShiftProc, Combine(
ONE_TYPE(CV_16SC2), ONE_TYPE(CV_16SC2),
Values(5), Values(5),
Values(6), Values(6),
Values(cv::TermCriteria(cv::TermCriteria::COUNT+cv::TermCriteria::EPS, 5, 1)) Values(cv::TermCriteria(cv::TermCriteria::COUNT + cv::TermCriteria::EPS, 5, 1))
)); ));
INSTANTIATE_TEST_CASE_P(Imgproc, Remap, Combine( INSTANTIATE_TEST_CASE_P(Imgproc, Remap, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4),
Values(CV_32FC1, CV_16SC2, CV_32FC2),Values(-1,CV_32FC1), Values(CV_32FC1, CV_16SC2, CV_32FC2), Values(-1, CV_32FC1),
Values((int)cv::INTER_NEAREST, (int)cv::INTER_LINEAR), Values((int)cv::INTER_NEAREST, (int)cv::INTER_LINEAR),
Values((int)cv::BORDER_CONSTANT))); Values((int)cv::BORDER_CONSTANT)));
@@ -1748,7 +1749,7 @@ INSTANTIATE_TEST_CASE_P(Imgproc, Remap, Combine(
INSTANTIATE_TEST_CASE_P(histTestBase, calcHist, Combine( INSTANTIATE_TEST_CASE_P(histTestBase, calcHist, Combine(
ONE_TYPE(CV_8UC1), ONE_TYPE(CV_8UC1),
ONE_TYPE(CV_32SC1) //no use ONE_TYPE(CV_32SC1) //no use
)); ));
INSTANTIATE_TEST_CASE_P(ConvolveTestBase, Convolve, Combine( INSTANTIATE_TEST_CASE_P(ConvolveTestBase, Convolve, Combine(
Values(CV_32FC1, CV_32FC1), Values(CV_32FC1, CV_32FC1),

View File

@@ -44,14 +44,15 @@
#include "precomp.hpp" #include "precomp.hpp"
#define PERF_TEST 0
#ifdef HAVE_OPENCL
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// MatchTemplate // MatchTemplate
#define ALL_TEMPLATE_METHODS testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR), TemplateMethod(cv::TM_CCOEFF), TemplateMethod(cv::TM_SQDIFF_NORMED), TemplateMethod(cv::TM_CCORR_NORMED), TemplateMethod(cv::TM_CCOEFF_NORMED)) #define ALL_TEMPLATE_METHODS testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR), TemplateMethod(cv::TM_CCOEFF), TemplateMethod(cv::TM_SQDIFF_NORMED), TemplateMethod(cv::TM_CCORR_NORMED), TemplateMethod(cv::TM_CCOEFF_NORMED))
IMPLEMENT_PARAM_CLASS(TemplateSize, cv::Size); IMPLEMENT_PARAM_CLASS(TemplateSize, cv::Size);
const char* TEMPLATE_METHOD_NAMES[6] = {"TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR", "TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED"}; const char *TEMPLATE_METHOD_NAMES[6] = {"TM_SQDIFF", "TM_SQDIFF_NORMED", "TM_CCORR", "TM_CCORR_NORMED", "TM_CCOEFF", "TM_CCOEFF_NORMED"};
#define MTEMP_SIZES testing::Values(cv::Size(128, 256), cv::Size(1024, 768)) #define MTEMP_SIZES testing::Values(cv::Size(128, 256), cv::Size(1024, 768))
@@ -78,8 +79,8 @@ TEST_P(MatchTemplate8U, Accuracy)
{ {
std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl; std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl;
std::cout << "Image Size: (" << size.width << ", " << size.height << ")"<< std::endl; std::cout << "Image Size: (" << size.width << ", " << size.height << ")" << std::endl;
std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")"<< std::endl; std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")" << std::endl;
std::cout << "Channels: " << cn << std::endl; std::cout << "Channels: " << cn << std::endl;
cv::Mat image = randomMat(size, CV_MAKETYPE(CV_8U, cn)); cv::Mat image = randomMat(size, CV_MAKETYPE(CV_8U, cn));
@@ -101,8 +102,8 @@ TEST_P(MatchTemplate8U, Accuracy)
#if PERF_TEST #if PERF_TEST
{ {
P_TEST_FULL({}, {cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);}, {}); P_TEST_FULL( {}, {cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);}, {});
P_TEST_FULL({}, {cv::matchTemplate(image, templ, dst_gold, method);}, {}); P_TEST_FULL( {}, {cv::matchTemplate(image, templ, dst_gold, method);}, {});
} }
#endif // PERF_TEST #endif // PERF_TEST
} }
@@ -147,27 +148,27 @@ TEST_P(MatchTemplate32F, Accuracy)
#if PERF_TEST #if PERF_TEST
{ {
std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl; std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl;
std::cout << "Image Size: (" << size.width << ", " << size.height << ")"<< std::endl; std::cout << "Image Size: (" << size.width << ", " << size.height << ")" << std::endl;
std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")"<< std::endl; std::cout << "Template Size: (" << templ_size.width << ", " << templ_size.height << ")" << std::endl;
std::cout << "Channels: " << cn << std::endl; std::cout << "Channels: " << cn << std::endl;
P_TEST_FULL({}, {cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);}, {}); P_TEST_FULL( {}, {cv::ocl::matchTemplate(ocl_image, ocl_templ, dst, method);}, {});
P_TEST_FULL({}, {cv::matchTemplate(image, templ, dst_gold, method);}, {}); P_TEST_FULL( {}, {cv::matchTemplate(image, templ, dst_gold, method);}, {});
} }
#endif // PERF_TEST #endif // PERF_TEST
} }
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U, //INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U,
testing::Combine( // testing::Combine(
MTEMP_SIZES, // MTEMP_SIZES,
testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), // testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/),
testing::Values(Channels(1), Channels(3),Channels(4)), // testing::Values(Channels(1), Channels(3), Channels(4)),
ALL_TEMPLATE_METHODS // ALL_TEMPLATE_METHODS
) // )
); // );
//
INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine( //INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine(
MTEMP_SIZES, // MTEMP_SIZES,
testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), // testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/),
testing::Values(Channels(1), Channels(3),Channels(4)), // testing::Values(Channels(1), Channels(3), Channels(4)),
testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR)))); // testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR))));
#endif

View File

@@ -493,15 +493,15 @@ TEST_P(convertC3C4, Accuracy)
} }
INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine( INSTANTIATE_TEST_CASE_P(MatrixOperation, ConvertTo, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4),
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4))); Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4)));
INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine( INSTANTIATE_TEST_CASE_P(MatrixOperation, CopyTo, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(MatrixOperation, SetTo, Combine( INSTANTIATE_TEST_CASE_P(MatrixOperation, SetTo, Combine(
Values(CV_8UC1, CV_8UC3,CV_8UC4, CV_32SC1, CV_32SC4, CV_32FC1, CV_32FC4), Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32SC1, CV_32SC3, CV_32SC4, CV_32FC1, CV_32FC3, CV_32FC4),
Values(false))); // Values(false) is the reserved parameter Values(false))); // Values(false) is the reserved parameter
INSTANTIATE_TEST_CASE_P(MatrixOperation, convertC3C4, Combine( INSTANTIATE_TEST_CASE_P(MatrixOperation, convertC3C4, Combine(

View File

@@ -85,7 +85,7 @@ TEST_P(PyrDown, Mat)
{ {
cv::Size size(MWIDTH, MHEIGHT); cv::Size size(MWIDTH, MHEIGHT);
cv::RNG &rng = TS::ptr()->get_rng(); cv::RNG &rng = TS::ptr()->get_rng();
cv::Mat src=randomMat(rng, size, CV_MAKETYPE(type, channels), 0, 100, false); cv::Mat src = randomMat(rng, size, CV_MAKETYPE(type, channels), 0, 100, false);
cv::ocl::oclMat gsrc(src), gdst; cv::ocl::oclMat gsrc(src), gdst;
cv::Mat dst_cpu; cv::Mat dst_cpu;
@@ -94,7 +94,7 @@ TEST_P(PyrDown, Mat)
cv::Mat dst; cv::Mat dst;
gdst.download(dst); gdst.download(dst);
char s[1024]={0}; char s[1024] = {0};
EXPECT_MAT_NEAR(dst, dst_cpu, dst.depth() == CV_32F ? 1e-4f : 1.0f, s); EXPECT_MAT_NEAR(dst, dst_cpu, dst.depth() == CV_32F ? 1e-4f : 1.0f, s);

View File

@@ -94,7 +94,7 @@ TEST_P(Sparse, Mat)
cv::goodFeaturesToTrack(gray_frame, pts, 1000, 0.01, 0.0); cv::goodFeaturesToTrack(gray_frame, pts, 1000, 0.01, 0.0);
cv::ocl::oclMat d_pts; cv::ocl::oclMat d_pts;
cv::Mat pts_mat(1, (int)pts.size(), CV_32FC2, (void*)&pts[0]); cv::Mat pts_mat(1, (int)pts.size(), CV_32FC2, (void *)&pts[0]);
d_pts.upload(pts_mat); d_pts.upload(pts_mat);
cv::ocl::PyrLKOpticalFlow pyrLK; cv::ocl::PyrLKOpticalFlow pyrLK;
@@ -111,11 +111,11 @@ TEST_P(Sparse, Mat)
pyrLK.sparse(oclFrame0, oclFrame1, d_pts, d_nextPts, d_status, &d_err); pyrLK.sparse(oclFrame0, oclFrame1, d_pts, d_nextPts, d_status, &d_err);
std::vector<cv::Point2f> nextPts(d_nextPts.cols); std::vector<cv::Point2f> nextPts(d_nextPts.cols);
cv::Mat nextPts_mat(1, d_nextPts.cols, CV_32FC2, (void*)&nextPts[0]); cv::Mat nextPts_mat(1, d_nextPts.cols, CV_32FC2, (void *)&nextPts[0]);
d_nextPts.download(nextPts_mat); d_nextPts.download(nextPts_mat);
std::vector<unsigned char> status(d_status.cols); std::vector<unsigned char> status(d_status.cols);
cv::Mat status_mat(1, d_status.cols, CV_8UC1, (void*)&status[0]); cv::Mat status_mat(1, d_status.cols, CV_8UC1, (void *)&status[0]);
d_status.download(status_mat); d_status.download(status_mat);
//std::vector<float> err(d_err.cols); //std::vector<float> err(d_err.cols);

View File

@@ -69,22 +69,22 @@ PARAM_TEST_CASE(PyrUp, MatType, int)
} }
}; };
TEST_P(PyrUp,Accuracy) TEST_P(PyrUp, Accuracy)
{ {
for(int j = 0; j < LOOP_TIMES; j++) for(int j = 0; j < LOOP_TIMES; j++)
{ {
Size size(MWIDTH, MHEIGHT); Size size(MWIDTH, MHEIGHT);
Mat src = randomMat(size,CV_MAKETYPE(type, channels)); Mat src = randomMat(size, CV_MAKETYPE(type, channels));
Mat dst_gold; Mat dst_gold;
pyrUp(src,dst_gold); pyrUp(src, dst_gold);
ocl::oclMat dst; ocl::oclMat dst;
ocl::oclMat srcMat(src); ocl::oclMat srcMat(src);
ocl::pyrUp(srcMat,dst); ocl::pyrUp(srcMat, dst);
Mat cpu_dst; Mat cpu_dst;
dst.download(cpu_dst); dst.download(cpu_dst);
char s[100]={0}; char s[100] = {0};
EXPECT_MAT_NEAR(dst_gold, cpu_dst, (src.depth() == CV_32F ? 1e-4f : 1.0),s); EXPECT_MAT_NEAR(dst_gold, cpu_dst, (src.depth() == CV_32F ? 1e-4f : 1.0), s);
} }
} }

View File

@@ -130,8 +130,8 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int)
src2x = rng.uniform(0, mat2.cols - roicols); src2x = rng.uniform(0, mat2.cols - roicols);
src2y = rng.uniform(0, mat2.rows - roirows); src2y = rng.uniform(0, mat2.rows - roirows);
src3x = rng.uniform(0, mat3.cols - roicols); src3x = rng.uniform(0, mat3.cols - roicols);
src3y = rng.uniform(0, mat3.cols - roirows); src3y = rng.uniform(0, mat3.rows - roirows);
src4x = rng.uniform(0, mat4.rows - roicols); src4x = rng.uniform(0, mat4.cols - roicols);
src4y = rng.uniform(0, mat4.rows - roirows); src4y = rng.uniform(0, mat4.rows - roirows);
dstx = rng.uniform(0, dst.cols - roicols); dstx = rng.uniform(0, dst.cols - roicols);
dsty = rng.uniform(0, dst.rows - roirows); dsty = rng.uniform(0, dst.rows - roirows);
@@ -383,11 +383,11 @@ TEST_P(Split, Accuracy)
INSTANTIATE_TEST_CASE_P(SplitMerge, Merge, Combine( INSTANTIATE_TEST_CASE_P(SplitMerge, Merge, Combine(
Values(CV_8U, CV_32S, CV_32F), Values(1, 3,4))); Values(CV_8U, CV_32S, CV_32F), Values(1, 3, 4)));
INSTANTIATE_TEST_CASE_P(SplitMerge, Split , Combine( INSTANTIATE_TEST_CASE_P(SplitMerge, Split , Combine(
Values(CV_8U, CV_32S, CV_32F), Values(1, 3,4))); Values(CV_8U, CV_32S, CV_32F), Values(1, 3, 4)));
#endif // HAVE_OPENCL #endif // HAVE_OPENCL

View File

@@ -207,7 +207,7 @@ vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end)
return v; return v;
} }
const vector<MatType>& all_types() const vector<MatType> &all_types()
{ {
static vector<MatType> v = types(CV_8U, CV_64F, 1, 4); static vector<MatType> v = types(CV_8U, CV_64F, 1, 4);

View File

@@ -112,7 +112,7 @@ using perf::MatType;
std::vector<MatType> types(int depth_start, int depth_end, int cn_start, int cn_end); 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). //! return vector with all types (depth: CV_8U-CV_64F, channels: 1-4).
const std::vector<MatType>& all_types(); const std::vector<MatType> &all_types();
class Inverse class Inverse
{ {