Commit dd942df0 authored by Andrey Pavlenko's avatar Andrey Pavlenko Committed by OpenCV Buildbot

Merge pull request #1736 from alalek:ocl_fix_corner_memory_access

parents 2767be9a 99ae9d9c
...@@ -119,18 +119,16 @@ __kernel void calcHarris(__global const float *Dx, __global const float *Dy, __g ...@@ -119,18 +119,16 @@ __kernel void calcHarris(__global const float *Dx, __global const float *Dy, __g
__local float temp[6][THREADS]; __local float temp[6][THREADS];
#ifdef BORDER_CONSTANT #ifdef BORDER_CONSTANT
bool dx_con,dy_con;
float dx_s, dy_s;
for (int i=0; i < ksY+1; i++) for (int i=0; i < ksY+1; i++)
{ {
dx_con = dx_startX+col >= 0 && dx_startX+col < dx_whole_cols && dx_startY+i >= 0 && dx_startY+i < dx_whole_rows; bool dx_con = dx_startX+col >= 0 && dx_startX+col < dx_whole_cols && dx_startY+i >= 0 && dx_startY+i < dx_whole_rows;
dx_s = Dx[(dx_startY+i)*(dx_step>>2)+(dx_startX+col)]; int indexDx = (dx_startY+i)*(dx_step>>2)+(dx_startX+col);
dx_data[i] = dx_con ? dx_s : 0.0f; float dx_s = dx_con ? Dx[indexDx] : 0.0f;
dx_data[i] = dx_s;
dy_con = dy_startX+col >= 0 && dy_startX+col < dy_whole_cols && dy_startY+i >= 0 && dy_startY+i < dy_whole_rows; bool dy_con = dy_startX+col >= 0 && dy_startX+col < dy_whole_cols && dy_startY+i >= 0 && dy_startY+i < dy_whole_rows;
dy_s = Dy[(dy_startY+i)*(dy_step>>2)+(dy_startX+col)]; int indexDy = (dy_startY+i)*(dy_step>>2)+(dy_startX+col);
dy_data[i] = dy_con ? dy_s : 0.0f; float dy_s = dx_con ? Dy[indexDy] : 0.0f;
dy_data[i] = dy_s;
data[0][i] = dx_data[i] * dx_data[i]; data[0][i] = dx_data[i] * dx_data[i];
data[1][i] = dx_data[i] * dy_data[i]; data[1][i] = dx_data[i] * dy_data[i];
data[2][i] = dy_data[i] * dy_data[i]; data[2][i] = dy_data[i] * dy_data[i];
......
...@@ -118,16 +118,16 @@ __kernel void calcMinEigenVal(__global const float *Dx,__global const float *Dy, ...@@ -118,16 +118,16 @@ __kernel void calcMinEigenVal(__global const float *Dx,__global const float *Dy,
__local float temp[6][THREADS]; __local float temp[6][THREADS];
#ifdef BORDER_CONSTANT #ifdef BORDER_CONSTANT
bool dx_con, dy_con;
float dx_s, dy_s;
for (int i=0; i < ksY+1; i++) for (int i=0; i < ksY+1; i++)
{ {
dx_con = dx_startX+col >= 0 && dx_startX+col < dx_whole_cols && dx_startY+i >= 0 && dx_startY+i < dx_whole_rows; bool dx_con = dx_startX+col >= 0 && dx_startX+col < dx_whole_cols && dx_startY+i >= 0 && dx_startY+i < dx_whole_rows;
dx_s = Dx[(dx_startY+i)*(dx_step>>2)+(dx_startX+col)]; int indexDx = (dx_startY+i)*(dx_step>>2)+(dx_startX+col);
dx_data[i] = dx_con ? dx_s : 0.0f; float dx_s = dx_con ? Dx[indexDx] : 0.0f;
dy_con = dy_startX+col >= 0 && dy_startX+col < dy_whole_cols && dy_startY+i >= 0 && dy_startY+i < dy_whole_rows; dx_data[i] = dx_s;
dy_s = Dy[(dy_startY+i)*(dy_step>>2)+(dy_startX+col)]; bool dy_con = dy_startX+col >= 0 && dy_startX+col < dy_whole_cols && dy_startY+i >= 0 && dy_startY+i < dy_whole_rows;
dy_data[i] = dy_con ? dy_s : 0.0f; int indexDy = (dy_startY+i)*(dy_step>>2)+(dy_startX+col);
float dy_s = dx_con ? Dy[indexDy] : 0.0f;
dy_data[i] = dy_s;
data[0][i] = dx_data[i] * dx_data[i]; data[0][i] = dx_data[i] * dx_data[i];
data[1][i] = dx_data[i] * dy_data[i]; data[1][i] = dx_data[i] * dy_data[i];
data[2][i] = dy_data[i] * dy_data[i]; data[2][i] = dy_data[i] * dy_data[i];
......
...@@ -93,14 +93,22 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType, ...@@ -93,14 +93,22 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType,
generateOclMat(gdst_whole, gdst_roi, dst_whole, roiSize, dstBorder); generateOclMat(gdst_whole, gdst_roi, dst_whole, roiSize, dstBorder);
} }
void Near(double threshold = 0.0) void Near(double threshold = 0.0, bool relative = false)
{ {
Mat whole, roi; Mat roi, whole;
gdst_whole.download(whole); gdst_whole.download(whole);
gdst_roi.download(roi); gdst_roi.download(roi);
EXPECT_MAT_NEAR(dst_whole, whole, threshold); if (relative)
EXPECT_MAT_NEAR(dst_roi, roi, threshold); {
EXPECT_MAT_NEAR_RELATIVE(dst_whole, whole, threshold);
EXPECT_MAT_NEAR_RELATIVE(dst_roi, roi, threshold);
}
else
{
EXPECT_MAT_NEAR(dst_whole, whole, threshold);
EXPECT_MAT_NEAR(dst_roi, roi, threshold);
}
} }
}; };
...@@ -228,7 +236,7 @@ OCL_TEST_P(CornerMinEigenVal, Mat) ...@@ -228,7 +236,7 @@ OCL_TEST_P(CornerMinEigenVal, Mat)
cornerMinEigenVal(src_roi, dst_roi, blockSize, apertureSize, borderType); cornerMinEigenVal(src_roi, dst_roi, blockSize, apertureSize, borderType);
ocl::cornerMinEigenVal(gsrc_roi, gdst_roi, blockSize, apertureSize, borderType); ocl::cornerMinEigenVal(gsrc_roi, gdst_roi, blockSize, apertureSize, borderType);
Near(0.02); Near(1e-5, true);
} }
} }
...@@ -248,7 +256,7 @@ OCL_TEST_P(CornerHarris, Mat) ...@@ -248,7 +256,7 @@ OCL_TEST_P(CornerHarris, Mat)
cornerHarris(src_roi, dst_roi, blockSize, apertureSize, k, borderType); cornerHarris(src_roi, dst_roi, blockSize, apertureSize, k, borderType);
ocl::cornerHarris(gsrc_roi, gdst_roi, blockSize, apertureSize, k, borderType); ocl::cornerHarris(gsrc_roi, gdst_roi, blockSize, apertureSize, k, borderType);
Near(0.02); Near(1e-5, true);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment