From 6e8f5ae574a0ea27f5218685eb69a1ec4fc175d3 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Wed, 10 Apr 2013 16:57:34 +0400 Subject: [PATCH 01/49] Front/back camera constants semantic for Android fixed (Bug #2839). Front/Back camera constants' values changed; Additional camera facing check added for JavaCameraView. --- modules/java/android_lib/res/values/attrs.xml | 4 +- .../java/android+CameraBridgeViewBase.java | 6 ++- .../src/java/android+JavaCameraView.java | 41 ++++++++++++++++--- 3 files changed, 42 insertions(+), 9 deletions(-) diff --git a/modules/java/android_lib/res/values/attrs.xml b/modules/java/android_lib/res/values/attrs.xml index 0cdf1097a0..6902621f66 100644 --- a/modules/java/android_lib/res/values/attrs.xml +++ b/modules/java/android_lib/res/values/attrs.xml @@ -4,8 +4,8 @@ - - + + diff --git a/modules/java/generator/src/java/android+CameraBridgeViewBase.java b/modules/java/generator/src/java/android+CameraBridgeViewBase.java index 36417c5829..42a199a9db 100644 --- a/modules/java/generator/src/java/android+CameraBridgeViewBase.java +++ b/modules/java/generator/src/java/android+CameraBridgeViewBase.java @@ -47,10 +47,14 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac protected int mMaxWidth; protected float mScale = 0; protected int mPreviewFormat = Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA; - protected int mCameraIndex = -1; + protected int mCameraIndex = CAMERA_ID_ANY; protected boolean mEnabled; protected FpsMeter mFpsMeter = null; + public static final int CAMERA_ID_ANY = -1; + public static final int CAMERA_ID_BACK = 99; + public static final int CAMERA_ID_FRONT = 98; + public CameraBridgeViewBase(Context context, int cameraId) { super(context); mCameraIndex = cameraId; diff --git a/modules/java/generator/src/java/android+JavaCameraView.java b/modules/java/generator/src/java/android+JavaCameraView.java index f07b7d2ca8..c7f3558689 100644 --- a/modules/java/generator/src/java/android+JavaCameraView.java +++ b/modules/java/generator/src/java/android+JavaCameraView.java @@ -6,6 +6,7 @@ import android.content.Context; import android.graphics.ImageFormat; import android.graphics.SurfaceTexture; import android.hardware.Camera; +import android.hardware.Camera.CameraInfo; import android.hardware.Camera.PreviewCallback; import android.os.Build; import android.util.AttributeSet; @@ -68,7 +69,7 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb synchronized (this) { mCamera = null; - if (mCameraIndex == -1) { + if (mCameraIndex == CAMERA_ID_ANY) { Log.d(TAG, "Trying to open camera with old open()"); try { mCamera = Camera.open(); @@ -92,11 +93,39 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb } } else { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) { - Log.d(TAG, "Trying to open camera with new open(" + Integer.valueOf(mCameraIndex) + ")"); - try { - mCamera = Camera.open(mCameraIndex); - } catch (RuntimeException e) { - Log.e(TAG, "Camera #" + mCameraIndex + "failed to open: " + e.getLocalizedMessage()); + int localCameraIndex = mCameraIndex; + if (mCameraIndex == CAMERA_ID_BACK) { + Log.i(TAG, "Trying to open back camera"); + Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); + for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) { + Camera.getCameraInfo( camIdx, cameraInfo ); + if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) { + localCameraIndex = camIdx; + break; + } + } + } else if (mCameraIndex == CAMERA_ID_FRONT) { + Log.i(TAG, "Trying to open front camera"); + Camera.CameraInfo cameraInfo = new Camera.CameraInfo(); + for (int camIdx = 0; camIdx < Camera.getNumberOfCameras(); ++camIdx) { + Camera.getCameraInfo( camIdx, cameraInfo ); + if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { + localCameraIndex = camIdx; + break; + } + } + } + if (localCameraIndex == CAMERA_ID_BACK) { + Log.e(TAG, "Back camera not found!"); + } else if (localCameraIndex == CAMERA_ID_FRONT) { + Log.e(TAG, "Front camera not found!"); + } else { + Log.d(TAG, "Trying to open camera with new open(" + Integer.valueOf(localCameraIndex) + ")"); + try { + mCamera = Camera.open(localCameraIndex); + } catch (RuntimeException e) { + Log.e(TAG, "Camera #" + localCameraIndex + "failed to open: " + e.getLocalizedMessage()); + } } } } From 06a4bad809ab072d143639d4dff667d439120634 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Mon, 15 Apr 2013 10:36:03 +0800 Subject: [PATCH 02/49] Merge ocl and/or/xor operators into one kernel each. --- modules/ocl/src/arithm.cpp | 96 +- .../ocl/src/opencl/arithm_bitwise_and_mask.cl | 803 ------------ .../opencl/arithm_bitwise_and_scalar_mask.cl | 1117 ----------------- ...itwise_and.cl => arithm_bitwise_binary.cl} | 43 +- ..._mask.cl => arithm_bitwise_binary_mask.cl} | 117 +- ...lar.cl => arithm_bitwise_binary_scalar.cl} | 101 +- ...l => arithm_bitwise_binary_scalar_mask.cl} | 112 +- modules/ocl/src/opencl/arithm_bitwise_or.cl | 294 ----- .../src/opencl/arithm_bitwise_or_scalar.cl | 636 ---------- .../opencl/arithm_bitwise_or_scalar_mask.cl | 760 ----------- modules/ocl/src/opencl/arithm_bitwise_xor.cl | 340 ----- .../ocl/src/opencl/arithm_bitwise_xor_mask.cl | 803 ------------ .../src/opencl/arithm_bitwise_xor_scalar.cl | 633 ---------- 13 files changed, 246 insertions(+), 5609 deletions(-) delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_and_mask.cl delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_and_scalar_mask.cl rename modules/ocl/src/opencl/{arithm_bitwise_and.cl => arithm_bitwise_binary.cl} (91%) rename modules/ocl/src/opencl/{arithm_bitwise_or_mask.cl => arithm_bitwise_binary_mask.cl} (91%) rename modules/ocl/src/opencl/{arithm_bitwise_and_scalar.cl => arithm_bitwise_binary_scalar.cl} (88%) rename modules/ocl/src/opencl/{arithm_bitwise_xor_scalar_mask.cl => arithm_bitwise_binary_scalar_mask.cl} (90%) delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_or.cl delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_or_scalar.cl delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_or_scalar_mask.cl delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_xor.cl delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_xor_mask.cl delete mode 100644 modules/ocl/src/opencl/arithm_bitwise_xor_scalar.cl diff --git a/modules/ocl/src/arithm.cpp b/modules/ocl/src/arithm.cpp index cba6ccf22f..d679a93480 100644 --- a/modules/ocl/src/arithm.cpp +++ b/modules/ocl/src/arithm.cpp @@ -62,8 +62,6 @@ namespace cv namespace ocl { ////////////////////////////////OpenCL kernel strings///////////////////// - extern const char *bitwise; - extern const char *bitwiseM; extern const char *transpose_kernel; extern const char *arithm_nonzero; extern const char *arithm_sum; @@ -77,19 +75,11 @@ namespace cv extern const char *arithm_add; extern const char *arithm_add_scalar; extern const char *arithm_add_scalar_mask; + extern const char *arithm_bitwise_binary; + extern const char *arithm_bitwise_binary_mask; + extern const char *arithm_bitwise_binary_scalar; + extern const char *arithm_bitwise_binary_scalar_mask; extern const char *arithm_bitwise_not; - extern const char *arithm_bitwise_and; - extern const char *arithm_bitwise_and_mask; - extern const char *arithm_bitwise_and_scalar; - extern const char *arithm_bitwise_and_scalar_mask; - extern const char *arithm_bitwise_or; - extern const char *arithm_bitwise_or_mask; - extern const char *arithm_bitwise_or_scalar; - extern const char *arithm_bitwise_or_scalar_mask; - extern const char *arithm_bitwise_xor; - extern const char *arithm_bitwise_xor_mask; - extern const char *arithm_bitwise_xor_scalar; - extern const char *arithm_bitwise_xor_scalar_mask; extern const char *arithm_compare_eq; extern const char *arithm_compare_ne; extern const char *arithm_mul; @@ -1646,7 +1636,8 @@ static void bitwise_run(const oclMat &src1, oclMat &dst, string kernelName, cons template -void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, string kernelName, const char **kernelString, void *_scalar) +void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, string kernelName, + const char **kernelString, void *_scalar, const char* _opt = NULL) { dst.create(src1.size(), src1.type()); CV_Assert(src1.cols == src2.cols && src2.cols == dst.cols && @@ -1696,13 +1687,15 @@ void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, string ker args.push_back( make_pair( sizeof(T), (void *)&scalar )); } - openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, -1, depth); + openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, -1, depth, _opt); } -static void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, string kernelName, const char **kernelString) +static void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, + string kernelName, const char **kernelString, const char* _opt = NULL) { - bitwise_run(src1, src2, dst, kernelName, kernelString, (void *)NULL); + bitwise_run(src1, src2, dst, kernelName, kernelString, (void *)NULL, _opt); } -static void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask, string kernelName, const char **kernelString) +static void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, + const oclMat &mask, string kernelName, const char **kernelString, const char* _opt = NULL) { dst.create(src1.size(), src1.type()); CV_Assert(src1.cols == src2.cols && src2.cols == dst.cols && @@ -1750,12 +1743,13 @@ static void bitwise_run(const oclMat &src1, const oclMat &src2, oclMat &dst, con args.push_back( make_pair( sizeof(cl_int), (void *)&cols )); args.push_back( make_pair( sizeof(cl_int), (void *)&dst_step1 )); - openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, channels, depth); + openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, channels, depth, _opt); } template -void bitwise_scalar_run(const oclMat &src1, const Scalar &src2, oclMat &dst, const oclMat &mask, string kernelName, const char **kernelString, int isMatSubScalar) +void bitwise_scalar_run(const oclMat &src1, const Scalar &src2, oclMat &dst, + const oclMat &mask, string kernelName, const char **kernelString, int isMatSubScalar, const char* opt = NULL) { dst.create(src1.size(), src1.type()); @@ -1817,14 +1811,16 @@ void bitwise_scalar_run(const oclMat &src1, const Scalar &src2, oclMat &dst, con args.push_back( make_pair( sizeof(cl_int) , (void *)&isMatSubScalar)); } - openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, channels, depth); + openCLExecuteKernel(clCxt, kernelString, kernelName, globalThreads, localThreads, args, channels, depth, opt); } -typedef void (*BitwiseFuncS)(const oclMat &src1, const Scalar &src2, oclMat &dst, const oclMat &mask, string kernelName, const char **kernelString, int isMatSubScalar); +typedef void (*BitwiseFuncS)(const oclMat &src1, const Scalar &src2, oclMat &dst, + const oclMat &mask, string kernelName, const char **kernelString, int isMatSubScalar, const char* opt); -static void bitwise_scalar(const oclMat &src1, const Scalar &src2, oclMat &dst, const oclMat &mask, string kernelName, const char **kernelString, int isMatSubScalar) +static void bitwise_scalar(const oclMat &src1, const Scalar &src2, oclMat &dst, + const oclMat &mask, string kernelName, const char **kernelString, int isMatSubScalar, const char* opt) { static BitwiseFuncS tab[8] = { @@ -1852,11 +1848,12 @@ static void bitwise_scalar(const oclMat &src1, const Scalar &src2, oclMat &dst, BitwiseFuncS func = tab[src1.depth()]; if(func == 0) cv::ocl::error("Unsupported arithmetic operation", __FILE__, __LINE__); - func(src1, src2, dst, mask, kernelName, kernelString, isMatSubScalar); + func(src1, src2, dst, mask, kernelName, kernelString, isMatSubScalar, opt); } -static void bitwise_scalar(const oclMat &src1, const Scalar &src2, oclMat &dst, const oclMat &mask, string kernelName, const char **kernelString) +static void bitwise_scalar(const oclMat &src1, const Scalar &src2, oclMat &dst, + const oclMat &mask, string kernelName, const char **kernelString, const char * opt = NULL) { - bitwise_scalar(src1, src2, dst, mask, kernelName, kernelString, 0); + bitwise_scalar(src1, src2, dst, mask, kernelName, kernelString, 0, opt); } void cv::ocl::bitwise_not(const oclMat &src, oclMat &dst) @@ -1879,12 +1876,13 @@ void cv::ocl::bitwise_or(const oclMat &src1, const oclMat &src2, oclMat &dst, co cout << "Selected device do not support double" << endl; return; } - oclMat emptyMat; - string kernelName = mask.empty() ? "arithm_bitwise_or" : "arithm_bitwise_or_with_mask"; + + string kernelName = mask.empty() ? "arithm_bitwise_binary" : "arithm_bitwise_binary_with_mask"; + static const char opt [] = "-D OP_BINARY=|"; if (mask.empty()) - bitwise_run(src1, src2, dst, kernelName, &arithm_bitwise_or); + bitwise_run(src1, src2, dst, kernelName, &arithm_bitwise_binary, opt); else - bitwise_run(src1, src2, dst, mask, kernelName, &arithm_bitwise_or_mask); + bitwise_run(src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_mask, opt); } @@ -1895,11 +1893,12 @@ void cv::ocl::bitwise_or(const oclMat &src1, const Scalar &src2, oclMat &dst, co cout << "Selected device do not support double" << endl; return; } - string kernelName = mask.data ? "arithm_s_bitwise_or_with_mask" : "arithm_s_bitwise_or"; + static const char opt [] = "-D OP_BINARY=|"; + string kernelName = mask.data ? "arithm_s_bitwise_binary_with_mask" : "arithm_s_bitwise_binary"; if (mask.data) - bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_or_scalar_mask); + bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_scalar_mask, opt); else - bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_or_scalar); + bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_scalar, opt); } void cv::ocl::bitwise_and(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask) @@ -1912,12 +1911,13 @@ void cv::ocl::bitwise_and(const oclMat &src1, const oclMat &src2, oclMat &dst, c } oclMat emptyMat; - string kernelName = mask.empty() ? "arithm_bitwise_and" : "arithm_bitwise_and_with_mask"; + string kernelName = mask.empty() ? "arithm_bitwise_binary" : "arithm_bitwise_binary_with_mask"; + static const char opt [] = "-D OP_BINARY=&"; if (mask.empty()) - bitwise_run(src1, src2, dst, kernelName, &arithm_bitwise_and); + bitwise_run(src1, src2, dst, kernelName, &arithm_bitwise_binary, opt); else - bitwise_run(src1, src2, dst, mask, kernelName, &arithm_bitwise_and_mask); + bitwise_run(src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_mask, opt); } void cv::ocl::bitwise_and(const oclMat &src1, const Scalar &src2, oclMat &dst, const oclMat &mask) @@ -1927,11 +1927,12 @@ void cv::ocl::bitwise_and(const oclMat &src1, const Scalar &src2, oclMat &dst, c cout << "Selected device do not support double" << endl; return; } - string kernelName = mask.data ? "arithm_s_bitwise_and_with_mask" : "arithm_s_bitwise_and"; + static const char opt [] = "-D OP_BINARY=&"; + string kernelName = mask.data ? "arithm_s_bitwise_binary_with_mask" : "arithm_s_bitwise_binary"; if (mask.data) - bitwise_scalar(src1, src2, dst, mask, kernelName, &arithm_bitwise_and_scalar_mask); + bitwise_scalar(src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_scalar_mask, opt); else - bitwise_scalar(src1, src2, dst, mask, kernelName, &arithm_bitwise_and_scalar); + bitwise_scalar(src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_scalar, opt); } void cv::ocl::bitwise_xor(const oclMat &src1, const oclMat &src2, oclMat &dst, const oclMat &mask) @@ -1941,14 +1942,14 @@ void cv::ocl::bitwise_xor(const oclMat &src1, const oclMat &src2, oclMat &dst, c cout << "Selected device do not support double" << endl; return; } - oclMat emptyMat; - string kernelName = mask.empty() ? "arithm_bitwise_xor" : "arithm_bitwise_xor_with_mask"; + string kernelName = mask.empty() ? "arithm_bitwise_binary" : "arithm_bitwise_binary_with_mask"; + static const char opt [] = "-D OP_BINARY=^"; if (mask.empty()) - bitwise_run(src1, src2, dst, kernelName, &arithm_bitwise_xor); + bitwise_run(src1, src2, dst, kernelName, &arithm_bitwise_binary, opt); else - bitwise_run(src1, src2, dst, mask, kernelName, &arithm_bitwise_xor_mask); + bitwise_run(src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_mask, opt); } @@ -1960,11 +1961,12 @@ void cv::ocl::bitwise_xor(const oclMat &src1, const Scalar &src2, oclMat &dst, c cout << "Selected device do not support double" << endl; return; } - string kernelName = mask.data ? "arithm_s_bitwise_xor_with_mask" : "arithm_s_bitwise_xor"; + string kernelName = mask.data ? "arithm_s_bitwise_binary_with_mask" : "arithm_s_bitwise_binary"; + static const char opt [] = "-D OP_BINARY=^"; if (mask.data) - bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_xor_scalar_mask); + bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_scalar_mask, opt); else - bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_xor_scalar); + bitwise_scalar( src1, src2, dst, mask, kernelName, &arithm_bitwise_binary_scalar, opt); } oclMat cv::ocl::operator ~ (const oclMat &src) diff --git a/modules/ocl/src/opencl/arithm_bitwise_and_mask.cl b/modules/ocl/src/opencl/arithm_bitwise_and_mask.cl deleted file mode 100644 index 5e0428f34b..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_and_mask.cl +++ /dev/null @@ -1,803 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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*/ -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_AND//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_and with mask**************************************/ -__kernel void arithm_bitwise_and_with_mask_C1_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = vload4(0, src2 + src2_index); - uchar4 mask_data = vload4(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data & src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_and_with_mask_C1_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = vload4(0, src2 + src2_index); - uchar4 mask_data = vload4(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data & src2_data; - - data.x = convert_char((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = convert_char((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = convert_char((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = convert_char((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_and_with_mask_C1_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - ushort2 src1_data = vload2(0, (__global ushort *)((__global char *)src1 + src1_index)); - ushort2 src2_data = vload2(0, (__global ushort *)((__global char *)src2 + src2_index)); - uchar2 mask_data = vload2(0, mask + mask_index); - - ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data & src2_data; - - data.x = convert_ushort((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = convert_ushort((mask_data.y) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : data.y; - - *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_and_with_mask_C1_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - short2 src1_data = vload2(0, (__global short *)((__global char *)src1 + src1_index)); - short2 src2_data = vload2(0, (__global short *)((__global char *)src2 + src2_index)); - uchar2 mask_data = vload2(0, mask + mask_index); - - short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - short2 tmp_data = src1_data & src2_data; - - data.x = convert_short((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = convert_short((mask_data.y) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : data.y; - - *((__global short2 *)((__global uchar *)dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_and_with_mask_C1_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int src_data1 = *((__global int *)((__global char *)src1 + src1_index)); - int src_data2 = *((__global int *)((__global char *)src2 + src2_index)); - int dst_data = *((__global int *)((__global char *)dst + dst_index)); - - int data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global int *)((__global char *)dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_and_with_mask_C1_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src_data1 = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 src_data2 = *((__global char4 *)((__global char *)src2 + src2_index)); - char4 dst_data = *((__global char4 *)((__global char *)dst + dst_index)); - - char4 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global char4 *)((__global char *)dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_and_with_mask_C1_D6 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src_data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src_data2 = *((__global char8 *)((__global char *)src2 + src2_index)); - char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - - char8 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global char8 *)((__global char *)dst + dst_index)) = data; - } - -} - - - -__kernel void arithm_bitwise_and_with_mask_C2_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = vload4(0, src2 + src2_index); - uchar2 mask_data = vload2(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data & src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_bitwise_and_with_mask_C2_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = vload4(0, src2 + src2_index); - uchar2 mask_data = vload2(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data & src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_bitwise_and_with_mask_C2_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort2 src_data1 = *((__global ushort2 *)((__global char *)src1 + src1_index)); - ushort2 src_data2 = *((__global ushort2 *)((__global char *)src2 + src2_index)); - ushort2 dst_data = *((__global ushort2 *)((__global char *)dst + dst_index)); - - ushort2 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global ushort2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_and_with_mask_C2_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short2 src_data1 = *((__global short2 *)((__global char *)src1 + src1_index)); - short2 src_data2 = *((__global short2 *)((__global char *)src2 + src2_index)); - short2 dst_data = *((__global short2 *)((__global char *)dst + dst_index)); - - short2 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global short2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_and_with_mask_C2_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int2 src_data1 = *((__global int2 *)((__global char *)src1 + src1_index)); - int2 src_data2 = *((__global int2 *)((__global char *)src2 + src2_index)); - int2 dst_data = *((__global int2 *)((__global char *)dst + dst_index)); - - int2 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global int2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_and_with_mask_C2_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src_data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src_data2 = *((__global char8 *)((__global char *)src2 + src2_index)); - char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - - char8 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global char8 *)((__global char *)dst + dst_index)) = data; - } -} - -__kernel void arithm_bitwise_and_with_mask_C2_D6 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 4) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char16 src_data1 = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src_data2 = *((__global char16 *)((__global char *)src2 + src2_index)); - char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - - char16 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global char16 *)((__global char *)dst + dst_index)) = data; - } -} - - -__kernel void arithm_bitwise_and_with_mask_C4_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); - uchar4 src_data2 = *((__global uchar4 *)(src2 + src2_index)); - uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); - - uchar4 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_bitwise_and_with_mask_C4_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src_data1 = *((__global char4 *)(src1 + src1_index)); - char4 src_data2 = *((__global char4 *)(src2 + src2_index)); - char4 dst_data = *((__global char4 *)(dst + dst_index)); - - char4 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_bitwise_and_with_mask_C4_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); - ushort4 src_data2 = *((__global ushort4 *)((__global char *)src2 + src2_index)); - ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - - ushort4 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_and_with_mask_C4_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 src_data2 = *((__global short4 *)((__global char *)src2 + src2_index)); - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - - short4 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_and_with_mask_C4_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 4) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); - int4 src_data2 = *((__global int4 *)((__global char *)src2 + src2_index)); - int4 dst_data = *((__global int4 *)((__global char *)dst + dst_index)); - - int4 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global int4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_and_with_mask_C4_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 4) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char16 src_data1 = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src_data2 = *((__global char16 *)((__global char *)src2 + src2_index)); - char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - - char16 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global char16 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_and_with_mask_C4_D6 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 5) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 5) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 5) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src_data1_0 = *((__global char8 *)((__global char *)src1 + src1_index + 0)); - char8 src_data1_1 = *((__global char8 *)((__global char *)src1 + src1_index + 8)); - char8 src_data1_2 = *((__global char8 *)((__global char *)src1 + src1_index + 16)); - char8 src_data1_3 = *((__global char8 *)((__global char *)src1 + src1_index + 24)); - - char8 src_data2_0 = *((__global char8 *)((__global char *)src2 + src2_index + 0)); - char8 src_data2_1 = *((__global char8 *)((__global char *)src2 + src2_index + 8)); - char8 src_data2_2 = *((__global char8 *)((__global char *)src2 + src2_index + 16)); - char8 src_data2_3 = *((__global char8 *)((__global char *)src2 + src2_index + 24)); - - char8 dst_data_0 = *((__global char8 *)((__global char *)dst + dst_index + 0)); - char8 dst_data_1 = *((__global char8 *)((__global char *)dst + dst_index + 8)); - char8 dst_data_2 = *((__global char8 *)((__global char *)dst + dst_index + 16)); - char8 dst_data_3 = *((__global char8 *)((__global char *)dst + dst_index + 24)); - - char8 data_0 = src_data1_0 & src_data2_0; - char8 data_1 = src_data1_1 & src_data2_1; - char8 data_2 = src_data1_2 & src_data2_2; - char8 data_3 = src_data1_3 & src_data2_3; - - data_0 = mask_data ? data_0 : dst_data_0; - data_1 = mask_data ? data_1 : dst_data_1; - data_2 = mask_data ? data_2 : dst_data_2; - data_3 = mask_data ? data_3 : dst_data_3; - - *((__global char8 *)((__global char *)dst + dst_index + 0)) = data_0; - *((__global char8 *)((__global char *)dst + dst_index + 8)) = data_1; - *((__global char8 *)((__global char *)dst + dst_index + 16)) = data_2; - *((__global char8 *)((__global char *)dst + dst_index + 24)) = data_3; - } -} -#endif diff --git a/modules/ocl/src/opencl/arithm_bitwise_and_scalar_mask.cl b/modules/ocl/src/opencl/arithm_bitwise_and_scalar_mask.cl deleted file mode 100644 index 71371737da..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_and_scalar_mask.cl +++ /dev/null @@ -1,1117 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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 GpuMaterials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors as is and -// any express or 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*/ -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_AND//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_and with scalar with mask**************************************/ -__kernel void arithm_s_bitwise_and_with_mask_C1_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.x, src2.x, src2.x); - uchar4 mask_data = vload4(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data & src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_and_with_mask_C1_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.x, src2.x, src2.x); - uchar4 mask_data = vload4(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data & src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_and_with_mask_C1_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - ushort2 src1_data = vload2(0, (__global ushort *)((__global char *)src1 + src1_index)); - ushort2 src2_data = (ushort2)(src2.x, src2.x); - uchar2 mask_data = vload2(0, mask + mask_index); - - ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data & src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.y : data.y; - - *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C1_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - short2 src1_data = vload2(0, (__global short *)((__global char *)src1 + src1_index)); - short2 src2_data = (short2)(src2.x, src2.x); - uchar2 mask_data = vload2(0, mask + mask_index); - - short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - short2 tmp_data = src1_data & src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.y : data.y; - - *((__global short2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C1_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int src_data1 = *((__global int *)((__global char *)src1 + src1_index)); - int src_data2 = src2.x; - int dst_data = *((__global int *)((__global char *)dst + dst_index)); - - int data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global int *)((__global char *)dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_and_with_mask_C1_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src1_data = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 src2_data = (char4)(src2.s0, src2.s1, src2.s2, src2.s3); - char4 dst_data = *((__global char4 *)((__global char *)dst + dst_index)); - - char4 data = src1_data & src2_data; - data = mask_data ? data : dst_data; - - *((__global char4 *)((__global char *)dst + dst_index)) = data; - } -} - -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_and_with_mask_C1_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src1_data = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 src2_data = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - - short4 data = src1_data & src2_data; - data = mask_data ? data : dst_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -#endif -__kernel void arithm_s_bitwise_and_with_mask_C2_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.y, src2.x, src2.y); - uchar2 mask_data = vload2(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data & src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_and_with_mask_C2_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.y, src2.x, src2.y); - uchar2 mask_data = vload2(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data & src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_and_with_mask_C2_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort2 src_data1 = *((__global ushort2 *)((__global char *)src1 + src1_index)); - ushort2 src_data2 = (ushort2)(src2.x, src2.y); - ushort2 dst_data = *((__global ushort2 *)((__global char *)dst + dst_index)); - - ushort2 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global ushort2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C2_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short2 src_data1 = *((__global short2 *)((__global char *)src1 + src1_index)); - short2 src_data2 = (short2)(src2.x, src2.y); - short2 dst_data = *((__global short2 *)((__global char *)dst + dst_index)); - - short2 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global short2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C2_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int2 src_data1 = *((__global int2 *)((__global char *)src1 + src1_index)); - int2 src_data2 = (int2)(src2.x, src2.y); - int2 dst_data = *((__global int2 *)((__global char *)dst + dst_index)); - - int2 data = src_data1 & src_data2; - data = mask_data ? data : dst_data; - - *((__global int2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C2_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src1_data = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src2_data = (char8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - - char8 data = src1_data & src2_data; - - data = mask_data ? data : dst_data; - - *((__global char8 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_and_with_mask_C2_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short8 src1_data = *((__global short8 *)((__global char *)src1 + src1_index)); - short8 src2_data = (short8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - short8 dst_data = *((__global short8 *)((__global char *)dst + dst_index)); - - short8 data = src1_data & src2_data; - data = mask_data ? data : dst_data; - - *((__global short8 *)((__global char *)dst + dst_index)) = data; - } -} -#endif -__kernel void arithm_s_bitwise_and_with_mask_C3_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (((dst_offset % dst_step) / 3 ) & 3) - int src1_index = mad24(y, src1_step, (x * 3) + src1_offset - (dst_align * 3)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x * 3) - (dst_align * 3)); - - uchar4 src1_data_0 = vload4(0, src1 + src1_index + 0); - uchar4 src1_data_1 = vload4(0, src1 + src1_index + 4); - uchar4 src1_data_2 = vload4(0, src1 + src1_index + 8); - - uchar4 src2_data_0 = (uchar4)(src2.x, src2.y, src2.z, src2.x); - uchar4 src2_data_1 = (uchar4)(src2.y, src2.z, src2.x, src2.y); - uchar4 src2_data_2 = (uchar4)(src2.z, src2.x, src2.y, src2.z); - - uchar4 mask_data = vload4(0, mask + mask_index); - - uchar4 data_0 = *((__global uchar4 *)(dst + dst_index + 0)); - uchar4 data_1 = *((__global uchar4 *)(dst + dst_index + 4)); - uchar4 data_2 = *((__global uchar4 *)(dst + dst_index + 8)); - - uchar4 tmp_data_0 = src1_data_0 & src2_data_0; - uchar4 tmp_data_1 = src1_data_1 & src2_data_1; - uchar4 tmp_data_2 = src1_data_2 & src2_data_2; - - data_0.xyz = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data_0.xyz : data_0.xyz; - data_0.w = ((mask_data.y) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) - ? tmp_data_0.w : data_0.w; - - data_1.xy = ((mask_data.y) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) - ? tmp_data_1.xy : data_1.xy; - data_1.zw = ((mask_data.z) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_1.zw : data_1.zw; - - data_2.x = ((mask_data.z) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_2.x : data_2.x; - data_2.yzw = ((mask_data.w) && (dst_index + 9 >= dst_start) && (dst_index + 9 < dst_end)) - ? tmp_data_2.yzw : data_2.yzw; - - *((__global uchar4 *)(dst + dst_index + 0)) = data_0; - *((__global uchar4 *)(dst + dst_index + 4)) = data_1; - *((__global uchar4 *)(dst + dst_index + 8)) = data_2; - } -} - - -__kernel void arithm_s_bitwise_and_with_mask_C3_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (((dst_offset % dst_step) / 3 ) & 3) - int src1_index = mad24(y, src1_step, (x * 3) + src1_offset - (dst_align * 3)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x * 3) - (dst_align * 3)); - - char4 src1_data_0 = vload4(0, src1 + src1_index + 0); - char4 src1_data_1 = vload4(0, src1 + src1_index + 4); - char4 src1_data_2 = vload4(0, src1 + src1_index + 8); - - char4 src2_data_0 = (char4)(src2.x, src2.y, src2.z, src2.x); - char4 src2_data_1 = (char4)(src2.y, src2.z, src2.x, src2.y); - char4 src2_data_2 = (char4)(src2.z, src2.x, src2.y, src2.z); - - uchar4 mask_data = vload4(0, mask + mask_index); - - char4 data_0 = *((__global char4 *)(dst + dst_index + 0)); - char4 data_1 = *((__global char4 *)(dst + dst_index + 4)); - char4 data_2 = *((__global char4 *)(dst + dst_index + 8)); - - char4 tmp_data_0 = src1_data_0 & src2_data_0; - char4 tmp_data_1 = src1_data_1 & src2_data_1; - char4 tmp_data_2 = src1_data_2 & src2_data_2; - - data_0.xyz = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data_0.xyz : data_0.xyz; - data_0.w = ((mask_data.y) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) - ? tmp_data_0.w : data_0.w; - - data_1.xy = ((mask_data.y) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) - ? tmp_data_1.xy : data_1.xy; - data_1.zw = ((mask_data.z) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_1.zw : data_1.zw; - - data_2.x = ((mask_data.z) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_2.x : data_2.x; - data_2.yzw = ((mask_data.w) && (dst_index + 9 >= dst_start) && (dst_index + 9 < dst_end)) - ? tmp_data_2.yzw : data_2.yzw; - - *((__global char4 *)(dst + dst_index + 0)) = data_0; - *((__global char4 *)(dst + dst_index + 4)) = data_1; - *((__global char4 *)(dst + dst_index + 8)) = data_2; - } -} - -__kernel void arithm_s_bitwise_and_with_mask_C3_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (((dst_offset % dst_step) / 6 ) & 1) - int src1_index = mad24(y, src1_step, (x * 6) + src1_offset - (dst_align * 6)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x * 6) - (dst_align * 6)); - - ushort2 src1_data_0 = vload2(0, (__global ushort *)((__global char *)src1 + src1_index + 0)); - ushort2 src1_data_1 = vload2(0, (__global ushort *)((__global char *)src1 + src1_index + 4)); - ushort2 src1_data_2 = vload2(0, (__global ushort *)((__global char *)src1 + src1_index + 8)); - - ushort2 src2_data_0 = (ushort2)(src2.x, src2.y); - ushort2 src2_data_1 = (ushort2)(src2.z, src2.x); - ushort2 src2_data_2 = (ushort2)(src2.y, src2.z); - - uchar2 mask_data = vload2(0, mask + mask_index); - - ushort2 data_0 = *((__global ushort2 *)((__global char *)dst + dst_index + 0)); - ushort2 data_1 = *((__global ushort2 *)((__global char *)dst + dst_index + 4)); - ushort2 data_2 = *((__global ushort2 *)((__global char *)dst + dst_index + 8)); - - ushort2 tmp_data_0 = src1_data_0 & src2_data_0; - ushort2 tmp_data_1 = src1_data_1 & src2_data_1; - ushort2 tmp_data_2 = src1_data_2 & src2_data_2; - - data_0.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data_0.xy : data_0.xy; - - data_1.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) - ? tmp_data_1.x : data_1.x; - data_1.y = ((mask_data.y) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_1.y : data_1.y; - - data_2.xy = ((mask_data.y) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_2.xy : data_2.xy; - - *((__global ushort2 *)((__global char *)dst + dst_index + 0))= data_0; - *((__global ushort2 *)((__global char *)dst + dst_index + 4))= data_1; - *((__global ushort2 *)((__global char *)dst + dst_index + 8))= data_2; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C3_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (((dst_offset % dst_step) / 6 ) & 1) - int src1_index = mad24(y, src1_step, (x * 6) + src1_offset - (dst_align * 6)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x * 6) - (dst_align * 6)); - - short2 src1_data_0 = vload2(0, (__global short *)((__global char *)src1 + src1_index + 0)); - short2 src1_data_1 = vload2(0, (__global short *)((__global char *)src1 + src1_index + 4)); - short2 src1_data_2 = vload2(0, (__global short *)((__global char *)src1 + src1_index + 8)); - - short2 src2_data_0 = (short2)(src2.x, src2.y); - short2 src2_data_1 = (short2)(src2.z, src2.x); - short2 src2_data_2 = (short2)(src2.y, src2.z); - - uchar2 mask_data = vload2(0, mask + mask_index); - - short2 data_0 = *((__global short2 *)((__global char *)dst + dst_index + 0)); - short2 data_1 = *((__global short2 *)((__global char *)dst + dst_index + 4)); - short2 data_2 = *((__global short2 *)((__global char *)dst + dst_index + 8)); - - short2 tmp_data_0 = src1_data_0 & src2_data_0; - short2 tmp_data_1 = src1_data_1 & src2_data_1; - short2 tmp_data_2 = src1_data_2 & src2_data_2; - - data_0.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data_0.xy : data_0.xy; - - data_1.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) - ? tmp_data_1.x : data_1.x; - data_1.y = ((mask_data.y) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_1.y : data_1.y; - - data_2.xy = ((mask_data.y) && (dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) - ? tmp_data_2.xy : data_2.xy; - - *((__global short2 *)((__global char *)dst + dst_index + 0))= data_0; - *((__global short2 *)((__global char *)dst + dst_index + 4))= data_1; - *((__global short2 *)((__global char *)dst + dst_index + 8))= data_2; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C3_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x * 12) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, dst_offset + (x * 12)); - - int src1_data_0 = *((__global int *)((__global char *)src1 + src1_index + 0)); - int src1_data_1 = *((__global int *)((__global char *)src1 + src1_index + 4)); - int src1_data_2 = *((__global int *)((__global char *)src1 + src1_index + 8)); - - int src2_data_0 = src2.x; - int src2_data_1 = src2.y; - int src2_data_2 = src2.z; - - uchar mask_data = * (mask + mask_index); - - int data_0 = *((__global int *)((__global char *)dst + dst_index + 0)); - int data_1 = *((__global int *)((__global char *)dst + dst_index + 4)); - int data_2 = *((__global int *)((__global char *)dst + dst_index + 8)); - - int tmp_data_0 = src1_data_0 & src2_data_0; - int tmp_data_1 = src1_data_1 & src2_data_1; - int tmp_data_2 = src1_data_2 & src2_data_2; - - data_0 = mask_data ? tmp_data_0 : data_0; - data_1 = mask_data ? tmp_data_1 : data_1; - data_2 = mask_data ? tmp_data_2 : data_2; - - *((__global int *)((__global char *)dst + dst_index + 0))= data_0; - *((__global int *)((__global char *)dst + dst_index + 4))= data_1; - *((__global int *)((__global char *)dst + dst_index + 8))= data_2; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C3_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x * 12) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, dst_offset + (x * 12)); - - char4 src1_data_0 = *((__global char4 *)((__global char *)src1 + src1_index + 0)); - char4 src1_data_1 = *((__global char4 *)((__global char *)src1 + src1_index + 4)); - char4 src1_data_2 = *((__global char4 *)((__global char *)src1 + src1_index + 8)); - - char4 src2_data_0 = (char4)(src2.s0, src2.s1, src2.s2, src2.s3); - char4 src2_data_1 = (char4)(src2.s4, src2.s5, src2.s6, src2.s7); - char4 src2_data_2 = (char4)(src2.s8, src2.s9, src2.sA, src2.sB); - - uchar mask_data = * (mask + mask_index); - - char4 data_0 = *((__global char4 *)((__global char *)dst + dst_index + 0)); - char4 data_1 = *((__global char4 *)((__global char *)dst + dst_index + 4)); - char4 data_2 = *((__global char4 *)((__global char *)dst + dst_index + 8)); - - char4 tmp_data_0 = src1_data_0 & src2_data_0; - char4 tmp_data_1 = src1_data_1 & src2_data_1; - char4 tmp_data_2 = src1_data_2 & src2_data_2; - - data_0 = mask_data ? tmp_data_0 : data_0; - data_1 = mask_data ? tmp_data_1 : data_1; - data_2 = mask_data ? tmp_data_2 : data_2; - - *((__global char4 *)((__global char *)dst + dst_index + 0))= data_0; - *((__global char4 *)((__global char *)dst + dst_index + 4))= data_1; - *((__global char4 *)((__global char *)dst + dst_index + 8))= data_2; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_and_with_mask_C3_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x * 24) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, dst_offset + (x * 24)); - - short4 src1_data_0 = *((__global short4 *)((__global char *)src1 + src1_index + 0 )); - short4 src1_data_1 = *((__global short4 *)((__global char *)src1 + src1_index + 8 )); - short4 src1_data_2 = *((__global short4 *)((__global char *)src1 + src1_index + 16)); - - short4 src2_data_0 = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 src2_data_1 = (short4)(src2.s4, src2.s5, src2.s6, src2.s7); - short4 src2_data_2 = (short4)(src2.s8, src2.s9, src2.sa, src2.sb); - - uchar mask_data = * (mask + mask_index); - - short4 data_0 = *((__global short4 *)((__global char *)dst + dst_index + 0 )); - short4 data_1 = *((__global short4 *)((__global char *)dst + dst_index + 8 )); - short4 data_2 = *((__global short4 *)((__global char *)dst + dst_index + 16)); - - short4 tmp_data_0 = src1_data_0 & src2_data_0; - short4 tmp_data_1 = src1_data_1 & src2_data_1; - short4 tmp_data_2 = src1_data_2 & src2_data_2; - - data_0 = mask_data ? tmp_data_0 : data_0; - data_1 = mask_data ? tmp_data_1 : data_1; - data_2 = mask_data ? tmp_data_2 : data_2; - - *((__global short4 *)((__global char *)dst + dst_index + 0 ))= data_0; - *((__global short4 *)((__global char *)dst + dst_index + 8 ))= data_1; - *((__global short4 *)((__global char *)dst + dst_index + 16))= data_2; - } -} -#endif -__kernel void arithm_s_bitwise_and_with_mask_C4_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); - uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); - - uchar4 data = src_data1 & src2; - data = mask_data ? data : dst_data; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_and_with_mask_C4_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src_data1 = *((__global char4 *)(src1 + src1_index)); - char4 dst_data = *((__global char4 *)(dst + dst_index)); - - char4 data = src_data1 & src2; - data = mask_data ? data : dst_data; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_and_with_mask_C4_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); - ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - - ushort4 data = src_data1 & src2; - data = mask_data ? data : dst_data; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C4_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - - short4 data = src_data1 & src2; - data = mask_data ? data : dst_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C4_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); - int4 dst_data = *((__global int4 *)((__global char *)dst + dst_index)); - - int4 data = src_data1 & src2; - data = mask_data ? data : dst_data; - - *((__global int4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_and_with_mask_C4_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char16 src1_data = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src2_data = (char16)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7, - src2.s8, src2.s9, src2.sa, src2.sb, src2.sc, src2.sd, src2.se, src2.sf); - char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - - char16 data = src1_data & src2_data; - data = mask_data ? data : dst_data; - - *((__global char16 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_and_with_mask_C4_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 5) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 5) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src1_data_0 = *((__global short4 *)((__global char *)src1 + src1_index + 0)); - short4 src1_data_1 = *((__global short4 *)((__global char *)src1 + src1_index + 8)); - short4 src1_data_2 = *((__global short4 *)((__global char *)src1 + src1_index + 16)); - short4 src1_data_3 = *((__global short4 *)((__global char *)src1 + src1_index + 24)); - - short4 src2_data_0 = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 src2_data_1 = (short4)(src2.s4, src2.s5, src2.s6, src2.s7); - short4 src2_data_2 = (short4)(src2.s8, src2.s9, src2.sa, src2.sb); - short4 src2_data_3 = (short4)(src2.sc, src2.sd, src2.se, src2.sf); - - short4 dst_data_0 = *((__global short4 *)((__global char *)dst + dst_index + 0)); - short4 dst_data_1 = *((__global short4 *)((__global char *)dst + dst_index + 8)); - short4 dst_data_2 = *((__global short4 *)((__global char *)dst + dst_index + 16)); - short4 dst_data_3 = *((__global short4 *)((__global char *)dst + dst_index + 24)); - - short4 data_0 = src1_data_0 & src2_data_0; - short4 data_1 = src1_data_1 & src2_data_1; - short4 data_2 = src1_data_2 & src2_data_2; - short4 data_3 = src1_data_3 & src2_data_3; - - data_0 = mask_data ? data_0 : dst_data_0; - data_1 = mask_data ? data_1 : dst_data_1; - data_2 = mask_data ? data_2 : dst_data_2; - data_3 = mask_data ? data_3 : dst_data_3; - - *((__global short4 *)((__global char *)dst + dst_index + 0)) = data_0; - *((__global short4 *)((__global char *)dst + dst_index + 8)) = data_1; - *((__global short4 *)((__global char *)dst + dst_index + 16)) = data_2; - *((__global short4 *)((__global char *)dst + dst_index + 24)) = data_3; - } -} -#endif - diff --git a/modules/ocl/src/opencl/arithm_bitwise_and.cl b/modules/ocl/src/opencl/arithm_bitwise_binary.cl similarity index 91% rename from modules/ocl/src/opencl/arithm_bitwise_and.cl rename to modules/ocl/src/opencl/arithm_bitwise_binary.cl index a369d87439..b1f8545d08 100644 --- a/modules/ocl/src/opencl/arithm_bitwise_and.cl +++ b/modules/ocl/src/opencl/arithm_bitwise_binary.cl @@ -16,6 +16,7 @@ // // @Authors // Jiang Liyuan, jlyuan001.good@163.com +// Peng Xiao, pengxiao@outlook.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -50,11 +51,17 @@ #endif #endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_AND//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_and without mask**************************************/ -__kernel void arithm_bitwise_and_D0 (__global uchar *src1, int src1_step, int src1_offset, +//bitwise_binary without mask for and, or, xor operators + +///////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////bitwise_binary/////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef OP_BINARY +#define OP_BINARY & +#endif + +__kernel void arithm_bitwise_binary_D0 (__global uchar *src1, int src1_step, int src1_offset, __global uchar *src2, int src2_step, int src2_offset, __global uchar *dst, int dst_step, int dst_offset, int rows, int cols, int dst_step1) @@ -95,7 +102,7 @@ __kernel void arithm_bitwise_and_D0 (__global uchar *src1, int src1_step, int sr } uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data & src2_data; + uchar4 tmp_data = src1_data OP_BINARY src2_data; dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; dst_data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : dst_data.y; @@ -107,7 +114,7 @@ __kernel void arithm_bitwise_and_D0 (__global uchar *src1, int src1_step, int sr } -__kernel void arithm_bitwise_and_D1 (__global char *src1, int src1_step, int src1_offset, +__kernel void arithm_bitwise_binary_D1 (__global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global char *dst, int dst_step, int dst_offset, int rows, int cols, int dst_step1) @@ -148,7 +155,7 @@ __kernel void arithm_bitwise_and_D1 (__global char *src1, int src1_step, int src src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw; } char4 dst_data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data & src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; dst_data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : dst_data.y; @@ -160,7 +167,7 @@ __kernel void arithm_bitwise_and_D1 (__global char *src1, int src1_step, int src } -__kernel void arithm_bitwise_and_D2 (__global ushort *src1, int src1_step, int src1_offset, +__kernel void arithm_bitwise_binary_D2 (__global ushort *src1, int src1_step, int src1_offset, __global ushort *src2, int src2_step, int src2_offset, __global ushort *dst, int dst_step, int dst_offset, int rows, int cols, int dst_step1) @@ -202,7 +209,7 @@ __kernel void arithm_bitwise_and_D2 (__global ushort *src1, int src1_step, int s src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw; } ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - ushort4 tmp_data = src1_data & src2_data; + ushort4 tmp_data = src1_data OP_BINARY src2_data; dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; dst_data.y = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : dst_data.y; @@ -215,7 +222,7 @@ __kernel void arithm_bitwise_and_D2 (__global ushort *src1, int src1_step, int s -__kernel void arithm_bitwise_and_D3 (__global short *src1, int src1_step, int src1_offset, +__kernel void arithm_bitwise_binary_D3 (__global short *src1, int src1_step, int src1_offset, __global short *src2, int src2_step, int src2_offset, __global short *dst, int dst_step, int dst_offset, int rows, int cols, int dst_step1) @@ -257,7 +264,7 @@ __kernel void arithm_bitwise_and_D3 (__global short *src1, int src1_step, int sr src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw; } short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - short4 tmp_data = src1_data & src2_data; + short4 tmp_data = src1_data OP_BINARY src2_data; dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; dst_data.y = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : dst_data.y; @@ -270,7 +277,7 @@ __kernel void arithm_bitwise_and_D3 (__global short *src1, int src1_step, int sr -__kernel void arithm_bitwise_and_D4 (__global int *src1, int src1_step, int src1_offset, +__kernel void arithm_bitwise_binary_D4 (__global int *src1, int src1_step, int src1_offset, __global int *src2, int src2_step, int src2_offset, __global int *dst, int dst_step, int dst_offset, int rows, int cols, int dst_step1) @@ -286,13 +293,13 @@ __kernel void arithm_bitwise_and_D4 (__global int *src1, int src1_step, int src1 int data1 = *((__global int *)((__global char *)src1 + src1_index)); int data2 = *((__global int *)((__global char *)src2 + src2_index)); - int tmp = data1 & data2; + int tmp = data1 OP_BINARY data2; *((__global int *)((__global char *)dst + dst_index)) = tmp; } } -__kernel void arithm_bitwise_and_D5 (__global char *src1, int src1_step, int src1_offset, +__kernel void arithm_bitwise_binary_D5 (__global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global char *dst, int dst_step, int dst_offset, int rows, int cols, int dst_step1) @@ -308,14 +315,14 @@ __kernel void arithm_bitwise_and_D5 (__global char *src1, int src1_step, int src char4 data1 = *((__global char4 *)((__global char *)src1 + src1_index)); char4 data2 = *((__global char4 *)((__global char *)src2 + src2_index)); - char4 tmp = data1 & data2; + char4 tmp = data1 OP_BINARY data2; *((__global char4 *)((__global char *)dst + dst_index)) = tmp; } } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_and_D6 (__global char *src1, int src1_step, int src1_offset, +__kernel void arithm_bitwise_binary_D6 (__global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global char *dst, int dst_step, int dst_offset, int rows, int cols, int dst_step1) @@ -332,7 +339,7 @@ __kernel void arithm_bitwise_and_D6 (__global char *src1, int src1_step, int src char8 data1 = *((__global char8 *)((__global char *)src1 + src1_index)); char8 data2 = *((__global char8 *)((__global char *)src2 + src2_index)); - *((__global char8 *)((__global char *)dst + dst_index)) = data1 & data2; + *((__global char8 *)((__global char *)dst + dst_index)) = data1 OP_BINARY data2; } } #endif diff --git a/modules/ocl/src/opencl/arithm_bitwise_or_mask.cl b/modules/ocl/src/opencl/arithm_bitwise_binary_mask.cl similarity index 91% rename from modules/ocl/src/opencl/arithm_bitwise_or_mask.cl rename to modules/ocl/src/opencl/arithm_bitwise_binary_mask.cl index f2cc36e1e0..7e4a884f8c 100644 --- a/modules/ocl/src/opencl/arithm_bitwise_or_mask.cl +++ b/modules/ocl/src/opencl/arithm_bitwise_binary_mask.cl @@ -16,6 +16,7 @@ // // @Authors // Jiang Liyuan, jlyuan001.good@163.com +// Peng Xiao, pengxiao@outlook.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -49,11 +50,16 @@ #pragma OPENCL EXTENSION cl_amd_fp64:enable #endif #endif + +#ifndef OP_BINARY +#define OP_BINARY & +#endif + ////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_OR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_or with mask**************************************/ -__kernel void arithm_bitwise_or_with_mask_C1_D0 ( +////////////////////////////////////////////bitwise_binary//////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////// +/**************************************bitwise_binary with mask**************************************/ +__kernel void arithm_bitwise_binary_with_mask_C1_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -85,7 +91,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D0 ( uchar4 mask_data = vload4(0, mask + mask_index); uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data | src2_data; + uchar4 tmp_data = src1_data OP_BINARY src2_data; data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; @@ -98,7 +104,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D0 ( -__kernel void arithm_bitwise_or_with_mask_C1_D1 ( +__kernel void arithm_bitwise_binary_with_mask_C1_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -130,7 +136,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D1 ( uchar4 mask_data = vload4(0, mask + mask_index); char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data | src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; data.x = convert_char((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = convert_char((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; @@ -143,7 +149,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D1 ( -__kernel void arithm_bitwise_or_with_mask_C1_D2 ( +__kernel void arithm_bitwise_binary_with_mask_C1_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -161,7 +167,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D2 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -175,7 +181,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D2 ( uchar2 mask_data = vload2(0, mask + mask_index); ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data | src2_data; + ushort2 tmp_data = src1_data OP_BINARY src2_data; data.x = convert_ushort((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = convert_ushort((mask_data.y) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : data.y; @@ -186,7 +192,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D2 ( -__kernel void arithm_bitwise_or_with_mask_C1_D3 ( +__kernel void arithm_bitwise_binary_with_mask_C1_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -204,7 +210,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D3 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -218,7 +224,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D3 ( uchar2 mask_data = vload2(0, mask + mask_index); short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - short2 tmp_data = src1_data | src2_data; + short2 tmp_data = src1_data OP_BINARY src2_data; data.x = convert_short((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = convert_short((mask_data.y) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : data.y; @@ -229,7 +235,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D3 ( -__kernel void arithm_bitwise_or_with_mask_C1_D4 ( +__kernel void arithm_bitwise_binary_with_mask_C1_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -253,7 +259,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D4 ( int src_data2 = *((__global int *)((__global char *)src2 + src2_index)); int dst_data = *((__global int *)((__global char *)dst + dst_index)); - int data = src_data1 | src_data2; + int data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global int *)((__global char *)dst + dst_index)) = data; @@ -262,7 +268,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D4 ( -__kernel void arithm_bitwise_or_with_mask_C1_D5 ( +__kernel void arithm_bitwise_binary_with_mask_C1_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -286,7 +292,7 @@ __kernel void arithm_bitwise_or_with_mask_C1_D5 ( char4 src_data2 = *((__global char4 *)((__global char *)src2 + src2_index)); char4 dst_data = *((__global char4 *)((__global char *)dst + dst_index)); - char4 data = src_data1 | src_data2; + char4 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global char4 *)((__global char *)dst + dst_index)) = data; @@ -294,8 +300,8 @@ __kernel void arithm_bitwise_or_with_mask_C1_D5 ( } -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_or_with_mask_C1_D6 ( + +__kernel void arithm_bitwise_binary_with_mask_C1_D6 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -319,17 +325,17 @@ __kernel void arithm_bitwise_or_with_mask_C1_D6 ( char8 src_data2 = *((__global char8 *)((__global char *)src2 + src2_index)); char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - char8 data = src_data1 | src_data2; + char8 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global char8 *)((__global char *)dst + dst_index)) = data; } } -#endif -__kernel void arithm_bitwise_or_with_mask_C2_D0 ( + +__kernel void arithm_bitwise_binary_with_mask_C2_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -347,7 +353,7 @@ __kernel void arithm_bitwise_or_with_mask_C2_D0 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -361,7 +367,7 @@ __kernel void arithm_bitwise_or_with_mask_C2_D0 ( uchar2 mask_data = vload2(0, mask + mask_index); uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data | src2_data; + uchar4 tmp_data = src1_data OP_BINARY src2_data; data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; @@ -371,7 +377,7 @@ __kernel void arithm_bitwise_or_with_mask_C2_D0 ( } -__kernel void arithm_bitwise_or_with_mask_C2_D1 ( +__kernel void arithm_bitwise_binary_with_mask_C2_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -389,7 +395,7 @@ __kernel void arithm_bitwise_or_with_mask_C2_D1 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -403,7 +409,7 @@ __kernel void arithm_bitwise_or_with_mask_C2_D1 ( uchar2 mask_data = vload2(0, mask + mask_index); char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data | src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; @@ -412,7 +418,7 @@ __kernel void arithm_bitwise_or_with_mask_C2_D1 ( } } -__kernel void arithm_bitwise_or_with_mask_C2_D2 ( +__kernel void arithm_bitwise_binary_with_mask_C2_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -436,13 +442,13 @@ __kernel void arithm_bitwise_or_with_mask_C2_D2 ( ushort2 src_data2 = *((__global ushort2 *)((__global char *)src2 + src2_index)); ushort2 dst_data = *((__global ushort2 *)((__global char *)dst + dst_index)); - ushort2 data = src_data1 | src_data2; + ushort2 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global ushort2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_bitwise_or_with_mask_C2_D3 ( +__kernel void arithm_bitwise_binary_with_mask_C2_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -466,13 +472,13 @@ __kernel void arithm_bitwise_or_with_mask_C2_D3 ( short2 src_data2 = *((__global short2 *)((__global char *)src2 + src2_index)); short2 dst_data = *((__global short2 *)((__global char *)dst + dst_index)); - short2 data = src_data1 | src_data2; + short2 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global short2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_bitwise_or_with_mask_C2_D4 ( +__kernel void arithm_bitwise_binary_with_mask_C2_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -496,13 +502,13 @@ __kernel void arithm_bitwise_or_with_mask_C2_D4 ( int2 src_data2 = *((__global int2 *)((__global char *)src2 + src2_index)); int2 dst_data = *((__global int2 *)((__global char *)dst + dst_index)); - int2 data = src_data1 | src_data2; + int2 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global int2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_bitwise_or_with_mask_C2_D5 ( +__kernel void arithm_bitwise_binary_with_mask_C2_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -526,14 +532,14 @@ __kernel void arithm_bitwise_or_with_mask_C2_D5 ( char8 src_data2 = *((__global char8 *)((__global char *)src2 + src2_index)); char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - char8 data = src_data1 | src_data2; + char8 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global char8 *)((__global char *)dst + dst_index)) = data; } } -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_or_with_mask_C2_D6 ( + +__kernel void arithm_bitwise_binary_with_mask_C2_D6 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -557,16 +563,15 @@ __kernel void arithm_bitwise_or_with_mask_C2_D6 ( char16 src_data2 = *((__global char16 *)((__global char *)src2 + src2_index)); char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - char16 data = src_data1 | src_data2; + char16 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global char16 *)((__global char *)dst + dst_index)) = data; } } -#endif -__kernel void arithm_bitwise_or_with_mask_C4_D0 ( +__kernel void arithm_bitwise_binary_with_mask_C4_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -590,7 +595,7 @@ __kernel void arithm_bitwise_or_with_mask_C4_D0 ( uchar4 src_data2 = *((__global uchar4 *)(src2 + src2_index)); uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); - uchar4 data = src_data1 | src_data2; + uchar4 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global uchar4 *)(dst + dst_index)) = data; @@ -598,7 +603,7 @@ __kernel void arithm_bitwise_or_with_mask_C4_D0 ( } -__kernel void arithm_bitwise_or_with_mask_C4_D1 ( +__kernel void arithm_bitwise_binary_with_mask_C4_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -622,14 +627,14 @@ __kernel void arithm_bitwise_or_with_mask_C4_D1 ( char4 src_data2 = *((__global char4 *)(src2 + src2_index)); char4 dst_data = *((__global char4 *)(dst + dst_index)); - char4 data = src_data1 | src_data2; + char4 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global char4 *)(dst + dst_index)) = data; } } -__kernel void arithm_bitwise_or_with_mask_C4_D2 ( +__kernel void arithm_bitwise_binary_with_mask_C4_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -653,13 +658,13 @@ __kernel void arithm_bitwise_or_with_mask_C4_D2 ( ushort4 src_data2 = *((__global ushort4 *)((__global char *)src2 + src2_index)); ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - ushort4 data = src_data1 | src_data2; + ushort4 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global ushort4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_bitwise_or_with_mask_C4_D3 ( +__kernel void arithm_bitwise_binary_with_mask_C4_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -683,13 +688,13 @@ __kernel void arithm_bitwise_or_with_mask_C4_D3 ( short4 src_data2 = *((__global short4 *)((__global char *)src2 + src2_index)); short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - short4 data = src_data1 | src_data2; + short4 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global short4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_bitwise_or_with_mask_C4_D4 ( +__kernel void arithm_bitwise_binary_with_mask_C4_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -713,13 +718,13 @@ __kernel void arithm_bitwise_or_with_mask_C4_D4 ( int4 src_data2 = *((__global int4 *)((__global char *)src2 + src2_index)); int4 dst_data = *((__global int4 *)((__global char *)dst + dst_index)); - int4 data = src_data1 | src_data2; + int4 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global int4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_bitwise_or_with_mask_C4_D5 ( +__kernel void arithm_bitwise_binary_with_mask_C4_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -743,14 +748,14 @@ __kernel void arithm_bitwise_or_with_mask_C4_D5 ( char16 src_data2 = *((__global char16 *)((__global char *)src2 + src2_index)); char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - char16 data = src_data1 | src_data2; + char16 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global char16 *)((__global char *)dst + dst_index)) = data; } } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_or_with_mask_C4_D6 ( +__kernel void arithm_bitwise_binary_with_mask_C4_D6 ( __global char *src1, int src1_step, int src1_offset, __global char *src2, int src2_step, int src2_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -785,10 +790,10 @@ __kernel void arithm_bitwise_or_with_mask_C4_D6 ( char8 dst_data_2 = *((__global char8 *)((__global char *)dst + dst_index + 16)); char8 dst_data_3 = *((__global char8 *)((__global char *)dst + dst_index + 24)); - char8 data_0 = src_data1_0 | src_data2_0; - char8 data_1 = src_data1_1 | src_data2_1; - char8 data_2 = src_data1_2 | src_data2_2; - char8 data_3 = src_data1_3 | src_data2_3; + char8 data_0 = src_data1_0 OP_BINARY src_data2_0; + char8 data_1 = src_data1_1 OP_BINARY src_data2_1; + char8 data_2 = src_data1_2 OP_BINARY src_data2_2; + char8 data_3 = src_data1_3 OP_BINARY src_data2_3; data_0 = mask_data ? data_0 : dst_data_0; data_1 = mask_data ? data_1 : dst_data_1; diff --git a/modules/ocl/src/opencl/arithm_bitwise_and_scalar.cl b/modules/ocl/src/opencl/arithm_bitwise_binary_scalar.cl similarity index 88% rename from modules/ocl/src/opencl/arithm_bitwise_and_scalar.cl rename to modules/ocl/src/opencl/arithm_bitwise_binary_scalar.cl index 9605476581..ce870b3f18 100644 --- a/modules/ocl/src/opencl/arithm_bitwise_and_scalar.cl +++ b/modules/ocl/src/opencl/arithm_bitwise_binary_scalar.cl @@ -16,6 +16,7 @@ // // @Authors // Jiang Liyuan, jlyuan001.good@163.com +// Peng Xiao, pengxiao@outlook.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -50,11 +51,15 @@ #endif #endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_AND//////////////////////////////////////////////////// +#ifndef OP_BINARY +#define OP_BINARY & +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////////bitwise_binary///////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************and with scalar without mask**************************************/ -__kernel void arithm_s_bitwise_and_C1_D0 ( +/******************************bitwise binary with scalar without mask********************************/ +__kernel void arithm_s_bitwise_binary_C1_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *dst, int dst_step, int dst_offset, uchar4 src2, int rows, int cols, int dst_step1) @@ -80,7 +85,7 @@ __kernel void arithm_s_bitwise_and_C1_D0 ( uchar4 src2_data = (uchar4)(src2.x, src2.x, src2.x, src2.x); uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data & src2_data; + uchar4 tmp_data = src1_data OP_BINARY src2_data; data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; @@ -92,7 +97,7 @@ __kernel void arithm_s_bitwise_and_C1_D0 ( } -__kernel void arithm_s_bitwise_and_C1_D1 ( +__kernel void arithm_s_bitwise_binary_C1_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, char4 src2, int rows, int cols, int dst_step1) @@ -118,7 +123,7 @@ __kernel void arithm_s_bitwise_and_C1_D1 ( char4 src2_data = (char4)(src2.x, src2.x, src2.x, src2.x); char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data & src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; @@ -129,7 +134,7 @@ __kernel void arithm_s_bitwise_and_C1_D1 ( } } -__kernel void arithm_s_bitwise_and_C1_D2 ( +__kernel void arithm_s_bitwise_binary_C1_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *dst, int dst_step, int dst_offset, ushort4 src2, int rows, int cols, int dst_step1) @@ -156,7 +161,7 @@ __kernel void arithm_s_bitwise_and_C1_D2 ( ushort2 src2_data = (ushort2)(src2.x, src2.x); ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data & src2_data; + ushort2 tmp_data = src1_data OP_BINARY src2_data; data.x = (dst_index + 0 >= dst_start) ? tmp_data.x : data.x; data.y = (dst_index + 2 < dst_end ) ? tmp_data.y : data.y; @@ -164,7 +169,7 @@ __kernel void arithm_s_bitwise_and_C1_D2 ( *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C1_D3 ( +__kernel void arithm_s_bitwise_binary_C1_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, short4 src2, int rows, int cols, int dst_step1) @@ -191,7 +196,7 @@ __kernel void arithm_s_bitwise_and_C1_D3 ( short2 src2_data = (short2)(src2.x, src2.x); short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - short2 tmp_data = src1_data & src2_data; + short2 tmp_data = src1_data OP_BINARY src2_data; data.x = (dst_index + 0 >= dst_start) ? tmp_data.x : data.x; data.y = (dst_index + 2 < dst_end ) ? tmp_data.y : data.y; @@ -199,7 +204,7 @@ __kernel void arithm_s_bitwise_and_C1_D3 ( *((__global short2 *)((__global uchar *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C1_D4 ( +__kernel void arithm_s_bitwise_binary_C1_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *dst, int dst_step, int dst_offset, int4 src2, int rows, int cols, int dst_step1) @@ -216,12 +221,12 @@ __kernel void arithm_s_bitwise_and_C1_D4 ( int src_data1 = *((__global int *)((__global char *)src1 + src1_index)); int src_data2 = src2.x; - int data = src_data1 & src_data2; + int data = src_data1 OP_BINARY src_data2; *((__global int *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C1_D5 ( +__kernel void arithm_s_bitwise_binary_C1_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, char16 src2, int rows, int cols, int dst_step1) @@ -242,7 +247,7 @@ __kernel void arithm_s_bitwise_and_C1_D5 ( char4 src2_data = (char4)(src2.s0, src2.s1, src2.s2, src2.s3); char4 data = *((__global char4 *)((__global char *)dst + dst_index)); - char4 tmp_data = src1_data & src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; @@ -253,7 +258,7 @@ __kernel void arithm_s_bitwise_and_C1_D5 ( } } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_and_C1_D6 ( +__kernel void arithm_s_bitwise_binary_C1_D6 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, short16 src2, int rows, int cols, int dst_step1) @@ -270,13 +275,13 @@ __kernel void arithm_s_bitwise_and_C1_D6 ( short4 src1_data = *((__global short4 *)((__global char *)src1 + src1_index)); short4 src2_data = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 tmp_data = src1_data & src2_data; + short4 tmp_data = src1_data OP_BINARY src2_data; *((__global short4 *)((__global char *)dst + dst_index)) = tmp_data; } } #endif -__kernel void arithm_s_bitwise_and_C2_D0 ( +__kernel void arithm_s_bitwise_binary_C2_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *dst, int dst_step, int dst_offset, uchar4 src2, int rows, int cols, int dst_step1) @@ -303,7 +308,7 @@ __kernel void arithm_s_bitwise_and_C2_D0 ( uchar4 src2_data = (uchar4)(src2.x, src2.y, src2.x, src2.y); uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data & src2_data; + uchar4 tmp_data = src1_data OP_BINARY src2_data; data.xy = (dst_index + 0 >= dst_start) ? tmp_data.xy : data.xy; @@ -314,7 +319,7 @@ __kernel void arithm_s_bitwise_and_C2_D0 ( } -__kernel void arithm_s_bitwise_and_C2_D1 ( +__kernel void arithm_s_bitwise_binary_C2_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, char4 src2, int rows, int cols, int dst_step1) @@ -341,7 +346,7 @@ __kernel void arithm_s_bitwise_and_C2_D1 ( char4 src2_data = (char4)(src2.x, src2.y, src2.x, src2.y); char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data & src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; data.xy = (dst_index + 0 >= dst_start) ? tmp_data.xy : data.xy; data.zw = (dst_index + 2 < dst_end ) ? tmp_data.zw : data.zw; @@ -350,7 +355,7 @@ __kernel void arithm_s_bitwise_and_C2_D1 ( } } -__kernel void arithm_s_bitwise_and_C2_D2 ( +__kernel void arithm_s_bitwise_binary_C2_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *dst, int dst_step, int dst_offset, ushort4 src2, int rows, int cols, int dst_step1) @@ -367,12 +372,12 @@ __kernel void arithm_s_bitwise_and_C2_D2 ( ushort2 src_data1 = *((__global ushort2 *)((__global char *)src1 + src1_index)); ushort2 src_data2 = (ushort2)(src2.x, src2.y); - ushort2 data = src_data1 & src_data2; + ushort2 data = src_data1 OP_BINARY src_data2; *((__global ushort2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C2_D3 ( +__kernel void arithm_s_bitwise_binary_C2_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, short4 src2, int rows, int cols, int dst_step1) @@ -389,12 +394,12 @@ __kernel void arithm_s_bitwise_and_C2_D3 ( short2 src_data1 = *((__global short2 *)((__global char *)src1 + src1_index)); short2 src_data2 = (short2)(src2.x, src2.y); - short2 data = src_data1 & src_data2; + short2 data = src_data1 OP_BINARY src_data2; *((__global short2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C2_D4 ( +__kernel void arithm_s_bitwise_binary_C2_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *dst, int dst_step, int dst_offset, int4 src2, int rows, int cols, int dst_step1) @@ -411,11 +416,11 @@ __kernel void arithm_s_bitwise_and_C2_D4 ( int2 src_data1 = *((__global int2 *)((__global char *)src1 + src1_index)); int2 src_data2 = (int2)(src2.x, src2.y); - int2 data = src_data1 & src_data2; + int2 data = src_data1 OP_BINARY src_data2; *((__global int2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C2_D5 ( +__kernel void arithm_s_bitwise_binary_C2_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, char16 src2, int rows, int cols, int dst_step1) @@ -432,13 +437,13 @@ __kernel void arithm_s_bitwise_and_C2_D5 ( char8 src1_data = *((__global char8 *)((__global char *)src1 + src1_index)); char8 src2_data = (char8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - char8 tmp_data = src1_data & src2_data; + char8 tmp_data = src1_data OP_BINARY src2_data; *((__global char8 *)((__global char *)dst + dst_index)) = tmp_data; } } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_and_C2_D6 ( +__kernel void arithm_s_bitwise_binary_C2_D6 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, short16 src2, int rows, int cols, int dst_step1) @@ -455,14 +460,14 @@ __kernel void arithm_s_bitwise_and_C2_D6 ( short8 src1_data = *((__global short8 *)((__global char *)src1 + src1_index)); short8 src2_data = (short8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - short8 tmp_data = src1_data & src2_data; + short8 tmp_data = src1_data OP_BINARY src2_data; *((__global short8 *)((__global char *)dst + dst_index)) = tmp_data; } } #endif -__kernel void arithm_s_bitwise_and_C4_D0 ( +__kernel void arithm_s_bitwise_binary_C4_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *dst, int dst_step, int dst_offset, uchar4 src2, int rows, int cols, int dst_step1) @@ -478,14 +483,14 @@ __kernel void arithm_s_bitwise_and_C4_D0 ( uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); - uchar4 data = src_data1 & src2; + uchar4 data = src_data1 OP_BINARY src2; *((__global uchar4 *)(dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C4_D1 ( +__kernel void arithm_s_bitwise_binary_C4_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, char4 src2, int rows, int cols, int dst_step1) @@ -501,13 +506,13 @@ __kernel void arithm_s_bitwise_and_C4_D1 ( char4 src_data1 = *((__global char4 *)(src1 + src1_index)); - char4 data = src_data1 & src2; + char4 data = src_data1 OP_BINARY src2; *((__global char4 *)(dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C4_D2 ( +__kernel void arithm_s_bitwise_binary_C4_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *dst, int dst_step, int dst_offset, ushort4 src2, int rows, int cols, int dst_step1) @@ -523,12 +528,12 @@ __kernel void arithm_s_bitwise_and_C4_D2 ( ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); - ushort4 data = src_data1 & src2; + ushort4 data = src_data1 OP_BINARY src2; *((__global ushort4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C4_D3 ( +__kernel void arithm_s_bitwise_binary_C4_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, short4 src2, int rows, int cols, int dst_step1) @@ -544,12 +549,12 @@ __kernel void arithm_s_bitwise_and_C4_D3 ( short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 data = src_data1 & src2; + short4 data = src_data1 OP_BINARY src2; *((__global short4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C4_D4 ( +__kernel void arithm_s_bitwise_binary_C4_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *dst, int dst_step, int dst_offset, int4 src2, int rows, int cols, int dst_step1) @@ -565,12 +570,12 @@ __kernel void arithm_s_bitwise_and_C4_D4 ( int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); - int4 data = src_data1 & src2; + int4 data = src_data1 OP_BINARY src2; *((__global int4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_and_C4_D5 ( +__kernel void arithm_s_bitwise_binary_C4_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, char16 src2, int rows, int cols, int dst_step1) @@ -588,13 +593,13 @@ __kernel void arithm_s_bitwise_and_C4_D5 ( char16 src2_data = (char16)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7, src2.s8, src2.s9, src2.sa, src2.sb, src2.sc, src2.sd, src2.se, src2.sf); - char16 tmp_data = src1_data & src2_data; + char16 tmp_data = src1_data OP_BINARY src2_data; *((__global char16 *)((__global char *)dst + dst_index)) = tmp_data; } } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_and_C4_D6 ( +__kernel void arithm_s_bitwise_binary_C4_D6 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, short16 src2, int rows, int cols, int dst_step1) @@ -618,10 +623,10 @@ __kernel void arithm_s_bitwise_and_C4_D6 ( short4 src2_data_2 = (short4)(src2.s8, src2.s9, src2.sa, src2.sb); short4 src2_data_3 = (short4)(src2.sc, src2.sd, src2.se, src2.sf); - short4 tmp_data_0 = src1_data_0 & src2_data_0; - short4 tmp_data_1 = src1_data_1 & src2_data_1; - short4 tmp_data_2 = src1_data_2 & src2_data_2; - short4 tmp_data_3 = src1_data_3 & src2_data_3; + short4 tmp_data_0 = src1_data_0 OP_BINARY src2_data_0; + short4 tmp_data_1 = src1_data_1 OP_BINARY src2_data_1; + short4 tmp_data_2 = src1_data_2 OP_BINARY src2_data_2; + short4 tmp_data_3 = src1_data_3 OP_BINARY src2_data_3; *((__global short4 *)((__global char *)dst + dst_index + 0 ))= tmp_data_0; *((__global short4 *)((__global char *)dst + dst_index + 8 ))= tmp_data_1; diff --git a/modules/ocl/src/opencl/arithm_bitwise_xor_scalar_mask.cl b/modules/ocl/src/opencl/arithm_bitwise_binary_scalar_mask.cl similarity index 90% rename from modules/ocl/src/opencl/arithm_bitwise_xor_scalar_mask.cl rename to modules/ocl/src/opencl/arithm_bitwise_binary_scalar_mask.cl index ad481aad80..9f5bac5b64 100644 --- a/modules/ocl/src/opencl/arithm_bitwise_xor_scalar_mask.cl +++ b/modules/ocl/src/opencl/arithm_bitwise_binary_scalar_mask.cl @@ -42,7 +42,6 @@ // the use of this software, even if advised of the possibility of such damage. // //M*/ - #if defined (DOUBLE_SUPPORT) #ifdef cl_khr_fp64 #pragma OPENCL EXTENSION cl_khr_fp64:enable @@ -50,11 +49,16 @@ #pragma OPENCL EXTENSION cl_amd_fp64:enable #endif #endif + +#ifndef OP_BINARY +#define OP_BINARY & +#endif + ////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_XOR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_xor with scalar with mask**************************************/ -__kernel void arithm_s_bitwise_xor_with_mask_C1_D0 ( +////////////////////////////////////////////bitwise_binary//////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////// +/**************************************bitwise_binary with scalar with mask**************************************/ +__kernel void arithm_s_bitwise_binary_with_mask_C1_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -84,7 +88,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D0 ( uchar4 mask_data = vload4(0, mask + mask_index); uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data ^ src2_data; + uchar4 tmp_data = src1_data OP_BINARY src2_data; data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; @@ -96,7 +100,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D0 ( } -__kernel void arithm_s_bitwise_xor_with_mask_C1_D1 ( +__kernel void arithm_s_bitwise_binary_with_mask_C1_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -126,7 +130,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D1 ( uchar4 mask_data = vload4(0, mask + mask_index); char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; @@ -137,7 +141,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D1 ( } } -__kernel void arithm_s_bitwise_xor_with_mask_C1_D2 ( +__kernel void arithm_s_bitwise_binary_with_mask_C1_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -154,7 +158,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D2 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -167,7 +171,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D2 ( uchar2 mask_data = vload2(0, mask + mask_index); ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data ^ src2_data; + ushort2 tmp_data = src1_data OP_BINARY src2_data; data.x = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.x : data.x; data.y = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.y : data.y; @@ -175,7 +179,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D2 ( *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C1_D3 ( +__kernel void arithm_s_bitwise_binary_with_mask_C1_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -192,7 +196,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D3 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -205,7 +209,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D3 ( uchar2 mask_data = vload2(0, mask + mask_index); short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - short2 tmp_data = src1_data ^ src2_data; + short2 tmp_data = src1_data OP_BINARY src2_data; data.x = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.x : data.x; data.y = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.y : data.y; @@ -213,7 +217,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D3 ( *((__global short2 *)((__global uchar *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C1_D4 ( +__kernel void arithm_s_bitwise_binary_with_mask_C1_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -235,14 +239,14 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D4 ( int src_data2 = src2.x; int dst_data = *((__global int *)((__global char *)dst + dst_index)); - int data = src_data1 ^ src_data2; + int data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global int *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C1_D5 ( +__kernel void arithm_s_bitwise_binary_with_mask_C1_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -264,7 +268,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D5 ( char4 src2_data = (char4)(src2.s0, src2.s1, src2.s2, src2.s3); char4 dst_data = *((__global char4 *)((__global char *)dst + dst_index)); - char4 data = src1_data ^ src2_data; + char4 data = src1_data OP_BINARY src2_data; data = mask_data ? data : dst_data; *((__global char4 *)((__global char *)dst + dst_index)) = data; @@ -272,7 +276,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D5 ( } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_xor_with_mask_C1_D6 ( +__kernel void arithm_s_bitwise_binary_with_mask_C1_D6 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -294,14 +298,14 @@ __kernel void arithm_s_bitwise_xor_with_mask_C1_D6 ( short4 src2_data = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - short4 data = src1_data ^ src2_data; + short4 data = src1_data OP_BINARY src2_data; data = mask_data ? data : dst_data; *((__global short4 *)((__global char *)dst + dst_index)) = data; } } #endif -__kernel void arithm_s_bitwise_xor_with_mask_C2_D0 ( +__kernel void arithm_s_bitwise_binary_with_mask_C2_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -318,7 +322,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D0 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -331,7 +335,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D0 ( uchar2 mask_data = vload2(0, mask + mask_index); uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data ^ src2_data; + uchar4 tmp_data = src1_data OP_BINARY src2_data; data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; @@ -341,7 +345,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D0 ( } -__kernel void arithm_s_bitwise_xor_with_mask_C2_D1 ( +__kernel void arithm_s_bitwise_binary_with_mask_C2_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -358,7 +362,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D1 ( #ifdef dst_align #undef dst_align #endif -#define dst_align ((dst_offset >> 1) & 1) +#define dst_align ((dst_offset / 2) & 1) int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); @@ -371,7 +375,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D1 ( uchar2 mask_data = vload2(0, mask + mask_index); char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; + char4 tmp_data = src1_data OP_BINARY src2_data; data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; @@ -380,7 +384,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D1 ( } } -__kernel void arithm_s_bitwise_xor_with_mask_C2_D2 ( +__kernel void arithm_s_bitwise_binary_with_mask_C2_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -402,13 +406,13 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D2 ( ushort2 src_data2 = (ushort2)(src2.x, src2.y); ushort2 dst_data = *((__global ushort2 *)((__global char *)dst + dst_index)); - ushort2 data = src_data1 ^ src_data2; + ushort2 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global ushort2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C2_D3 ( +__kernel void arithm_s_bitwise_binary_with_mask_C2_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -430,13 +434,13 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D3 ( short2 src_data2 = (short2)(src2.x, src2.y); short2 dst_data = *((__global short2 *)((__global char *)dst + dst_index)); - short2 data = src_data1 ^ src_data2; + short2 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global short2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C2_D4 ( +__kernel void arithm_s_bitwise_binary_with_mask_C2_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -458,13 +462,13 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D4 ( int2 src_data2 = (int2)(src2.x, src2.y); int2 dst_data = *((__global int2 *)((__global char *)dst + dst_index)); - int2 data = src_data1 ^ src_data2; + int2 data = src_data1 OP_BINARY src_data2; data = mask_data ? data : dst_data; *((__global int2 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C2_D5 ( +__kernel void arithm_s_bitwise_binary_with_mask_C2_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -486,7 +490,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D5 ( char8 src2_data = (char8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - char8 data = src1_data ^ src2_data; + char8 data = src1_data OP_BINARY src2_data; data = mask_data ? data : dst_data; @@ -494,7 +498,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D5 ( } } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_xor_with_mask_C2_D6 ( +__kernel void arithm_s_bitwise_binary_with_mask_C2_D6 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -516,15 +520,14 @@ __kernel void arithm_s_bitwise_xor_with_mask_C2_D6 ( short8 src2_data = (short8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); short8 dst_data = *((__global short8 *)((__global char *)dst + dst_index)); - short8 data = src1_data ^ src2_data; + short8 data = src1_data OP_BINARY src2_data; data = mask_data ? data : dst_data; *((__global short8 *)((__global char *)dst + dst_index)) = data; } } #endif - -__kernel void arithm_s_bitwise_xor_with_mask_C4_D0 ( +__kernel void arithm_s_bitwise_binary_with_mask_C4_D0 ( __global uchar *src1, int src1_step, int src1_offset, __global uchar *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -545,7 +548,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D0 ( uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); - uchar4 data = src_data1 ^ src2; + uchar4 data = src_data1 OP_BINARY src2; data = mask_data ? data : dst_data; *((__global uchar4 *)(dst + dst_index)) = data; @@ -553,7 +556,7 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D0 ( } -__kernel void arithm_s_bitwise_xor_with_mask_C4_D1 ( +__kernel void arithm_s_bitwise_binary_with_mask_C4_D1 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -574,14 +577,14 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D1 ( char4 src_data1 = *((__global char4 *)(src1 + src1_index)); char4 dst_data = *((__global char4 *)(dst + dst_index)); - char4 data = src_data1 ^ src2; + char4 data = src_data1 OP_BINARY src2; data = mask_data ? data : dst_data; *((__global char4 *)(dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C4_D2 ( +__kernel void arithm_s_bitwise_binary_with_mask_C4_D2 ( __global ushort *src1, int src1_step, int src1_offset, __global ushort *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -602,13 +605,13 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D2 ( ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - ushort4 data = src_data1 ^ src2; + ushort4 data = src_data1 OP_BINARY src2; data = mask_data ? data : dst_data; *((__global ushort4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C4_D3 ( +__kernel void arithm_s_bitwise_binary_with_mask_C4_D3 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -629,13 +632,13 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D3 ( short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - short4 data = src_data1 ^ src2; + short4 data = src_data1 OP_BINARY src2; data = mask_data ? data : dst_data; *((__global short4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C4_D4 ( +__kernel void arithm_s_bitwise_binary_with_mask_C4_D4 ( __global int *src1, int src1_step, int src1_offset, __global int *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -656,13 +659,13 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D4 ( int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); int4 dst_data = *((__global int4 *)((__global char *)dst + dst_index)); - int4 data = src_data1 ^ src2; + int4 data = src_data1 OP_BINARY src2; data = mask_data ? data : dst_data; *((__global int4 *)((__global char *)dst + dst_index)) = data; } } -__kernel void arithm_s_bitwise_xor_with_mask_C4_D5 ( +__kernel void arithm_s_bitwise_binary_with_mask_C4_D5 ( __global char *src1, int src1_step, int src1_offset, __global char *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -685,14 +688,14 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D5 ( src2.s8, src2.s9, src2.sa, src2.sb, src2.sc, src2.sd, src2.se, src2.sf); char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - char16 data = src1_data ^ src2_data; + char16 data = src1_data OP_BINARY src2_data; data = mask_data ? data : dst_data; *((__global char16 *)((__global char *)dst + dst_index)) = data; } } #if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_xor_with_mask_C4_D6 ( +__kernel void arithm_s_bitwise_binary_with_mask_C4_D6 ( __global short *src1, int src1_step, int src1_offset, __global short *dst, int dst_step, int dst_offset, __global uchar *mask, int mask_step, int mask_offset, @@ -725,10 +728,10 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D6 ( short4 dst_data_2 = *((__global short4 *)((__global char *)dst + dst_index + 16)); short4 dst_data_3 = *((__global short4 *)((__global char *)dst + dst_index + 24)); - short4 data_0 = src1_data_0 ^ src2_data_0; - short4 data_1 = src1_data_1 ^ src2_data_1; - short4 data_2 = src1_data_2 ^ src2_data_2; - short4 data_3 = src1_data_3 ^ src2_data_3; + short4 data_0 = src1_data_0 OP_BINARY src2_data_0; + short4 data_1 = src1_data_1 OP_BINARY src2_data_1; + short4 data_2 = src1_data_2 OP_BINARY src2_data_2; + short4 data_3 = src1_data_3 OP_BINARY src2_data_3; data_0 = mask_data ? data_0 : dst_data_0; data_1 = mask_data ? data_1 : dst_data_1; @@ -742,3 +745,4 @@ __kernel void arithm_s_bitwise_xor_with_mask_C4_D6 ( } } #endif + diff --git a/modules/ocl/src/opencl/arithm_bitwise_or.cl b/modules/ocl/src/opencl/arithm_bitwise_or.cl deleted file mode 100644 index 4d47b21271..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_or.cl +++ /dev/null @@ -1,294 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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*/ -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif - -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_OR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_or without mask**************************************/ -__kernel void arithm_bitwise_or_D0 (__global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - int src1_index_fix = src1_index < 0 ? 0 : src1_index; - int src2_index_fix = src2_index < 0 ? 0 : 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 tmp_data = src1_data | src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global uchar4 *)(dst + dst_index)) = dst_data; - } -} - - -__kernel void arithm_bitwise_or_D1 (__global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = vload4(0, src2 + src2_index); - - char4 dst_data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data | src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global char4 *)(dst + dst_index)) = dst_data; - } -} - - -__kernel void arithm_bitwise_or_D2 (__global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) - -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 3) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffff8); - - ushort4 src1_data = vload4(0, (__global ushort *)((__global char *)src1 + src1_index)); - ushort4 src2_data = vload4(0, (__global ushort *)((__global char *)src2 + src2_index)); - - ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - ushort4 tmp_data = src1_data | src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 4 >= dst_start) && (dst_index + 4 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = dst_data; - } -} - - - -__kernel void arithm_bitwise_or_D3 (__global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) - -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 3) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffff8); - - short4 src1_data = vload4(0, (__global short *)((__global char *)src1 + src1_index)); - short4 src2_data = vload4(0, (__global short *)((__global char *)src2 + src2_index)); - - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - short4 tmp_data = src1_data | src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 4 >= dst_start) && (dst_index + 4 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global short4 *)((__global char *)dst + dst_index)) = dst_data; - } -} - - - -__kernel void arithm_bitwise_or_D4 (__global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - int data1 = *((__global int *)((__global char *)src1 + src1_index)); - int data2 = *((__global int *)((__global char *)src2 + src2_index)); - int tmp = data1 | data2; - - *((__global int *)((__global char *)dst + dst_index)) = tmp; - } -} - -__kernel void arithm_bitwise_or_D5 (__global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - char4 data1 = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 data2 = *((__global char4 *)((__global char *)src2 + src2_index)); - char4 tmp = data1 | data2; - - *((__global char4 *)((__global char *)dst + dst_index)) = tmp; - } -} - -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_or_D6 (__global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - char8 data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 data2 = *((__global char8 *)((__global char *)src2 + src2_index)); - - *((__global char8 *)((__global char *)dst + dst_index)) = data1 | data2; - } -} -#endif diff --git a/modules/ocl/src/opencl/arithm_bitwise_or_scalar.cl b/modules/ocl/src/opencl/arithm_bitwise_or_scalar.cl deleted file mode 100644 index 7ade345f9b..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_or_scalar.cl +++ /dev/null @@ -1,636 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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*/ -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif - -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_OR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************and with scalar without mask**************************************/ -__kernel void arithm_s_bitwise_or_C1_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.x, src2.x, src2.x); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data | src2_data; - - data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_or_C1_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.x, src2.x, src2.x); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data | src2_data; - - data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_or_C1_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - ushort2 src1_data = vload2(0, (__global ushort *)((__global char *)src1 + src1_index)); - ushort2 src2_data = (ushort2)(src2.x, src2.x); - - ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data | src2_data; - - data.x = (dst_index + 0 >= dst_start) ? tmp_data.x : data.x; - data.y = (dst_index + 2 < dst_end ) ? tmp_data.y : data.y; - - *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C1_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - short2 src1_data = vload2(0, (__global short *)((__global char *)src1 + src1_index)); - short2 src2_data = (short2)(src2.x, src2.x); - short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - - short2 tmp_data = src1_data | src2_data; - - data.x = (dst_index + 0 >= dst_start) ? tmp_data.x : data.x; - data.y = (dst_index + 2 < dst_end ) ? tmp_data.y : data.y; - - *((__global short2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C1_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - int src_data1 = *((__global int *)((__global char *)src1 + src1_index)); - int src_data2 = src2.x; - - int data = src_data1 | src_data2; - - *((__global int *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C1_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - char4 src_data1 = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 src_data2 = (char4)(src2.s0, src2.s1, src2.s2, src2.s3); - - char4 data = src_data1 | src_data2; - - *((__global char4 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_or_C1_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - short4 src1_data = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 src2_data = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - - short4 tmp_data = src1_data | src2_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = tmp_data; - } -} -#endif -__kernel void arithm_s_bitwise_or_C2_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - uchar4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.y, src2.x, src2.y); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data | src2_data; - - data.xy = (dst_index + 0 >= dst_start) ? tmp_data.xy : data.xy; - data.zw = (dst_index + 2 < dst_end ) ? tmp_data.zw : data.zw; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_or_C2_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.y, src2.x, src2.y); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data | src2_data; - - data.xy = (dst_index + 0 >= dst_start) ? tmp_data.xy : data.xy; - data.zw = (dst_index + 2 < dst_end ) ? tmp_data.zw : data.zw; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_or_C2_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - ushort4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - ushort2 src_data1 = *((__global ushort2 *)((__global char *)src1 + src1_index)); - ushort2 src_data2 = (ushort2)(src2.x, src2.y); - - ushort2 data = src_data1 | src_data2; - - *((__global ushort2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C2_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - short2 src_data1 = *((__global short2 *)((__global char *)src1 + src1_index)); - short2 src_data2 = (short2)(src2.x, src2.y); - - short2 data = src_data1 | src_data2; - - *((__global short2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C2_D4 (__global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - int4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - int2 src_data1 = *((__global int2 *)((__global char *)src1 + src1_index)); - int2 src_data2 = (int2)(src2.x, src2.y); - - int2 data = src_data1 | src_data2; - *((__global int2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C2_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - char8 src_data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src_data2 = (char8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - - char8 data = src_data1 | src_data2; - *((__global char8 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_or_C2_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - short8 src1_data = *((__global short8 *)((__global char *)src1 + src1_index)); - short8 src2_data = (short8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - - short8 tmp_data = src1_data & src2_data; - - *((__global short8 *)((__global char *)dst + dst_index)) = tmp_data; - } -} -#endif - -__kernel void arithm_s_bitwise_or_C4_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - uchar4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); - - uchar4 data = src_data1 | src2; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_or_C4_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - char4 src_data1 = *((__global char4 *)(src1 + src1_index)); - - char4 data = src_data1 | src2; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_or_C4_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - ushort4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); - - ushort4 data = src_data1 | src2; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C4_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); - - short4 data = src_data1 | src2; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C4_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - int4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); - - int4 data = src_data1 | src2; - - *((__global int4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_C4_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - char16 src_data1 = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src_data2 = (char16)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7, - src2.s8, src2.s9, src2.sa, src2.sb, src2.sc, src2.sd, src2.se, src2.sf); - - char16 data = src_data1 | src_data2; - - *((__global char16 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_or_C4_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 5) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 5) + dst_offset); - - short4 src1_data_0 = *((__global short4 *)((__global char *)src1 + src1_index + 0)); - short4 src1_data_1 = *((__global short4 *)((__global char *)src1 + src1_index + 8)); - short4 src1_data_2 = *((__global short4 *)((__global char *)src1 + src1_index + 16)); - short4 src1_data_3 = *((__global short4 *)((__global char *)src1 + src1_index + 24)); - - short4 src2_data_0 = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 src2_data_1 = (short4)(src2.s4, src2.s5, src2.s6, src2.s7); - short4 src2_data_2 = (short4)(src2.s8, src2.s9, src2.sa, src2.sb); - short4 src2_data_3 = (short4)(src2.sc, src2.sd, src2.se, src2.sf); - - short4 tmp_data_0 = src1_data_0 | src2_data_0; - short4 tmp_data_1 = src1_data_1 | src2_data_1; - short4 tmp_data_2 = src1_data_2 | src2_data_2; - short4 tmp_data_3 = src1_data_3 | src2_data_3; - - *((__global short4 *)((__global char *)dst + dst_index + 0 ))= tmp_data_0; - *((__global short4 *)((__global char *)dst + dst_index + 8 ))= tmp_data_1; - *((__global short4 *)((__global char *)dst + dst_index + 16))= tmp_data_2; - *((__global short4 *)((__global char *)dst + dst_index + 24))= tmp_data_3; - - } -} -#endif diff --git a/modules/ocl/src/opencl/arithm_bitwise_or_scalar_mask.cl b/modules/ocl/src/opencl/arithm_bitwise_or_scalar_mask.cl deleted file mode 100644 index b8f07a8724..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_or_scalar_mask.cl +++ /dev/null @@ -1,760 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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 GpuMaterials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors as is and -// any express or 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*/ -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_OR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_or with scalar with mask**************************************/ -__kernel void arithm_s_bitwise_or_with_mask_C1_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - uchar4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.x, src2.x, src2.x); - uchar4 mask_data = vload4(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data | src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_or_with_mask_C1_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.x, src2.x, src2.x); - uchar4 mask_data = vload4(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data | src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_or_with_mask_C1_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - ushort4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - ushort2 src1_data = vload2(0, (__global ushort *)((__global char *)src1 + src1_index)); - ushort2 src2_data = (ushort2)(src2.x, src2.x); - uchar2 mask_data = vload2(0, mask + mask_index); - - ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data | src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.y : data.y; - - *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C1_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - short2 src1_data = vload2(0, (__global short *)((__global char *)src1 + src1_index)); - short2 src2_data = (short2)(src2.x, src2.x); - uchar2 mask_data = vload2(0, mask + mask_index); - - short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - short2 tmp_data = src1_data | src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.y : data.y; - - *((__global short2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C1_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - int4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int src_data1 = *((__global int *)((__global char *)src1 + src1_index)); - int src_data2 = src2.x; - int dst_data = *((__global int *)((__global char *)dst + dst_index)); - - int data = src_data1 | src_data2; - data = mask_data ? data : dst_data; - - *((__global int *)((__global char *)dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_or_with_mask_C1_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src_data1 = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 src_data2 = (char4)(src2.s0, src2.s1, src2.s2, src2.s3); - char4 dst_data = *((__global char4 *)((__global char *)dst + dst_index)); - - char4 data = src_data1 | src_data2; - data = mask_data ? data : dst_data; - - *((__global char4 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_or_with_mask_C1_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src1_data = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 src2_data = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - - short4 data = src1_data | src2_data; - data = mask_data ? data : dst_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -#endif -__kernel void arithm_s_bitwise_or_with_mask_C2_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - uchar4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.y, src2.x, src2.y); - uchar2 mask_data = vload2(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data | src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_or_with_mask_C2_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.y, src2.x, src2.y); - uchar2 mask_data = vload2(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data | src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_or_with_mask_C2_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - ushort4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort2 src_data1 = *((__global ushort2 *)((__global char *)src1 + src1_index)); - ushort2 src_data2 = (ushort2)(src2.x, src2.y); - ushort2 dst_data = *((__global ushort2 *)((__global char *)dst + dst_index)); - - ushort2 data = src_data1 | src_data2; - data = mask_data ? data : dst_data; - - *((__global ushort2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C2_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short2 src_data1 = *((__global short2 *)((__global char *)src1 + src1_index)); - short2 src_data2 = (short2)(src2.x, src2.y); - short2 dst_data = *((__global short2 *)((__global char *)dst + dst_index)); - - short2 data = src_data1 | src_data2; - data = mask_data ? data : dst_data; - - *((__global short2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C2_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - int4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int2 src_data1 = *((__global int2 *)((__global char *)src1 + src1_index)); - int2 src_data2 = (int2)(src2.x, src2.y); - int2 dst_data = *((__global int2 *)((__global char *)dst + dst_index)); - - int2 data = src_data1 | src_data2; - data = mask_data ? data : dst_data; - - *((__global int2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C2_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src_data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src_data2 = (char8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - char8 data = src_data1 | src_data2; - data = mask_data ? data : dst_data; - *((__global char8 *)((__global char *)dst + dst_index)) = data; - - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_or_with_mask_C2_D6 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short8 src1_data = *((__global short8 *)((__global char *)src1 + src1_index)); - short8 src2_data = (short8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - short8 dst_data = *((__global short8 *)((__global char *)dst + dst_index)); - - short8 data = src1_data | src2_data; - data = mask_data ? data : dst_data; - - *((__global short8 *)((__global char *)dst + dst_index)) = data; - } -} -#endif - -__kernel void arithm_s_bitwise_or_with_mask_C4_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - uchar4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); - uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); - - uchar4 data = src_data1 | src2; - data = mask_data ? data : dst_data; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_or_with_mask_C4_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src_data1 = *((__global char4 *)(src1 + src1_index)); - char4 dst_data = *((__global char4 *)(dst + dst_index)); - - char4 data = src_data1 | src2; - data = mask_data ? data : dst_data; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_or_with_mask_C4_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - ushort4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); - ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - - ushort4 data = src_data1 | src2; - data = mask_data ? data : dst_data; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C4_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - - short4 data = src_data1 | src2; - data = mask_data ? data : dst_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C4_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - int4 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); - int4 dst_data = *((__global int4 *)((__global char *)dst + dst_index)); - - int4 data = src_data1 | src2; - data = mask_data ? data : dst_data; - - *((__global int4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_or_with_mask_C4_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - char16 src2, int rows, int cols, int dst_step1) - -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char16 src_data1 = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src_data2 = (char16)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7, - src2.s8, src2.s9, src2.sa, src2.sb, src2.sc, src2.sd, src2.se, src2.sf); - char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - - char16 data = src_data1 | src_data2; - data = mask_data ? data : dst_data; - - *((__global char16 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_or_with_mask_C4_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - __global uchar *mask, int mask_step, int mask_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 5) + src1_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 5) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src1_data_0 = *((__global short4 *)((__global char *)src1 + src1_index + 0)); - short4 src1_data_1 = *((__global short4 *)((__global char *)src1 + src1_index + 8)); - short4 src1_data_2 = *((__global short4 *)((__global char *)src1 + src1_index + 16)); - short4 src1_data_3 = *((__global short4 *)((__global char *)src1 + src1_index + 24)); - - short4 src2_data_0 = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 src2_data_1 = (short4)(src2.s4, src2.s5, src2.s6, src2.s7); - short4 src2_data_2 = (short4)(src2.s8, src2.s9, src2.sa, src2.sb); - short4 src2_data_3 = (short4)(src2.sc, src2.sd, src2.se, src2.sf); - - short4 dst_data_0 = *((__global short4 *)((__global char *)dst + dst_index + 0)); - short4 dst_data_1 = *((__global short4 *)((__global char *)dst + dst_index + 8)); - short4 dst_data_2 = *((__global short4 *)((__global char *)dst + dst_index + 16)); - short4 dst_data_3 = *((__global short4 *)((__global char *)dst + dst_index + 24)); - - short4 data_0 = src1_data_0 | src2_data_0; - short4 data_1 = src1_data_1 | src2_data_1; - short4 data_2 = src1_data_2 | src2_data_2; - short4 data_3 = src1_data_3 | src2_data_3; - - data_0 = mask_data ? data_0 : dst_data_0; - data_1 = mask_data ? data_1 : dst_data_1; - data_2 = mask_data ? data_2 : dst_data_2; - data_3 = mask_data ? data_3 : dst_data_3; - - *((__global short4 *)((__global char *)dst + dst_index + 0)) = data_0; - *((__global short4 *)((__global char *)dst + dst_index + 8)) = data_1; - *((__global short4 *)((__global char *)dst + dst_index + 16)) = data_2; - *((__global short4 *)((__global char *)dst + dst_index + 24)) = data_3; - } -} -#endif diff --git a/modules/ocl/src/opencl/arithm_bitwise_xor.cl b/modules/ocl/src/opencl/arithm_bitwise_xor.cl deleted file mode 100644 index c8b00ca39d..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_xor.cl +++ /dev/null @@ -1,340 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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 GpuMaterials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors as is and -// any express or 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*/ -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_XOR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_xor without mask**************************************/ -__kernel void arithm_bitwise_xor_D0 (__global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - int src1_index_fix = src1_index < 0 ? 0 : src1_index; - int src2_index_fix = src2_index < 0 ? 0 : 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 tmp_data = src1_data ^ src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global uchar4 *)(dst + dst_index)) = dst_data; - } -} - - -__kernel void arithm_bitwise_xor_D1 (__global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - int src1_index_fix = src1_index < 0 ? 0 : src1_index; - int src2_index_fix = src2_index < 0 ? 0 : src2_index; - char4 src1_data = vload4(0, src1 + src1_index_fix); - char4 src2_data = vload4(0, src2 + src2_index_fix); - - if(src1_index < 0) - { - char4 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) - { - char4 tmp; - tmp.xyzw = (src2_index == -2) ? src2_data.zwxy:src2_data.yzwx; - src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw; - } - char4 dst_data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global char4 *)(dst + dst_index)) = dst_data; - } -} - - -__kernel void arithm_bitwise_xor_D2 (__global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) - -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 3) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffff8); - - int src1_index_fix = src1_index < 0 ? 0 : src1_index; - int src2_index_fix = src2_index < 0 ? 0 : src2_index; - ushort4 src1_data = vload4(0, (__global ushort *)((__global char *)src1 + src1_index_fix)); - ushort4 src2_data = vload4(0, (__global ushort *)((__global char *)src2 + src2_index_fix)); - - if(src1_index < 0) - { - ushort4 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) - { - ushort4 tmp; - tmp.xyzw = (src2_index == -2) ? src2_data.zwxy:src2_data.yzwx; - src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw; - } - ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - ushort4 tmp_data = src1_data ^ src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 4 >= dst_start) && (dst_index + 4 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = dst_data; - } -} - - - -__kernel void arithm_bitwise_xor_D3 (__global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) - -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 3) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffff8); - - int src1_index_fix = src1_index < 0 ? 0 : src1_index; - int src2_index_fix = src2_index < 0 ? 0 : src2_index; - short4 src1_data = vload4(0, (__global short *)((__global char *)src1 + src1_index_fix)); - short4 src2_data = vload4(0, (__global short *)((__global char *)src2 + src2_index_fix)); - - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - - if(src1_index < 0) - { - short4 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) - { - short4 tmp; - tmp.xyzw = (src2_index == -2) ? src2_data.zwxy:src2_data.yzwx; - src2_data.xyzw = (src2_index == -1) ? src2_data.wxyz:tmp.xyzw; - } - - - - short4 tmp_data = src1_data ^ src2_data; - - dst_data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : dst_data.x; - dst_data.y = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : dst_data.y; - dst_data.z = ((dst_index + 4 >= dst_start) && (dst_index + 4 < dst_end)) ? tmp_data.z : dst_data.z; - dst_data.w = ((dst_index + 6 >= dst_start) && (dst_index + 6 < dst_end)) ? tmp_data.w : dst_data.w; - - *((__global short4 *)((__global char *)dst + dst_index)) = dst_data; - } -} - - - -__kernel void arithm_bitwise_xor_D4 (__global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - int data1 = *((__global int *)((__global char *)src1 + src1_index)); - int data2 = *((__global int *)((__global char *)src2 + src2_index)); - int tmp = data1 ^ data2; - - *((__global int *)((__global char *)dst + dst_index)) = tmp; - } -} - -__kernel void arithm_bitwise_xor_D5 (__global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - char4 data1 = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 data2 = *((__global char4 *)((__global char *)src2 + src2_index)); - char4 tmp = data1 ^ data2; - - *((__global char4 *)((__global char *)dst + dst_index)) = tmp; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_xor_D6 (__global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - char8 data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 data2 = *((__global char8 *)((__global char *)src2 + src2_index)); - - *((__global char8 *)((__global char *)dst + dst_index)) = data1 ^ data2; - } -} -#endif diff --git a/modules/ocl/src/opencl/arithm_bitwise_xor_mask.cl b/modules/ocl/src/opencl/arithm_bitwise_xor_mask.cl deleted file mode 100644 index 7655be3a80..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_xor_mask.cl +++ /dev/null @@ -1,803 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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*/ -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_XOR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************bitwise_xor with mask**************************************/ -__kernel void arithm_bitwise_xor_with_mask_C1_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = vload4(0, src2 + src2_index); - uchar4 mask_data = vload4(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data ^ src2_data; - - data.x = ((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_xor_with_mask_C1_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - int src2_index = mad24(y, src2_step, x + src2_offset - dst_align); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = vload4(0, src2 + src2_index); - uchar4 mask_data = vload4(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; - - data.x = convert_char((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = convert_char((mask_data.y) && (dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = convert_char((mask_data.z) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = convert_char((mask_data.w) && (dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_xor_with_mask_C1_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - ushort2 src1_data = vload2(0, (__global ushort *)((__global char *)src1 + src1_index)); - ushort2 src2_data = vload2(0, (__global ushort *)((__global char *)src2 + src2_index)); - uchar2 mask_data = vload2(0, mask + mask_index); - - ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data ^ src2_data; - - data.x = convert_ushort((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = convert_ushort((mask_data.y) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : data.y; - - *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_xor_with_mask_C1_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - short2 src1_data = vload2(0, (__global short *)((__global char *)src1 + src1_index)); - short2 src2_data = vload2(0, (__global short *)((__global char *)src2 + src2_index)); - uchar2 mask_data = vload2(0, mask + mask_index); - - short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - short2 tmp_data = src1_data ^ src2_data; - - data.x = convert_short((mask_data.x) && (dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = convert_short((mask_data.y) && (dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.y : data.y; - - *((__global short2 *)((__global uchar *)dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_xor_with_mask_C1_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int src_data1 = *((__global int *)((__global char *)src1 + src1_index)); - int src_data2 = *((__global int *)((__global char *)src2 + src2_index)); - int dst_data = *((__global int *)((__global char *)dst + dst_index)); - - int data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global int *)((__global char *)dst + dst_index)) = data; - } -} - - - -__kernel void arithm_bitwise_xor_with_mask_C1_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src_data1 = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 src_data2 = *((__global char4 *)((__global char *)src2 + src2_index)); - char4 dst_data = *((__global char4 *)((__global char *)dst + dst_index)); - - char4 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global char4 *)((__global char *)dst + dst_index)) = data; - } -} - - -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_xor_with_mask_C1_D6 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src_data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src_data2 = *((__global char8 *)((__global char *)src2 + src2_index)); - char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - - char8 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global char8 *)((__global char *)dst + dst_index)) = data; - } -} -#endif - - - -__kernel void arithm_bitwise_xor_with_mask_C2_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = vload4(0, src2 + src2_index); - uchar2 mask_data = vload2(0, mask + mask_index); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data ^ src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_bitwise_xor_with_mask_C2_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - int src2_index = mad24(y, src2_step, (x << 1) + src2_offset - (dst_align << 1)); - int mask_index = mad24(y, mask_step, x + mask_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = vload4(0, src2 + src2_index); - uchar2 mask_data = vload2(0, mask + mask_index); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; - - data.xy = ((mask_data.x) && (dst_index + 0 >= dst_start)) ? tmp_data.xy : data.xy; - data.zw = ((mask_data.y) && (dst_index + 2 < dst_end )) ? tmp_data.zw : data.zw; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_bitwise_xor_with_mask_C2_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort2 src_data1 = *((__global ushort2 *)((__global char *)src1 + src1_index)); - ushort2 src_data2 = *((__global ushort2 *)((__global char *)src2 + src2_index)); - ushort2 dst_data = *((__global ushort2 *)((__global char *)dst + dst_index)); - - ushort2 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global ushort2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_xor_with_mask_C2_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short2 src_data1 = *((__global short2 *)((__global char *)src1 + src1_index)); - short2 src_data2 = *((__global short2 *)((__global char *)src2 + src2_index)); - short2 dst_data = *((__global short2 *)((__global char *)dst + dst_index)); - - short2 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global short2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_xor_with_mask_C2_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int2 src_data1 = *((__global int2 *)((__global char *)src1 + src1_index)); - int2 src_data2 = *((__global int2 *)((__global char *)src2 + src2_index)); - int2 dst_data = *((__global int2 *)((__global char *)dst + dst_index)); - - int2 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global int2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_xor_with_mask_C2_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src_data1 = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src_data2 = *((__global char8 *)((__global char *)src2 + src2_index)); - char8 dst_data = *((__global char8 *)((__global char *)dst + dst_index)); - - char8 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global char8 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_xor_with_mask_C2_D6 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 4) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char16 src_data1 = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src_data2 = *((__global char16 *)((__global char *)src2 + src2_index)); - char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - - char16 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global char16 *)((__global char *)dst + dst_index)) = data; - } -} -#endif - -__kernel void arithm_bitwise_xor_with_mask_C4_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global uchar *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); - uchar4 src_data2 = *((__global uchar4 *)(src2 + src2_index)); - uchar4 dst_data = *((__global uchar4 *)(dst + dst_index)); - - uchar4 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_bitwise_xor_with_mask_C4_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 2) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char4 src_data1 = *((__global char4 *)(src1 + src1_index)); - char4 src_data2 = *((__global char4 *)(src2 + src2_index)); - char4 dst_data = *((__global char4 *)(dst + dst_index)); - - char4 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_bitwise_xor_with_mask_C4_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global ushort *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); - ushort4 src_data2 = *((__global ushort4 *)((__global char *)src2 + src2_index)); - ushort4 dst_data = *((__global ushort4 *)((__global char *)dst + dst_index)); - - ushort4 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_xor_with_mask_C4_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global short *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 3) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 src_data2 = *((__global short4 *)((__global char *)src2 + src2_index)); - short4 dst_data = *((__global short4 *)((__global char *)dst + dst_index)); - - short4 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_xor_with_mask_C4_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global int *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 4) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); - int4 src_data2 = *((__global int4 *)((__global char *)src2 + src2_index)); - int4 dst_data = *((__global int4 *)((__global char *)dst + dst_index)); - - int4 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global int4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_bitwise_xor_with_mask_C4_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 4) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char16 src_data1 = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src_data2 = *((__global char16 *)((__global char *)src2 + src2_index)); - char16 dst_data = *((__global char16 *)((__global char *)dst + dst_index)); - - char16 data = src_data1 ^ src_data2; - data = mask_data ? data : dst_data; - - *((__global char16 *)((__global char *)dst + dst_index)) = data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_bitwise_xor_with_mask_C4_D6 ( - __global char *src1, int src1_step, int src1_offset, - __global char *src2, int src2_step, int src2_offset, - __global uchar *mask, int mask_step, int mask_offset, - __global char *dst, int dst_step, int dst_offset, - int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 5) + src1_offset); - int src2_index = mad24(y, src2_step, (x << 5) + src2_offset); - int mask_index = mad24(y, mask_step, x + mask_offset); - int dst_index = mad24(y, dst_step, (x << 5) + dst_offset); - - uchar mask_data = *(mask + mask_index); - - char8 src_data1_0 = *((__global char8 *)((__global char *)src1 + src1_index + 0)); - char8 src_data1_1 = *((__global char8 *)((__global char *)src1 + src1_index + 8)); - char8 src_data1_2 = *((__global char8 *)((__global char *)src1 + src1_index + 16)); - char8 src_data1_3 = *((__global char8 *)((__global char *)src1 + src1_index + 24)); - - char8 src_data2_0 = *((__global char8 *)((__global char *)src2 + src2_index + 0)); - char8 src_data2_1 = *((__global char8 *)((__global char *)src2 + src2_index + 8)); - char8 src_data2_2 = *((__global char8 *)((__global char *)src2 + src2_index + 16)); - char8 src_data2_3 = *((__global char8 *)((__global char *)src2 + src2_index + 24)); - - char8 dst_data_0 = *((__global char8 *)((__global char *)dst + dst_index + 0)); - char8 dst_data_1 = *((__global char8 *)((__global char *)dst + dst_index + 8)); - char8 dst_data_2 = *((__global char8 *)((__global char *)dst + dst_index + 16)); - char8 dst_data_3 = *((__global char8 *)((__global char *)dst + dst_index + 24)); - - char8 data_0 = src_data1_0 ^ src_data2_0; - char8 data_1 = src_data1_1 ^ src_data2_1; - char8 data_2 = src_data1_2 ^ src_data2_2; - char8 data_3 = src_data1_3 ^ src_data2_3; - - data_0 = mask_data ? data_0 : dst_data_0; - data_1 = mask_data ? data_1 : dst_data_1; - data_2 = mask_data ? data_2 : dst_data_2; - data_3 = mask_data ? data_3 : dst_data_3; - - *((__global char8 *)((__global char *)dst + dst_index + 0)) = data_0; - *((__global char8 *)((__global char *)dst + dst_index + 8)) = data_1; - *((__global char8 *)((__global char *)dst + dst_index + 16)) = data_2; - *((__global char8 *)((__global char *)dst + dst_index + 24)) = data_3; - } -} -#endif diff --git a/modules/ocl/src/opencl/arithm_bitwise_xor_scalar.cl b/modules/ocl/src/opencl/arithm_bitwise_xor_scalar.cl deleted file mode 100644 index 73b5687c11..0000000000 --- a/modules/ocl/src/opencl/arithm_bitwise_xor_scalar.cl +++ /dev/null @@ -1,633 +0,0 @@ -//////////////////////////////////////////////////////////////////////////////////////// -// -// 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, Institute Of Software Chinese Academy Of Science, all rights reserved. -// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// @Authors -// Jiang Liyuan, jlyuan001.good@163.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. -// -// -#if defined (DOUBLE_SUPPORT) -#ifdef cl_khr_fp64 -#pragma OPENCL EXTENSION cl_khr_fp64:enable -#elif defined (cl_amd_fp64) -#pragma OPENCL EXTENSION cl_amd_fp64:enable -#endif -#endif -////////////////////////////////////////////////////////////////////////////////////////////////////// -////////////////////////////////////////////BITWISE_XOR//////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////////////////////////////// -/**************************************xor with scalar without mask**************************************/ -__kernel void arithm_s_bitwise_xor_C1_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.x, src2.x, src2.x); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data ^ src2_data; - - data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_xor_C1_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 2; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align (dst_offset & 3) - int src1_index = mad24(y, src1_step, x + src1_offset - dst_align); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + x & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.x, src2.x, src2.x); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; - - data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_xor_C1_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - ushort2 src1_data = vload2(0, (__global ushort *)((__global char *)src1 + src1_index)); - ushort2 src2_data = (ushort2)(src2.x, src2.x); - - ushort2 data = *((__global ushort2 *)((__global uchar *)dst + dst_index)); - ushort2 tmp_data = src1_data ^ src2_data; - - data.x = (dst_index + 0 >= dst_start) ? tmp_data.x : data.x; - data.y = (dst_index + 2 < dst_end ) ? tmp_data.y : data.y; - - *((__global ushort2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C1_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - short2 src1_data = vload2(0, (__global short *)((__global char *)src1 + src1_index)); - short2 src2_data = (short2)(src2.x, src2.x); - short2 data = *((__global short2 *)((__global uchar *)dst + dst_index)); - - short2 tmp_data = src1_data ^ src2_data; - - data.x = (dst_index + 0 >= dst_start) ? tmp_data.x : data.x; - data.y = (dst_index + 2 < dst_end ) ? tmp_data.y : data.y; - - *((__global short2 *)((__global uchar *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C1_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - int src_data1 = *((__global int *)((__global char *)src1 + src1_index)); - int src_data2 = src2.x; - - int data = src_data1 ^ src_data2; - - *((__global int *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C1_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - char4 src1_data = *((__global char4 *)((__global char *)src1 + src1_index)); - char4 src2_data = (char4)(src2.s0, src2.s1, src2.s2, src2.s3); - - char4 data = *((__global char4 *)((__global char *)dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; - - data.x = ((dst_index + 0 >= dst_start) && (dst_index + 0 < dst_end)) ? tmp_data.x : data.x; - data.y = ((dst_index + 1 >= dst_start) && (dst_index + 1 < dst_end)) ? tmp_data.y : data.y; - data.z = ((dst_index + 2 >= dst_start) && (dst_index + 2 < dst_end)) ? tmp_data.z : data.z; - data.w = ((dst_index + 3 >= dst_start) && (dst_index + 3 < dst_end)) ? tmp_data.w : data.w; - - *((__global char4 *)((__global char *)dst + dst_index)) = data; - } -} - -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_xor_C1_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - short4 src1_data = *((__global short4 *)((__global char *)src1 + src1_index)); - short4 src2_data = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - - short4 tmp_data = src1_data ^ src2_data; - - *((__global short4 *)((__global char *)dst + dst_index)) = tmp_data; - } -} -#endif -__kernel void arithm_s_bitwise_xor_C2_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - uchar4 src1_data = vload4(0, src1 + src1_index); - uchar4 src2_data = (uchar4)(src2.x, src2.y, src2.x, src2.y); - - uchar4 data = *((__global uchar4 *)(dst + dst_index)); - uchar4 tmp_data = src1_data ^ src2_data; - - - data.xy = (dst_index + 0 >= dst_start) ? tmp_data.xy : data.xy; - data.zw = (dst_index + 2 < dst_end ) ? tmp_data.zw : data.zw; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_xor_C2_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - x = x << 1; - -#ifdef dst_align -#undef dst_align -#endif -#define dst_align ((dst_offset >> 1) & 1) - int src1_index = mad24(y, src1_step, (x << 1) + src1_offset - (dst_align << 1)); - - int dst_start = mad24(y, dst_step, dst_offset); - int dst_end = mad24(y, dst_step, dst_offset + dst_step1); - int dst_index = mad24(y, dst_step, dst_offset + (x << 1) & (int)0xfffffffc); - - char4 src1_data = vload4(0, src1 + src1_index); - char4 src2_data = (char4)(src2.x, src2.y, src2.x, src2.y); - - char4 data = *((__global char4 *)(dst + dst_index)); - char4 tmp_data = src1_data ^ src2_data; - - data.xy = (dst_index + 0 >= dst_start) ? tmp_data.xy : data.xy; - data.zw = (dst_index + 2 < dst_end ) ? tmp_data.zw : data.zw; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_xor_C2_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - ushort2 src_data1 = *((__global ushort2 *)((__global char *)src1 + src1_index)); - ushort2 src_data2 = (ushort2)(src2.x, src2.y); - - ushort2 data = src_data1 ^ src_data2; - - *((__global ushort2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C2_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - short2 src_data1 = *((__global short2 *)((__global char *)src1 + src1_index)); - short2 src_data2 = (short2)(src2.x, src2.y); - - short2 data = src_data1 ^ src_data2; - - *((__global short2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C2_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - int2 src_data1 = *((__global int2 *)((__global char *)src1 + src1_index)); - int2 src_data2 = (int2)(src2.x, src2.y); - - int2 data = src_data1 ^ src_data2; - *((__global int2 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C2_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - char8 src1_data = *((__global char8 *)((__global char *)src1 + src1_index)); - char8 src2_data = (char8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - - char8 tmp_data = src1_data ^ src2_data; - - *((__global char8 *)((__global char *)dst + dst_index)) = tmp_data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_xor_C2_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - short8 src1_data = *((__global short8 *)((__global char *)src1 + src1_index)); - short8 src2_data = (short8)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7); - - short8 tmp_data = src1_data ^ src2_data; - - *((__global short8 *)((__global char *)dst + dst_index)) = tmp_data; - } -} -#endif - -__kernel void arithm_s_bitwise_xor_C4_D0 ( - __global uchar *src1, int src1_step, int src1_offset, - __global uchar *dst, int dst_step, int dst_offset, - uchar4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - uchar4 src_data1 = *((__global uchar4 *)(src1 + src1_index)); - - uchar4 data = src_data1 ^ src2; - - *((__global uchar4 *)(dst + dst_index)) = data; - } -} - - -__kernel void arithm_s_bitwise_xor_C4_D1 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 2) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 2) + dst_offset); - - char4 src_data1 = *((__global char4 *)(src1 + src1_index)); - - char4 data = src_data1 ^ src2; - - *((__global char4 *)(dst + dst_index)) = data; - } -} - -__kernel void arithm_s_bitwise_xor_C4_D2 ( - __global ushort *src1, int src1_step, int src1_offset, - __global ushort *dst, int dst_step, int dst_offset, - ushort4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - ushort4 src_data1 = *((__global ushort4 *)((__global char *)src1 + src1_index)); - - ushort4 data = src_data1 ^ src2; - - *((__global ushort4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C4_D3 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 3) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 3) + dst_offset); - - short4 src_data1 = *((__global short4 *)((__global char *)src1 + src1_index)); - - short4 data = src_data1 ^ src2; - - *((__global short4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C4_D4 ( - __global int *src1, int src1_step, int src1_offset, - __global int *dst, int dst_step, int dst_offset, - int4 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - int4 src_data1 = *((__global int4 *)((__global char *)src1 + src1_index)); - - int4 data = src_data1 ^ src2; - - *((__global int4 *)((__global char *)dst + dst_index)) = data; - } -} -__kernel void arithm_s_bitwise_xor_C4_D5 ( - __global char *src1, int src1_step, int src1_offset, - __global char *dst, int dst_step, int dst_offset, - char16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 4) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 4) + dst_offset); - - char16 src1_data = *((__global char16 *)((__global char *)src1 + src1_index)); - char16 src2_data = (char16)(src2.s0, src2.s1, src2.s2, src2.s3, src2.s4, src2.s5, src2.s6, src2.s7, - src2.s8, src2.s9, src2.sa, src2.sb, src2.sc, src2.sd, src2.se, src2.sf); - - char16 tmp_data = src1_data ^ src2_data; - - *((__global char16 *)((__global char *)dst + dst_index)) = tmp_data; - } -} -#if defined (DOUBLE_SUPPORT) -__kernel void arithm_s_bitwise_xor_C4_D6 ( - __global short *src1, int src1_step, int src1_offset, - __global short *dst, int dst_step, int dst_offset, - short16 src2, int rows, int cols, int dst_step1) -{ - - int x = get_global_id(0); - int y = get_global_id(1); - - if (x < cols && y < rows) - { - int src1_index = mad24(y, src1_step, (x << 5) + src1_offset); - int dst_index = mad24(y, dst_step, (x << 5) + dst_offset); - - short4 src1_data_0 = *((__global short4 *)((__global char *)src1 + src1_index + 0)); - short4 src1_data_1 = *((__global short4 *)((__global char *)src1 + src1_index + 8)); - short4 src1_data_2 = *((__global short4 *)((__global char *)src1 + src1_index + 16)); - short4 src1_data_3 = *((__global short4 *)((__global char *)src1 + src1_index + 24)); - - short4 src2_data_0 = (short4)(src2.s0, src2.s1, src2.s2, src2.s3); - short4 src2_data_1 = (short4)(src2.s4, src2.s5, src2.s6, src2.s7); - short4 src2_data_2 = (short4)(src2.s8, src2.s9, src2.sa, src2.sb); - short4 src2_data_3 = (short4)(src2.sc, src2.sd, src2.se, src2.sf); - - short4 tmp_data_0 = src1_data_0 ^ src2_data_0; - short4 tmp_data_1 = src1_data_1 ^ src2_data_1; - short4 tmp_data_2 = src1_data_2 ^ src2_data_2; - short4 tmp_data_3 = src1_data_3 ^ src2_data_3; - - *((__global short4 *)((__global char *)dst + dst_index + 0 ))= tmp_data_0; - *((__global short4 *)((__global char *)dst + dst_index + 8 ))= tmp_data_1; - *((__global short4 *)((__global char *)dst + dst_index + 16))= tmp_data_2; - *((__global short4 *)((__global char *)dst + dst_index + 24))= tmp_data_3; - - } -} -#endif \ No newline at end of file From dec6a3b080374004d9b748998c583b48abf5ab50 Mon Sep 17 00:00:00 2001 From: yao Date: Mon, 15 Apr 2013 16:46:25 +0800 Subject: [PATCH 03/49] make boxfilter kernel compile on Mac GPU OCL --- modules/ocl/src/opencl/filtering_boxFilter.cl | 367 +++++++++--------- 1 file changed, 184 insertions(+), 183 deletions(-) diff --git a/modules/ocl/src/opencl/filtering_boxFilter.cl b/modules/ocl/src/opencl/filtering_boxFilter.cl index 79ca8d735b..512e32997d 100644 --- a/modules/ocl/src/opencl/filtering_boxFilter.cl +++ b/modules/ocl/src/opencl/filtering_boxFilter.cl @@ -79,15 +79,73 @@ #define ADDR_B(i, b_edge, addr) ((i) >= (b_edge) ? (i)-(b_edge) : (addr)) #endif +#define THREADS 256 +#define ELEM(i, l_edge, r_edge, elem1, elem2) (i) >= (l_edge) && (i) < (r_edge) ? (elem1) : (elem2) + +inline void update_dst_C1_D0(__global uchar *dst, __local uint* temp, + int dst_rows, int dst_cols, + int dst_startX, int dst_x_off, + float alpha) +{ + if(get_local_id(0) < anX || get_local_id(0) >= (THREADS-ksX+anX+1)) + { + return; + } + + uint4 tmp_sum = 0; + int posX = dst_startX - dst_x_off + (get_local_id(0)-anX)*4; + int posY = (get_group_id(1) << 1); + + for(int i=-anX; i<=anX; i++) + { + tmp_sum += vload4(get_local_id(0), temp+i); + } + + if(posY < dst_rows && posX < dst_cols) + { + tmp_sum /= (uint4) alpha; + if(posX >= 0 && posX < dst_cols) + *(dst) = tmp_sum.x; + if(posX+1 >= 0 && posX+1 < dst_cols) + *(dst + 1) = tmp_sum.y; + if(posX+2 >= 0 && posX+2 < dst_cols) + *(dst + 2) = tmp_sum.z; + if(posX+3 >= 0 && posX+3 < dst_cols) + *(dst + 3) = tmp_sum.w; + } +} + + +inline void update_dst_C4_D0(__global uchar4 *dst, __local uint4* temp, + int dst_rows, int dst_cols, + int dst_startX, int dst_x_off, + float alpha) +{ + if(get_local_id(0) >= (THREADS-ksX+1)) + { + return; + } + + int posX = dst_startX - dst_x_off + get_local_id(0); + int posY = (get_group_id(1) << 1); + + uint4 temp_sum = 0; + for(int i=-anX; i<=anX; i++) + { + temp_sum += temp[get_local_id(0) + anX + i]; + } + + if(posX >= 0 && posX < dst_cols && posY >= 0 && posY < dst_rows) + *dst = convert_uchar4(convert_float4(temp_sum)/alpha); +} + /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////8uC1//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// -#define THREADS 256 -#define ELEM(i, l_edge, r_edge, elem1, elem2) (i) >= (l_edge) && (i) < (r_edge) ? (elem1) : (elem2) __kernel void boxFilter_C1_D0(__global const uchar * restrict src, __global uchar *dst, float alpha, - int src_offset, int src_whole_rows, int src_whole_cols, int src_step, - int dst_offset, int dst_rows, int dst_cols, int dst_step - ) + int src_offset, int src_whole_rows, int src_whole_cols, int src_step, + int dst_offset, int dst_rows, int dst_cols, int dst_step + ) { int col = get_local_id(0); @@ -105,115 +163,84 @@ __kernel void boxFilter_C1_D0(__global const uchar * restrict src, __global ucha int dst_startY = (gY << 1) + dst_y_off; uint4 data[ksY+1]; - __local uint4 temp[(THREADS<<1)]; + __local uint4 temp[2][THREADS]; #ifdef BORDER_CONSTANT - for(int i=0; i < ksY+1; i++) + for(int i=0; i < ksY+1; i++) + { + if(startY+i >=0 && startY+i < src_whole_rows && startX+col*4 >=0 && startX+col*4+3=0 && startY+i < src_whole_rows && startX+col*4 >=0 && startX+col*4+3=0 && startY+i < src_whole_rows && startX+col*4 >=0 && startX+col*4=0 && startY+i < src_whole_rows && startX+col*4+1 >=0 && startX+col*4+1=0 && startY+i < src_whole_rows && startX+col*4+2 >=0 && startX+col*4+2=0 && startY+i < src_whole_rows && startX+col*4+3 >=0 && startX+col*4+3=0 && startY+i < src_whole_rows && startX+col*4 >=0 && startX+col*4=0 && startY+i < src_whole_rows && startX+col*4+1 >=0 && startX+col*4+1=0 && startY+i < src_whole_rows && startX+col*4+2 >=0 && startX+col*4+2=0 && startY+i < src_whole_rows && startX+col*4+3 >=0 && startX+col*4+3src_whole_cols-1) - | (startY+i<0) | (startY+i>src_whole_rows-1); - if(not_all_in_range) - { - int selected_row; - int4 selected_col; - selected_row = ADDR_H(startY+i, 0, src_whole_rows); - selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); - - selected_col.x = ADDR_L(startX+col*4, 0, src_whole_cols); - selected_col.x = ADDR_R(startX+col*4, src_whole_cols, selected_col.x); - - selected_col.y = ADDR_L(startX+col*4+1, 0, src_whole_cols); - selected_col.y = ADDR_R(startX+col*4+1, src_whole_cols, selected_col.y); - - selected_col.z = ADDR_L(startX+col*4+2, 0, src_whole_cols); - selected_col.z = ADDR_R(startX+col*4+2, src_whole_cols, selected_col.z); - - selected_col.w = ADDR_L(startX+col*4+3, 0, src_whole_cols); - selected_col.w = ADDR_R(startX+col*4+3, src_whole_cols, selected_col.w); - - data[i].x = *(src + selected_row * src_step + selected_col.x); - data[i].y = *(src + selected_row * src_step + selected_col.y); - data[i].z = *(src + selected_row * src_step + selected_col.z); - data[i].w = *(src + selected_row * src_step + selected_col.w); - } - else - { - data[i] = convert_uint4(vload4(col,(__global uchar*)(src+(startY+i)*src_step + startX))); - } - } -#endif - uint4 sum0 = 0, sum1 = 0, sum2 = 0; - for(int i=1; i < ksY; i++) + int not_all_in_range; + for(int i=0; i < ksY+1; i++) { - sum0 += (data[i]); - } - sum1 = sum0 + (data[0]); - sum2 = sum0 + (data[ksY]); + not_all_in_range = (startX+col*4<0) | (startX+col*4+3>src_whole_cols-1) + | (startY+i<0) | (startY+i>src_whole_rows-1); + if(not_all_in_range) + { + int selected_row; + int4 selected_col; + selected_row = ADDR_H(startY+i, 0, src_whole_rows); + selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); - temp[col] = sum1; - temp[col+THREADS] = sum2; - barrier(CLK_LOCAL_MEM_FENCE); + selected_col.x = ADDR_L(startX+col*4, 0, src_whole_cols); + selected_col.x = ADDR_R(startX+col*4, src_whole_cols, selected_col.x); - if(col >= anX && col < (THREADS-ksX+anX+1)) - { - int posX = dst_startX - dst_x_off + (col-anX)*4; - int posY = (gY << 1); - uint4 tmp_sum1=0, tmp_sum2=0; - for(int i=-anX; i<=anX; i++) - { - tmp_sum1 += vload4(col, (__local uint*)temp+i); - } + selected_col.y = ADDR_L(startX+col*4+1, 0, src_whole_cols); + selected_col.y = ADDR_R(startX+col*4+1, src_whole_cols, selected_col.y); - for(int i=-anX; i<=anX; i++) - { - tmp_sum2 += vload4(col, (__local uint*)(temp+THREADS)+i); - } + selected_col.z = ADDR_L(startX+col*4+2, 0, src_whole_cols); + selected_col.z = ADDR_R(startX+col*4+2, src_whole_cols, selected_col.z); - if(posY < dst_rows && posX < dst_cols) - { - if(posX >= 0 && posX < dst_cols) - *(dst+dst_startY * dst_step + dst_startX + (col-anX)*4) = tmp_sum1.x/alpha; - if(posX+1 >= 0 && posX+1 < dst_cols) - *(dst+dst_startY * dst_step + dst_startX+1 + (col-anX)*4) = tmp_sum1.y/alpha; - if(posX+2 >= 0 && posX+2 < dst_cols) - *(dst+dst_startY * dst_step + dst_startX+2 + (col-anX)*4) = tmp_sum1.z/alpha; - if(posX+3 >= 0 && posX+3 < dst_cols) - *(dst+dst_startY * dst_step + dst_startX+3 + (col-anX)*4) = tmp_sum1.w/alpha; + selected_col.w = ADDR_L(startX+col*4+3, 0, src_whole_cols); + selected_col.w = ADDR_R(startX+col*4+3, src_whole_cols, selected_col.w); + + data[i].x = *(src + selected_row * src_step + selected_col.x); + data[i].y = *(src + selected_row * src_step + selected_col.y); + data[i].z = *(src + selected_row * src_step + selected_col.z); + data[i].w = *(src + selected_row * src_step + selected_col.w); } - if(posY+1 < dst_rows && posX < dst_cols) + else { - dst_startY+=1; - if(posX >= 0 && posX < dst_cols) - *(dst+dst_startY * dst_step + dst_startX + (col-anX)*4) = tmp_sum2.x/alpha; - if(posX+1 >= 0 && posX+1 < dst_cols) - *(dst+dst_startY * dst_step + dst_startX+1 + (col-anX)*4) = tmp_sum2.y/alpha; - if(posX+2 >= 0 && posX+2 < dst_cols) - *(dst+dst_startY * dst_step + dst_startX+2 + (col-anX)*4) = tmp_sum2.z/alpha; - if(posX+3 >= 0 && posX+3 < dst_cols) - *(dst+dst_startY * dst_step + dst_startX+3 + (col-anX)*4) = tmp_sum2.w/alpha; + data[i] = convert_uint4(vload4(col,(__global uchar*)(src+(startY+i)*src_step + startX))); } } +#endif + uint4 tmp_sum = 0; + for(int i=1; i < ksY; i++) + { + tmp_sum += (data[i]); + } + + int index = dst_startY * dst_step + dst_startX + (col-anX)*4; + + temp[0][col] = tmp_sum + (data[0]); + temp[1][col] = tmp_sum + (data[ksY]); + barrier(CLK_LOCAL_MEM_FENCE); + update_dst_C1_D0(dst+index, (__local uint *)(temp[0]), + dst_rows, dst_cols, dst_startX, dst_x_off, alpha); + update_dst_C1_D0(dst+index+dst_step, (__local uint *)(temp[1]), + dst_rows, dst_cols, dst_startX, dst_x_off, alpha); } @@ -221,9 +248,9 @@ __kernel void boxFilter_C1_D0(__global const uchar * restrict src, __global ucha /////////////////////////////////////////8uC4//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// __kernel void boxFilter_C4_D0(__global const uchar4 * restrict src, __global uchar4 *dst, float alpha, - int src_offset, int src_whole_rows, int src_whole_cols, int src_step, - int dst_offset, int dst_rows, int dst_cols, int dst_step - ) + int src_offset, int src_whole_rows, int src_whole_cols, int src_step, + int dst_offset, int dst_rows, int dst_cols, int dst_step + ) { int col = get_local_id(0); const int gX = get_group_id(0); @@ -238,81 +265,63 @@ __kernel void boxFilter_C4_D0(__global const uchar4 * restrict src, __global uch int startY = (gY << 1) - anY + src_y_off; int dst_startX = gX * (THREADS-ksX+1) + dst_x_off; int dst_startY = (gY << 1) + dst_y_off; - //int end_addr = (src_whole_rows-1)*(src_step>>2) + src_whole_cols-4; - int end_addr = src_whole_cols-4; uint4 data[ksY+1]; __local uint4 temp[2][THREADS]; + #ifdef BORDER_CONSTANT bool con; - uint4 ss; 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; - - //int cur_addr = clamp((startY+i)*(src_step>>2)+(startX+col),0,end_addr); - //ss = convert_uint4(src[cur_addr]); - int cur_col = clamp(startX + col, 0, src_whole_cols); - if(con) - ss = convert_uint4(src[(startY+i)*(src_step>>2) + cur_col]); - data[i] = con ? ss : 0; + data[i].x = con ? src[(startY+i)*(src_step>>2) + cur_col].x : 0; + data[i].y = con ? src[(startY+i)*(src_step>>2) + cur_col].y : 0; + data[i].z = con ? src[(startY+i)*(src_step>>2) + cur_col].z : 0; + data[i].w = con ? src[(startY+i)*(src_step>>2) + cur_col].w : 0; } #else - for(int i=0; i < ksY+1; i++) - { - int selected_row; - int selected_col; - selected_row = ADDR_H(startY+i, 0, src_whole_rows); - selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); + for(int i=0; i < ksY+1; i++) + { + int selected_row; + int selected_col; + selected_row = ADDR_H(startY+i, 0, src_whole_rows); + selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); - selected_col = ADDR_L(startX+col, 0, src_whole_cols); - selected_col = ADDR_R(startX+col, src_whole_cols, selected_col); + selected_col = ADDR_L(startX+col, 0, src_whole_cols); + 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]); + } #endif - uint4 sum0 = 0, sum1 = 0, sum2 = 0; + uint4 tmp_sum = 0; for(int i=1; i < ksY; i++) { - sum0 += (data[i]); + tmp_sum += (data[i]); } - sum1 = sum0 + (data[0]); - sum2 = sum0 + (data[ksY]); - temp[0][col] = sum1; - temp[1][col] = sum2; - barrier(CLK_LOCAL_MEM_FENCE); - if(col < (THREADS-(ksX-1))) - { - col += anX; - int posX = dst_startX - dst_x_off + col - anX; - int posY = (gY << 1); - uint4 tmp_sum[2]={(uint4)(0,0,0,0),(uint4)(0,0,0,0)}; - for(int k=0; k<2; k++) - for(int i=-anX; i<=anX; i++) - { - tmp_sum[k] += temp[k][col+i]; - } - for(int i=0; i<2; i++) - { - if(posX >= 0 && posX < dst_cols && (posY+i) >= 0 && (posY+i) < dst_rows) - dst[(dst_startY+i) * (dst_step>>2)+ dst_startX + col - anX] = convert_uchar4(convert_float4(tmp_sum[i])/alpha); - } + int index = dst_startY * (dst_step>>2)+ dst_startX + col; + + temp[0][col] = tmp_sum + (data[0]); + temp[1][col] = tmp_sum + (data[ksY]); + barrier(CLK_LOCAL_MEM_FENCE); + update_dst_C4_D0(dst+index, (__local uint4 *)(temp[0]), + dst_rows, dst_cols, dst_startX, dst_x_off, alpha); + update_dst_C4_D0(dst+index+(dst_step>>2), (__local uint4 *)(temp[1]), + dst_rows, dst_cols, dst_startX, dst_x_off, alpha); - } } /////////////////////////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////32fC1//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// __kernel void boxFilter_C1_D5(__global const float *restrict src, __global float *dst, float alpha, - int src_offset, int src_whole_rows, int src_whole_cols, int src_step, - int dst_offset, int dst_rows, int dst_cols, int dst_step - ) + int src_offset, int src_whole_rows, int src_whole_cols, int src_step, + int dst_offset, int dst_rows, int dst_cols, int dst_step + ) { int col = get_local_id(0); const int gX = get_group_id(0); @@ -327,7 +336,6 @@ __kernel void boxFilter_C1_D5(__global const float *restrict src, __global float int startY = (gY << 1) - anY + src_y_off; int dst_startX = gX * (THREADS-ksX+1) + dst_x_off; int dst_startY = (gY << 1) + dst_y_off; - int end_addr = (src_whole_rows-1)*(src_step>>2) + src_whole_cols-4; float data[ksY+1]; __local float temp[2][THREADS]; #ifdef BORDER_CONSTANT @@ -336,28 +344,25 @@ __kernel void boxFilter_C1_D5(__global const float *restrict src, __global float 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; - //int cur_addr = clamp((startY+i)*(src_step>>2)+(startX+col),0,end_addr); - //ss = src[cur_addr]; int cur_col = clamp(startX + col, 0, src_whole_cols); - //ss = src[(startY+i)*(src_step>>2) + cur_col]; - ss = (startY+i)=0&&cur_col>=0&&cur_col>2) + cur_col]:0; + ss = (startY+i)=0&&cur_col>=0&&cur_col>2) + cur_col]:(float)0; data[i] = con ? ss : 0.f; } #else - for(int i=0; i < ksY+1; i++) - { - int selected_row; - int selected_col; - selected_row = ADDR_H(startY+i, 0, src_whole_rows); - selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); + for(int i=0; i < ksY+1; i++) + { + int selected_row; + int selected_col; + selected_row = ADDR_H(startY+i, 0, src_whole_rows); + selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); - selected_col = ADDR_L(startX+col, 0, src_whole_cols); - selected_col = ADDR_R(startX+col, src_whole_cols, selected_col); + selected_col = ADDR_L(startX+col, 0, src_whole_cols); + selected_col = ADDR_R(startX+col, src_whole_cols, selected_col); - data[i] = src[selected_row * (src_step>>2) + selected_col]; - } + data[i] = src[selected_row * (src_step>>2) + selected_col]; + } #endif float sum0 = 0.0, sum1 = 0.0, sum2 = 0.0; @@ -376,7 +381,7 @@ __kernel void boxFilter_C1_D5(__global const float *restrict src, __global float int posX = dst_startX - dst_x_off + col - anX; int posY = (gY << 1); - float tmp_sum[2]={0.0, 0.0}; + float tmp_sum[2]= {0.0, 0.0}; for(int k=0; k<2; k++) for(int i=-anX; i<=anX; i++) { @@ -395,9 +400,9 @@ __kernel void boxFilter_C1_D5(__global const float *restrict src, __global float /////////////////////////////////////////32fC4//////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////// __kernel void boxFilter_C4_D5(__global const float4 *restrict src, __global float4 *dst, float alpha, - int src_offset, int src_whole_rows, int src_whole_cols, int src_step, - int dst_offset, int dst_rows, int dst_cols, int dst_step - ) + int src_offset, int src_whole_rows, int src_whole_cols, int src_step, + int dst_offset, int dst_rows, int dst_cols, int dst_step + ) { int col = get_local_id(0); const int gX = get_group_id(0); @@ -412,7 +417,6 @@ __kernel void boxFilter_C4_D5(__global const float4 *restrict src, __global floa int startY = (gY << 1) - anY + src_y_off; int dst_startX = gX * (THREADS-ksX+1) + dst_x_off; int dst_startY = (gY << 1) + dst_y_off; - int end_addr = (src_whole_rows-1)*(src_step>>4) + src_whole_cols-16; float4 data[ksY+1]; __local float4 temp[2][THREADS]; #ifdef BORDER_CONSTANT @@ -421,28 +425,25 @@ __kernel void boxFilter_C4_D5(__global const float4 *restrict src, __global floa 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; - //int cur_addr = clamp((startY+i)*(src_step>>4)+(startX+col),0,end_addr); - //ss = src[cur_addr]; int cur_col = clamp(startX + col, 0, src_whole_cols); - //ss = src[(startY+i)*(src_step>>4) + cur_col]; - ss = (startY+i)=0&&cur_col>=0&&cur_col>4) + cur_col]:0; + ss = (startY+i)=0&&cur_col>=0&&cur_col>4) + cur_col]:(float4)0; data[i] = con ? ss : (float4)(0.0,0.0,0.0,0.0); } #else - for(int i=0; i < ksY+1; i++) - { - int selected_row; - int selected_col; - selected_row = ADDR_H(startY+i, 0, src_whole_rows); - selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); + for(int i=0; i < ksY+1; i++) + { + int selected_row; + int selected_col; + selected_row = ADDR_H(startY+i, 0, src_whole_rows); + selected_row = ADDR_B(startY+i, src_whole_rows, selected_row); - selected_col = ADDR_L(startX+col, 0, src_whole_cols); - selected_col = ADDR_R(startX+col, src_whole_cols, selected_col); + selected_col = ADDR_L(startX+col, 0, src_whole_cols); + selected_col = ADDR_R(startX+col, src_whole_cols, selected_col); - data[i] = src[selected_row * (src_step>>4) + selected_col]; - } + data[i] = src[selected_row * (src_step>>4) + selected_col]; + } #endif float4 sum0 = 0.0, sum1 = 0.0, sum2 = 0.0; @@ -461,7 +462,7 @@ __kernel void boxFilter_C4_D5(__global const float4 *restrict src, __global floa int posX = dst_startX - dst_x_off + col - anX; int posY = (gY << 1); - float4 tmp_sum[2]={(float4)(0.0,0.0,0.0,0.0), (float4)(0.0,0.0,0.0,0.0)}; + float4 tmp_sum[2]= {(float4)(0.0,0.0,0.0,0.0), (float4)(0.0,0.0,0.0,0.0)}; for(int k=0; k<2; k++) for(int i=-anX; i<=anX; i++) { From 69a0b5dde596840f8face6a4623a9fcffacf5fda Mon Sep 17 00:00:00 2001 From: yao Date: Mon, 15 Apr 2013 17:24:30 +0800 Subject: [PATCH 04/49] Add OclCascadeClassifierBuf interface --- modules/ocl/include/opencv2/ocl/ocl.hpp | 38 + modules/ocl/src/haar.cpp | 715 ++++++++++++++---- modules/ocl/src/opencl/haarobjectdetect.cl | 318 ++++---- .../src/opencl/haarobjectdetect_scaled2.cl | 286 ++++--- modules/ocl/test/test_haar.cpp | 98 ++- 5 files changed, 956 insertions(+), 499 deletions(-) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 613179f8b6..d00f4bf54e 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -802,6 +802,44 @@ namespace cv int minNeighbors, int flags, CvSize minSize = cvSize(0, 0), CvSize maxSize = cvSize(0, 0)); }; + class CV_EXPORTS OclCascadeClassifierBuf : public cv::CascadeClassifier + { + public: + OclCascadeClassifierBuf() : + m_flags(0), initialized(false), m_scaleFactor(0), buffers(NULL) {} + + ~OclCascadeClassifierBuf() {} + + void detectMultiScale(oclMat &image, CV_OUT std::vector& faces, + double scaleFactor = 1.1, int minNeighbors = 3, int flags = 0, + Size minSize = Size(), Size maxSize = Size()); + void release(); + + private: + void Init(const int rows, const int cols, double scaleFactor, int flags, + const int outputsz, const size_t localThreads[], + CvSize minSize, CvSize maxSize); + void CreateBaseBufs(const int datasize, const int totalclassifier, const int flags, const int outputsz); + void CreateFactorRelatedBufs(const int rows, const int cols, const int flags, + const double scaleFactor, const size_t localThreads[], + CvSize minSize, CvSize maxSize); + void GenResult(CV_OUT std::vector& faces, const std::vector &rectList, const std::vector &rweights); + + int m_rows; + int m_cols; + int m_flags; + int m_loopcount; + int m_nodenum; + bool findBiggestObject; + bool initialized; + double m_scaleFactor; + Size m_minSize; + Size m_maxSize; + vector sizev; + vector scalev; + oclMat gimg1, gsum, gsqsum; + void * buffers; + }; /////////////////////////////// Pyramid ///////////////////////////////////// diff --git a/modules/ocl/src/haar.cpp b/modules/ocl/src/haar.cpp index 1c727f01f9..c65f68b050 100644 --- a/modules/ocl/src/haar.cpp +++ b/modules/ocl/src/haar.cpp @@ -20,6 +20,7 @@ // Jia Haipeng, jiahaipeng95@gmail.com // Wu Xinglong, wxl370@126.com // Wang Yao, bitwangyaoyao@gmail.com +// Sen Liu, swjtuls1987@126.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -842,15 +843,13 @@ static void gpuSetHaarClassifierCascade( CvHaarClassifierCascade *_cascade } /* j */ } } + CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemStorage *storage, double scaleFactor, int minNeighbors, int flags, CvSize minSize, CvSize maxSize) { CvHaarClassifierCascade *cascade = oldCascade; - //double alltime = (double)cvGetTickCount(); - //double t = (double)cvGetTickCount(); const double GROUP_EPS = 0.2; - oclMat gtemp, gsum1, gtilted1, gsqsum1, gnormImg, gsumcanny; CvSeq *result_seq = 0; cv::Ptr temp_storage; @@ -861,7 +860,6 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int datasize=0; int totalclassifier=0; - //void *out; GpuHidHaarClassifierCascade *gcascade; GpuHidHaarStageClassifier *stage; GpuHidHaarClassifier *classifier; @@ -870,11 +868,8 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int *candidate; cl_int status; - // bool doCannyPruning = (flags & CV_HAAR_DO_CANNY_PRUNING) != 0; bool findBiggestObject = (flags & CV_HAAR_FIND_BIGGEST_OBJECT) != 0; - // bool roughSearch = (flags & CV_HAAR_DO_ROUGH_SEARCH) != 0; - //double t = 0; if( maxSize.height == 0 || maxSize.width == 0 ) { maxSize.height = gimg.rows; @@ -896,27 +891,20 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS if( findBiggestObject ) flags &= ~CV_HAAR_SCALE_IMAGE; - //gtemp = oclMat( gimg.rows, gimg.cols, CV_8UC1); - //gsum1 = oclMat( gimg.rows + 1, gimg.cols + 1, CV_32SC1 ); - //gsqsum1 = oclMat( gimg.rows + 1, gimg.cols + 1, CV_32FC1 ); - if( !cascade->hid_cascade ) - /*out = (void *)*/gpuCreateHidHaarClassifierCascade(cascade, &datasize, &totalclassifier); - if( cascade->hid_cascade->has_tilted_features ) - gtilted1 = oclMat( gimg.rows + 1, gimg.cols + 1, CV_32SC1 ); + gpuCreateHidHaarClassifierCascade(cascade, &datasize, &totalclassifier); result_seq = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvAvgComp), storage ); if( CV_MAT_CN(gimg.type()) > 1 ) { + oclMat gtemp; cvtColor( gimg, gtemp, CV_BGR2GRAY ); gimg = gtemp; } if( findBiggestObject ) flags &= ~(CV_HAAR_SCALE_IMAGE | CV_HAAR_DO_CANNY_PRUNING); - //t = (double)cvGetTickCount() - t; - //printf( "before if time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); if( gimg.cols < minSize.width || gimg.rows < minSize.height ) CV_Error(CV_StsError, "Image too small"); @@ -924,12 +912,9 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS if( (flags & CV_HAAR_SCALE_IMAGE) ) { CvSize winSize0 = cascade->orig_window_size; - //float scalefactor = 1.1f; - //float factor = 1.f; int totalheight = 0; int indexy = 0; CvSize sz; - //t = (double)cvGetTickCount(); vector sizev; vector scalev; for(factor = 1.f;; factor *= scaleFactor) @@ -950,20 +935,15 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS sizev.push_back(sz); scalev.push_back(factor); } - //int flag = 0; oclMat gimg1(gimg.rows, gimg.cols, CV_8UC1); oclMat gsum(totalheight + 4, gimg.cols + 1, CV_32SC1); oclMat gsqsum(totalheight + 4, gimg.cols + 1, CV_32FC1); - //cl_mem cascadebuffer; cl_mem stagebuffer; - //cl_mem classifierbuffer; cl_mem nodebuffer; cl_mem candidatebuffer; cl_mem scaleinfobuffer; - //cl_kernel kernel; - //kernel = openCLGetKernelFromSource(gimg.clCxt, &haarobjectdetect, "gpuRunHaarClassifierCascade"); cv::Rect roi, roi2; cv::Mat imgroi, imgroisq; cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; @@ -971,18 +951,13 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS size_t blocksize = 8; size_t localThreads[3] = { blocksize, blocksize , 1 }; - size_t globalThreads[3] = { grp_per_CU *((gsum.clCxt)->computeUnits()) *localThreads[0], + size_t globalThreads[3] = { grp_per_CU * gsum.clCxt->computeUnits() *localThreads[0], localThreads[1], 1 }; int outputsz = 256 * globalThreads[0] / localThreads[0]; int loopcount = sizev.size(); detect_piramid_info *scaleinfo = (detect_piramid_info *)malloc(sizeof(detect_piramid_info) * loopcount); - //t = (double)cvGetTickCount() - t; - // printf( "pre time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - //int *it =scaleinfo; - // t = (double)cvGetTickCount(); - for( int i = 0; i < loopcount; i++ ) { sz = sizev[i]; @@ -992,7 +967,6 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS resizeroi = gimg1(roi2); gimgroi = gsum(roi); gimgroisq = gsqsum(roi); - //scaleinfo[i].rows = gimgroi.rows; int width = gimgroi.cols - 1 - cascade->orig_window_size.width; int height = gimgroi.rows - 1 - cascade->orig_window_size.height; scaleinfo[i].width_height = (width << 16) | height; @@ -1000,76 +974,40 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int grpnumperline = (width + localThreads[0] - 1) / localThreads[0]; int totalgrp = ((height + localThreads[1] - 1) / localThreads[1]) * grpnumperline; - //outputsz +=width*height; scaleinfo[i].grpnumperline_totalgrp = (grpnumperline << 16) | totalgrp; scaleinfo[i].imgoff = gimgroi.offset >> 2; scaleinfo[i].factor = factor; - //printf("rows = %d,ystep = %d,width = %d,height = %d,grpnumperline = %d,totalgrp = %d,imgoff = %d,factor = %f\n", - // scaleinfo[i].rows,scaleinfo[i].ystep,scaleinfo[i].width,scaleinfo[i].height,scaleinfo[i].grpnumperline, - // scaleinfo[i].totalgrp,scaleinfo[i].imgoff,scaleinfo[i].factor); cv::ocl::resize(gimg, resizeroi, Size(sz.width - 1, sz.height - 1), 0, 0, INTER_LINEAR); - //cv::imwrite("D:\\1.jpg",gimg1); cv::ocl::integral(resizeroi, gimgroi, gimgroisq); - //cv::ocl::oclMat chk(sz.height,sz.width,CV_32SC1),chksq(sz.height,sz.width,CV_32FC1); - //cv::ocl::integral(gimg1, chk, chksq); - //double r = cv::norm(chk,gimgroi,NORM_INF); - //if(r > std::numeric_limits::epsilon()) - //{ - // printf("failed"); - //} indexy += sz.height; } - //int ystep = factor > 2 ? 1 : 2; - // t = (double)cvGetTickCount() - t; - //printf( "resize integral time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - //t = (double)cvGetTickCount(); + gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade; stage = (GpuHidHaarStageClassifier *)(gcascade + 1); classifier = (GpuHidHaarClassifier *)(stage + gcascade->count); node = (GpuHidHaarTreeNode *)(classifier->node); - //int m,n; - //m = (gsum.cols - 1 - cascade->orig_window_size.width + ystep - 1)/ystep; - //n = (gsum.rows - 1 - cascade->orig_window_size.height + ystep - 1)/ystep; - //int counter = m*n; - int nodenum = (datasize - sizeof(GpuHidHaarClassifierCascade) - sizeof(GpuHidHaarStageClassifier) * gcascade->count - sizeof(GpuHidHaarClassifier) * totalclassifier) / sizeof(GpuHidHaarTreeNode); - //if(flag == 0){ + candidate = (int *)malloc(4 * sizeof(int) * outputsz); - //memset((char*)candidate,0,4*sizeof(int)*outputsz); - gpuSetImagesForHaarClassifierCascade( cascade,/* &sum1, &sqsum1, _tilted,*/ 1., gsum.step / 4 ); - //cascadebuffer = clCreateBuffer(gsum.clCxt->clContext,CL_MEM_READ_ONLY,sizeof(GpuHidHaarClassifierCascade),NULL,&status); - //openCLVerifyCall(status); - //openCLSafeCall(clEnqueueWriteBuffer(gsum.clCxt->clCmdQueue,cascadebuffer,1,0,sizeof(GpuHidHaarClassifierCascade),gcascade,0,NULL,NULL)); + gpuSetImagesForHaarClassifierCascade( cascade, 1., gsum.step / 4 ); stagebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(GpuHidHaarStageClassifier) * gcascade->count); - //openCLVerifyCall(status); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), stagebuffer, 1, 0, sizeof(GpuHidHaarStageClassifier)*gcascade->count, stage, 0, NULL, NULL)); - - //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); + cl_command_queue qu = (cl_command_queue)gsum.clCxt->oclCommandQueue(); + openCLSafeCall(clEnqueueWriteBuffer(qu, stagebuffer, 1, 0, sizeof(GpuHidHaarStageClassifier)*gcascade->count, stage, 0, NULL, NULL)); nodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, nodenum * sizeof(GpuHidHaarTreeNode)); - //openCLVerifyCall(status); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), nodebuffer, 1, 0, - nodenum * sizeof(GpuHidHaarTreeNode), + + openCLSafeCall(clEnqueueWriteBuffer(qu, nodebuffer, 1, 0, nodenum * sizeof(GpuHidHaarTreeNode), node, 0, NULL, NULL)); candidatebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_WRITE_ONLY, 4 * sizeof(int) * outputsz); - //openCLVerifyCall(status); - scaleinfobuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount); - //openCLVerifyCall(status); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), scaleinfobuffer, 1, 0, sizeof(detect_piramid_info)*loopcount, scaleinfo, 0, NULL, NULL)); - //flag = 1; - //} - //t = (double)cvGetTickCount() - t; - //printf( "update time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); + scaleinfobuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount); + openCLSafeCall(clEnqueueWriteBuffer(qu, scaleinfobuffer, 1, 0, sizeof(detect_piramid_info)*loopcount, scaleinfo, 0, NULL, NULL)); - //size_t globalThreads[3] = { counter+blocksize*blocksize-counter%(blocksize*blocksize),1,1}; - //t = (double)cvGetTickCount(); int startstage = 0; int endstage = gcascade->count; int startnode = 0; @@ -1087,11 +1025,6 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS pq.s[3] = gcascade->pq3; float correction = gcascade->inv_window_area; - //int grpnumperline = ((m + localThreads[0] - 1) / localThreads[0]); - //int totalgrp = ((n + localThreads[1] - 1) / localThreads[1])*grpnumperline; - // openCLVerifyKernel(gsum.clCxt, kernel, &blocksize, globalThreads, localThreads); - //openCLSafeCall(clSetKernelArg(kernel,argcount++,sizeof(cl_mem),(void*)&cascadebuffer)); - vector > args; args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&scaleinfobuffer )); @@ -1111,28 +1044,20 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS args.push_back ( make_pair(sizeof(cl_float) , (void *)&correction )); openCLExecuteKernel(gsum.clCxt, &haarobjectdetect, "gpuRunHaarClassifierCascade", globalThreads, localThreads, args, -1, -1); - //t = (double)cvGetTickCount() - t; - //printf( "detection time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - //t = (double)cvGetTickCount(); - //openCLSafeCall(clEnqueueReadBuffer(gsum.clCxt->impl->clCmdQueue, candidatebuffer, 1, 0, 4 * sizeof(int)*outputsz, candidate, 0, NULL, NULL)); + openCLReadBuffer( gsum.clCxt, candidatebuffer, candidate, 4 * sizeof(int)*outputsz ); for(int i = 0; i < outputsz; i++) 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])); - // t = (double)cvGetTickCount() - t; - //printf( "post time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - //t = (double)cvGetTickCount(); + allCandidates.push_back(Rect(candidate[4 * i], candidate[4 * i + 1], + candidate[4 * i + 2], candidate[4 * i + 3])); + free(scaleinfo); free(candidate); - //openCLSafeCall(clReleaseMemObject(cascadebuffer)); openCLSafeCall(clReleaseMemObject(stagebuffer)); openCLSafeCall(clReleaseMemObject(scaleinfobuffer)); openCLSafeCall(clReleaseMemObject(nodebuffer)); openCLSafeCall(clReleaseMemObject(candidatebuffer)); - // openCLSafeCall(clReleaseKernel(kernel)); - //t = (double)cvGetTickCount() - t; - //printf( "release time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); } else { @@ -1150,7 +1075,6 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS classifier = (GpuHidHaarClassifier *)(stage + gcascade->count); node = (GpuHidHaarTreeNode *)(classifier->node); cl_mem stagebuffer; - //cl_mem classifierbuffer; cl_mem nodebuffer; cl_mem candidatebuffer; cl_mem scaleinfobuffer; @@ -1187,24 +1111,20 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS size_t blocksize = 8; size_t localThreads[3] = { blocksize, blocksize , 1 }; size_t globalThreads[3] = { grp_per_CU *gsum.clCxt->computeUnits() *localThreads[0], - localThreads[1], 1 - }; + localThreads[1], 1 }; int outputsz = 256 * globalThreads[0] / localThreads[0]; int nodenum = (datasize - sizeof(GpuHidHaarClassifierCascade) - sizeof(GpuHidHaarStageClassifier) * gcascade->count - sizeof(GpuHidHaarClassifier) * totalclassifier) / sizeof(GpuHidHaarTreeNode); nodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, nodenum * sizeof(GpuHidHaarTreeNode)); - //openCLVerifyCall(status); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), nodebuffer, 1, 0, + cl_command_queue qu = (cl_command_queue)gsum.clCxt->oclCommandQueue(); + openCLSafeCall(clEnqueueWriteBuffer(qu, nodebuffer, 1, 0, nodenum * sizeof(GpuHidHaarTreeNode), node, 0, NULL, NULL)); cl_mem newnodebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_WRITE, loopcount * nodenum * sizeof(GpuHidHaarTreeNode)); int startstage = 0; int endstage = gcascade->count; - //cl_kernel kernel; - //kernel = openCLGetKernelFromSource(gsum.clCxt, &haarobjectdetect_scaled2, "gpuRunHaarClassifierCascade_scaled2"); - //cl_kernel kernel2 = openCLGetKernelFromSource(gimg.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier"); for(int i = 0; i < loopcount; i++) { sz = sizev[i]; @@ -1223,7 +1143,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS int height = (gsum.rows - 1 - sz.height + ystep - 1) / ystep; int grpnumperline = (width + localThreads[0] - 1) / localThreads[0]; int totalgrp = ((height + localThreads[1] - 1) / localThreads[1]) * grpnumperline; - //outputsz +=width*height; + scaleinfo[i].width_height = (width << 16) | height; scaleinfo[i].grpnumperline_totalgrp = (grpnumperline << 16) | totalgrp; scaleinfo[i].imgoff = 0; @@ -1241,28 +1161,20 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS size_t globalThreads2[3] = {nodenum, 1, 1}; openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier", globalThreads2, NULL/*localThreads2*/, args1, -1, -1); - - //clEnqueueNDRangeKernel(gsum.clCxt->impl->clCmdQueue, kernel2, 1, NULL, globalThreads2, 0, 0, NULL, NULL); - //clFinish(gsum.clCxt->impl->clCmdQueue); } - //clReleaseKernel(kernel2); + int step = gsum.step / 4; int startnode = 0; int splitstage = 3; - int splitnode = stage[0].count + stage[1].count + stage[2].count; stagebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(GpuHidHaarStageClassifier) * gcascade->count); - //openCLVerifyCall(status); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), stagebuffer, 1, 0, sizeof(GpuHidHaarStageClassifier)*gcascade->count, stage, 0, NULL, NULL)); + openCLSafeCall(clEnqueueWriteBuffer(qu, stagebuffer, 1, 0, sizeof(GpuHidHaarStageClassifier)*gcascade->count, stage, 0, NULL, NULL)); candidatebuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, 4 * sizeof(int) * outputsz); - //openCLVerifyCall(status); scaleinfobuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount); - //openCLVerifyCall(status); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), scaleinfobuffer, 1, 0, sizeof(detect_piramid_info)*loopcount, scaleinfo, 0, NULL, NULL)); + openCLSafeCall(clEnqueueWriteBuffer(qu, scaleinfobuffer, 1, 0, sizeof(detect_piramid_info)*loopcount, scaleinfo, 0, NULL, NULL)); pbuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(cl_int4) * loopcount); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), pbuffer, 1, 0, sizeof(cl_int4)*loopcount, p, 0, NULL, NULL)); + openCLSafeCall(clEnqueueWriteBuffer(qu, pbuffer, 1, 0, sizeof(cl_int4)*loopcount, p, 0, NULL, NULL)); correctionbuffer = openCLCreateBuffer(gsum.clCxt, CL_MEM_READ_ONLY, sizeof(cl_float) * loopcount); - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), correctionbuffer, 1, 0, sizeof(cl_float)*loopcount, correction, 0, NULL, NULL)); - //int argcount = 0; + openCLSafeCall(clEnqueueWriteBuffer(qu, correctionbuffer, 1, 0, sizeof(cl_float)*loopcount, correction, 0, NULL, NULL)); vector > args; args.push_back ( make_pair(sizeof(cl_mem) , (void *)&stagebuffer )); @@ -1271,22 +1183,21 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsum.data )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsqsum.data )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&candidatebuffer )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&gsum.rows )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&gsum.cols )); args.push_back ( make_pair(sizeof(cl_int) , (void *)&step )); args.push_back ( make_pair(sizeof(cl_int) , (void *)&loopcount )); args.push_back ( make_pair(sizeof(cl_int) , (void *)&startstage )); args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitstage )); args.push_back ( make_pair(sizeof(cl_int) , (void *)&endstage )); args.push_back ( make_pair(sizeof(cl_int) , (void *)&startnode )); - args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitnode )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&pbuffer )); args.push_back ( make_pair(sizeof(cl_mem) , (void *)&correctionbuffer )); args.push_back ( make_pair(sizeof(cl_int) , (void *)&nodenum )); - openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuRunHaarClassifierCascade_scaled2", globalThreads, localThreads, args, -1, -1); - //openCLSafeCall(clEnqueueReadBuffer(gsum.clCxt->clCmdQueue,candidatebuffer,1,0,4*sizeof(int)*outputsz,candidate,0,NULL,NULL)); - candidate = (int *)clEnqueueMapBuffer((cl_command_queue)gsum.clCxt->oclCommandQueue(), candidatebuffer, 1, CL_MAP_READ, 0, 4 * sizeof(int), 0, 0, 0, &status); + candidate = (int *)clEnqueueMapBuffer(qu, candidatebuffer, 1, CL_MAP_READ, 0, 4 * sizeof(int) * outputsz, 0, 0, 0, &status); for(int i = 0; i < outputsz; i++) { @@ -1297,7 +1208,7 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS free(scaleinfo); free(p); free(correction); - clEnqueueUnmapMemObject((cl_command_queue)gsum.clCxt->oclCommandQueue(), candidatebuffer, candidate, 0, 0, 0); + clEnqueueUnmapMemObject(qu, candidatebuffer, candidate, 0, 0, 0); openCLSafeCall(clReleaseMemObject(stagebuffer)); openCLSafeCall(clReleaseMemObject(scaleinfobuffer)); openCLSafeCall(clReleaseMemObject(nodebuffer)); @@ -1306,20 +1217,547 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS openCLSafeCall(clReleaseMemObject(pbuffer)); openCLSafeCall(clReleaseMemObject(correctionbuffer)); } - //t = (double)cvGetTickCount() ; + cvFree(&cascade->hid_cascade); - // printf("%d\n",globalcounter); rectList.resize(allCandidates.size()); if(!allCandidates.empty()) std::copy(allCandidates.begin(), allCandidates.end(), rectList.begin()); - //cout << "count = " << rectList.size()<< endl; + if( minNeighbors != 0 || findBiggestObject ) + groupRectangles(rectList, rweights, std::max(minNeighbors, 1), GROUP_EPS); + else + rweights.resize(rectList.size(), 0); + + if( findBiggestObject && rectList.size() ) + { + CvAvgComp result_comp = {{0, 0, 0, 0}, 0}; + + for( size_t i = 0; i < rectList.size(); i++ ) + { + cv::Rect r = rectList[i]; + if( r.area() > cv::Rect(result_comp.rect).area() ) + { + result_comp.rect = r; + result_comp.neighbors = rweights[i]; + } + } + cvSeqPush( result_seq, &result_comp ); + } + else + { + for( size_t i = 0; i < rectList.size(); i++ ) + { + CvAvgComp c; + c.rect = rectList[i]; + c.neighbors = rweights[i]; + cvSeqPush( result_seq, &c ); + } + } + + return result_seq; +} + +struct OclBuffers +{ + cl_mem stagebuffer; + cl_mem nodebuffer; + cl_mem candidatebuffer; + cl_mem scaleinfobuffer; + cl_mem pbuffer; + cl_mem correctionbuffer; + cl_mem newnodebuffer; +}; + +struct getRect +{ + Rect operator()(const CvAvgComp &e) const + { + return e.rect; + } +}; + +void cv::ocl::OclCascadeClassifierBuf::detectMultiScale(oclMat &gimg, CV_OUT std::vector& faces, + double scaleFactor, int minNeighbors, int flags, + Size minSize, Size maxSize) +{ + int blocksize = 8; + int grp_per_CU = 12; + size_t localThreads[3] = { blocksize, blocksize, 1 }; + size_t globalThreads[3] = { grp_per_CU * Context::getContext()->computeUnits() * localThreads[0], + localThreads[1], + 1 }; + int outputsz = 256 * globalThreads[0] / localThreads[0]; + + Init(gimg.rows, gimg.cols, scaleFactor, flags, outputsz, localThreads, minSize, maxSize); + + const double GROUP_EPS = 0.2; + + cv::ConcurrentRectVector allCandidates; + std::vector rectList; + std::vector rweights; + + CvHaarClassifierCascade *cascade = oldCascade; + GpuHidHaarClassifierCascade *gcascade; + GpuHidHaarStageClassifier *stage; + GpuHidHaarClassifier *classifier; + GpuHidHaarTreeNode *node; + + if( CV_MAT_DEPTH(gimg.type()) != CV_8U ) + CV_Error( CV_StsUnsupportedFormat, "Only 8-bit images are supported" ); + + if( CV_MAT_CN(gimg.type()) > 1 ) + { + oclMat gtemp; + cvtColor( gimg, gtemp, CV_BGR2GRAY ); + gimg = gtemp; + } + + int *candidate; + + if( (flags & CV_HAAR_SCALE_IMAGE) ) + { + int indexy = 0; + CvSize sz; + + cv::Rect roi, roi2; + cv::Mat imgroi, imgroisq; + cv::ocl::oclMat resizeroi, gimgroi, gimgroisq; + + for( int i = 0; i < m_loopcount; i++ ) + { + sz = sizev[i]; + roi = Rect(0, indexy, sz.width, sz.height); + roi2 = Rect(0, 0, sz.width - 1, sz.height - 1); + resizeroi = gimg1(roi2); + gimgroi = gsum(roi); + gimgroisq = gsqsum(roi); + + cv::ocl::resize(gimg, resizeroi, Size(sz.width - 1, sz.height - 1), 0, 0, INTER_LINEAR); + cv::ocl::integral(resizeroi, gimgroi, gimgroisq); + indexy += sz.height; + } + + gcascade = (GpuHidHaarClassifierCascade *)(cascade->hid_cascade); + stage = (GpuHidHaarStageClassifier *)(gcascade + 1); + classifier = (GpuHidHaarClassifier *)(stage + gcascade->count); + node = (GpuHidHaarTreeNode *)(classifier->node); + + gpuSetImagesForHaarClassifierCascade( cascade, 1., gsum.step / 4 ); + + cl_command_queue qu = (cl_command_queue)gsum.clCxt->oclCommandQueue(); + openCLSafeCall(clEnqueueWriteBuffer(qu, ((OclBuffers *)buffers)->stagebuffer, 1, 0, + sizeof(GpuHidHaarStageClassifier) * gcascade->count, + stage, 0, NULL, NULL)); + + openCLSafeCall(clEnqueueWriteBuffer(qu, ((OclBuffers *)buffers)->nodebuffer, 1, 0, + m_nodenum * sizeof(GpuHidHaarTreeNode), + node, 0, NULL, NULL)); + + int startstage = 0; + int endstage = gcascade->count; + int startnode = 0; + int pixelstep = gsum.step / 4; + int splitstage = 3; + int splitnode = stage[0].count + stage[1].count + stage[2].count; + cl_int4 p, pq; + p.s[0] = gcascade->p0; + p.s[1] = gcascade->p1; + p.s[2] = gcascade->p2; + p.s[3] = gcascade->p3; + pq.s[0] = gcascade->pq0; + pq.s[1] = gcascade->pq1; + pq.s[2] = gcascade->pq2; + pq.s[3] = gcascade->pq3; + float correction = gcascade->inv_window_area; + + vector > args; + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->stagebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->scaleinfobuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->nodebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsqsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->candidatebuffer )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&pixelstep )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&m_loopcount )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&endstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startnode )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitnode )); + args.push_back ( make_pair(sizeof(cl_int4) , (void *)&p )); + args.push_back ( make_pair(sizeof(cl_int4) , (void *)&pq )); + args.push_back ( make_pair(sizeof(cl_float) , (void *)&correction )); + + openCLExecuteKernel(gsum.clCxt, &haarobjectdetect, "gpuRunHaarClassifierCascade", globalThreads, localThreads, args, -1, -1); + + candidate = (int *)malloc(4 * sizeof(int) * outputsz); + memset(candidate, 0, 4 * sizeof(int) * outputsz); + openCLReadBuffer( gsum.clCxt, ((OclBuffers *)buffers)->candidatebuffer, candidate, 4 * sizeof(int)*outputsz ); + + for(int i = 0; i < outputsz; i++) + 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])); + + free((void *)candidate); + candidate = NULL; + } + else + { + cv::ocl::integral(gimg, gsum, gsqsum); + + gpuSetHaarClassifierCascade(cascade); + + gcascade = (GpuHidHaarClassifierCascade *)cascade->hid_cascade; + stage = (GpuHidHaarStageClassifier *)(gcascade + 1); + classifier = (GpuHidHaarClassifier *)(stage + gcascade->count); + node = (GpuHidHaarTreeNode *)(classifier->node); + + cl_command_queue qu = (cl_command_queue)gsum.clCxt->oclCommandQueue(); + openCLSafeCall(clEnqueueWriteBuffer(qu, ((OclBuffers *)buffers)->nodebuffer, 1, 0, + m_nodenum * sizeof(GpuHidHaarTreeNode), + node, 0, NULL, NULL)); + + cl_int4 *p = (cl_int4 *)malloc(sizeof(cl_int4) * m_loopcount); + float *correction = (float *)malloc(sizeof(float) * m_loopcount); + int startstage = 0; + int endstage = gcascade->count; + double factor; + for(int i = 0; i < m_loopcount; i++) + { + factor = scalev[i]; + int equRect_x = (int)(factor * gcascade->p0 + 0.5); + int equRect_y = (int)(factor * gcascade->p1 + 0.5); + int equRect_w = (int)(factor * gcascade->p3 + 0.5); + int equRect_h = (int)(factor * gcascade->p2 + 0.5); + p[i].s[0] = equRect_x; + p[i].s[1] = equRect_y; + p[i].s[2] = equRect_x + equRect_w; + p[i].s[3] = equRect_y + equRect_h; + correction[i] = 1. / (equRect_w * equRect_h); + int startnodenum = m_nodenum * i; + float factor2 = (float)factor; + + vector > args1; + args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->nodebuffer )); + args1.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->newnodebuffer )); + 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_int) , (void *)&startnodenum )); + + size_t globalThreads2[3] = {m_nodenum, 1, 1}; + + openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuscaleclassifier", globalThreads2, NULL/*localThreads2*/, args1, -1, -1); + } + + int step = gsum.step / 4; + int startnode = 0; + int splitstage = 3; + openCLSafeCall(clEnqueueWriteBuffer(qu, ((OclBuffers *)buffers)->stagebuffer, 1, 0, sizeof(GpuHidHaarStageClassifier)*gcascade->count, stage, 0, NULL, NULL)); + openCLSafeCall(clEnqueueWriteBuffer(qu, ((OclBuffers *)buffers)->pbuffer, 1, 0, sizeof(cl_int4)*m_loopcount, p, 0, NULL, NULL)); + openCLSafeCall(clEnqueueWriteBuffer(qu, ((OclBuffers *)buffers)->correctionbuffer, 1, 0, sizeof(cl_float)*m_loopcount, correction, 0, NULL, NULL)); + + vector > args; + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->stagebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->scaleinfobuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->newnodebuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&gsqsum.data )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->candidatebuffer )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&gsum.rows )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&gsum.cols )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&step )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&m_loopcount )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&splitstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&endstage )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&startnode )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->pbuffer )); + args.push_back ( make_pair(sizeof(cl_mem) , (void *)&((OclBuffers *)buffers)->correctionbuffer )); + args.push_back ( make_pair(sizeof(cl_int) , (void *)&m_nodenum )); + + openCLExecuteKernel(gsum.clCxt, &haarobjectdetect_scaled2, "gpuRunHaarClassifierCascade_scaled2", globalThreads, localThreads, args, -1, -1); + + candidate = (int *)clEnqueueMapBuffer(qu, ((OclBuffers *)buffers)->candidatebuffer, 1, CL_MAP_READ, 0, 4 * sizeof(int) * outputsz, 0, 0, 0, NULL); + + for(int i = 0; i < outputsz; i++) + { + 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])); + } + + free(p); + free(correction); + clEnqueueUnmapMemObject(qu, ((OclBuffers *)buffers)->candidatebuffer, candidate, 0, 0, 0); + } + + rectList.resize(allCandidates.size()); + if(!allCandidates.empty()) + std::copy(allCandidates.begin(), allCandidates.end(), rectList.begin()); if( minNeighbors != 0 || findBiggestObject ) groupRectangles(rectList, rweights, std::max(minNeighbors, 1), GROUP_EPS); else rweights.resize(rectList.size(), 0); + GenResult(faces, rectList, rweights); +} + +void cv::ocl::OclCascadeClassifierBuf::Init(const int rows, const int cols, + double scaleFactor, int flags, + const int outputsz, const size_t localThreads[], + CvSize minSize, CvSize maxSize) +{ + CvHaarClassifierCascade *cascade = oldCascade; + + if( !CV_IS_HAAR_CLASSIFIER(cascade) ) + CV_Error( !cascade ? CV_StsNullPtr : CV_StsBadArg, "Invalid classifier cascade" ); + + if( scaleFactor <= 1 ) + CV_Error( CV_StsOutOfRange, "scale factor must be > 1" ); + + if( cols < minSize.width || rows < minSize.height ) + CV_Error(CV_StsError, "Image too small"); + + int datasize=0; + int totalclassifier=0; + + if( !cascade->hid_cascade ) + gpuCreateHidHaarClassifierCascade(cascade, &datasize, &totalclassifier); + + if( maxSize.height == 0 || maxSize.width == 0 ) + { + maxSize.height = rows; + maxSize.width = cols; + } + + findBiggestObject = (flags & CV_HAAR_FIND_BIGGEST_OBJECT) != 0; + if( findBiggestObject ) + flags &= ~(CV_HAAR_SCALE_IMAGE | CV_HAAR_DO_CANNY_PRUNING); + + CreateBaseBufs(datasize, totalclassifier, flags, outputsz); + CreateFactorRelatedBufs(rows, cols, flags, scaleFactor, localThreads, minSize, maxSize); + + m_scaleFactor = scaleFactor; + m_rows = rows; + m_cols = cols; + m_flags = flags; + m_minSize = minSize; + m_maxSize = maxSize; + + initialized = true; +} + +void cv::ocl::OclCascadeClassifierBuf::CreateBaseBufs(const int datasize, const int totalclassifier, + const int flags, const int outputsz) +{ + if (!initialized) + { + buffers = malloc(sizeof(OclBuffers)); + + size_t tempSize = + sizeof(GpuHidHaarStageClassifier) * ((GpuHidHaarClassifierCascade *)oldCascade->hid_cascade)->count; + m_nodenum = (datasize - sizeof(GpuHidHaarClassifierCascade) - tempSize - sizeof(GpuHidHaarClassifier) * totalclassifier) + / sizeof(GpuHidHaarTreeNode); + + ((OclBuffers *)buffers)->stagebuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), CL_MEM_READ_ONLY, tempSize); + ((OclBuffers *)buffers)->nodebuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), CL_MEM_READ_ONLY, m_nodenum * sizeof(GpuHidHaarTreeNode)); + } + + if (initialized + && ((m_flags & CV_HAAR_SCALE_IMAGE) ^ (flags & CV_HAAR_SCALE_IMAGE))) + { + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->candidatebuffer)); + } + + if (flags & CV_HAAR_SCALE_IMAGE) + { + ((OclBuffers *)buffers)->candidatebuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), + CL_MEM_WRITE_ONLY, + 4 * sizeof(int) * outputsz); + } + else + { + ((OclBuffers *)buffers)->candidatebuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), + CL_MEM_WRITE_ONLY | CL_MEM_ALLOC_HOST_PTR, + 4 * sizeof(int) * outputsz); + } +} + +void cv::ocl::OclCascadeClassifierBuf::CreateFactorRelatedBufs( + const int rows, const int cols, const int flags, + const double scaleFactor, const size_t localThreads[], + CvSize minSize, CvSize maxSize) +{ + if (initialized) + { + if ((m_flags & CV_HAAR_SCALE_IMAGE) && !(flags & CV_HAAR_SCALE_IMAGE)) + { + gimg1.release(); + gsum.release(); + gsqsum.release(); + } + else if (!(m_flags & CV_HAAR_SCALE_IMAGE) && (flags & CV_HAAR_SCALE_IMAGE)) + { + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->newnodebuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->correctionbuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->pbuffer)); + } + else if ((m_flags & CV_HAAR_SCALE_IMAGE) && (flags & CV_HAAR_SCALE_IMAGE)) + { + if (fabs(m_scaleFactor - scaleFactor) < 1e-6 + && (rows == m_rows && cols == m_cols) + && (minSize.width == m_minSize.width) + && (minSize.height == m_minSize.height) + && (maxSize.width == m_maxSize.width) + && (maxSize.height == m_maxSize.height)) + { + return; + } + } + else + { + if (fabs(m_scaleFactor - scaleFactor) < 1e-6 + && (rows == m_rows && cols == m_cols) + && (minSize.width == m_minSize.width) + && (minSize.height == m_minSize.height) + && (maxSize.width == m_maxSize.width) + && (maxSize.height == m_maxSize.height)) + { + return; + } + else + { + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->newnodebuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->correctionbuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->pbuffer)); + } + } + } + + int loopcount; + int indexy = 0; + int totalheight = 0; + double factor; + Rect roi; + CvSize sz; + CvSize winSize0 = oldCascade->orig_window_size; + detect_piramid_info *scaleinfo; + if (flags & CV_HAAR_SCALE_IMAGE) + { + for(factor = 1.f;; factor *= scaleFactor) + { + CvSize winSize = { cvRound(winSize0.width * factor), cvRound(winSize0.height * factor) }; + sz.width = cvRound( cols / factor ) + 1; + sz.height = cvRound( rows / factor ) + 1; + CvSize sz1 = { sz.width - winSize0.width - 1, sz.height - winSize0.height - 1 }; + + if( sz1.width <= 0 || sz1.height <= 0 ) + break; + if( winSize.width > maxSize.width || winSize.height > maxSize.height ) + break; + if( winSize.width < minSize.width || winSize.height < minSize.height ) + continue; + + totalheight += sz.height; + sizev.push_back(sz); + scalev.push_back(static_cast(factor)); + } + + loopcount = sizev.size(); + gimg1.create(rows, cols, CV_8UC1); + gsum.create(totalheight + 4, cols + 1, CV_32SC1); + gsqsum.create(totalheight + 4, cols + 1, CV_32FC1); + + scaleinfo = (detect_piramid_info *)malloc(sizeof(detect_piramid_info) * loopcount); + for( int i = 0; i < loopcount; i++ ) + { + sz = sizev[i]; + roi = Rect(0, indexy, sz.width, sz.height); + int width = sz.width - 1 - oldCascade->orig_window_size.width; + int height = sz.height - 1 - oldCascade->orig_window_size.height; + int grpnumperline = (width + localThreads[0] - 1) / localThreads[0]; + int totalgrp = ((height + localThreads[1] - 1) / localThreads[1]) * grpnumperline; + + ((detect_piramid_info *)scaleinfo)[i].width_height = (width << 16) | height; + ((detect_piramid_info *)scaleinfo)[i].grpnumperline_totalgrp = (grpnumperline << 16) | totalgrp; + ((detect_piramid_info *)scaleinfo)[i].imgoff = gsum(roi).offset >> 2; + ((detect_piramid_info *)scaleinfo)[i].factor = scalev[i]; + + indexy += sz.height; + } + } + else + { + for(factor = 1; + cvRound(factor * winSize0.width) < cols - 10 && cvRound(factor * winSize0.height) < rows - 10; + factor *= scaleFactor) + { + CvSize winSize = { cvRound( winSize0.width * factor ), cvRound( winSize0.height * factor ) }; + if( winSize.width < minSize.width || winSize.height < minSize.height ) + { + continue; + } + sizev.push_back(winSize); + scalev.push_back(factor); + } + + loopcount = scalev.size(); + if(loopcount == 0) + { + loopcount = 1; + sizev.push_back(minSize); + scalev.push_back( min(cvRound(minSize.width / winSize0.width), cvRound(minSize.height / winSize0.height)) ); + } + + ((OclBuffers *)buffers)->pbuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), CL_MEM_READ_ONLY, + sizeof(cl_int4) * loopcount); + ((OclBuffers *)buffers)->correctionbuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), CL_MEM_READ_ONLY, + sizeof(cl_float) * loopcount); + ((OclBuffers *)buffers)->newnodebuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), CL_MEM_READ_WRITE, + loopcount * m_nodenum * sizeof(GpuHidHaarTreeNode)); + + scaleinfo = (detect_piramid_info *)malloc(sizeof(detect_piramid_info) * loopcount); + for( int i = 0; i < loopcount; i++ ) + { + sz = sizev[i]; + factor = scalev[i]; + int ystep = cvRound(std::max(2., factor)); + int width = (cols - 1 - sz.width + ystep - 1) / ystep; + int height = (rows - 1 - sz.height + ystep - 1) / ystep; + int grpnumperline = (width + localThreads[0] - 1) / localThreads[0]; + int totalgrp = ((height + localThreads[1] - 1) / localThreads[1]) * grpnumperline; + + ((detect_piramid_info *)scaleinfo)[i].width_height = (width << 16) | height; + ((detect_piramid_info *)scaleinfo)[i].grpnumperline_totalgrp = (grpnumperline << 16) | totalgrp; + ((detect_piramid_info *)scaleinfo)[i].imgoff = 0; + ((detect_piramid_info *)scaleinfo)[i].factor = factor; + } + } + + if (loopcount != m_loopcount) + { + if (initialized) + { + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->scaleinfobuffer)); + } + ((OclBuffers *)buffers)->scaleinfobuffer = openCLCreateBuffer(cv::ocl::Context::getContext(), CL_MEM_READ_ONLY, sizeof(detect_piramid_info) * loopcount); + } + + openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)cv::ocl::Context::getContext()->oclCommandQueue(), ((OclBuffers *)buffers)->scaleinfobuffer, 1, 0, + sizeof(detect_piramid_info)*loopcount, + scaleinfo, 0, NULL, NULL)); + free(scaleinfo); + + m_loopcount = loopcount; +} + +void cv::ocl::OclCascadeClassifierBuf::GenResult(CV_OUT std::vector& faces, + const std::vector &rectList, + const std::vector &rweights) +{ + CvSeq *result_seq = cvCreateSeq( 0, sizeof(CvSeq), sizeof(CvAvgComp), cvCreateMemStorage(0) ); if( findBiggestObject && rectList.size() ) { @@ -1346,13 +1784,34 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS cvSeqPush( result_seq, &c ); } } - //t = (double)cvGetTickCount() - t; - //printf( "get face time = %g ms\n", t/((double)cvGetTickFrequency()*1000.) ); - //alltime = (double)cvGetTickCount() - alltime; - //printf( "all time = %g ms\n", alltime/((double)cvGetTickFrequency()*1000.) ); - return result_seq; + + vector vecAvgComp; + Seq(result_seq).copyTo(vecAvgComp); + faces.resize(vecAvgComp.size()); + std::transform(vecAvgComp.begin(), vecAvgComp.end(), faces.begin(), getRect()); } +void cv::ocl::OclCascadeClassifierBuf::release() +{ + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->stagebuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->scaleinfobuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->nodebuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->candidatebuffer)); + + if( (m_flags & CV_HAAR_SCALE_IMAGE) ) + { + cvFree(&oldCascade->hid_cascade); + } + else + { + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->newnodebuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->correctionbuffer)); + openCLSafeCall(clReleaseMemObject(((OclBuffers *)buffers)->pbuffer)); + } + + free(buffers); + buffers = NULL; +} #ifndef _MAX_PATH #define _MAX_PATH 1024 diff --git a/modules/ocl/src/opencl/haarobjectdetect.cl b/modules/ocl/src/opencl/haarobjectdetect.cl index 9e468b07f5..c7ed96a342 100644 --- a/modules/ocl/src/opencl/haarobjectdetect.cl +++ b/modules/ocl/src/opencl/haarobjectdetect.cl @@ -112,7 +112,7 @@ typedef struct __attribute__((aligned (64))) GpuHidHaarClassifierCascade } GpuHidHaarClassifierCascade; -__kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCascade(//constant GpuHidHaarClassifierCascade * cascade, +__kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCascade( global GpuHidHaarStageClassifier * stagecascadeptr, global int4 * info, global GpuHidHaarTreeNode * nodeptr, @@ -128,12 +128,7 @@ __kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCa const int splitnode, const int4 p, const int4 pq, - const float correction - //const int width, - //const int height, - //const int grpnumperline, - //const int totalgrp -) + const float correction) { int grpszx = get_local_size(0); int grpszy = get_local_size(1); @@ -145,13 +140,8 @@ __kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCa int lcl_sz = mul24(grpszx,grpszy); int lcl_id = mad24(lclidy,grpszx,lclidx); - //assume lcl_sz == 256 or 128 or 64 - //int lcl_sz_shift = (lcl_sz == 256) ? 8 : 7; - //lcl_sz_shift = (lcl_sz == 64) ? 6 : lcl_sz_shift; __local int lclshare[1024]; - -#define OFF 0 - __local int* lcldata = lclshare + OFF;//for save win data + __local int* lcldata = lclshare;//for save win data __local int* glboutindex = lcldata + 28*28;//for save global out index __local int* lclcount = glboutindex + 1;//for save the numuber of temp pass pixel __local int* lcloutindex = lclcount + 1;//for save info of temp pass pixel @@ -181,7 +171,6 @@ __kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCa int totalgrp = scaleinfo1.y & 0xffff; int imgoff = scaleinfo1.z; float factor = as_float(scaleinfo1.w); - //int ystep =1;// factor > 2.0 ? 1 : 2; __global const int * sum = sum1 + imgoff; __global const float * sqsum = sqsum1 + imgoff; @@ -191,8 +180,6 @@ __kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCa int grpidx = grploop - mul24(grpidy, grpnumperline); int x = mad24(grpidx,grpszx,lclidx); int y = mad24(grpidy,grpszy,lclidy); - //candidate_result.x = convert_int_rtn(x*factor); - //candidate_result.y = convert_int_rtn(y*factor); int grpoffx = x-lclidx; int grpoffy = y-lclidy; @@ -211,14 +198,7 @@ __kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCa int4 data = *(__global int4*)&sum[glb_off]; int lcl_off = mad24(lcl_y, readwidth, lcl_x<<2); -#if OFF - lcldata[lcl_off] = data.x; - lcldata[lcl_off+1] = data.y; - lcldata[lcl_off+2] = data.z; - lcldata[lcl_off+3] = data.w; -#else vstore4(data, 0, &lcldata[lcl_off]); -#endif } lcloutindex[lcl_id] = 0; @@ -231,184 +211,170 @@ __kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCa int lcl_off = mad24(lclidy,readwidth,lclidx); int4 cascadeinfo1, cascadeinfo2; cascadeinfo1 = p; - cascadeinfo2 = pq;// + mad24(y, pixelstep, x); + cascadeinfo2 = pq; + cascadeinfo1.x +=lcl_off; + cascadeinfo1.z +=lcl_off; + mean = (lcldata[mad24(cascadeinfo1.y,readwidth,cascadeinfo1.x)] - lcldata[mad24(cascadeinfo1.y,readwidth,cascadeinfo1.z)] - + lcldata[mad24(cascadeinfo1.w,readwidth,cascadeinfo1.x)] + lcldata[mad24(cascadeinfo1.w,readwidth,cascadeinfo1.z)]) + *correction; - //if((x < width) && (y < height)) - { - cascadeinfo1.x +=lcl_off; - cascadeinfo1.z +=lcl_off; - mean = (lcldata[mad24(cascadeinfo1.y,readwidth,cascadeinfo1.x)] - lcldata[mad24(cascadeinfo1.y,readwidth,cascadeinfo1.z)] - - lcldata[mad24(cascadeinfo1.w,readwidth,cascadeinfo1.x)] + lcldata[mad24(cascadeinfo1.w,readwidth,cascadeinfo1.z)]) - *correction; - - int p_offset = mad24(y, pixelstep, x); - - cascadeinfo2.x +=p_offset; - cascadeinfo2.z +=p_offset; - variance_norm_factor =sqsum[mad24(cascadeinfo2.y, pixelstep, cascadeinfo2.x)] - sqsum[mad24(cascadeinfo2.y, pixelstep, cascadeinfo2.z)] - - sqsum[mad24(cascadeinfo2.w, pixelstep, cascadeinfo2.x)] + sqsum[mad24(cascadeinfo2.w, pixelstep, cascadeinfo2.z)]; - - variance_norm_factor = variance_norm_factor * correction - mean * mean; - variance_norm_factor = variance_norm_factor >=0.f ? sqrt(variance_norm_factor) : 1.f; - //if( cascade->is_stump_based ) - //{ - for(int stageloop = start_stage; (stageloop < split_stage) && result; stageloop++ ) - { - float stage_sum = 0.f; - int2 stageinfo = *(global int2*)(stagecascadeptr+stageloop); - float stagethreshold = as_float(stageinfo.y); - for(int nodeloop = 0; nodeloop < stageinfo.x; nodeloop++ ) - { - __global GpuHidHaarTreeNode* currentnodeptr = (nodeptr + nodecounter); + int p_offset = mad24(y, pixelstep, x); - int4 info1 = *(__global int4*)(&(currentnodeptr->p[0][0])); - int4 info2 = *(__global int4*)(&(currentnodeptr->p[1][0])); - int4 info3 = *(__global int4*)(&(currentnodeptr->p[2][0])); - float4 w = *(__global float4*)(&(currentnodeptr->weight[0])); - float2 alpha2 = *(__global float2*)(&(currentnodeptr->alpha[0])); - float nodethreshold = w.w * variance_norm_factor; + cascadeinfo2.x +=p_offset; + cascadeinfo2.z +=p_offset; + variance_norm_factor =sqsum[mad24(cascadeinfo2.y, pixelstep, cascadeinfo2.x)] - sqsum[mad24(cascadeinfo2.y, pixelstep, cascadeinfo2.z)] - + sqsum[mad24(cascadeinfo2.w, pixelstep, cascadeinfo2.x)] + sqsum[mad24(cascadeinfo2.w, pixelstep, cascadeinfo2.z)]; - info1.x +=lcl_off; - info1.z +=lcl_off; - info2.x +=lcl_off; - info2.z +=lcl_off; + variance_norm_factor = variance_norm_factor * correction - mean * mean; + variance_norm_factor = variance_norm_factor >=0.f ? sqrt(variance_norm_factor) : 1.f; - float classsum = (lcldata[mad24(info1.y,readwidth,info1.x)] - lcldata[mad24(info1.y,readwidth,info1.z)] - - lcldata[mad24(info1.w,readwidth,info1.x)] + lcldata[mad24(info1.w,readwidth,info1.z)]) * w.x; + for(int stageloop = start_stage; (stageloop < split_stage) && result; stageloop++ ) + { + float stage_sum = 0.f; + int2 stageinfo = *(global int2*)(stagecascadeptr+stageloop); + float stagethreshold = as_float(stageinfo.y); + for(int nodeloop = 0; nodeloop < stageinfo.x; nodeloop++ ) + { + __global GpuHidHaarTreeNode* currentnodeptr = (nodeptr + nodecounter); + int4 info1 = *(__global int4*)(&(currentnodeptr->p[0][0])); + int4 info2 = *(__global int4*)(&(currentnodeptr->p[1][0])); + int4 info3 = *(__global int4*)(&(currentnodeptr->p[2][0])); + float4 w = *(__global float4*)(&(currentnodeptr->weight[0])); + float2 alpha2 = *(__global float2*)(&(currentnodeptr->alpha[0])); + float nodethreshold = w.w * variance_norm_factor; - classsum += (lcldata[mad24(info2.y,readwidth,info2.x)] - lcldata[mad24(info2.y,readwidth,info2.z)] - - lcldata[mad24(info2.w,readwidth,info2.x)] + lcldata[mad24(info2.w,readwidth,info2.z)]) * w.y; + info1.x +=lcl_off; + info1.z +=lcl_off; + info2.x +=lcl_off; + info2.z +=lcl_off; + float classsum = (lcldata[mad24(info1.y,readwidth,info1.x)] - lcldata[mad24(info1.y,readwidth,info1.z)] - + lcldata[mad24(info1.w,readwidth,info1.x)] + lcldata[mad24(info1.w,readwidth,info1.z)]) * w.x; - //if((info3.z - info3.x) && (!stageinfo.z)) - //{ - info3.x +=lcl_off; - info3.z +=lcl_off; - classsum += (lcldata[mad24(info3.y,readwidth,info3.x)] - lcldata[mad24(info3.y,readwidth,info3.z)] - - lcldata[mad24(info3.w,readwidth,info3.x)] + lcldata[mad24(info3.w,readwidth,info3.z)]) * w.z; - //} - stage_sum += classsum >= nodethreshold ? alpha2.y : alpha2.x; - nodecounter++; - } + classsum += (lcldata[mad24(info2.y,readwidth,info2.x)] - lcldata[mad24(info2.y,readwidth,info2.z)] - + lcldata[mad24(info2.w,readwidth,info2.x)] + lcldata[mad24(info2.w,readwidth,info2.z)]) * w.y; - result = (stage_sum >= stagethreshold); - } + info3.x +=lcl_off; + info3.z +=lcl_off; + classsum += (lcldata[mad24(info3.y,readwidth,info3.x)] - lcldata[mad24(info3.y,readwidth,info3.z)] - + lcldata[mad24(info3.w,readwidth,info3.x)] + lcldata[mad24(info3.w,readwidth,info3.z)]) * w.z; - if(result && (x < width) && (y < height)) - { - int queueindex = atomic_inc(lclcount); - lcloutindex[queueindex<<1] = (lclidy << 16) | lclidx; - lcloutindex[(queueindex<<1)+1] = as_int(variance_norm_factor); + stage_sum += classsum >= nodethreshold ? alpha2.y : alpha2.x; + nodecounter++; } + + result = (stage_sum >= stagethreshold); + } + + if(result && (x < width) && (y < height)) + { + int queueindex = atomic_inc(lclcount); + lcloutindex[queueindex<<1] = (lclidy << 16) | lclidx; + lcloutindex[(queueindex<<1)+1] = as_int(variance_norm_factor); + } + barrier(CLK_LOCAL_MEM_FENCE); + int queuecount = lclcount[0]; + barrier(CLK_LOCAL_MEM_FENCE); + nodecounter = splitnode; + for(int stageloop = split_stage; stageloop< end_stage && queuecount>0; stageloop++) + { + lclcount[0]=0; barrier(CLK_LOCAL_MEM_FENCE); - int queuecount = lclcount[0]; - barrier(CLK_LOCAL_MEM_FENCE); - nodecounter = splitnode; - for(int stageloop = split_stage; stageloop< end_stage && queuecount>0; stageloop++) - { - //barrier(CLK_LOCAL_MEM_FENCE); - //if(lcl_id == 0) - lclcount[0]=0; - barrier(CLK_LOCAL_MEM_FENCE); - int2 stageinfo = *(global int2*)(stagecascadeptr+stageloop); - float stagethreshold = as_float(stageinfo.y); + int2 stageinfo = *(global int2*)(stagecascadeptr+stageloop); + float stagethreshold = as_float(stageinfo.y); - int perfscale = queuecount > 4 ? 3 : 2; - int queuecount_loop = (queuecount + (1<> perfscale; - int lcl_compute_win = lcl_sz >> perfscale; - int lcl_compute_win_id = (lcl_id >>(6-perfscale)); - int lcl_loops = (stageinfo.x + lcl_compute_win -1) >> (6-perfscale); - int lcl_compute_id = lcl_id - (lcl_compute_win_id << (6-perfscale)); - for(int queueloop=0; queueloop 4 ? 3 : 2; + int queuecount_loop = (queuecount + (1<> perfscale; + int lcl_compute_win = lcl_sz >> perfscale; + int lcl_compute_win_id = (lcl_id >>(6-perfscale)); + int lcl_loops = (stageinfo.x + lcl_compute_win -1) >> (6-perfscale); + int lcl_compute_id = lcl_id - (lcl_compute_win_id << (6-perfscale)); + for(int queueloop=0; queueloop>16),readwidth,temp_coord & 0xffff); + + if(lcl_compute_win_id < queuecount) { - float stage_sum = 0.f; - int temp_coord = lcloutindex[lcl_compute_win_id<<1]; - float variance_norm_factor = as_float(lcloutindex[(lcl_compute_win_id<<1)+1]); - int queue_pixel = mad24(((temp_coord & (int)0xffff0000)>>16),readwidth,temp_coord & 0xffff); - //barrier(CLK_LOCAL_MEM_FENCE); - if(lcl_compute_win_id < queuecount) + int tempnodecounter = lcl_compute_id; + float part_sum = 0.f; + for(int lcl_loop=0; lcl_loopp[0][0])); + int4 info2 = *(__global int4*)(&(currentnodeptr->p[1][0])); + int4 info3 = *(__global int4*)(&(currentnodeptr->p[2][0])); + float4 w = *(__global float4*)(&(currentnodeptr->weight[0])); + float2 alpha2 = *(__global float2*)(&(currentnodeptr->alpha[0])); + float nodethreshold = w.w * variance_norm_factor; + + info1.x +=queue_pixel; + info1.z +=queue_pixel; + info2.x +=queue_pixel; + info2.z +=queue_pixel; + + float classsum = (lcldata[mad24(info1.y,readwidth,info1.x)] - lcldata[mad24(info1.y,readwidth,info1.z)] - + lcldata[mad24(info1.w,readwidth,info1.x)] + lcldata[mad24(info1.w,readwidth,info1.z)]) * w.x; - int tempnodecounter = lcl_compute_id; - float part_sum = 0.f; - for(int lcl_loop=0; lcl_loopp[0][0])); - int4 info2 = *(__global int4*)(&(currentnodeptr->p[1][0])); - int4 info3 = *(__global int4*)(&(currentnodeptr->p[2][0])); - float4 w = *(__global float4*)(&(currentnodeptr->weight[0])); - float2 alpha2 = *(__global float2*)(&(currentnodeptr->alpha[0])); - float nodethreshold = w.w * variance_norm_factor; - - info1.x +=queue_pixel; - info1.z +=queue_pixel; - info2.x +=queue_pixel; - info2.z +=queue_pixel; - - float classsum = (lcldata[mad24(info1.y,readwidth,info1.x)] - lcldata[mad24(info1.y,readwidth,info1.z)] - - lcldata[mad24(info1.w,readwidth,info1.x)] + lcldata[mad24(info1.w,readwidth,info1.z)]) * w.x; - - - classsum += (lcldata[mad24(info2.y,readwidth,info2.x)] - lcldata[mad24(info2.y,readwidth,info2.z)] - - lcldata[mad24(info2.w,readwidth,info2.x)] + lcldata[mad24(info2.w,readwidth,info2.z)]) * w.y; - //if((info3.z - info3.x) && (!stageinfo.z)) - //{ - info3.x +=queue_pixel; - info3.z +=queue_pixel; - classsum += (lcldata[mad24(info3.y,readwidth,info3.x)] - lcldata[mad24(info3.y,readwidth,info3.z)] - - lcldata[mad24(info3.w,readwidth,info3.x)] + lcldata[mad24(info3.w,readwidth,info3.z)]) * w.z; - //} - part_sum += classsum >= nodethreshold ? alpha2.y : alpha2.x; - tempnodecounter +=lcl_compute_win; - }//end for(int lcl_loop=0;lcl_loop= nodethreshold ? alpha2.y : alpha2.x; + tempnodecounter +=lcl_compute_win; + }//end for(int lcl_loop=0;lcl_loop= stagethreshold && (lcl_compute_id==0)) { - for(int i=0; i= stagethreshold && (lcl_compute_id==0)) - { - int queueindex = atomic_inc(lclcount); - lcloutindex[queueindex<<1] = temp_coord; - lcloutindex[(queueindex<<1)+1] = as_int(variance_norm_factor); - } - lcl_compute_win_id +=(1<0;stageloop++) - //barrier(CLK_LOCAL_MEM_FENCE); - if(lcl_id> 16)); - temp = glboutindex[0]; - int4 candidate_result; - candidate_result.zw = (int2)convert_int_rtn(factor*20.f); - candidate_result.x = convert_int_rtn(x*factor); - candidate_result.y = convert_int_rtn(y*factor); - atomic_inc(glboutindex); - candidate[outputoff+temp+lcl_id] = candidate_result; - } + }//end for(int queueloop=0;queueloop0;stageloop++) + + if(lcl_id> 16)); + temp = glboutindex[0]; + int4 candidate_result; + candidate_result.zw = (int2)convert_int_rtn(factor*20.f); + candidate_result.x = convert_int_rtn(x*factor); + candidate_result.y = convert_int_rtn(y*factor); + atomic_inc(glboutindex); + candidate[outputoff+temp+lcl_id] = candidate_result; + } + barrier(CLK_LOCAL_MEM_FENCE); }//end for(int grploop=grpidx;grploop> 16; + int height = scaleinfo1.x & 0xffff; + int grpnumperline = (scaleinfo1.y & 0xffff0000) >> 16; + int totalgrp = scaleinfo1.y & 0xffff; + float factor = as_float(scaleinfo1.w); + float correction_t = correction[scalei]; + int ystep = (int)(max(2.0f, factor) + 0.5f); - for (int scalei = 0; scalei < loopcount; scalei++) + for (int grploop = get_group_id(0); grploop < totalgrp; grploop += grpnumx) { - int4 scaleinfo1; - scaleinfo1 = info[scalei]; - int width = (scaleinfo1.x & 0xffff0000) >> 16; - int height = scaleinfo1.x & 0xffff; - int grpnumperline = (scaleinfo1.y & 0xffff0000) >> 16; - int totalgrp = scaleinfo1.y & 0xffff; - float factor = as_float(scaleinfo1.w); - float correction_t = correction[scalei]; - int ystep = (int)(max(2.0f, factor) + 0.5f); + int4 cascadeinfo = p[scalei]; + int grpidy = grploop / grpnumperline; + int grpidx = grploop - mul24(grpidy, grpnumperline); + int ix = mad24(grpidx, grpszx, lclidx); + int iy = mad24(grpidy, grpszy, lclidy); + int x = ix * ystep; + int y = iy * ystep; + lcloutindex[lcl_id] = 0; + lclcount[0] = 0; + int nodecounter; + float mean, variance_norm_factor; + //if((ix < width) && (iy < height)) + { + const int p_offset = mad24(y, step, x); + cascadeinfo.x += p_offset; + cascadeinfo.z += p_offset; + mean = (sum[clamp(mad24(cascadeinfo.y, step, cascadeinfo.x), 0, max_idx)] - sum[clamp(mad24(cascadeinfo.y, step, cascadeinfo.z), 0, max_idx)] - + sum[clamp(mad24(cascadeinfo.w, step, cascadeinfo.x), 0, max_idx)] + sum[clamp(mad24(cascadeinfo.w, step, cascadeinfo.z), 0, max_idx)]) + * correction_t; + variance_norm_factor = sqsum[clamp(mad24(cascadeinfo.y, step, cascadeinfo.x), 0, max_idx)] - sqsum[clamp(mad24(cascadeinfo.y, step, cascadeinfo.z), 0, max_idx)] - + sqsum[clamp(mad24(cascadeinfo.w, step, cascadeinfo.x), 0, max_idx)] + sqsum[clamp(mad24(cascadeinfo.w, step, cascadeinfo.z), 0, max_idx)]; + variance_norm_factor = variance_norm_factor * correction_t - mean * mean; + variance_norm_factor = variance_norm_factor >= 0.f ? sqrt(variance_norm_factor) : 1.f; + bool result = true; + nodecounter = startnode + nodecount * scalei; - for (int grploop = get_group_id(0); grploop < totalgrp; grploop += grpnumx) + for (int stageloop = start_stage; (stageloop < end_stage) && result; stageloop++) { - int4 cascadeinfo = p[scalei]; - int grpidy = grploop / grpnumperline; - int grpidx = grploop - mul24(grpidy, grpnumperline); - int ix = mad24(grpidx, grpszx, lclidx); - int iy = mad24(grpidy, grpszy, lclidy); - int x = ix * ystep; - int y = iy * ystep; - lcloutindex[lcl_id] = 0; - lclcount[0] = 0; - int result = 1, nodecounter; - float mean, variance_norm_factor; - //if((ix < width) && (iy < height)) - { - const int p_offset = mad24(y, step, x); - cascadeinfo.x += p_offset; - cascadeinfo.z += p_offset; - mean = (sum[mad24(cascadeinfo.y, step, cascadeinfo.x)] - sum[mad24(cascadeinfo.y, step, cascadeinfo.z)] - - sum[mad24(cascadeinfo.w, step, cascadeinfo.x)] + sum[mad24(cascadeinfo.w, step, cascadeinfo.z)]) - * correction_t; - variance_norm_factor = sqsum[mad24(cascadeinfo.y, step, cascadeinfo.x)] - sqsum[mad24(cascadeinfo.y, step, cascadeinfo.z)] - - sqsum[mad24(cascadeinfo.w, step, cascadeinfo.x)] + sqsum[mad24(cascadeinfo.w, step, cascadeinfo.z)]; - variance_norm_factor = variance_norm_factor * correction_t - mean * mean; - variance_norm_factor = variance_norm_factor >= 0.f ? sqrt(variance_norm_factor) : 1.f; - result = 1; - nodecounter = startnode + nodecount * scalei; - - for (int stageloop = start_stage; stageloop < end_stage && result; stageloop++) - { - float stage_sum = 0.f; - int4 stageinfo = *(global int4 *)(stagecascadeptr + stageloop); - float stagethreshold = as_float(stageinfo.y); - - for (int nodeloop = 0; nodeloop < stageinfo.x; nodeloop++) - { - __global GpuHidHaarTreeNode *currentnodeptr = (nodeptr + nodecounter); - int4 info1 = *(__global int4 *)(&(currentnodeptr->p[0][0])); - int4 info2 = *(__global int4 *)(&(currentnodeptr->p[1][0])); - int4 info3 = *(__global int4 *)(&(currentnodeptr->p[2][0])); - float4 w = *(__global float4 *)(&(currentnodeptr->weight[0])); - float2 alpha2 = *(__global float2 *)(&(currentnodeptr->alpha[0])); - float nodethreshold = w.w * variance_norm_factor; - info1.x += p_offset; - info1.z += p_offset; - info2.x += p_offset; - info2.z += p_offset; - float classsum = (sum[mad24(info1.y, step, info1.x)] - sum[mad24(info1.y, step, info1.z)] - - sum[mad24(info1.w, step, info1.x)] + sum[mad24(info1.w, step, info1.z)]) * w.x; - classsum += (sum[mad24(info2.y, step, info2.x)] - sum[mad24(info2.y, step, info2.z)] - - sum[mad24(info2.w, step, info2.x)] + sum[mad24(info2.w, step, info2.z)]) * w.y; - info3.x += p_offset; - info3.z += p_offset; - classsum += (sum[mad24(info3.y, step, info3.x)] - sum[mad24(info3.y, step, info3.z)] - - sum[mad24(info3.w, step, info3.x)] + sum[mad24(info3.w, step, info3.z)]) * w.z; - stage_sum += classsum >= nodethreshold ? alpha2.y : alpha2.x; - nodecounter++; - } - - result = (stage_sum >= stagethreshold); - } + float stage_sum = 0.f; + int stagecount = stagecascadeptr[stageloop].count; + for (int nodeloop = 0; nodeloop < stagecount; nodeloop++) + { + __global GpuHidHaarTreeNode *currentnodeptr = (nodeptr + nodecounter); + int4 info1 = *(__global int4 *)(&(currentnodeptr->p[0][0])); + int4 info2 = *(__global int4 *)(&(currentnodeptr->p[1][0])); + int4 info3 = *(__global int4 *)(&(currentnodeptr->p[2][0])); + float4 w = *(__global float4 *)(&(currentnodeptr->weight[0])); + float2 alpha2 = *(__global float2 *)(&(currentnodeptr->alpha[0])); + float nodethreshold = w.w * variance_norm_factor; + info1.x += p_offset; + info1.z += p_offset; + info2.x += p_offset; + info2.z += p_offset; + float classsum = (sum[clamp(mad24(info1.y, step, info1.x), 0, max_idx)] - sum[clamp(mad24(info1.y, step, info1.z), 0, max_idx)] - + sum[clamp(mad24(info1.w, step, info1.x), 0, max_idx)] + sum[clamp(mad24(info1.w, step, info1.z), 0, max_idx)]) * w.x; + classsum += (sum[clamp(mad24(info2.y, step, info2.x), 0, max_idx)] - sum[clamp(mad24(info2.y, step, info2.z), 0, max_idx)] - + sum[clamp(mad24(info2.w, step, info2.x), 0, max_idx)] + sum[clamp(mad24(info2.w, step, info2.z), 0, max_idx)]) * w.y; + info3.x += p_offset; + info3.z += p_offset; + classsum += (sum[clamp(mad24(info3.y, step, info3.x), 0, max_idx)] - sum[clamp(mad24(info3.y, step, info3.z), 0, max_idx)] - + sum[clamp(mad24(info3.w, step, info3.x), 0, max_idx)] + sum[clamp(mad24(info3.w, step, info3.z), 0, max_idx)]) * w.z; + stage_sum += classsum >= nodethreshold ? alpha2.y : alpha2.x; + nodecounter++; + } + result = (bool)(stage_sum >= stagecascadeptr[stageloop].threshold); + } - if (result && (ix < width) && (iy < height)) - { - int queueindex = atomic_inc(lclcount); - lcloutindex[queueindex << 1] = (y << 16) | x; - lcloutindex[(queueindex << 1) + 1] = as_int(variance_norm_factor); - } + barrier(CLK_LOCAL_MEM_FENCE); - barrier(CLK_LOCAL_MEM_FENCE); - int queuecount = lclcount[0]; - nodecounter = splitnode + nodecount * scalei; + if (result && (ix < width) && (iy < height)) + { + int queueindex = atomic_inc(lclcount); + lcloutindex[queueindex] = (y << 16) | x; + } - if (lcl_id < queuecount) - { - int temp = lcloutindex[lcl_id << 1]; - int x = temp & 0xffff; - int y = (temp & (int)0xffff0000) >> 16; - temp = glboutindex[0]; - int4 candidate_result; - candidate_result.zw = (int2)convert_int_rtn(factor * 20.f); - candidate_result.x = x; - candidate_result.y = y; - atomic_inc(glboutindex); - candidate[outputoff + temp + lcl_id] = candidate_result; - } + barrier(CLK_LOCAL_MEM_FENCE); + int queuecount = lclcount[0]; - barrier(CLK_LOCAL_MEM_FENCE); - } + if (lcl_id < queuecount) + { + int temp = lcloutindex[lcl_id]; + int x = temp & 0xffff; + int y = (temp & (int)0xffff0000) >> 16; + temp = atomic_inc(glboutindex); + int4 candidate_result; + candidate_result.zw = (int2)convert_int_rtn(factor * 20.f); + candidate_result.x = x; + candidate_result.y = y; + candidate[outputoff + temp + lcl_id] = candidate_result; } + + barrier(CLK_LOCAL_MEM_FENCE); + } } + } } __kernel void gpuscaleclassifier(global GpuHidHaarTreeNode *orinode, global GpuHidHaarTreeNode *newnode, float scale, float weight_scale, int nodenum) { - int counter = get_global_id(0); - int tr_x[3], tr_y[3], tr_h[3], tr_w[3], i = 0; - GpuHidHaarTreeNode t1 = *(orinode + counter); + int counter = get_global_id(0); + int tr_x[3], tr_y[3], tr_h[3], tr_w[3], i = 0; + GpuHidHaarTreeNode t1 = *(orinode + counter); #pragma unroll - for (i = 0; i < 3; i++) - { - tr_x[i] = (int)(t1.p[i][0] * scale + 0.5f); - tr_y[i] = (int)(t1.p[i][1] * scale + 0.5f); - tr_w[i] = (int)(t1.p[i][2] * scale + 0.5f); - tr_h[i] = (int)(t1.p[i][3] * scale + 0.5f); - } + for (i = 0; i < 3; i++) + { + tr_x[i] = (int)(t1.p[i][0] * scale + 0.5f); + tr_y[i] = (int)(t1.p[i][1] * scale + 0.5f); + tr_w[i] = (int)(t1.p[i][2] * scale + 0.5f); + tr_h[i] = (int)(t1.p[i][3] * scale + 0.5f); + } - t1.weight[0] = t1.p[2][0] ? -(t1.weight[1] * tr_h[1] * tr_w[1] + t1.weight[2] * tr_h[2] * tr_w[2]) / (tr_h[0] * tr_w[0]) : -t1.weight[1] * tr_h[1] * tr_w[1] / (tr_h[0] * tr_w[0]); - counter += nodenum; + t1.weight[0] = t1.p[2][0] ? -(t1.weight[1] * tr_h[1] * tr_w[1] + t1.weight[2] * tr_h[2] * tr_w[2]) / (tr_h[0] * tr_w[0]) : -t1.weight[1] * tr_h[1] * tr_w[1] / (tr_h[0] * tr_w[0]); + counter += nodenum; #pragma unroll - for (i = 0; i < 3; i++) - { - newnode[counter].p[i][0] = tr_x[i]; - newnode[counter].p[i][1] = tr_y[i]; - newnode[counter].p[i][2] = tr_x[i] + tr_w[i]; - newnode[counter].p[i][3] = tr_y[i] + tr_h[i]; - newnode[counter].weight[i] = t1.weight[i] * weight_scale; - } + for (i = 0; i < 3; i++) + { + newnode[counter].p[i][0] = tr_x[i]; + newnode[counter].p[i][1] = tr_y[i]; + newnode[counter].p[i][2] = tr_x[i] + tr_w[i]; + newnode[counter].p[i][3] = tr_y[i] + tr_h[i]; + newnode[counter].weight[i] = t1.weight[i] * weight_scale; + } - newnode[counter].left = t1.left; - newnode[counter].right = t1.right; - newnode[counter].threshold = t1.threshold; - newnode[counter].alpha[0] = t1.alpha[0]; - newnode[counter].alpha[1] = t1.alpha[1]; + newnode[counter].left = t1.left; + newnode[counter].right = t1.right; + newnode[counter].threshold = t1.threshold; + newnode[counter].alpha[0] = t1.alpha[0]; + newnode[counter].alpha[1] = t1.alpha[1]; } + diff --git a/modules/ocl/test/test_haar.cpp b/modules/ocl/test/test_haar.cpp index 9bff324662..19147b04b8 100644 --- a/modules/ocl/test/test_haar.cpp +++ b/modules/ocl/test/test_haar.cpp @@ -16,6 +16,7 @@ // // @Authors // Jia Haipeng, jiahaipeng95@gmail.com +// Sen Liu, swjutls1987@126.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -61,40 +62,31 @@ struct getRect } }; -PARAM_TEST_CASE(HaarTestBase, int, int) +PARAM_TEST_CASE(Haar, double, int) { - //std::vector oclinfo; cv::ocl::OclCascadeClassifier cascade, nestedCascade; + cv::ocl::OclCascadeClassifierBuf cascadebuf; cv::CascadeClassifier cpucascade, cpunestedCascade; - // Mat img; double scale; - int index; + int flags; virtual void SetUp() { - scale = 1.0; - index = 0; + scale = GET_PARAM(0); + flags = GET_PARAM(1); string cascadeName = workdir + "../../data/haarcascades/haarcascade_frontalface_alt.xml"; - if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName))) + if( (!cascade.load( cascadeName )) || (!cpucascade.load(cascadeName)) || (!cascadebuf.load( cascadeName ))) { cout << "ERROR: Could not load classifier cascade" << endl; return; } - //int devnums = getDevice(oclinfo); - //CV_Assert(devnums>0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); - //cv::ocl::setBinpath("E:\\"); } }; ////////////////////////////////faceDetect///////////////////////////////////////////////// - -struct Haar : HaarTestBase {}; - -TEST_F(Haar, FaceDetect) +TEST_P(Haar, FaceDetect) { string imgName = workdir + "lena.jpg"; Mat img = imread( imgName, 1 ); @@ -105,59 +97,65 @@ TEST_F(Haar, FaceDetect) return ; } - //int i = 0; - //double t = 0; vector faces, oclfaces; - // const static Scalar colors[] = { CV_RGB(0, 0, 255), - // CV_RGB(0, 128, 255), - // CV_RGB(0, 255, 255), - // CV_RGB(0, 255, 0), - // CV_RGB(255, 128, 0), - // CV_RGB(255, 255, 0), - // CV_RGB(255, 0, 0), - // CV_RGB(255, 0, 255) - // } ; - Mat gray, smallImg(cvRound (img.rows / scale), cvRound(img.cols / scale), CV_8UC1 ); MemStorage storage(cvCreateMemStorage(0)); cvtColor( img, gray, CV_BGR2GRAY ); resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); equalizeHist( smallImg, smallImg ); - cv::ocl::oclMat image; CvSeq *_objects; image.upload(smallImg); _objects = cascade.oclHaarDetectObjects( image, storage, 1.1, - 3, 0 - | CV_HAAR_SCALE_IMAGE - , Size(30, 30), Size(0, 0) ); + 3, flags, Size(30, 30), Size(0, 0) ); vector vecAvgComp; Seq(_objects).copyTo(vecAvgComp); oclfaces.resize(vecAvgComp.size()); std::transform(vecAvgComp.begin(), vecAvgComp.end(), oclfaces.begin(), getRect()); - cpucascade.detectMultiScale( smallImg, faces, 1.1, - 3, 0 - | CV_HAAR_SCALE_IMAGE - , Size(30, 30), Size(0, 0) ); + cpucascade.detectMultiScale( smallImg, faces, 1.1, 3, + flags, + Size(30, 30), Size(0, 0) ); EXPECT_EQ(faces.size(), oclfaces.size()); - /* for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ ) +} + +TEST_P(Haar, FaceDetectUseBuf) +{ + string imgName = workdir + "lena.jpg"; + Mat img = imread( imgName, 1 ); + + if(img.empty()) { - Mat smallImgROI; - Point center; - Scalar color = colors[i%8]; - int radius; - center.x = cvRound((r->x + r->width*0.5)*scale); - center.y = cvRound((r->y + r->height*0.5)*scale); - radius = cvRound((r->width + r->height)*0.25*scale); - circle( img, center, radius, color, 3, 8, 0 ); - } */ - //namedWindow("result"); - //imshow("result",img); - //waitKey(0); - //destroyAllWindows(); + std::cout << "Couldn't read " << imgName << std::endl; + return ; + } + vector faces, oclfaces; + + Mat gray, smallImg(cvRound (img.rows / scale), cvRound(img.cols / scale), CV_8UC1 ); + MemStorage storage(cvCreateMemStorage(0)); + cvtColor( img, gray, CV_BGR2GRAY ); + resize( gray, smallImg, smallImg.size(), 0, 0, INTER_LINEAR ); + equalizeHist( smallImg, smallImg ); + + cv::ocl::oclMat image; + image.upload(smallImg); + + cascadebuf.detectMultiScale( image, oclfaces, 1.1, 3, + flags, + Size(30, 30), Size(0, 0) ); + cascadebuf.release(); + + cpucascade.detectMultiScale( smallImg, faces, 1.1, 3, + flags, + Size(30, 30), Size(0, 0) ); + EXPECT_EQ(faces.size(), oclfaces.size()); } + +INSTANTIATE_TEST_CASE_P(FaceDetect, Haar, + Combine(Values(1.0), + Values(CV_HAAR_SCALE_IMAGE, 0))); + #endif // HAVE_OPENCL From 8c40f0ccf2c79a7b547b51e1c481a617c3c649b5 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Tue, 16 Apr 2013 15:30:43 +0400 Subject: [PATCH 05/49] fixing build and lint warnings --- modules/java/android_lib/lint.xml | 3 +++ .../generator/src/java/android+CameraBridgeViewBase.java | 3 +-- .../java/generator/src/java/android+JavaCameraView.java | 3 --- .../generator/src/java/android+NativeCameraView.java | 9 +++------ .../opencv/samples/NativeActivity/CvNativeActivity.java | 1 - .../res/layout/tutorial1_surface_view.xml | 4 ++-- 6 files changed, 9 insertions(+), 14 deletions(-) diff --git a/modules/java/android_lib/lint.xml b/modules/java/android_lib/lint.xml index e54ced1dc4..a95e509d22 100644 --- a/modules/java/android_lib/lint.xml +++ b/modules/java/android_lib/lint.xml @@ -1,5 +1,8 @@ + + + diff --git a/modules/java/generator/src/java/android+CameraBridgeViewBase.java b/modules/java/generator/src/java/android+CameraBridgeViewBase.java index 36417c5829..5ec9b12fdd 100644 --- a/modules/java/generator/src/java/android+CameraBridgeViewBase.java +++ b/modules/java/generator/src/java/android+CameraBridgeViewBase.java @@ -74,6 +74,7 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac getHolder().addCallback(this); mMaxWidth = MAX_UNSPECIFIED; mMaxHeight = MAX_UNSPECIFIED; + styledAttrs.recycle(); } public interface CvCameraViewListener { @@ -155,8 +156,6 @@ public abstract class CameraBridgeViewBase extends SurfaceView implements Surfac mPreviewFormat = format; } - private CvCameraViewListenerAdapter() {} - private int mPreviewFormat = Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA; private CvCameraViewListener mOldStyleListener; }; diff --git a/modules/java/generator/src/java/android+JavaCameraView.java b/modules/java/generator/src/java/android+JavaCameraView.java index f07b7d2ca8..f0036ef029 100644 --- a/modules/java/generator/src/java/android+JavaCameraView.java +++ b/modules/java/generator/src/java/android+JavaCameraView.java @@ -267,9 +267,6 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb mRgba.release(); } - private JavaCameraFrame(CvCameraViewFrame obj) { - } - private Mat mYuvFrameData; private Mat mRgba; private int mWidth; diff --git a/modules/java/generator/src/java/android+NativeCameraView.java b/modules/java/generator/src/java/android+NativeCameraView.java index 496ed53d6e..6f3ab265cb 100644 --- a/modules/java/generator/src/java/android+NativeCameraView.java +++ b/modules/java/generator/src/java/android+NativeCameraView.java @@ -131,17 +131,17 @@ public class NativeCameraView extends CameraBridgeViewBase { } } - private class NativeCameraFrame implements CvCameraViewFrame { + private static class NativeCameraFrame implements CvCameraViewFrame { @Override public Mat rgba() { - mCamera.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); + mCapture.retrieve(mRgba, Highgui.CV_CAP_ANDROID_COLOR_FRAME_RGBA); return mRgba; } @Override public Mat gray() { - mCamera.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); + mCapture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME); return mGray; } @@ -158,9 +158,6 @@ public class NativeCameraView extends CameraBridgeViewBase { private class CameraWorker implements Runnable { - private Mat mRgba = new Mat(); - private Mat mGray = new Mat(); - public void run() { do { if (!mCamera.grab()) { diff --git a/samples/android/native-activity/src/org/opencv/samples/NativeActivity/CvNativeActivity.java b/samples/android/native-activity/src/org/opencv/samples/NativeActivity/CvNativeActivity.java index d8e437533e..1a9302b1d5 100644 --- a/samples/android/native-activity/src/org/opencv/samples/NativeActivity/CvNativeActivity.java +++ b/samples/android/native-activity/src/org/opencv/samples/NativeActivity/CvNativeActivity.java @@ -6,7 +6,6 @@ import org.opencv.android.OpenCVLoader; import android.app.Activity; import android.content.Intent; -import android.os.Bundle; import android.util.Log; public class CvNativeActivity extends Activity { diff --git a/samples/android/tutorial-1-camerapreview/res/layout/tutorial1_surface_view.xml b/samples/android/tutorial-1-camerapreview/res/layout/tutorial1_surface_view.xml index 52b9dfaf6e..40f5f49326 100644 --- a/samples/android/tutorial-1-camerapreview/res/layout/tutorial1_surface_view.xml +++ b/samples/android/tutorial-1-camerapreview/res/layout/tutorial1_surface_view.xml @@ -1,4 +1,4 @@ - - + From bd6f80faf3a1288d0d34a98c43a42c959783e341 Mon Sep 17 00:00:00 2001 From: Roman Donchenko Date: Wed, 17 Apr 2013 12:21:17 +0400 Subject: [PATCH 06/49] Redo the Sphinx check to do the same thing on all platforms. This also fixes the bug where the Sphinx version gets detected as "Sphinx vX.Y.Z" instead of "X.Y.Z" on Unix-like systems. --- cmake/OpenCVDetectPython.cmake | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/cmake/OpenCVDetectPython.cmake b/cmake/OpenCVDetectPython.cmake index 73143b7341..debaaec53b 100644 --- a/cmake/OpenCVDetectPython.cmake +++ b/cmake/OpenCVDetectPython.cmake @@ -104,18 +104,12 @@ if(PYTHON_EXECUTABLE) if(BUILD_DOCS) find_host_program(SPHINX_BUILD sphinx-build) if(SPHINX_BUILD) - if(UNIX) - execute_process(COMMAND sh -c "${SPHINX_BUILD} -_ 2>&1 | sed -ne 1p" - RESULT_VARIABLE SPHINX_PROCESS - OUTPUT_VARIABLE SPHINX_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - else() - execute_process(COMMAND ${PYTHON_EXECUTABLE} -c "import sphinx; print sphinx.__version__" - RESULT_VARIABLE SPHINX_PROCESS - OUTPUT_VARIABLE SPHINX_VERSION - OUTPUT_STRIP_TRAILING_WHITESPACE) - endif() - if(SPHINX_PROCESS EQUAL 0) + execute_process(COMMAND "${SPHINX_BUILD}" + OUTPUT_QUIET + ERROR_VARIABLE SPHINX_OUTPUT + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(SPHINX_OUTPUT MATCHES "^Sphinx v([0-9][^ \n]*)") + set(SPHINX_VERSION "${CMAKE_MATCH_1}") set(HAVE_SPHINX 1) message(STATUS "Found Sphinx ${SPHINX_VERSION}: ${SPHINX_BUILD}") endif() From 7b08d5ec69c281fff3fb6f77dce314efeb4539bf Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Sat, 20 Apr 2013 00:34:37 +0800 Subject: [PATCH 07/49] Add OpenCL stereo CSBP implementation --- modules/ocl/include/opencv2/ocl/ocl.hpp | 38 + modules/ocl/src/opencl/stereocsbp.cl | 1135 +++++++++++++++++++++++ modules/ocl/src/stereo_csbp.cpp | 792 ++++++++++++++++ modules/ocl/test/test_calib3d.cpp | 76 +- 4 files changed, 2033 insertions(+), 8 deletions(-) create mode 100644 modules/ocl/src/opencl/stereocsbp.cl create mode 100644 modules/ocl/src/stereo_csbp.cpp diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 613179f8b6..059ae020d3 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -1731,6 +1731,44 @@ namespace cv std::vector datas; oclMat out; }; + class CV_EXPORTS StereoConstantSpaceBP + { + public: + enum { DEFAULT_NDISP = 128 }; + enum { DEFAULT_ITERS = 8 }; + enum { DEFAULT_LEVELS = 4 }; + enum { DEFAULT_NR_PLANE = 4 }; + static void estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels, int &nr_plane); + explicit StereoConstantSpaceBP( + int ndisp = DEFAULT_NDISP, + int iters = DEFAULT_ITERS, + int levels = DEFAULT_LEVELS, + int nr_plane = DEFAULT_NR_PLANE, + int msg_type = CV_32F); + StereoConstantSpaceBP(int ndisp, int iters, int levels, int nr_plane, + float max_data_term, float data_weight, float max_disc_term, float disc_single_jump, + int min_disp_th = 0, + int msg_type = CV_32F); + void operator()(const oclMat &left, const oclMat &right, oclMat &disparity); + int ndisp; + int iters; + int levels; + int nr_plane; + float max_data_term; + float data_weight; + float max_disc_term; + float disc_single_jump; + int min_disp_th; + int msg_type; + bool use_local_init_data_cost; + private: + oclMat u[2], d[2], l[2], r[2]; + oclMat disp_selected_pyr[2]; + oclMat data_cost; + oclMat data_cost_selected; + oclMat temp; + oclMat out; + }; } } #if defined _MSC_VER && _MSC_VER >= 1200 diff --git a/modules/ocl/src/opencl/stereocsbp.cl b/modules/ocl/src/opencl/stereocsbp.cl new file mode 100644 index 0000000000..f855ee0979 --- /dev/null +++ b/modules/ocl/src/opencl/stereocsbp.cl @@ -0,0 +1,1135 @@ +/*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, Institute Of Software Chinese Academy Of Science, all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Jia Haipeng, jiahaipeng95@gmail.com +// Jin Ma, jin@multicorewareinc.com +// Redistribution and use in source and binary forms, with or without modification, +// are permitted provided that the following conditions are met: +// +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. +// +// * Redistribution's in binary form must reproduce the above copyright notice, +// this list of conditions and the following disclaimer in the documentation +// and/or other oclMaterials provided with the distribution. +// +// * The name of the copyright holders may not be used to endorse or promote products +// derived from this software without specific prior written permission. +// +// This software is provided by the copyright holders and contributors "as is" and +// any express or implied warranties, including, but not limited to, the implied +// warranties of merchantability and fitness for a particular purpose are disclaimed. +// In no event shall the Intel Corporation or contributors be liable for any direct, +// indirect, incidental, special, exemplary, or consequential damages +// (including, but not limited to, procurement of substitute goods or services; +// loss of use, data, or profits; or business interruption) however caused +// and on any theory of liability, whether in contract, strict liability, +// or tort (including negligence or otherwise) arising in any way out of +// the use of this software, even if advised of the possibility of such damage. +// +//M*/ + + +#ifndef FLT_MAX +#define FLT_MAX CL_FLT_MAX +#endif + +#ifndef SHRT_MAX +#define SHRT_MAX CL_SHORT_MAX +#endif + + +/////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////get_first_k_initial_global////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////// +__kernel void get_first_k_initial_global_0(__global short *data_cost_selected_, __global short *selected_disp_pyr, + __global short *ctemp, int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + __global short *selected_disparity = selected_disp_pyr + y * cmsg_step1 + x; + __global short *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; + __global short *data_cost = ctemp + y * cmsg_step1 + x; + + for(int i = 0; i < nr_plane; i++) + { + short minimum = SHRT_MAX; + int id = 0; + + for(int d = 0; d < cndisp; d++) + { + short cur = data_cost[d * cdisp_step1]; + if(cur < minimum) + { + minimum = cur; + id = d; + } + } + + data_cost_selected[i * cdisp_step1] = minimum; + selected_disparity[i * cdisp_step1] = id; + data_cost [id * cdisp_step1] = SHRT_MAX; + } + } +} +__kernel void get_first_k_initial_global_1(__global float *data_cost_selected_, __global float *selected_disp_pyr, + __global float *ctemp, int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + __global float *selected_disparity = selected_disp_pyr + y * cmsg_step1 + x; + __global float *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; + __global float *data_cost = ctemp + y * cmsg_step1 + x; + + for(int i = 0; i < nr_plane; i++) + { + float minimum = FLT_MAX; + int id = 0; + + for(int d = 0; d < cndisp; d++) + { + float cur = data_cost[d * cdisp_step1]; + if(cur < minimum) + { + minimum = cur; + id = d; + } + } + + data_cost_selected[i * cdisp_step1] = minimum; + selected_disparity[i * cdisp_step1] = id; + data_cost [id * cdisp_step1] = FLT_MAX; + } + } +} + +//////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////get_first_k_initial_local//////////////////////////////////// +//////////////////////////////////////////////////////////////////////////////////////////////////////// +__kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, __global short *selected_disp_pyr, + __global short *ctemp,int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + __global short *selected_disparity = selected_disp_pyr + y * cmsg_step1 + x; + __global short *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; + __global short *data_cost = ctemp + y * cmsg_step1 + x; + + int nr_local_minimum = 0; + + short prev = data_cost[0 * cdisp_step1]; + short cur = data_cost[1 * cdisp_step1]; + short next = data_cost[2 * cdisp_step1]; + + for (int d = 1; d < cndisp - 1 && nr_local_minimum < nr_plane; d++) + { + + if (cur < prev && cur < next) + { + data_cost_selected[nr_local_minimum * cdisp_step1] = cur; + selected_disparity[nr_local_minimum * cdisp_step1] = d; + data_cost[d * cdisp_step1] = SHRT_MAX; + + nr_local_minimum++; + } + + prev = cur; + cur = next; + next = data_cost[(d + 1) * cdisp_step1]; + } + + for (int i = nr_local_minimum; i < nr_plane; i++) + { + short minimum = SHRT_MAX; + int id = 0; + + for (int d = 0; d < cndisp; d++) + { + cur = data_cost[d * cdisp_step1]; + if (cur < minimum) + { + minimum = cur; + id = d; + } + } + + data_cost_selected[i * cdisp_step1] = minimum; + selected_disparity[i * cdisp_step1] = id; + data_cost[id * cdisp_step1] = SHRT_MAX; + } + } +} + +__kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, __global float *selected_disp_pyr, + __global float *ctemp,int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + __global float *selected_disparity = selected_disp_pyr + y * cmsg_step1 + x; + __global float *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; + __global float *data_cost = ctemp + y * cmsg_step1 + x; + + int nr_local_minimum = 0; + + float prev = data_cost[0 * cdisp_step1]; + float cur = data_cost[1 * cdisp_step1]; + float next = data_cost[2 * cdisp_step1]; + + for (int d = 1; d < cndisp - 1 && nr_local_minimum < nr_plane; d++) + { + if (cur < prev && cur < next) + { + data_cost_selected[nr_local_minimum * cdisp_step1] = cur; + selected_disparity[nr_local_minimum * cdisp_step1] = d; + data_cost[d * cdisp_step1] = FLT_MAX ; + + nr_local_minimum++; + } + + prev = cur; + cur = next; + next = data_cost[(d + 1) * cdisp_step1]; + } + for (int i = nr_local_minimum; i < nr_plane; i++) + { + float minimum = FLT_MAX; + int id = 0; + + for (int d = 0; d < cndisp; d++) + { + cur = data_cost[d * cdisp_step1]; + if (cur < minimum) + { + minimum = cur; + id = d; + } + } + + data_cost_selected[i * cdisp_step1] = minimum; + selected_disparity[i * cdisp_step1] = id; + data_cost[id * cdisp_step1] = FLT_MAX; + } + } +} + +/////////////////////////////////////////////////////////////// +/////////////////////// init data cost //////////////////////// +/////////////////////////////////////////////////////////////// +float compute_3(__global uchar* left, __global uchar* right, + float cdata_weight, float cmax_data_term) +{ + float tb = 0.114f * abs((int)left[0] - right[0]); + float tg = 0.587f * abs((int)left[1] - right[1]); + float tr = 0.299f * abs((int)left[2] - right[2]); + + return fmin(cdata_weight * (tr + tg + tb), cdata_weight * cmax_data_term); +} +float compute_1(__global uchar* left, __global uchar* right, + float cdata_weight, float cmax_data_term) +{ + return fmin(cdata_weight * abs((int)*left - (int)*right), cdata_weight * cmax_data_term); +} +short round_short(float v){ + return convert_short_sat_rte(v); +} +/////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////init_data_cost/////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////////////// +__kernel void init_data_cost_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright, + int h, int w, int level, int channels, + int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1, + int cth, int cimg_step, int cndisp) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + int y0 = y << level; + int yt = (y + 1) << level; + + int x0 = x << level; + int xt = (x + 1) << level; + + __global short *data_cost = ctemp + y * cmsg_step1 + x; + + for(int d = 0; d < cndisp; ++d) + { + float val = 0.0f; + for(int yi = y0; yi < yt; yi++) + { + for(int xi = x0; xi < xt; xi++) + { + int xr = xi - d; + if(d < cth || xr < 0) + val += cdata_weight * cmax_data_term; + else + { + __global uchar *lle = cleft + yi * cimg_step + xi * channels; + __global uchar *lri = cright + yi * cimg_step + xr * channels; + + if(channels == 1) + val += compute_1(lle, lri, cdata_weight, cmax_data_term); + else + val += compute_3(lle, lri, cdata_weight, cmax_data_term); + } + } + } + data_cost[cdisp_step1 * d] = round_short(val); + } + } +} +__kernel void init_data_cost_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright, + int h, int w, int level, int channels, + int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1, + int cth, int cimg_step, int cndisp) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + int y0 = y << level; + int yt = (y + 1) << level; + + int x0 = x << level; + int xt = (x + 1) << level; + + __global float *data_cost = ctemp + y * cmsg_step1 + x; + + for(int d = 0; d < cndisp; ++d) + { + float val = 0.0f; + for(int yi = y0; yi < yt; yi++) + { + for(int xi = x0; xi < xt; xi++) + { + int xr = xi - d; + if(d < cth || xr < 0) + val += cdata_weight * cmax_data_term; + else + { + __global uchar* lle = cleft + yi * cimg_step + xi * channels; + __global uchar* lri = cright + yi * cimg_step + xr * channels; + + if(channels == 1) + val += compute_1(lle, lri, cdata_weight, cmax_data_term); + else + val += compute_3(lle, lri, cdata_weight, cmax_data_term); + } + } + } + data_cost[cdisp_step1 * d] = val; + } + } +} +//////////////////////////////////////////////////////////////////////////////////////////////////////// +//////////////////////////////////init_data_cost_reduce////////////////////////////////////////////////// +////////////////////////////////////////////////////////////////////////////////////////////////////////// +__kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright, + __local float *smem, int level, int rows, int cols, int h, int winsz, int channels, + int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth, + int cdisp_step1, int cmsg_step1) +{ + int x_out = get_group_id(0); + int y_out = get_group_id(1) % h; + //int d = (blockIdx.y / h) * blockDim.z + threadIdx.z; + int d = (get_group_id(1) / h ) * get_local_size(2) + get_local_id(2); + + int tid = get_local_id(0); + + if (d < cndisp) + { + int x0 = x_out << level; + int y0 = y_out << level; + + int len = min(y0 + winsz, rows) - y0; + + float val = 0.0f; + if (x0 + tid < cols) + { + if (x0 + tid - d < 0 || d < cth) + val = cdata_weight * cmax_data_term * len; + else + { + __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); + __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - d); + + for(int y = 0; y < len; ++y) + { + if(channels == 1) + val += compute_1(lle, lri, cdata_weight, cmax_data_term); + else + val += compute_3(lle, lri, cdata_weight, cmax_data_term); + + lle += cimg_step; + lri += cimg_step; + } + } + } + + __local float* dline = smem + winsz * get_local_id(2); + + dline[tid] = val; + + barrier(CLK_LOCAL_MEM_FENCE); + + if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } + if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + + __local volatile float* vdline = smem + winsz * get_local_id(2); + + if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; + if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; + if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; + if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; + if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; + if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; + + __global short* data_cost = ctemp + y_out * cmsg_step1 + x_out; + + if (tid == 0) + data_cost[cdisp_step1 * d] = convert_short_sat_rte(dline[0]); + } +} + +__kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright, + __local float *smem, int level, int rows, int cols, int h, int winsz, int channels, + int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth, + int cdisp_step1, int cmsg_step1) +{ + int x_out = get_group_id(0); + int y_out = get_group_id(1) % h; + int d = (get_group_id(1) / h ) * get_local_size(2) + get_local_id(2); + + int tid = get_local_id(0); + + if (d < cndisp) + { + int x0 = x_out << level; + int y0 = y_out << level; + + int len = min(y0 + winsz, rows) - y0; + + float val = 0.0f; + //float val = 528.0f; + + if (x0 + tid < cols) + { + if (x0 + tid - d < 0 || d < cth) + val = cdata_weight * cmax_data_term * len; + else + { + __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); + __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - d); + + for(int y = 0; y < len; ++y) + { + if(channels == 1) + val += compute_1(lle, lri, cdata_weight, cmax_data_term); + else + val += compute_3(lle, lri, cdata_weight, cmax_data_term); + + lle += cimg_step; + lri += cimg_step; + } + } + } + + __local float* dline = smem + winsz * get_local_id(2); + + dline[tid] = val; + + barrier(CLK_LOCAL_MEM_FENCE); + + if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } + if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + + __local volatile float* vdline = smem + winsz * get_local_id(2); + + if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; + if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; + if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; + if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; + if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; + if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; + + __global float *data_cost = ctemp + y_out * cmsg_step1 + x_out; + + if (tid == 0) + data_cost[cdisp_step1 * d] = dline[0]; + } +} + +/////////////////////////////////////////////////////////////// +////////////////////// compute data cost ////////////////////// +/////////////////////////////////////////////////////////////// +__kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __global short *data_cost_, + __global uchar *cleft, __global uchar *cright, + int h, int w, int level, int nr_plane, int channels, + int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight, + float cmax_data_term, int cimg_step, int cth) +{ + + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + int y0 = y << level; + int yt = (y + 1) << level; + + int x0 = x << level; + int xt = (x + 1) << level; + + __global const short *selected_disparity = selected_disp_pyr + y/2 * cmsg_step2 + x/2; + __global short *data_cost = data_cost_ + y * cmsg_step1 + x; + + for(int d = 0; d < nr_plane; d++) + { + float val = 0.0f; + for(int yi = y0; yi < yt; yi++) + { + for(int xi = x0; xi < xt; xi++) + { + int sel_disp = selected_disparity[d * cdisp_step2]; + int xr = xi - sel_disp; + + if (xr < 0 || sel_disp < cth) + val += cdata_weight * cmax_data_term; + + else + { + __global uchar* left_x = cleft + yi * cimg_step + xi * channels; + __global uchar* right_x = cright + yi * cimg_step + xr * channels; + + if(channels == 1) + val += compute_1(left_x, right_x, cdata_weight, cmax_data_term); + else + val += compute_3(left_x, right_x, cdata_weight, cmax_data_term); + } + } + } + data_cost[cdisp_step1 * d] = convert_short_sat_rte(val); + } + } +} +__kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __global float *data_cost_, + __global uchar *cleft, __global uchar *cright, + int h, int w, int level, int nr_plane, int channels, + int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight, + float cmax_data_term, int cimg_step, int cth) +{ + + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + int y0 = y << level; + int yt = (y + 1) << level; + + int x0 = x << level; + int xt = (x + 1) << level; + + __global const float *selected_disparity = selected_disp_pyr + y/2 * cmsg_step2 + x/2; + __global float *data_cost = data_cost_ + y * cmsg_step1 + x; + + for(int d = 0; d < nr_plane; d++) + { + float val = 0.0f; + for(int yi = y0; yi < yt; yi++) + { + for(int xi = x0; xi < xt; xi++) + { + int sel_disp = selected_disparity[d * cdisp_step2]; + int xr = xi - sel_disp; + + if (xr < 0 || sel_disp < cth) + val += cdata_weight * cmax_data_term; + else + { + __global uchar* left_x = cleft + yi * cimg_step + xi * channels; + __global uchar* right_x = cright + yi * cimg_step + xr * channels; + + if(channels == 1) + val += compute_1(left_x, right_x, cdata_weight, cmax_data_term); + else + val += compute_3(left_x, right_x, cdata_weight, cmax_data_term); + } + } + } + data_cost[cdisp_step1 * d] = val; + } + } +} +//////////////////////////////////////////////////////////////////////////////////////////////////////// +////////////////////////////////////////compute_data_cost_reduce////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////// +__kernel void compute_data_cost_reduce_0(__global const short* selected_disp_pyr, __global short* data_cost_, + __global uchar *cleft, __global uchar *cright,__local float *smem, + int level, int rows, int cols, int h, int nr_plane, + int channels, int winsz, + int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, + float cdata_weight, float cmax_data_term, int cimg_step,int cth) + +{ + int x_out = get_group_id(0); + int y_out = get_group_id(1) % h; + int d = (get_group_id(1)/ h) * get_local_size(2) + get_local_id(2); + + int tid = get_local_id(0); + + __global const short* selected_disparity = selected_disp_pyr + y_out/2 * cmsg_step2 + x_out/2; + __global short* data_cost = data_cost_ + y_out * cmsg_step1 + x_out; + + if (d < nr_plane) + { + int sel_disp = selected_disparity[d * cdisp_step2]; + + int x0 = x_out << level; + int y0 = y_out << level; + + int len = min(y0 + winsz, rows) - y0; + + float val = 0.0f; + if (x0 + tid < cols) + { + if (x0 + tid - sel_disp < 0 || sel_disp < cth) + val = cdata_weight * cmax_data_term * len; + else + { + __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); + __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - sel_disp); + + for(int y = 0; y < len; ++y) + { + if(channels == 1) + val += compute_1(lle, lri, cdata_weight, cmax_data_term); + else + val += compute_3(lle, lri, cdata_weight, cmax_data_term); + + lle += cimg_step; + lri += cimg_step; + } + } + } + + __local float* dline = smem + winsz * get_local_id(2); + + dline[tid] = val; + } + + barrier(CLK_LOCAL_MEM_FENCE); + if(d < nr_plane) + { + + // if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } + //if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + + __local volatile float* vdline = smem + winsz * get_local_id(2); + + if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; + if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; + if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; + if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; + if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; + if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; + + if (tid == 0) + data_cost[cdisp_step1 * d] = convert_short_sat_rte(vdline[0]); + } +} + +__kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr, __global float *data_cost_, + __global uchar *cleft, __global uchar *cright, __local float *smem, + int level, int rows, int cols, int h, int nr_plane, + int channels, int winsz, + int cmsg_step1, int cmsg_step2, int cdisp_step1,int cdisp_step2, float cdata_weight, + float cmax_data_term, int cimg_step, int cth) + +{ + int x_out = get_group_id(0); + int y_out = get_group_id(1) % h; + int d = (get_group_id(1)/ h) * get_local_size(2) + get_local_id(2); + + int tid = get_local_id(0); + + __global const float *selected_disparity = selected_disp_pyr + y_out/2 * cmsg_step2 + x_out/2; + __global float *data_cost = data_cost_ + y_out * cmsg_step1 + x_out; + + if (d < nr_plane) + { + int sel_disp = selected_disparity[d * cdisp_step2]; + + int x0 = x_out << level; + int y0 = y_out << level; + + int len = min(y0 + winsz, rows) - y0; + + float val = 0.0f; + if (x0 + tid < cols) + { + if (x0 + tid - sel_disp < 0 || sel_disp < cth) + val = cdata_weight * cmax_data_term * len; + else + { + __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); + __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - sel_disp); + + for(int y = 0; y < len; ++y) + { + if(channels == 1) + val += compute_1(lle, lri, cdata_weight, cmax_data_term); + else + val += compute_3(lle, lri, cdata_weight, cmax_data_term); + + lle += cimg_step; + lri += cimg_step; + } + } + } + + __local float* dline = smem + winsz * get_local_id(2); + + dline[tid] = val; + } + + barrier(CLK_LOCAL_MEM_FENCE); + if(d < nr_plane) + { + + //if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } + //if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + + __local volatile float* vdline = smem + winsz * get_local_id(2); + + if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; + if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; + if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; + if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; + if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; + if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; + + if (tid == 0) + data_cost[cdisp_step1 * d] = vdline[0]; + } +} + +/////////////////////////////////////////////////////////////// +//////////////////////// init message ///////////////////////// +/////////////////////////////////////////////////////////////// +void get_first_k_element_increase_0(__global short* u_new, __global short *d_new, __global short *l_new, + __global short *r_new, __global const short *u_cur, __global const short *d_cur, + __global const short *l_cur, __global const short *r_cur, + __global short *data_cost_selected, __global short *disparity_selected_new, + __global short *data_cost_new, __global const short* data_cost_cur, + __global const short *disparity_selected_cur, + int nr_plane, int nr_plane2, + int cdisp_step1, int cdisp_step2) +{ + for(int i = 0; i < nr_plane; i++) + { + short minimum = SHRT_MAX; + int id = 0; + for(int j = 0; j < nr_plane2; j++) + { + short cur = data_cost_new[j * cdisp_step1]; + if(cur < minimum) + { + minimum = cur; + id = j; + } + } + + data_cost_selected[i * cdisp_step1] = data_cost_cur[id * cdisp_step1]; + disparity_selected_new[i * cdisp_step1] = disparity_selected_cur[id * cdisp_step2]; + + u_new[i * cdisp_step1] = u_cur[id * cdisp_step2]; + d_new[i * cdisp_step1] = d_cur[id * cdisp_step2]; + l_new[i * cdisp_step1] = l_cur[id * cdisp_step2]; + r_new[i * cdisp_step1] = r_cur[id * cdisp_step2]; + + data_cost_new[id * cdisp_step1] = SHRT_MAX; + } +} +void get_first_k_element_increase_1(__global float *u_new, __global float *d_new, __global float *l_new, + __global float *r_new, __global const float *u_cur, __global const float *d_cur, + __global const float *l_cur, __global const float *r_cur, + __global float *data_cost_selected, __global float *disparity_selected_new, + __global float *data_cost_new, __global const float *data_cost_cur, + __global const float *disparity_selected_cur, + int nr_plane, int nr_plane2, + int cdisp_step1, int cdisp_step2) +{ + for(int i = 0; i < nr_plane; i++) + { + float minimum = FLT_MAX; + int id = 0; + + for(int j = 0; j < nr_plane2; j++) + { + float cur = data_cost_new[j * cdisp_step1]; + if(cur < minimum) + { + minimum = cur; + id = j; + } + } + + data_cost_selected[i * cdisp_step1] = data_cost_cur[id * cdisp_step1]; + disparity_selected_new[i * cdisp_step1] = disparity_selected_cur[id * cdisp_step2]; + + u_new[i * cdisp_step1] = u_cur[id * cdisp_step2]; + d_new[i * cdisp_step1] = d_cur[id * cdisp_step2]; + l_new[i * cdisp_step1] = l_cur[id * cdisp_step2]; + r_new[i * cdisp_step1] = r_cur[id * cdisp_step2]; + data_cost_new[id * cdisp_step1] = FLT_MAX; + + } +} +__kernel void init_message_0(__global short *u_new_, __global short *d_new_, __global short *l_new_, + __global short *r_new_, __global short *u_cur_, __global const short *d_cur_, + __global const short *l_cur_, __global const short *r_cur_, __global short *ctemp, + __global short *selected_disp_pyr_new, __global const short *selected_disp_pyr_cur, + __global short *data_cost_selected_, __global const short *data_cost_, + int h, int w, int nr_plane, int h2, int w2, int nr_plane2, + int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + __global const short *u_cur = u_cur_ + min(h2-1, y/2 + 1) * cmsg_step2 + x/2; + __global const short *d_cur = d_cur_ + max(0, y/2 - 1) * cmsg_step2 + x/2; + __global const short *l_cur = l_cur_ + y/2 * cmsg_step2 + min(w2-1, x/2 + 1); + __global const short *r_cur = r_cur_ + y/2 * cmsg_step2 + max(0, x/2 - 1); + + __global short *data_cost_new = ctemp + y * cmsg_step1 + x; + + __global const short *disparity_selected_cur = selected_disp_pyr_cur + y/2 * cmsg_step2 + x/2; + __global const short *data_cost = data_cost_ + y * cmsg_step1 + x; + + for(int d = 0; d < nr_plane2; d++) + { + int idx2 = d * cdisp_step2; + + short val = data_cost[d * cdisp_step1] + u_cur[idx2] + d_cur[idx2] + l_cur[idx2] + r_cur[idx2]; + data_cost_new[d * cdisp_step1] = val; + } + + __global short *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; + __global short *disparity_selected_new = selected_disp_pyr_new + y * cmsg_step1 + x; + + __global short *u_new = u_new_ + y * cmsg_step1 + x; + __global short *d_new = d_new_ + y * cmsg_step1 + x; + __global short *l_new = l_new_ + y * cmsg_step1 + x; + __global short *r_new = r_new_ + y * cmsg_step1 + x; + + u_cur = u_cur_ + y/2 * cmsg_step2 + x/2; + d_cur = d_cur_ + y/2 * cmsg_step2 + x/2; + l_cur = l_cur_ + y/2 * cmsg_step2 + x/2; + r_cur = r_cur_ + y/2 * cmsg_step2 + x/2; + + get_first_k_element_increase_0(u_new, d_new, l_new, r_new, u_cur, d_cur, l_cur, r_cur, + data_cost_selected, disparity_selected_new, data_cost_new, + data_cost, disparity_selected_cur, nr_plane, nr_plane2, + cdisp_step1, cdisp_step2); + } +} +__kernel void init_message_1(__global float *u_new_, __global float *d_new_, __global float *l_new_, + __global float *r_new_, __global float *u_cur_, __global const float *d_cur_, + __global const float *l_cur_, __global const float *r_cur_, __global float *ctemp, + __global float *selected_disp_pyr_new, __global const float *selected_disp_pyr_cur, + __global float *data_cost_selected_, __global const float *data_cost_, + int h, int w, int nr_plane, int h2, int w2, int nr_plane2, + int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y < h && x < w) + { + __global const float *u_cur = u_cur_ + min(h2-1, y/2 + 1) * cmsg_step2 + x/2; + __global const float *d_cur = d_cur_ + max(0, y/2 - 1) * cmsg_step2 + x/2; + __global const float *l_cur = l_cur_ + y/2 * cmsg_step2 + min(w2-1, x/2 + 1); + __global const float *r_cur = r_cur_ + y/2 * cmsg_step2 + max(0, x/2 - 1); + + __global float *data_cost_new = ctemp + y * cmsg_step1 + x; + + __global const float *disparity_selected_cur = selected_disp_pyr_cur + y/2 * cmsg_step2 + x/2; + __global const float *data_cost = data_cost_ + y * cmsg_step1 + x; + + for(int d = 0; d < nr_plane2; d++) + { + int idx2 = d * cdisp_step2; + + float val = data_cost[d * cdisp_step1] + u_cur[idx2] + d_cur[idx2] + l_cur[idx2] + r_cur[idx2]; + data_cost_new[d * cdisp_step1] = val; + } + + __global float *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; + __global float *disparity_selected_new = selected_disp_pyr_new + y * cmsg_step1 + x; + + __global float *u_new = u_new_ + y * cmsg_step1 + x; + __global float *d_new = d_new_ + y * cmsg_step1 + x; + __global float *l_new = l_new_ + y * cmsg_step1 + x; + __global float *r_new = r_new_ + y * cmsg_step1 + x; + + u_cur = u_cur_ + y/2 * cmsg_step2 + x/2; + d_cur = d_cur_ + y/2 * cmsg_step2 + x/2; + l_cur = l_cur_ + y/2 * cmsg_step2 + x/2; + r_cur = r_cur_ + y/2 * cmsg_step2 + x/2; + + get_first_k_element_increase_1(u_new, d_new, l_new, r_new, u_cur, d_cur, l_cur, r_cur, + data_cost_selected, disparity_selected_new, data_cost_new, + data_cost, disparity_selected_cur, nr_plane, nr_plane2, + cdisp_step1, cdisp_step2); + } +} +/////////////////////////////////////////////////////////////// +//////////////////// calc all iterations ///////////////////// +/////////////////////////////////////////////////////////////// +void message_per_pixel_0(__global const short *data, __global short *msg_dst, __global const short *msg1, + __global const short *msg2, __global const short *msg3, + __global const short *dst_disp, __global const short *src_disp, + int nr_plane, __global short *temp, + float cmax_disc_term, int cdisp_step1, float cdisc_single_jump) +{ + short minimum = SHRT_MAX; + for(int d = 0; d < nr_plane; d++) + { + int idx = d * cdisp_step1; + short val = data[idx] + msg1[idx] + msg2[idx] + msg3[idx]; + + if(val < minimum) + minimum = val; + + msg_dst[idx] = val; + } + + float sum = 0; + for(int d = 0; d < nr_plane; d++) + { + float cost_min = minimum + cmax_disc_term; + short src_disp_reg = src_disp[d * cdisp_step1]; + + for(int d2 = 0; d2 < nr_plane; d2++) + cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] + + cdisc_single_jump * abs(dst_disp[d2 * cdisp_step1] - src_disp_reg))); + + temp[d * cdisp_step1] = convert_short_sat_rte(cost_min); + sum += cost_min; + } + sum /= nr_plane; + + for(int d = 0; d < nr_plane; d++) + msg_dst[d * cdisp_step1] = convert_short_sat_rte(temp[d * cdisp_step1] - sum); +} +void message_per_pixel_1(__global const float *data, __global float *msg_dst, __global const float *msg1, + __global const float *msg2, __global const float *msg3, + __global const float *dst_disp, __global const float *src_disp, + int nr_plane, __global float *temp, + float cmax_disc_term, int cdisp_step1, float cdisc_single_jump) +{ + float minimum = FLT_MAX; + for(int d = 0; d < nr_plane; d++) + { + int idx = d * cdisp_step1; + float val = data[idx] + msg1[idx] + msg2[idx] + msg3[idx]; + + if(val < minimum) + minimum = val; + + msg_dst[idx] = val; + } + + float sum = 0; + for(int d = 0; d < nr_plane; d++) + { + float cost_min = minimum + cmax_disc_term; + float src_disp_reg = src_disp[d * cdisp_step1]; + + for(int d2 = 0; d2 < nr_plane; d2++) + cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] + + cdisc_single_jump * fabs(dst_disp[d2 * cdisp_step1] - src_disp_reg))); + + temp[d * cdisp_step1] = cost_min; + sum += cost_min; + } + sum /= nr_plane; + + for(int d = 0; d < nr_plane; d++) + msg_dst[d * cdisp_step1] = temp[d * cdisp_step1] - sum; +} +__kernel void compute_message_0(__global short *u_, __global short *d_, __global short *l_, __global short *r_, + __global const short *data_cost_selected, __global const short *selected_disp_pyr_cur, + __global short *ctemp, int h, int w, int nr_plane, int i, + float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump) +{ + int y = get_global_id(1); + int x = ((get_global_id(0)) << 1) + ((y + i) & 1); + + if (y > 0 && y < h - 1 && x > 0 && x < w - 1) + { + __global const short *data = data_cost_selected + y * cmsg_step1 + x; + + __global short *u = u_ + y * cmsg_step1 + x; + __global short *d = d_ + y * cmsg_step1 + x; + __global short *l = l_ + y * cmsg_step1 + x; + __global short *r = r_ + y * cmsg_step1 + x; + + __global const short *disp = selected_disp_pyr_cur + y * cmsg_step1 + x; + + __global short *temp = ctemp + y * cmsg_step1 + x; + + message_per_pixel_0(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + message_per_pixel_0(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + message_per_pixel_0(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + message_per_pixel_0(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + } +} +__kernel void compute_message_1(__global float *u_, __global float *d_, __global float *l_, __global float *r_, + __global const float *data_cost_selected, __global const float *selected_disp_pyr_cur, + __global float *ctemp, int h, int w, int nr_plane, int i, + float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump) +{ + int y = get_global_id(1); + int x = ((get_global_id(0)) << 1) + ((y + i) & 1); + + if (y > 0 && y < h - 1 && x > 0 && x < w - 1) + { + __global const float *data = data_cost_selected + y * cmsg_step1 + x; + + __global float *u = u_ + y * cmsg_step1 + x; + __global float *d = d_ + y * cmsg_step1 + x; + __global float *l = l_ + y * cmsg_step1 + x; + __global float *r = r_ + y * cmsg_step1 + x; + + __global const float *disp = selected_disp_pyr_cur + y * cmsg_step1 + x; + __global float *temp = ctemp + y * cmsg_step1 + x; + + message_per_pixel_1(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + message_per_pixel_1(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + message_per_pixel_1(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + message_per_pixel_1(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp, + cmax_disc_term, cdisp_step1, cdisc_single_jump); + } +} + +/////////////////////////////////////////////////////////////// +/////////////////////////// output //////////////////////////// +/////////////////////////////////////////////////////////////// +__kernel void compute_disp_0(__global const short *u_, __global const short *d_, __global const short *l_, + __global const short *r_, __global const short * data_cost_selected, + __global const short *disp_selected_pyr, + __global short* disp, + int res_step, int cols, int rows, int nr_plane, + int cmsg_step1, int cdisp_step1) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y > 0 && y < rows - 1 && x > 0 && x < cols - 1) + { + __global const short *data = data_cost_selected + y * cmsg_step1 + x; + __global const short *disp_selected = disp_selected_pyr + y * cmsg_step1 + x; + + __global const short *u = u_ + (y+1) * cmsg_step1 + (x+0); + __global const short *d = d_ + (y-1) * cmsg_step1 + (x+0); + __global const short *l = l_ + (y+0) * cmsg_step1 + (x+1); + __global const short *r = r_ + (y+0) * cmsg_step1 + (x-1); + + short best = 0; + short best_val = SHRT_MAX; + + for (int i = 0; i < nr_plane; ++i) + { + int idx = i * cdisp_step1; + short val = data[idx]+ u[idx] + d[idx] + l[idx] + r[idx]; + + if (val < best_val) + { + best_val = val; + best = disp_selected[idx]; + } + } + disp[res_step * y + x] = best; + } +} +__kernel void compute_disp_1(__global const float *u_, __global const float *d_, __global const float *l_, + __global const float *r_, __global const float *data_cost_selected, + __global const float *disp_selected_pyr, + __global short *disp, + int res_step, int cols, int rows, int nr_plane, + int cmsg_step1, int cdisp_step1) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if (y > 0 && y < rows - 1 && x > 0 && x < cols - 1) + { + __global const float *data = data_cost_selected + y * cmsg_step1 + x; + __global const float *disp_selected = disp_selected_pyr + y * cmsg_step1 + x; + + __global const float *u = u_ + (y+1) * cmsg_step1 + (x+0); + __global const float *d = d_ + (y-1) * cmsg_step1 + (x+0); + __global const float *l = l_ + (y+0) * cmsg_step1 + (x+1); + __global const float *r = r_ + (y+0) * cmsg_step1 + (x-1); + + short best = 0; + short best_val = SHRT_MAX; + for (int i = 0; i < nr_plane; ++i) + { + int idx = i * cdisp_step1; + float val = data[idx]+ u[idx] + d[idx] + l[idx] + r[idx]; + + if (val < best_val) + { + best_val = val; + best = convert_short_sat_rte(disp_selected[idx]); + } + } + disp[res_step * y + x] = best; + } +} + diff --git a/modules/ocl/src/stereo_csbp.cpp b/modules/ocl/src/stereo_csbp.cpp new file mode 100644 index 0000000000..f18b6bac00 --- /dev/null +++ b/modules/ocl/src/stereo_csbp.cpp @@ -0,0 +1,792 @@ +/*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, Institute Of Software Chinese Academy Of Science, all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Third party copyrights are property of their respective owners. +// +// @Authors +// Jia Haipeng, jiahaipeng95@gmail.com +// Jin Ma, jin@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) + +namespace cv +{ + namespace ocl + { + + void cv::ocl::StereoConstantSpaceBP::estimateRecommendedParams(int, int, int &, int &, int &, int &) + { + throw_nogpu(); + } + cv::ocl::StereoConstantSpaceBP::StereoConstantSpaceBP(int, int, int, int, int) + { + throw_nogpu(); + } + cv::ocl::StereoConstantSpaceBP::StereoConstantSpaceBP(int, int, int, int, float, float, + float, float, int, int) + { + throw_nogpu(); + } + + void cv::ocl::StereoConstantSpaceBP::operator()(const oclMat &, const oclMat &, oclMat &) + { + throw_nogpu(); + } + } +} + +#else /* !defined (HAVE_OPENCL) */ + +namespace cv +{ + namespace ocl + { + + ///////////////////////////OpenCL kernel strings/////////////////////////// + extern const char *stereocsbp; + } + +} +namespace cv +{ + namespace ocl + { + namespace stereoCSBP + { + ////////////////////////////////////////////////////////////////////////// + //////////////////////////////common//////////////////////////////////// + //////////////////////////////////////////////////////////////////////// + static inline int divUp(int total, int grain) + { + return (total + grain - 1) / grain; + } + static string get_kernel_name(string kernel_name, int data_type) + { + stringstream idxStr; + if(data_type == CV_16S) + idxStr << "0"; + else + idxStr << "1"; + kernel_name += idxStr.str(); + + return kernel_name; + } + using cv::ocl::StereoConstantSpaceBP; + ////////////////////////////////////////////////////////////////////////////////// + /////////////////////////////////init_data_cost////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////// + static void init_data_cost_caller(const oclMat &left, const oclMat &right, oclMat &temp, + StereoConstantSpaceBP &rthis, + int msg_step, int h, int w, int level) + { + Context *clCxt = left.clCxt; + int data_type = rthis.msg_type; + int channels = left.oclchannels(); + + string kernelName = get_kernel_name("init_data_cost_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + //size_t blockSize = 256; + size_t localThreads[] = {32, 8 ,1}; + size_t globalThreads[] = {divUp(w, localThreads[0]) *localThreads[0], + divUp(h, localThreads[1]) *localThreads[1], + 1 + }; + + int cdisp_step1 = msg_step * h; + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&temp.data)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&left.data)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&right.data)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_int), (void *)&w)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&level)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&channels)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&msg_step)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_float), (void *)&rthis.data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_float), (void *)&rthis.max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&cdisp_step1)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&left.step)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 2, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + + static void init_data_cost_reduce_caller(const oclMat &left, const oclMat &right, oclMat &temp, + StereoConstantSpaceBP &rthis, + int msg_step, int h, int w, int level) + { + + Context *clCxt = left.clCxt; + int data_type = rthis.msg_type; + int channels = left.oclchannels(); + int win_size = (int)std::pow(2.f, level); + + string kernelName = get_kernel_name("init_data_cost_reduce_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + const int threadsNum = 256; + //size_t blockSize = threadsNum; + size_t localThreads[3] = {win_size, 1, threadsNum / win_size}; + size_t globalThreads[3] = {w *localThreads[0], + h * divUp(rthis.ndisp, localThreads[2]) *localThreads[1], 1 * localThreads[2] + }; + + int local_mem_size = threadsNum * sizeof(float); + int cdisp_step1 = msg_step * h; + + openCLVerifyKernel(clCxt, kernel, localThreads); + + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&temp.data)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&left.data)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&right.data)); + openCLSafeCall(clSetKernelArg(kernel, 3, local_mem_size, (void *)NULL)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_int), (void *)&level)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&left.rows)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&left.cols)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&win_size)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&channels)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&left.step)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_float), (void *)&rthis.data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_float), (void *)&rthis.max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clSetKernelArg(kernel, 15, sizeof(cl_int), (void *)&cdisp_step1)); + openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_int), (void *)&msg_step)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 3, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + + static void get_first_initial_local_caller(uchar *data_cost_selected, uchar *disp_selected_pyr, + oclMat &temp, StereoConstantSpaceBP &rthis, + int h, int w, int nr_plane, int msg_step) + { + Context *clCxt = temp.clCxt; + int data_type = rthis.msg_type; + + string kernelName = get_kernel_name("get_first_k_initial_local_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + //size_t blockSize = 256; + size_t localThreads[] = {32, 8 ,1}; + size_t globalThreads[] = {divUp(w, localThreads[0]) *localThreads[0], + divUp(h, localThreads[1]) *localThreads[1], + 1 + }; + + int disp_step = msg_step * h; + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&data_cost_selected)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&disp_selected_pyr)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&temp.data)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_int), (void *)&w)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&nr_plane)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&msg_step)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&disp_step)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 2, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + static void get_first_initial_global_caller(uchar *data_cost_selected, uchar *disp_selected_pyr, + oclMat &temp, StereoConstantSpaceBP &rthis, + int h, int w, int nr_plane, int msg_step) + { + Context *clCxt = temp.clCxt; + int data_type = rthis.msg_type; + + string kernelName = get_kernel_name("get_first_k_initial_global_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + //size_t blockSize = 256; + size_t localThreads[] = {32, 8, 1}; + size_t globalThreads[] = {divUp(w, localThreads[0]) *localThreads[0], + divUp(h, localThreads[1]) *localThreads[1], + 1 + }; + + int disp_step = msg_step * h; + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&data_cost_selected)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&disp_selected_pyr)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&temp.data)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_int), (void *)&w)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&nr_plane)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&msg_step)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&disp_step)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&rthis.ndisp)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 2, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + + static void init_data_cost(const oclMat &left, const oclMat &right, oclMat &temp, StereoConstantSpaceBP &rthis, + uchar *disp_selected_pyr, uchar *data_cost_selected, + size_t msg_step, int h, int w, int level, int nr_plane) + { + + if(level <= 1) + init_data_cost_caller(left, right, temp, rthis, msg_step, h, w, level); + else + init_data_cost_reduce_caller(left, right, temp, rthis, msg_step, h, w, level); + + if(rthis.use_local_init_data_cost == true) + { + get_first_initial_local_caller(data_cost_selected, disp_selected_pyr, temp, rthis, h, w, nr_plane, msg_step); + } + else + { + get_first_initial_global_caller(data_cost_selected, disp_selected_pyr, temp, rthis, h, w, + nr_plane, msg_step); + } + } + + /////////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////////////compute_data_cost////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + static void compute_data_cost_caller(uchar *disp_selected_pyr, uchar *data_cost, + StereoConstantSpaceBP &rthis, int msg_step1, + int msg_step2, const oclMat &left, const oclMat &right, int h, + int w, int h2, int level, int nr_plane) + { + Context *clCxt = left.clCxt; + int channels = left.oclchannels(); + int data_type = rthis.msg_type; + + string kernelName = get_kernel_name("compute_data_cost_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + //size_t blockSize = 256; + size_t localThreads[] = {32, 8, 1}; + size_t globalThreads[] = {divUp(w, localThreads[0]) *localThreads[0], + divUp(h, localThreads[1]) *localThreads[1], + 1 + }; + + int disp_step1 = msg_step1 * h; + int disp_step2 = msg_step2 * h2; + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&disp_selected_pyr)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&data_cost)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&left.data)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *)&right.data)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&w)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&level)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&nr_plane)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&channels)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&msg_step1)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&msg_step2)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&disp_step1)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&disp_step2)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_float), (void *)&rthis.data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_float), (void *)&rthis.max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 15, sizeof(cl_int), (void *)&left.step)); + openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 2, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + static void compute_data_cost_reduce_caller(uchar *disp_selected_pyr, uchar *data_cost, + StereoConstantSpaceBP &rthis, int msg_step1, + int msg_step2, const oclMat &left, const oclMat &right, int h, + int w, int h2, int level, int nr_plane) + { + Context *clCxt = left.clCxt; + int data_type = rthis.msg_type; + int channels = left.oclchannels(); + int win_size = (int)std::pow(2.f, level); + + string kernelName = get_kernel_name("compute_data_cost_reduce_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + const size_t threadsNum = 256; + //size_t blockSize = threadsNum; + size_t localThreads[3] = {win_size, 1, threadsNum / win_size}; + size_t globalThreads[3] = {w *localThreads[0], + h * divUp(nr_plane, localThreads[2]) *localThreads[1], 1 * localThreads[2] + }; + + int disp_step1 = msg_step1 * h; + int disp_step2 = msg_step2 * h2; + size_t local_mem_size = threadsNum * sizeof(float); + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&disp_selected_pyr)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&data_cost)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&left.data)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *)&right.data)); + openCLSafeCall(clSetKernelArg(kernel, 4, local_mem_size, (void *)NULL)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&level)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&left.rows)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&left.cols)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&nr_plane)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&channels)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&win_size)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&msg_step1)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&msg_step2)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_int), (void *)&disp_step1)); + openCLSafeCall(clSetKernelArg(kernel, 15, sizeof(cl_int), (void *)&disp_step2)); + openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_float), (void *)&rthis.data_weight)); + openCLSafeCall(clSetKernelArg(kernel, 17, sizeof(cl_float), (void *)&rthis.max_data_term)); + openCLSafeCall(clSetKernelArg(kernel, 18, sizeof(cl_int), (void *)&left.step)); + openCLSafeCall(clSetKernelArg(kernel, 19, sizeof(cl_int), (void *)&rthis.min_disp_th)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 3, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + static void compute_data_cost(uchar *disp_selected_pyr, uchar *data_cost, StereoConstantSpaceBP &rthis, + int msg_step1, int msg_step2, const oclMat &left, const oclMat &right, int h, int w, + int h2, int level, int nr_plane) + { + if(level <= 1) + compute_data_cost_caller(disp_selected_pyr, data_cost, rthis, msg_step1, msg_step2, + left, right, h, w, h2, level, nr_plane); + else + compute_data_cost_reduce_caller(disp_selected_pyr, data_cost, rthis, msg_step1, msg_step2, + left, right, h, w, h2, level, nr_plane); + } + //////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////////////////init message////////////////////////////////////////////// + //////////////////////////////////////////////////////////////////////////////////////////////// + static void init_message(uchar *u_new, uchar *d_new, uchar *l_new, uchar *r_new, + uchar *u_cur, uchar *d_cur, uchar *l_cur, uchar *r_cur, + uchar *disp_selected_pyr_new, uchar *disp_selected_pyr_cur, + uchar *data_cost_selected, uchar *data_cost, oclMat &temp, StereoConstantSpaceBP rthis, + size_t msg_step1, size_t msg_step2, int h, int w, int nr_plane, + int h2, int w2, int nr_plane2) + { + Context *clCxt = temp.clCxt; + int data_type = rthis.msg_type; + + string kernelName = get_kernel_name("init_message_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + //size_t blockSize = 256; + size_t localThreads[] = {32, 8, 1}; + size_t globalThreads[] = {divUp(w, localThreads[0]) *localThreads[0], + divUp(h, localThreads[1]) *localThreads[1], + 1 + }; + + int disp_step1 = msg_step1 * h; + int disp_step2 = msg_step2 * h2; + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&u_new)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&d_new)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&l_new)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *)&r_new)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *)&u_cur)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *)&d_cur)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *)&l_cur)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_mem), (void *)&r_cur)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_mem), (void *)&temp.data)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_mem), (void *)&disp_selected_pyr_new)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_mem), (void *)&disp_selected_pyr_cur)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_mem), (void *)&data_cost_selected)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_mem), (void *)&data_cost)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_int), (void *)&w)); + openCLSafeCall(clSetKernelArg(kernel, 15, sizeof(cl_int), (void *)&nr_plane)); + openCLSafeCall(clSetKernelArg(kernel, 16, sizeof(cl_int), (void *)&h2)); + openCLSafeCall(clSetKernelArg(kernel, 17, sizeof(cl_int), (void *)&w2)); + openCLSafeCall(clSetKernelArg(kernel, 18, sizeof(cl_int), (void *)&nr_plane2)); + openCLSafeCall(clSetKernelArg(kernel, 19, sizeof(cl_int), (void *)&disp_step1)); + openCLSafeCall(clSetKernelArg(kernel, 20, sizeof(cl_int), (void *)&disp_step2)); + openCLSafeCall(clSetKernelArg(kernel, 21, sizeof(cl_int), (void *)&msg_step1)); + openCLSafeCall(clSetKernelArg(kernel, 22, sizeof(cl_int), (void *)&msg_step2)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 2, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + //////////////////////////////////////////////////////////////////////////////////////////////// + ///////////////////////////calc_all_iterations//////////////////////////////////////////////// + ////////////////////////////////////////////////////////////////////////////////////////////// + static void calc_all_iterations_caller(uchar *u, uchar *d, uchar *l, uchar *r, uchar *data_cost_selected, + uchar *disp_selected_pyr, oclMat &temp, StereoConstantSpaceBP rthis, + int msg_step, int h, int w, int nr_plane, int i) + { + Context *clCxt = temp.clCxt; + int data_type = rthis.msg_type; + + string kernelName = get_kernel_name("compute_message_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + size_t localThreads[] = {32, 8, 1}; + size_t globalThreads[] = {divUp(w, (localThreads[0]) << 1) *localThreads[0], + divUp(h, localThreads[1]) *localThreads[1], + 1 + }; + + int disp_step = msg_step * h; + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&u)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&d)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&l)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *)&r)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *)&data_cost_selected)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *)&disp_selected_pyr)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *)&temp.data)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&h)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&w)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&nr_plane)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&i)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_float), (void *)&rthis.max_disc_term)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&disp_step)); + openCLSafeCall(clSetKernelArg(kernel, 13, sizeof(cl_int), (void *)&msg_step)); + openCLSafeCall(clSetKernelArg(kernel, 14, sizeof(cl_float), (void *)&rthis.disc_single_jump)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 2, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + static void calc_all_iterations(uchar *u, uchar *d, uchar *l, uchar *r, uchar *data_cost_selected, + uchar *disp_selected_pyr, oclMat &temp, StereoConstantSpaceBP rthis, + int msg_step, int h, int w, int nr_plane) + { + for(int t = 0; t < rthis.iters; t++) + calc_all_iterations_caller(u, d, l, r, data_cost_selected, disp_selected_pyr, temp, rthis, + msg_step, h, w, nr_plane, t & 1); + } + + /////////////////////////////////////////////////////////////////////////////////////////////// + //////////////////////////compute_disp//////////////////////////////////////////////////////// + ///////////////////////////////////////////////////////////////////////////////////////////// + static void compute_disp(uchar *u, uchar *d, uchar *l, uchar *r, uchar *data_cost_selected, + uchar *disp_selected_pyr, StereoConstantSpaceBP &rthis, size_t msg_step, + oclMat &disp, int nr_plane) + { + Context *clCxt = disp.clCxt; + int data_type = rthis.msg_type; + + string kernelName = get_kernel_name("compute_disp_", data_type); + + cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereocsbp, kernelName); + + //size_t blockSize = 256; + size_t localThreads[] = {32, 8, 1}; + size_t globalThreads[] = {divUp(disp.cols, localThreads[0]) *localThreads[0], + divUp(disp.rows, localThreads[1]) *localThreads[1], + 1 + }; + + int step_size = disp.step / disp.elemSize(); + int disp_step = disp.rows * msg_step; + openCLVerifyKernel(clCxt, kernel, localThreads); + openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&u)); + openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&d)); + openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&l)); + openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_mem), (void *)&r)); + openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *)&data_cost_selected)); + openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_mem), (void *)&disp_selected_pyr)); + openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_mem), (void *)&disp.data)); + openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&step_size)); + openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&disp.cols)); + openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&disp.rows)); + openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&nr_plane)); + openCLSafeCall(clSetKernelArg(kernel, 11, sizeof(cl_int), (void *)&msg_step)); + openCLSafeCall(clSetKernelArg(kernel, 12, sizeof(cl_int), (void *)&disp_step)); + openCLSafeCall(clEnqueueNDRangeKernel(*(cl_command_queue*)getoclCommandQueue(), kernel, 2, NULL, + globalThreads, localThreads, 0, NULL, NULL)); + + clFinish(*(cl_command_queue*)getoclCommandQueue()); + openCLSafeCall(clReleaseKernel(kernel)); + } + } + } +} +namespace +{ + const float DEFAULT_MAX_DATA_TERM = 30.0f; + const float DEFAULT_DATA_WEIGHT = 1.0f; + const float DEFAULT_MAX_DISC_TERM = 160.0f; + const float DEFAULT_DISC_SINGLE_JUMP = 10.0f; + + template + void print_gpu_mat(const oclMat &mat) + { + T *data_1 = new T[mat.rows * mat.cols * mat.channels()]; + Context *clCxt = mat.clCxt; + int status = clEnqueueReadBuffer(clCxt -> impl->clCmdQueue, (cl_mem)mat.data, CL_TRUE, 0, + mat.rows * mat.cols * mat.channels() * sizeof(T), data_1, 0, NULL, NULL); + + if(status != CL_SUCCESS) + cout << "error " << status << endl; + + cout << ".........................................................." << endl; + cout << "elemSize() " << mat.elemSize() << endl; + cout << "elemSize() " << mat.elemSize1() << endl; + cout << "channels: " << mat.channels() << endl; + cout << "rows: " << mat.rows << endl; + cout << "cols: " << mat.cols << endl; + + for(int i = 0; i < 100; i++) + { + for(int j = 0; j < 30; j++) + { + cout << (int)data_1[i * mat.cols * mat.channels() + j] << " "; + } + cout << endl; + } + } +} + + +void cv::ocl::StereoConstantSpaceBP::estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels, int &nr_plane) +{ + ndisp = (int) ((float) width / 3.14f); + if ((ndisp & 1) != 0) + ndisp++; + + int mm = ::max(width, height); + iters = mm / 100 + ((mm > 1200) ? - 4 : 4); + + levels = (int)::log(static_cast(mm)) * 2 / 3; + if (levels == 0) levels++; + + nr_plane = (int) ((float) ndisp / std::pow(2.0, levels + 1)); +} + +cv::ocl::StereoConstantSpaceBP::StereoConstantSpaceBP(int ndisp_, int iters_, int levels_, int nr_plane_, + int msg_type_) + + : ndisp(ndisp_), iters(iters_), levels(levels_), nr_plane(nr_plane_), + max_data_term(DEFAULT_MAX_DATA_TERM), data_weight(DEFAULT_DATA_WEIGHT), + max_disc_term(DEFAULT_MAX_DISC_TERM), disc_single_jump(DEFAULT_DISC_SINGLE_JUMP), min_disp_th(0), + msg_type(msg_type_), use_local_init_data_cost(true) +{ + CV_Assert(msg_type_ == CV_32F || msg_type_ == CV_16S); +} + + +cv::ocl::StereoConstantSpaceBP::StereoConstantSpaceBP(int ndisp_, int iters_, int levels_, int nr_plane_, + float max_data_term_, float data_weight_, float max_disc_term_, float disc_single_jump_, + int min_disp_th_, int msg_type_) + : ndisp(ndisp_), iters(iters_), levels(levels_), nr_plane(nr_plane_), + max_data_term(max_data_term_), data_weight(data_weight_), + max_disc_term(max_disc_term_), disc_single_jump(disc_single_jump_), min_disp_th(min_disp_th_), + msg_type(msg_type_), use_local_init_data_cost(true) +{ + CV_Assert(msg_type_ == CV_32F || msg_type_ == CV_16S); +} + +template +static void csbp_operator(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2], oclMat l[2], oclMat r[2], + oclMat disp_selected_pyr[2], oclMat &data_cost, oclMat &data_cost_selected, + oclMat &temp, oclMat &out, const oclMat &left, const oclMat &right, oclMat &disp) +{ + CV_DbgAssert(0 < rthis.ndisp && 0 < rthis.iters && 0 < rthis.levels && 0 < rthis.nr_plane + && left.rows == right.rows && left.cols == right.cols && left.type() == right.type()); + + CV_Assert(rthis.levels <= 8 && (left.type() == CV_8UC1 || left.type() == CV_8UC3)); + + const Scalar zero = Scalar::all(0); + + ////////////////////////////////////Init/////////////////////////////////////////////////// + int rows = left.rows; + int cols = left.cols; + + rthis.levels = min(rthis.levels, int(log((double)rthis.ndisp) / log(2.0))); + int levels = rthis.levels; + + AutoBuffer buf(levels * 4); + + int *cols_pyr = buf; + int *rows_pyr = cols_pyr + levels; + int *nr_plane_pyr = rows_pyr + levels; + int *step_pyr = nr_plane_pyr + levels; + + cols_pyr[0] = cols; + rows_pyr[0] = rows; + nr_plane_pyr[0] = rthis.nr_plane; + + const int n = 64; + step_pyr[0] = alignSize(cols * sizeof(T), n) / sizeof(T); + for (int i = 1; i < levels; i++) + { + cols_pyr[i] = cols_pyr[i - 1] / 2; + rows_pyr[i] = rows_pyr[i - 1]/ 2; + + nr_plane_pyr[i] = nr_plane_pyr[i - 1] * 2; + + step_pyr[i] = alignSize(cols_pyr[i] * sizeof(T), n) / sizeof(T); + } + + Size msg_size(step_pyr[0], rows * nr_plane_pyr[0]); + Size data_cost_size(step_pyr[0], rows * nr_plane_pyr[0] * 2); + + u[0].create(msg_size, DataType::type); + d[0].create(msg_size, DataType::type); + l[0].create(msg_size, DataType::type); + r[0].create(msg_size, DataType::type); + + u[1].create(msg_size, DataType::type); + d[1].create(msg_size, DataType::type); + l[1].create(msg_size, DataType::type); + r[1].create(msg_size, DataType::type); + + disp_selected_pyr[0].create(msg_size, DataType::type); + disp_selected_pyr[1].create(msg_size, DataType::type); + + data_cost.create(data_cost_size, DataType::type); + data_cost_selected.create(msg_size, DataType::type); + + Size temp_size = data_cost_size; + if (data_cost_size.width * data_cost_size.height < step_pyr[0] * rows_pyr[levels - 1] * rthis.ndisp) + temp_size = Size(step_pyr[0], rows_pyr[levels - 1] * rthis.ndisp); + + temp.create(temp_size, DataType::type); + temp = zero; + + ///////////////////////////////// Compute//////////////////////////////////////////////// + + //csbp::load_constants(rthis.ndisp, rthis.max_data_term, rthis.data_weight, + // rthis.max_disc_term, rthis.disc_single_jump, rthis.min_disp_th, left, right, temp); + + l[0] = zero; + d[0] = zero; + r[0] = zero; + u[0] = zero; + disp_selected_pyr[0] = zero; + + l[1] = zero; + d[1] = zero; + r[1] = zero; + u[1] = zero; + disp_selected_pyr[1] = zero; + + data_cost = zero; + + data_cost_selected = zero; + + int cur_idx = 0; + + for (int i = levels - 1; i >= 0; i--) + { + if (i == levels - 1) + { + cv::ocl::stereoCSBP::init_data_cost(left, right, temp, rthis, disp_selected_pyr[cur_idx].data, + data_cost_selected.data, step_pyr[0], rows_pyr[i], cols_pyr[i], + i, nr_plane_pyr[i]); + } + else + { + cv::ocl::stereoCSBP::compute_data_cost( + disp_selected_pyr[cur_idx].data, data_cost.data, rthis, step_pyr[0], + step_pyr[0], left, right, rows_pyr[i], cols_pyr[i], rows_pyr[i + 1], i, + nr_plane_pyr[i + 1]); + + int new_idx = (cur_idx + 1) & 1; + + cv::ocl::stereoCSBP::init_message(u[new_idx].data, d[new_idx].data, l[new_idx].data, r[new_idx].data, + u[cur_idx].data, d[cur_idx].data, l[cur_idx].data, r[cur_idx].data, + disp_selected_pyr[new_idx].data, disp_selected_pyr[cur_idx].data, + data_cost_selected.data, data_cost.data, temp, rthis, step_pyr[0], + step_pyr[0], rows_pyr[i], cols_pyr[i], nr_plane_pyr[i], rows_pyr[i + 1], + cols_pyr[i + 1], nr_plane_pyr[i + 1]); + cur_idx = new_idx; + } + cv::ocl::stereoCSBP::calc_all_iterations(u[cur_idx].data, d[cur_idx].data, l[cur_idx].data, r[cur_idx].data, + data_cost_selected.data, disp_selected_pyr[cur_idx].data, temp, + rthis, step_pyr[0], rows_pyr[i], cols_pyr[i], nr_plane_pyr[i]); + } + + if (disp.empty()) + disp.create(rows, cols, CV_16S); + + out = ((disp.type() == CV_16S) ? disp : (out.create(rows, cols, CV_16S), out)); + out = zero; + + stereoCSBP::compute_disp(u[cur_idx].data, d[cur_idx].data, l[cur_idx].data, r[cur_idx].data, + data_cost_selected.data, disp_selected_pyr[cur_idx].data, rthis, step_pyr[0], + out, nr_plane_pyr[0]); + if (disp.type() != CV_16S) + out.convertTo(disp, disp.type()); +} + + +typedef void (*csbp_operator_t)(StereoConstantSpaceBP &rthis, oclMat u[2], oclMat d[2], oclMat l[2], oclMat r[2], + oclMat disp_selected_pyr[2], oclMat &data_cost, oclMat &data_cost_selected, + oclMat &temp, oclMat &out, const oclMat &left, const oclMat &right, oclMat &disp); + +const static csbp_operator_t operators[] = {0, 0, 0, csbp_operator, 0, csbp_operator, 0, 0}; + +void cv::ocl::StereoConstantSpaceBP::operator()(const oclMat &left, const oclMat &right, oclMat &disp) +{ + + CV_Assert(msg_type == CV_32F || msg_type == CV_16S); + operators[msg_type](*this, u, d, l, r, disp_selected_pyr, data_cost, data_cost_selected, temp, out, + left, right, disp); +} + +#endif /* !defined (HAVE_OPENCL) */ diff --git a/modules/ocl/test/test_calib3d.cpp b/modules/ocl/test/test_calib3d.cpp index 179829e0e6..befc0598a3 100644 --- a/modules/ocl/test/test_calib3d.cpp +++ b/modules/ocl/test/test_calib3d.cpp @@ -59,7 +59,7 @@ PARAM_TEST_CASE(StereoMatchBM, int, int) virtual void SetUp() { n_disp = GET_PARAM(0); - winSize = GET_PARAM(1); + winSize = GET_PARAM(1); } }; @@ -69,27 +69,27 @@ TEST_P(StereoMatchBM, Regression) Mat left_image = readImage("stereobm/aloe-L.png", IMREAD_GRAYSCALE); Mat right_image = readImage("stereobm/aloe-R.png", IMREAD_GRAYSCALE); Mat disp_gold = readImage("stereobm/aloe-disp.png", IMREAD_GRAYSCALE); - ocl::oclMat d_left, d_right; - ocl::oclMat d_disp(left_image.size(), CV_8U); - Mat disp; + ocl::oclMat d_left, d_right; + ocl::oclMat d_disp(left_image.size(), CV_8U); + Mat disp; ASSERT_FALSE(left_image.empty()); ASSERT_FALSE(right_image.empty()); ASSERT_FALSE(disp_gold.empty()); - d_left.upload(left_image); - d_right.upload(right_image); + d_left.upload(left_image); + d_right.upload(right_image); ocl::StereoBM_OCL bm(0, n_disp, winSize); bm(d_left, d_right, d_disp); - d_disp.download(disp); + d_disp.download(disp); EXPECT_MAT_SIMILAR(disp_gold, disp, 1e-3); } INSTANTIATE_TEST_CASE_P(OCL_Calib3D, StereoMatchBM, testing::Combine(testing::Values(128), - testing::Values(19))); + testing::Values(19))); PARAM_TEST_CASE(StereoMatchBP, int, int, int, float, float, float, float) { @@ -134,4 +134,64 @@ TEST_P(StereoMatchBP, Regression) INSTANTIATE_TEST_CASE_P(OCL_Calib3D, StereoMatchBP, testing::Combine(testing::Values(64), testing::Values(8),testing::Values(2),testing::Values(25.0f), testing::Values(0.1f),testing::Values(15.0f),testing::Values(1.0f))); + +////////////////////////////////////////////////////////////////////////// +// ConstSpaceBeliefPropagation +PARAM_TEST_CASE(StereoMatchConstSpaceBP, int, int, int, int, float, float, float, float, int, int) +{ + int ndisp_; + int iters_; + int levels_; + int nr_plane_; + float max_data_term_; + float data_weight_; + float max_disc_term_; + float disc_single_jump_; + int min_disp_th_; + int msg_type_; + + virtual void SetUp() + { + ndisp_ = GET_PARAM(0); + iters_ = GET_PARAM(1); + levels_ = GET_PARAM(2); + nr_plane_ = GET_PARAM(3); + max_data_term_ = GET_PARAM(4); + data_weight_ = GET_PARAM(5); + max_disc_term_ = GET_PARAM(6); + disc_single_jump_ = GET_PARAM(7); + min_disp_th_ = GET_PARAM(8); + msg_type_ = GET_PARAM(9); + } +}; +TEST_P(StereoMatchConstSpaceBP, Regression) +{ + Mat left_image = readImage("csstereobp/aloe-L.png"); + Mat right_image = readImage("csstereobp/aloe-R.png"); + Mat disp_gold = readImage("csstereobp/aloe-disp.png", IMREAD_GRAYSCALE); + + ocl::oclMat d_left, d_right; + ocl::oclMat d_disp; + + Mat disp; + ASSERT_FALSE(left_image.empty()); + ASSERT_FALSE(right_image.empty()); + ASSERT_FALSE(disp_gold.empty()); + + d_left.upload(left_image); + d_right.upload(right_image); + + ocl::StereoConstantSpaceBP bp(ndisp_, iters_, levels_, nr_plane_, max_data_term_, data_weight_, + max_disc_term_, disc_single_jump_, 0, CV_32F); + bp(d_left, d_right, d_disp); + d_disp.download(disp); + disp.convertTo(disp, disp_gold.depth()); + + EXPECT_MAT_SIMILAR(disp_gold, disp, 1e-4); + //EXPECT_MAT_NEAR(disp_gold, disp, 1.0, ""); +} +INSTANTIATE_TEST_CASE_P(OCL_Calib3D, StereoMatchConstSpaceBP, testing::Combine(testing::Values(128), + testing::Values(16),testing::Values(4), testing::Values(4), testing::Values(30.0f), + testing::Values(1.0f),testing::Values(160.0f), + testing::Values(10.0f), testing::Values(0), testing::Values(CV_32F))); #endif // HAVE_OPENCL From c701d5428118e1ee112a9de2dd60cf10120285b5 Mon Sep 17 00:00:00 2001 From: Peng Xiao Date: Sun, 21 Apr 2013 11:19:37 +0800 Subject: [PATCH 08/49] Fix build errors --- modules/ocl/src/stereo_csbp.cpp | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/modules/ocl/src/stereo_csbp.cpp b/modules/ocl/src/stereo_csbp.cpp index f18b6bac00..44662ea049 100644 --- a/modules/ocl/src/stereo_csbp.cpp +++ b/modules/ocl/src/stereo_csbp.cpp @@ -571,37 +571,8 @@ namespace const float DEFAULT_DATA_WEIGHT = 1.0f; const float DEFAULT_MAX_DISC_TERM = 160.0f; const float DEFAULT_DISC_SINGLE_JUMP = 10.0f; - - template - void print_gpu_mat(const oclMat &mat) - { - T *data_1 = new T[mat.rows * mat.cols * mat.channels()]; - Context *clCxt = mat.clCxt; - int status = clEnqueueReadBuffer(clCxt -> impl->clCmdQueue, (cl_mem)mat.data, CL_TRUE, 0, - mat.rows * mat.cols * mat.channels() * sizeof(T), data_1, 0, NULL, NULL); - - if(status != CL_SUCCESS) - cout << "error " << status << endl; - - cout << ".........................................................." << endl; - cout << "elemSize() " << mat.elemSize() << endl; - cout << "elemSize() " << mat.elemSize1() << endl; - cout << "channels: " << mat.channels() << endl; - cout << "rows: " << mat.rows << endl; - cout << "cols: " << mat.cols << endl; - - for(int i = 0; i < 100; i++) - { - for(int j = 0; j < 30; j++) - { - cout << (int)data_1[i * mat.cols * mat.channels() + j] << " "; - } - cout << endl; - } - } } - void cv::ocl::StereoConstantSpaceBP::estimateRecommendedParams(int width, int height, int &ndisp, int &iters, int &levels, int &nr_plane) { ndisp = (int) ((float) width / 3.14f); From 3282aaa1f5ba544c26611e20d31058fa2491ce96 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 23 Apr 2013 15:34:40 +0800 Subject: [PATCH 09/49] Fix a bug found on Intel OpenCL SDK. --- modules/ocl/src/opencl/stereobp.cl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ocl/src/opencl/stereobp.cl b/modules/ocl/src/opencl/stereobp.cl index 3196e581ad..4d13f807bb 100644 --- a/modules/ocl/src/opencl/stereobp.cl +++ b/modules/ocl/src/opencl/stereobp.cl @@ -185,10 +185,10 @@ __kernel void data_step_down(__global T *src, int src_rows, for (int d = 0; d < cndisp; ++d) { float dst_reg; - dst_reg = src[(d * src_rows + (2*y+0)) * src_step + 2*x+0]; - dst_reg += src[(d * src_rows + (2*y+1)) * src_step + 2*x+0]; - dst_reg += src[(d * src_rows + (2*y+0)) * src_step + 2*x+1]; - dst_reg += src[(d * src_rows + (2*y+1)) * src_step + 2*x+1]; + dst_reg = src[(d * src_rows + min(2*y+0, src_rows-1)) * src_step + 2*x+0]; + dst_reg += src[(d * src_rows + min(2*y+1, src_rows-1)) * src_step + 2*x+0]; + dst_reg += src[(d * src_rows + min(2*y+0, src_rows-1)) * src_step + 2*x+1]; + dst_reg += src[(d * src_rows + min(2*y+1, src_rows-1)) * src_step + 2*x+1]; dst[(d * dst_rows + y) * dst_step + x] = saturate_cast(dst_reg); } From b386ea72aa2540b94aab9d46acbdcb5c7a1162c8 Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 23 Apr 2013 17:23:05 +0800 Subject: [PATCH 10/49] use float when sum overflow --- modules/ocl/src/imgproc.cpp | 141 ++++++----- modules/ocl/src/opencl/imgproc_integral.cl | 220 +++++++++++++++++- .../ocl/src/opencl/imgproc_integral_sum.cl | 200 +++++++++++++++- 3 files changed, 487 insertions(+), 74 deletions(-) diff --git a/modules/ocl/src/imgproc.cpp b/modules/ocl/src/imgproc.cpp index 04f732f06b..ee1e92a712 100644 --- a/modules/ocl/src/imgproc.cpp +++ b/modules/ocl/src/imgproc.cpp @@ -1011,10 +1011,8 @@ namespace cv warpPerspective_gpu(src, dst, coeffs, interpolation); } - //////////////////////////////////////////////////////////////////////// // integral - void integral(const oclMat &src, oclMat &sum, oclMat &sqsum) { CV_Assert(src.type() == CV_8UC1); @@ -1028,42 +1026,53 @@ namespace cv int vcols = (pre_invalid + src.cols + vlen - 1) / vlen; oclMat t_sum , t_sqsum; - t_sum.create(src.cols, src.rows, CV_32SC1); - t_sqsum.create(src.cols, src.rows, CV_32FC1); - int w = src.cols + 1, h = src.rows + 1; - sum.create(h, w, CV_32SC1); - sqsum.create(h, w, CV_32FC1); - int sum_offset = sum.offset / vlen, sqsum_offset = sqsum.offset / vlen; - - vector > args; - args.push_back( make_pair( sizeof(cl_mem) , (void *)&src.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sqsum.data )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&offset )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&pre_invalid )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&src.rows )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&src.cols )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&src.step )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step)); - size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1}; - openCLExecuteKernel(src.clCxt, &imgproc_integral, "integral_cols", gt, lt, args, -1, -1); - args.clear(); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sqsum.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&sum.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&sqsum.data )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.rows )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.cols )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&sum.step)); - args.push_back( make_pair( sizeof(cl_int) , (void *)&sqsum.step)); - args.push_back( make_pair( sizeof(cl_int) , (void *)&sum_offset)); - args.push_back( make_pair( sizeof(cl_int) , (void *)&sqsum_offset)); - size_t gt2[3] = {t_sum.cols * 32, 1, 1}, lt2[3] = {256, 1, 1}; - openCLExecuteKernel(src.clCxt, &imgproc_integral, "integral_rows", gt2, lt2, args, -1, -1); - //cout << "tested" << endl; + int depth; + if( src.cols * src.rows <= 2901 * 2901 ) //2901 is the maximum size for int when all values are 255 + { + t_sum.create(src.cols, src.rows, CV_32SC1); + sum.create(h, w, CV_32SC1); + } + else + { + //Use float to prevent overflow + t_sum.create(src.cols, src.rows, CV_32FC1); + sum.create(h, w, CV_32FC1); + } + t_sqsum.create(src.cols, src.rows, CV_32FC1); + sqsum.create(h, w, CV_32FC1); + depth = sum.depth(); + int sum_offset = sum.offset / vlen; + int sqsum_offset = sqsum.offset / vlen; + + vector > args; + args.push_back( make_pair( sizeof(cl_mem) , (void *)&src.data )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sqsum.data )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&offset )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&pre_invalid )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&src.rows )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&src.cols )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&src.step )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step)); + size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1}; + openCLExecuteKernel(src.clCxt, &imgproc_integral, "integral_cols", gt, lt, args, -1, depth); + args.clear(); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sqsum.data )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&sum.data )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&sqsum.data )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.rows )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.cols )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&sum.step)); + args.push_back( make_pair( sizeof(cl_int) , (void *)&sqsum.step)); + args.push_back( make_pair( sizeof(cl_int) , (void *)&sum_offset)); + args.push_back( make_pair( sizeof(cl_int) , (void *)&sqsum_offset)); + size_t gt2[3] = {t_sum.cols * 32, 1, 1}, lt2[3] = {256, 1, 1}; + openCLExecuteKernel(src.clCxt, &imgproc_integral, "integral_rows", gt2, lt2, args, -1, depth); } + void integral(const oclMat &src, oclMat &sum) { CV_Assert(src.type() == CV_8UC1); @@ -1073,34 +1082,40 @@ namespace cv int vcols = (pre_invalid + src.cols + vlen - 1) / vlen; oclMat t_sum; - t_sum.create(src.cols, src.rows, CV_32SC1); - int w = src.cols + 1, h = src.rows + 1; - sum.create(h, w, CV_32SC1); - int sum_offset = sum.offset / vlen; - - vector > args; - args.push_back( make_pair( sizeof(cl_mem) , (void *)&src.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&offset )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&pre_invalid )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&src.rows )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&src.cols )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&src.step )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step)); - size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1}; - openCLExecuteKernel(src.clCxt, &imgproc_integral_sum, "integral_sum_cols", gt, lt, args, -1, -1); - args.clear(); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&sum.data )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.rows )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.cols )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&sum.step)); - args.push_back( make_pair( sizeof(cl_int) , (void *)&sum_offset)); - size_t gt2[3] = {t_sum.cols * 32, 1, 1}, lt2[3] = {256, 1, 1}; - openCLExecuteKernel(src.clCxt, &imgproc_integral_sum, "integral_sum_rows", gt2, lt2, args, -1, -1); - //cout << "tested" << endl; + int depth; + if(src.cols * src.rows <= 2901 * 2901) + { + t_sum.create(src.cols, src.rows, CV_32SC1); + sum.create(h, w, CV_32SC1); + }else + { + t_sum.create(src.cols, src.rows, CV_32FC1); + sum.create(h, w, CV_32FC1); + } + depth = sum.depth(); + int sum_offset = sum.offset / vlen; + vector > args; + args.push_back( make_pair( sizeof(cl_mem) , (void *)&src.data )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&offset )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&pre_invalid )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&src.rows )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&src.cols )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&src.step )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step)); + size_t gt[3] = {((vcols + 1) / 2) * 256, 1, 1}, lt[3] = {256, 1, 1}; + openCLExecuteKernel(src.clCxt, &imgproc_integral_sum, "integral_sum_cols", gt, lt, args, -1, depth); + args.clear(); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&t_sum.data )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&sum.data )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.rows )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.cols )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&t_sum.step )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&sum.step)); + args.push_back( make_pair( sizeof(cl_int) , (void *)&sum_offset)); + size_t gt2[3] = {t_sum.cols * 32, 1, 1}, lt2[3] = {256, 1, 1}; + openCLExecuteKernel(src.clCxt, &imgproc_integral_sum, "integral_sum_rows", gt2, lt2, args, -1, depth); } /////////////////////// corner ////////////////////////////// diff --git a/modules/ocl/src/opencl/imgproc_integral.cl b/modules/ocl/src/opencl/imgproc_integral.cl index c546957687..d279ef728c 100644 --- a/modules/ocl/src/opencl/imgproc_integral.cl +++ b/modules/ocl/src/opencl/imgproc_integral.cl @@ -60,7 +60,7 @@ #define GET_CONFLICT_OFFSET(lid) ((lid) >> LOG_NUM_BANKS) -kernel void integral_cols(__global uchar4 *src,__global int *sum ,__global float *sqsum, +kernel void integral_cols_D4(__global uchar4 *src,__global int *sum ,__global float *sqsum, int src_offset,int pre_invalid,int rows,int cols,int src_step,int dst_step) { unsigned int lid = get_local_id(0); @@ -159,7 +159,7 @@ kernel void integral_cols(__global uchar4 *src,__global int *sum ,__global float } -kernel void integral_rows(__global int4 *srcsum,__global float4 * srcsqsum,__global int *sum , +kernel void integral_rows_D4(__global int4 *srcsum,__global float4 * srcsqsum,__global int *sum , __global float *sqsum,int rows,int cols,int src_step,int sum_step, int sqsum_step,int sum_offset,int sqsum_offset) { @@ -275,3 +275,219 @@ kernel void integral_rows(__global int4 *srcsum,__global float4 * srcsqsum,__glo barrier(CLK_LOCAL_MEM_FENCE); } } + +kernel void integral_cols_D5(__global uchar4 *src,__global float *sum ,__global float *sqsum, + int src_offset,int pre_invalid,int rows,int cols,int src_step,int dst_step) +{ + unsigned int lid = get_local_id(0); + unsigned int gid = get_group_id(0); + float4 src_t[2], sum_t[2]; + float4 sqsum_t[2]; + __local float4 lm_sum[2][LSIZE + LOG_LSIZE]; + __local float4 lm_sqsum[2][LSIZE + LOG_LSIZE]; + __local float* sum_p; + __local float* sqsum_p; + src_step = src_step >> 2; + gid = gid << 1; + for(int i = 0; i < rows; i =i + LSIZE_1) + { + src_t[0] = (i + lid < rows ? convert_float4(src[src_offset + (lid+i) * src_step + min(gid, (uint)cols - 1)]) : (float4)0); + src_t[1] = (i + lid < rows ? convert_float4(src[src_offset + (lid+i) * src_step + min(gid + 1, (uint)cols - 1)]) : (float4)0); + + sum_t[0] = (i == 0 ? (float4)0 : lm_sum[0][LSIZE_2 + LOG_LSIZE]); + sqsum_t[0] = (i == 0 ? (float4)0 : lm_sqsum[0][LSIZE_2 + LOG_LSIZE]); + sum_t[1] = (i == 0 ? (float4)0 : lm_sum[1][LSIZE_2 + LOG_LSIZE]); + sqsum_t[1] = (i == 0 ? (float4)0 : lm_sqsum[1][LSIZE_2 + LOG_LSIZE]); + barrier(CLK_LOCAL_MEM_FENCE); + + int bf_loc = lid + GET_CONFLICT_OFFSET(lid); + lm_sum[0][bf_loc] = src_t[0]; + lm_sqsum[0][bf_loc] = convert_float4(src_t[0] * src_t[0]); + + lm_sum[1][bf_loc] = src_t[1]; + lm_sqsum[1][bf_loc] = convert_float4(src_t[1] * src_t[1]); + + int offset = 1; + for(int d = LSIZE >> 1 ; d > 0; d>>=1) + { + barrier(CLK_LOCAL_MEM_FENCE); + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + lm_sqsum[lid >> 7][bi] += lm_sqsum[lid >> 7][ai]; + } + offset <<= 1; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(lid < 2) + { + lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; + lm_sqsum[lid][LSIZE_2 + LOG_LSIZE] = 0; + } + for(int d = 1; d < LSIZE; d <<= 1) + { + barrier(CLK_LOCAL_MEM_FENCE); + offset >>= 1; + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + lm_sum[lid >> 7][ai] = lm_sum[lid >> 7][bi] - lm_sum[lid >> 7][ai]; + + lm_sqsum[lid >> 7][bi] += lm_sqsum[lid >> 7][ai]; + lm_sqsum[lid >> 7][ai] = lm_sqsum[lid >> 7][bi] - lm_sqsum[lid >> 7][ai]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + int loc_s0 = gid * dst_step + i + lid - 1 - pre_invalid * dst_step / 4, loc_s1 = loc_s0 + dst_step ; + if(lid > 0 && (i+lid) <= rows) + { + lm_sum[0][bf_loc] += sum_t[0]; + lm_sum[1][bf_loc] += sum_t[1]; + lm_sqsum[0][bf_loc] += sqsum_t[0]; + lm_sqsum[1][bf_loc] += sqsum_t[1]; + sum_p = (__local float*)(&(lm_sum[0][bf_loc])); + sqsum_p = (__local float*)(&(lm_sqsum[0][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 4 + k >= cols + pre_invalid || gid * 4 + k < pre_invalid) continue; + sum[loc_s0 + k * dst_step / 4] = sum_p[k]; + sqsum[loc_s0 + k * dst_step / 4] = sqsum_p[k]; + } + sum_p = (__local float*)(&(lm_sum[1][bf_loc])); + sqsum_p = (__local float*)(&(lm_sqsum[1][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 4 + k + 4 >= cols + pre_invalid) break; + sum[loc_s1 + k * dst_step / 4] = sum_p[k]; + sqsum[loc_s1 + k * dst_step / 4] = sqsum_p[k]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + } +} + + +kernel void integral_rows_D5(__global float4 *srcsum,__global float4 * srcsqsum,__global float *sum , + __global float *sqsum,int rows,int cols,int src_step,int sum_step, + int sqsum_step,int sum_offset,int sqsum_offset) +{ + unsigned int lid = get_local_id(0); + unsigned int gid = get_group_id(0); + float4 src_t[2], sum_t[2]; + float4 sqsrc_t[2],sqsum_t[2]; + __local float4 lm_sum[2][LSIZE + LOG_LSIZE]; + __local float4 lm_sqsum[2][LSIZE + LOG_LSIZE]; + __local float *sum_p; + __local float *sqsum_p; + src_step = src_step >> 4; + for(int i = 0; i < rows; i =i + LSIZE_1) + { + src_t[0] = i + lid < rows ? srcsum[(lid+i) * src_step + gid * 2] : (float4)0; + sqsrc_t[0] = i + lid < rows ? srcsqsum[(lid+i) * src_step + gid * 2] : (float4)0; + src_t[1] = i + lid < rows ? srcsum[(lid+i) * src_step + gid * 2 + 1] : (float4)0; + sqsrc_t[1] = i + lid < rows ? srcsqsum[(lid+i) * src_step + gid * 2 + 1] : (float4)0; + + sum_t[0] = (i == 0 ? (float4)0 : lm_sum[0][LSIZE_2 + LOG_LSIZE]); + sqsum_t[0] = (i == 0 ? (float4)0 : lm_sqsum[0][LSIZE_2 + LOG_LSIZE]); + sum_t[1] = (i == 0 ? (float4)0 : lm_sum[1][LSIZE_2 + LOG_LSIZE]); + sqsum_t[1] = (i == 0 ? (float4)0 : lm_sqsum[1][LSIZE_2 + LOG_LSIZE]); + barrier(CLK_LOCAL_MEM_FENCE); + + int bf_loc = lid + GET_CONFLICT_OFFSET(lid); + lm_sum[0][bf_loc] = src_t[0]; + lm_sqsum[0][bf_loc] = sqsrc_t[0]; + + lm_sum[1][bf_loc] = src_t[1]; + lm_sqsum[1][bf_loc] = sqsrc_t[1]; + + int offset = 1; + for(int d = LSIZE >> 1 ; d > 0; d>>=1) + { + barrier(CLK_LOCAL_MEM_FENCE); + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + lm_sqsum[lid >> 7][bi] += lm_sqsum[lid >> 7][ai]; + } + offset <<= 1; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(lid < 2) + { + lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; + lm_sqsum[lid][LSIZE_2 + LOG_LSIZE] = 0; + } + for(int d = 1; d < LSIZE; d <<= 1) + { + barrier(CLK_LOCAL_MEM_FENCE); + offset >>= 1; + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + lm_sum[lid >> 7][ai] = lm_sum[lid >> 7][bi] - lm_sum[lid >> 7][ai]; + + lm_sqsum[lid >> 7][bi] += lm_sqsum[lid >> 7][ai]; + lm_sqsum[lid >> 7][ai] = lm_sqsum[lid >> 7][bi] - lm_sqsum[lid >> 7][ai]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + if(gid == 0 && (i + lid) <= rows) + { + sum[sum_offset + i + lid] = 0; + sqsum[sqsum_offset + i + lid] = 0; + } + if(i + lid == 0) + { + int loc0 = gid * 2 * sum_step; + int loc1 = gid * 2 * sqsum_step; + for(int k = 1; k <= 8; k++) + { + if(gid * 8 + k > cols) break; + sum[sum_offset + loc0 + k * sum_step / 4] = 0; + sqsum[sqsum_offset + loc1 + k * sqsum_step / 4] = 0; + } + } + int loc_s0 = sum_offset + gid * 2 * sum_step + sum_step / 4 + i + lid, loc_s1 = loc_s0 + sum_step ; + int loc_sq0 = sqsum_offset + gid * 2 * sqsum_step + sqsum_step / 4 + i + lid, loc_sq1 = loc_sq0 + sqsum_step ; + if(lid > 0 && (i+lid) <= rows) + { + lm_sum[0][bf_loc] += sum_t[0]; + lm_sum[1][bf_loc] += sum_t[1]; + lm_sqsum[0][bf_loc] += sqsum_t[0]; + lm_sqsum[1][bf_loc] += sqsum_t[1]; + sum_p = (__local float*)(&(lm_sum[0][bf_loc])); + sqsum_p = (__local float*)(&(lm_sqsum[0][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 8 + k >= cols) break; + sum[loc_s0 + k * sum_step / 4] = sum_p[k]; + sqsum[loc_sq0 + k * sqsum_step / 4] = sqsum_p[k]; + } + sum_p = (__local float*)(&(lm_sum[1][bf_loc])); + sqsum_p = (__local float*)(&(lm_sqsum[1][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 8 + 4 + k >= cols) break; + sum[loc_s1 + k * sum_step / 4] = sum_p[k]; + sqsum[loc_sq1 + k * sqsum_step / 4] = sqsum_p[k]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + } +} \ No newline at end of file diff --git a/modules/ocl/src/opencl/imgproc_integral_sum.cl b/modules/ocl/src/opencl/imgproc_integral_sum.cl index b7b3f2ff0e..70f0c63df2 100644 --- a/modules/ocl/src/opencl/imgproc_integral_sum.cl +++ b/modules/ocl/src/opencl/imgproc_integral_sum.cl @@ -44,8 +44,13 @@ //M*/ #if defined (DOUBLE_SUPPORT) +#ifdef cl_khr_fp64 #pragma OPENCL EXTENSION cl_khr_fp64:enable +#elif defined (cl_amd_fp64) +#pragma OPENCL EXTENSION cl_amd_fp64:enable #endif +#endif + #define LSIZE 256 #define LSIZE_1 255 #define LSIZE_2 254 @@ -56,8 +61,8 @@ #define GET_CONFLICT_OFFSET(lid) ((lid) >> LOG_NUM_BANKS) -kernel void integral_sum_cols(__global uchar4 *src,__global int *sum , - int src_offset,int pre_invalid,int rows,int cols,int src_step,int dst_step) +kernel void integral_sum_cols_D4(__global uchar4 *src,__global int *sum , + int src_offset,int pre_invalid,int rows,int cols,int src_step,int dst_step) { unsigned int lid = get_local_id(0); unsigned int gid = get_group_id(0); @@ -114,7 +119,8 @@ kernel void integral_sum_cols(__global uchar4 *src,__global int *sum , } } barrier(CLK_LOCAL_MEM_FENCE); - if(lid > 0 && (i+lid) <= rows){ + if(lid > 0 && (i+lid) <= rows) + { int loc_s0 = gid * dst_step + i + lid - 1 - pre_invalid * dst_step / 4, loc_s1 = loc_s0 + dst_step ; lm_sum[0][bf_loc] += sum_t[0]; lm_sum[1][bf_loc] += sum_t[1]; @@ -136,9 +142,9 @@ kernel void integral_sum_cols(__global uchar4 *src,__global int *sum , } -kernel void integral_sum_rows(__global int4 *srcsum,__global int *sum , - int rows,int cols,int src_step,int sum_step, - int sum_offset) +kernel void integral_sum_rows_D4(__global int4 *srcsum,__global int *sum , + int rows,int cols,int src_step,int sum_step, + int sum_offset) { unsigned int lid = get_local_id(0); unsigned int gid = get_group_id(0); @@ -196,19 +202,20 @@ kernel void integral_sum_rows(__global int4 *srcsum,__global int *sum , barrier(CLK_LOCAL_MEM_FENCE); if(gid == 0 && (i + lid) <= rows) { - sum[sum_offset + i + lid] = 0; + sum[sum_offset + i + lid] = 0; } if(i + lid == 0) { int loc0 = gid * 2 * sum_step; - for(int k = 1;k <= 8;k++) + for(int k = 1; k <= 8; k++) { if(gid * 8 + k > cols) break; sum[sum_offset + loc0 + k * sum_step / 4] = 0; } } - if(lid > 0 && (i+lid) <= rows){ + if(lid > 0 && (i+lid) <= rows) + { int loc_s0 = sum_offset + gid * 2 * sum_step + sum_step / 4 + i + lid, loc_s1 = loc_s0 + sum_step ; lm_sum[0][bf_loc] += sum_t[0]; lm_sum[1][bf_loc] += sum_t[1]; @@ -228,3 +235,178 @@ kernel void integral_sum_rows(__global int4 *srcsum,__global int *sum , barrier(CLK_LOCAL_MEM_FENCE); } } + +kernel void integral_sum_cols_D5(__global uchar4 *src,__global float *sum , + int src_offset,int pre_invalid,int rows,int cols,int src_step,int dst_step) +{ + unsigned int lid = get_local_id(0); + unsigned int gid = get_group_id(0); + float4 src_t[2], sum_t[2]; + __local float4 lm_sum[2][LSIZE + LOG_LSIZE]; + __local float* sum_p; + src_step = src_step >> 2; + gid = gid << 1; + for(int i = 0; i < rows; i =i + LSIZE_1) + { + src_t[0] = (i + lid < rows ? convert_float4(src[src_offset + (lid+i) * src_step + gid]) : (float4)0); + src_t[1] = (i + lid < rows ? convert_float4(src[src_offset + (lid+i) * src_step + gid + 1]) : (float4)0); + + sum_t[0] = (i == 0 ? (float4)0 : lm_sum[0][LSIZE_2 + LOG_LSIZE]); + sum_t[1] = (i == 0 ? (float4)0 : lm_sum[1][LSIZE_2 + LOG_LSIZE]); + barrier(CLK_LOCAL_MEM_FENCE); + + int bf_loc = lid + GET_CONFLICT_OFFSET(lid); + lm_sum[0][bf_loc] = src_t[0]; + + lm_sum[1][bf_loc] = src_t[1]; + + int offset = 1; + for(int d = LSIZE >> 1 ; d > 0; d>>=1) + { + barrier(CLK_LOCAL_MEM_FENCE); + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + } + offset <<= 1; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(lid < 2) + { + lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; + } + for(int d = 1; d < LSIZE; d <<= 1) + { + barrier(CLK_LOCAL_MEM_FENCE); + offset >>= 1; + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + lm_sum[lid >> 7][ai] = lm_sum[lid >> 7][bi] - lm_sum[lid >> 7][ai]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + if(lid > 0 && (i+lid) <= rows) + { + int loc_s0 = gid * dst_step + i + lid - 1 - pre_invalid * dst_step / 4, loc_s1 = loc_s0 + dst_step ; + lm_sum[0][bf_loc] += sum_t[0]; + lm_sum[1][bf_loc] += sum_t[1]; + sum_p = (__local float*)(&(lm_sum[0][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 4 + k >= cols + pre_invalid || gid * 4 + k < pre_invalid) continue; + sum[loc_s0 + k * dst_step / 4] = sum_p[k]; + } + sum_p = (__local float*)(&(lm_sum[1][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 4 + k + 4 >= cols + pre_invalid) break; + sum[loc_s1 + k * dst_step / 4] = sum_p[k]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + } +} + + +kernel void integral_sum_rows_D5(__global float4 *srcsum,__global float *sum , + int rows,int cols,int src_step,int sum_step, + int sum_offset) +{ + unsigned int lid = get_local_id(0); + unsigned int gid = get_group_id(0); + float4 src_t[2], sum_t[2]; + __local float4 lm_sum[2][LSIZE + LOG_LSIZE]; + __local float *sum_p; + src_step = src_step >> 4; + for(int i = 0; i < rows; i =i + LSIZE_1) + { + src_t[0] = i + lid < rows ? srcsum[(lid+i) * src_step + gid * 2] : (float4)0; + src_t[1] = i + lid < rows ? srcsum[(lid+i) * src_step + gid * 2 + 1] : (float4)0; + + sum_t[0] = (i == 0 ? (float4)0 : lm_sum[0][LSIZE_2 + LOG_LSIZE]); + sum_t[1] = (i == 0 ? (float4)0 : lm_sum[1][LSIZE_2 + LOG_LSIZE]); + barrier(CLK_LOCAL_MEM_FENCE); + + int bf_loc = lid + GET_CONFLICT_OFFSET(lid); + lm_sum[0][bf_loc] = src_t[0]; + + lm_sum[1][bf_loc] = src_t[1]; + + int offset = 1; + for(int d = LSIZE >> 1 ; d > 0; d>>=1) + { + barrier(CLK_LOCAL_MEM_FENCE); + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + } + offset <<= 1; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(lid < 2) + { + lm_sum[lid][LSIZE_2 + LOG_LSIZE] = 0; + } + for(int d = 1; d < LSIZE; d <<= 1) + { + barrier(CLK_LOCAL_MEM_FENCE); + offset >>= 1; + int ai = offset * (((lid & 127)<<1) +1) - 1,bi = ai + offset; + ai += GET_CONFLICT_OFFSET(ai); + bi += GET_CONFLICT_OFFSET(bi); + + if((lid & 127) < d) + { + lm_sum[lid >> 7][bi] += lm_sum[lid >> 7][ai]; + lm_sum[lid >> 7][ai] = lm_sum[lid >> 7][bi] - lm_sum[lid >> 7][ai]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + if(gid == 0 && (i + lid) <= rows) + { + sum[sum_offset + i + lid] = 0; + } + if(i + lid == 0) + { + int loc0 = gid * 2 * sum_step; + for(int k = 1; k <= 8; k++) + { + if(gid * 8 + k > cols) break; + sum[sum_offset + loc0 + k * sum_step / 4] = 0; + } + } + + if(lid > 0 && (i+lid) <= rows) + { + int loc_s0 = sum_offset + gid * 2 * sum_step + sum_step / 4 + i + lid, loc_s1 = loc_s0 + sum_step ; + lm_sum[0][bf_loc] += sum_t[0]; + lm_sum[1][bf_loc] += sum_t[1]; + sum_p = (__local float*)(&(lm_sum[0][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 8 + k >= cols) break; + sum[loc_s0 + k * sum_step / 4] = sum_p[k]; + } + sum_p = (__local float*)(&(lm_sum[1][bf_loc])); + for(int k = 0; k < 4; k++) + { + if(gid * 8 + 4 + k >= cols) break; + sum[loc_s1 + k * sum_step / 4] = sum_p[k]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + } +} From 9cfa24e515d16225100462e0ab29b08214454022 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 23 Apr 2013 17:35:40 +0800 Subject: [PATCH 11/49] Fix thread sync for csbp. --- modules/ocl/src/opencl/stereocsbp.cl | 803 ++++++++++++++++++--------- 1 file changed, 535 insertions(+), 268 deletions(-) diff --git a/modules/ocl/src/opencl/stereocsbp.cl b/modules/ocl/src/opencl/stereocsbp.cl index f855ee0979..ea7af62b21 100644 --- a/modules/ocl/src/opencl/stereocsbp.cl +++ b/modules/ocl/src/opencl/stereocsbp.cl @@ -53,13 +53,13 @@ #define SHRT_MAX CL_SHORT_MAX #endif - + /////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////get_first_k_initial_global////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////// __kernel void get_first_k_initial_global_0(__global short *data_cost_selected_, __global short *selected_disp_pyr, - __global short *ctemp, int h, int w, int nr_plane, - int cmsg_step1, int cdisp_step1, int cndisp) + __global short *ctemp, int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) { int x = get_global_id(0); int y = get_global_id(1); @@ -74,7 +74,7 @@ __kernel void get_first_k_initial_global_0(__global short *data_cost_selected_, { short minimum = SHRT_MAX; int id = 0; - + for(int d = 0; d < cndisp; d++) { short cur = data_cost[d * cdisp_step1]; @@ -84,7 +84,7 @@ __kernel void get_first_k_initial_global_0(__global short *data_cost_selected_, id = d; } } - + data_cost_selected[i * cdisp_step1] = minimum; selected_disparity[i * cdisp_step1] = id; data_cost [id * cdisp_step1] = SHRT_MAX; @@ -92,8 +92,8 @@ __kernel void get_first_k_initial_global_0(__global short *data_cost_selected_, } } __kernel void get_first_k_initial_global_1(__global float *data_cost_selected_, __global float *selected_disp_pyr, - __global float *ctemp, int h, int w, int nr_plane, - int cmsg_step1, int cdisp_step1, int cndisp) + __global float *ctemp, int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) { int x = get_global_id(0); int y = get_global_id(1); @@ -108,7 +108,7 @@ __kernel void get_first_k_initial_global_1(__global float *data_cost_selected_, { float minimum = FLT_MAX; int id = 0; - + for(int d = 0; d < cndisp; d++) { float cur = data_cost[d * cdisp_step1]; @@ -118,7 +118,7 @@ __kernel void get_first_k_initial_global_1(__global float *data_cost_selected_, id = d; } } - + data_cost_selected[i * cdisp_step1] = minimum; selected_disparity[i * cdisp_step1] = id; data_cost [id * cdisp_step1] = FLT_MAX; @@ -130,8 +130,8 @@ __kernel void get_first_k_initial_global_1(__global float *data_cost_selected_, ///////////////////////////////////////////get_first_k_initial_local//////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////// __kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, __global short *selected_disp_pyr, - __global short *ctemp,int h, int w, int nr_plane, - int cmsg_step1, int cdisp_step1, int cndisp) + __global short *ctemp,int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) { int x = get_global_id(0); int y = get_global_id(1); @@ -147,10 +147,10 @@ __kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, short prev = data_cost[0 * cdisp_step1]; short cur = data_cost[1 * cdisp_step1]; short next = data_cost[2 * cdisp_step1]; - + for (int d = 1; d < cndisp - 1 && nr_local_minimum < nr_plane; d++) { - + if (cur < prev && cur < next) { data_cost_selected[nr_local_minimum * cdisp_step1] = cur; @@ -159,7 +159,7 @@ __kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, nr_local_minimum++; } - + prev = cur; cur = next; next = data_cost[(d + 1) * cdisp_step1]; @@ -169,7 +169,7 @@ __kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, { short minimum = SHRT_MAX; int id = 0; - + for (int d = 0; d < cndisp; d++) { cur = data_cost[d * cdisp_step1]; @@ -179,7 +179,7 @@ __kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, id = d; } } - + data_cost_selected[i * cdisp_step1] = minimum; selected_disparity[i * cdisp_step1] = id; data_cost[id * cdisp_step1] = SHRT_MAX; @@ -188,8 +188,8 @@ __kernel void get_first_k_initial_local_0(__global short *data_cost_selected_, } __kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, __global float *selected_disp_pyr, - __global float *ctemp,int h, int w, int nr_plane, - int cmsg_step1, int cdisp_step1, int cndisp) + __global float *ctemp,int h, int w, int nr_plane, + int cmsg_step1, int cdisp_step1, int cndisp) { int x = get_global_id(0); int y = get_global_id(1); @@ -205,7 +205,7 @@ __kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, _ float prev = data_cost[0 * cdisp_step1]; float cur = data_cost[1 * cdisp_step1]; float next = data_cost[2 * cdisp_step1]; - + for (int d = 1; d < cndisp - 1 && nr_local_minimum < nr_plane; d++) { if (cur < prev && cur < next) @@ -216,16 +216,18 @@ __kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, _ nr_local_minimum++; } - + prev = cur; cur = next; next = data_cost[(d + 1) * cdisp_step1]; } + + for (int i = nr_local_minimum; i < nr_plane; i++) { float minimum = FLT_MAX; int id = 0; - + for (int d = 0; d < cndisp; d++) { cur = data_cost[d * cdisp_step1]; @@ -235,7 +237,7 @@ __kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, _ id = d; } } - + data_cost_selected[i * cdisp_step1] = minimum; selected_disparity[i * cdisp_step1] = id; data_cost[id * cdisp_step1] = FLT_MAX; @@ -247,16 +249,16 @@ __kernel void get_first_k_initial_local_1(__global float *data_cost_selected_, _ /////////////////////// init data cost //////////////////////// /////////////////////////////////////////////////////////////// float compute_3(__global uchar* left, __global uchar* right, - float cdata_weight, float cmax_data_term) + float cdata_weight, float cmax_data_term) { float tb = 0.114f * abs((int)left[0] - right[0]); float tg = 0.587f * abs((int)left[1] - right[1]); float tr = 0.299f * abs((int)left[2] - right[2]); - + return fmin(cdata_weight * (tr + tg + tb), cdata_weight * cmax_data_term); } float compute_1(__global uchar* left, __global uchar* right, - float cdata_weight, float cmax_data_term) + float cdata_weight, float cmax_data_term) { return fmin(cdata_weight * abs((int)*left - (int)*right), cdata_weight * cmax_data_term); } @@ -267,23 +269,23 @@ short round_short(float v){ ///////////////////////////////////init_data_cost/////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////// __kernel void init_data_cost_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright, - int h, int w, int level, int channels, - int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1, - int cth, int cimg_step, int cndisp) + int h, int w, int level, int channels, + int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1, + int cth, int cimg_step, int cndisp) { int x = get_global_id(0); int y = get_global_id(1); - + if (y < h && x < w) { int y0 = y << level; int yt = (y + 1) << level; - + int x0 = x << level; int xt = (x + 1) << level; __global short *data_cost = ctemp + y * cmsg_step1 + x; - + for(int d = 0; d < cndisp; ++d) { float val = 0.0f; @@ -311,23 +313,23 @@ __kernel void init_data_cost_0(__global short *ctemp, __global uchar *cleft, __g } } __kernel void init_data_cost_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright, - int h, int w, int level, int channels, - int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1, - int cth, int cimg_step, int cndisp) + int h, int w, int level, int channels, + int cmsg_step1, float cdata_weight, float cmax_data_term, int cdisp_step1, + int cth, int cimg_step, int cndisp) { int x = get_global_id(0); int y = get_global_id(1); - + if (y < h && x < w) { int y0 = y << level; int yt = (y + 1) << level; - + int x0 = x << level; int xt = (x + 1) << level; __global float *data_cost = ctemp + y * cmsg_step1 + x; - + for(int d = 0; d < cndisp; ++d) { float val = 0.0f; @@ -358,9 +360,9 @@ __kernel void init_data_cost_1(__global float *ctemp, __global uchar *cleft, __g //////////////////////////////////init_data_cost_reduce////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////////// __kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cleft, __global uchar *cright, - __local float *smem, int level, int rows, int cols, int h, int winsz, int channels, - int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth, - int cdisp_step1, int cmsg_step1) + __local float *smem, int level, int rows, int cols, int h, int winsz, int channels, + int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth, + int cdisp_step1, int cmsg_step1) { int x_out = get_group_id(0); int y_out = get_group_id(1) % h; @@ -373,9 +375,9 @@ __kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cle { int x0 = x_out << level; int y0 = y_out << level; - + int len = min(y0 + winsz, rows) - y0; - + float val = 0.0f; if (x0 + tid < cols) { @@ -385,7 +387,7 @@ __kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cle { __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - d); - + for(int y = 0; y < len; ++y) { if(channels == 1) @@ -398,36 +400,103 @@ __kernel void init_data_cost_reduce_0(__global short *ctemp, __global uchar *cle } } } - + __local float* dline = smem + winsz * get_local_id(2); - + dline[tid] = val; + } - barrier(CLK_LOCAL_MEM_FENCE); + barrier(CLK_LOCAL_MEM_FENCE); - if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } - if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + if(d < cndisp) + { + __local float* dline = smem + winsz * get_local_id(2); + if (winsz >= 256) + { + if (tid < 128) + dline[tid] += dline[tid + 128]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - __local volatile float* vdline = smem + winsz * get_local_id(2); + if(d < cndisp) + { + __local float* dline = smem + winsz * get_local_id(2); + if (winsz >= 128) + { + if (tid < 64) + dline[tid] += dline[tid + 64]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; - if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; - if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; - if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; - if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; - if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 64) + if (tid < 32) + vdline[tid] += vdline[tid + 32]; + } + barrier(CLK_LOCAL_MEM_FENCE); - __global short* data_cost = ctemp + y_out * cmsg_step1 + x_out; + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 32) + if (tid < 16) + vdline[tid] += vdline[tid + 16]; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(d= 16) + if (tid < 8) + vdline[tid] += vdline[tid + 8]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d= 8) + if (tid < 4) + vdline[tid] += vdline[tid + 4]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d= 4) + if (tid < 2) + vdline[tid] += vdline[tid + 2]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d= 2) + if (tid < 1) + vdline[tid] += vdline[tid + 1]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < cndisp) + { + __local float* dline = smem + winsz * get_local_id(2); + __global short* data_cost = ctemp + y_out * cmsg_step1 + x_out; if (tid == 0) data_cost[cdisp_step1 * d] = convert_short_sat_rte(dline[0]); } } __kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cleft, __global uchar *cright, - __local float *smem, int level, int rows, int cols, int h, int winsz, int channels, - int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth, - int cdisp_step1, int cmsg_step1) + __local float *smem, int level, int rows, int cols, int h, int winsz, int channels, + int cndisp,int cimg_step, float cdata_weight, float cmax_data_term, int cth, + int cdisp_step1, int cmsg_step1) { int x_out = get_group_id(0); int y_out = get_group_id(1) % h; @@ -439,9 +508,9 @@ __kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cle { int x0 = x_out << level; int y0 = y_out << level; - + int len = min(y0 + winsz, rows) - y0; - + float val = 0.0f; //float val = 528.0f; @@ -453,7 +522,7 @@ __kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cle { __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - d); - + for(int y = 0; y < len; ++y) { if(channels == 1) @@ -466,27 +535,89 @@ __kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cle } } } - + __local float* dline = smem + winsz * get_local_id(2); - + dline[tid] = val; + } + barrier(CLK_LOCAL_MEM_FENCE); - barrier(CLK_LOCAL_MEM_FENCE); + if(d < cndisp) + { + __local float* dline = smem + winsz * get_local_id(2); + if (winsz >= 256) + if (tid < 128) + dline[tid] += dline[tid + 128]; + } + barrier(CLK_LOCAL_MEM_FENCE); - if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } - if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + if(d < cndisp) + { + __local float* dline = smem + winsz * get_local_id(2); + if (winsz >= 128) + if (tid < 64) + dline[tid] += dline[tid + 64]; + } + barrier(CLK_LOCAL_MEM_FENCE); - __local volatile float* vdline = smem + winsz * get_local_id(2); + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 64) + if (tid < 32) + vdline[tid] += vdline[tid + 32]; + } + barrier(CLK_LOCAL_MEM_FENCE); - if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; - if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; - if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; - if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; - if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; - if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 32) + if (tid < 16) + vdline[tid] += vdline[tid + 16]; + } + barrier(CLK_LOCAL_MEM_FENCE); - __global float *data_cost = ctemp + y_out * cmsg_step1 + x_out; + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 16) + if (tid < 8) + vdline[tid] += vdline[tid + 8]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 8) + if (tid < 4) + vdline[tid] += vdline[tid + 4]; + } + barrier(CLK_LOCAL_MEM_FENCE); + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 4) + if (tid < 2) + vdline[tid] += vdline[tid + 2]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < cndisp) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 2) + if (tid < 1) + vdline[tid] += vdline[tid + 1]; + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < cndisp) + { + __global float *data_cost = ctemp + y_out * cmsg_step1 + x_out; + __local float* dline = smem + winsz * get_local_id(2); if (tid == 0) data_cost[cdisp_step1 * d] = dline[0]; } @@ -496,10 +627,10 @@ __kernel void init_data_cost_reduce_1(__global float *ctemp, __global uchar *cle ////////////////////// compute data cost ////////////////////// /////////////////////////////////////////////////////////////// __kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __global short *data_cost_, - __global uchar *cleft, __global uchar *cright, - int h, int w, int level, int nr_plane, int channels, - int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight, - float cmax_data_term, int cimg_step, int cth) + __global uchar *cleft, __global uchar *cright, + int h, int w, int level, int nr_plane, int channels, + int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight, + float cmax_data_term, int cimg_step, int cth) { int x = get_global_id(0); @@ -509,7 +640,7 @@ __kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __glo { int y0 = y << level; int yt = (y + 1) << level; - + int x0 = x << level; int xt = (x + 1) << level; @@ -525,10 +656,10 @@ __kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __glo { int sel_disp = selected_disparity[d * cdisp_step2]; int xr = xi - sel_disp; - + if (xr < 0 || sel_disp < cth) val += cdata_weight * cmax_data_term; - + else { __global uchar* left_x = cleft + yi * cimg_step + xi * channels; @@ -546,10 +677,10 @@ __kernel void compute_data_cost_0(__global const short *selected_disp_pyr, __glo } } __kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __global float *data_cost_, - __global uchar *cleft, __global uchar *cright, - int h, int w, int level, int nr_plane, int channels, - int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight, - float cmax_data_term, int cimg_step, int cth) + __global uchar *cleft, __global uchar *cright, + int h, int w, int level, int nr_plane, int channels, + int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, float cdata_weight, + float cmax_data_term, int cimg_step, int cth) { int x = get_global_id(0); @@ -559,7 +690,7 @@ __kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __glo { int y0 = y << level; int yt = (y + 1) << level; - + int x0 = x << level; int xt = (x + 1) << level; @@ -575,7 +706,7 @@ __kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __glo { int sel_disp = selected_disparity[d * cdisp_step2]; int xr = xi - sel_disp; - + if (xr < 0 || sel_disp < cth) val += cdata_weight * cmax_data_term; else @@ -598,31 +729,31 @@ __kernel void compute_data_cost_1(__global const float *selected_disp_pyr, __glo ////////////////////////////////////////compute_data_cost_reduce////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////// __kernel void compute_data_cost_reduce_0(__global const short* selected_disp_pyr, __global short* data_cost_, - __global uchar *cleft, __global uchar *cright,__local float *smem, - int level, int rows, int cols, int h, int nr_plane, - int channels, int winsz, - int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, - float cdata_weight, float cmax_data_term, int cimg_step,int cth) - + __global uchar *cleft, __global uchar *cright,__local float *smem, + int level, int rows, int cols, int h, int nr_plane, + int channels, int winsz, + int cmsg_step1, int cmsg_step2, int cdisp_step1, int cdisp_step2, + float cdata_weight, float cmax_data_term, int cimg_step,int cth) + { int x_out = get_group_id(0); int y_out = get_group_id(1) % h; int d = (get_group_id(1)/ h) * get_local_size(2) + get_local_id(2); - + int tid = get_local_id(0); - + __global const short* selected_disparity = selected_disp_pyr + y_out/2 * cmsg_step2 + x_out/2; __global short* data_cost = data_cost_ + y_out * cmsg_step1 + x_out; - + if (d < nr_plane) { int sel_disp = selected_disparity[d * cdisp_step2]; - + int x0 = x_out << level; int y0 = y_out << level; - + int len = min(y0 + winsz, rows) - y0; - + float val = 0.0f; if (x0 + tid < cols) { @@ -632,7 +763,7 @@ __kernel void compute_data_cost_reduce_0(__global const short* selected_disp_pyr { __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - sel_disp); - + for(int y = 0; y < len; ++y) { if(channels == 1) @@ -644,60 +775,116 @@ __kernel void compute_data_cost_reduce_0(__global const short* selected_disp_pyr lri += cimg_step; } } - } - - __local float* dline = smem + winsz * get_local_id(2); + } + + __local float* dline = smem + winsz * get_local_id(2); + + dline[tid] = val; + } + + barrier(CLK_LOCAL_MEM_FENCE); + // if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } + //if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 64) + { + if (tid < 32) + vdline[tid] += vdline[tid + 32]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - dline[tid] = val; - } + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 32) + { + if (tid < 16) + vdline[tid] += vdline[tid + 16]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - barrier(CLK_LOCAL_MEM_FENCE); - if(d < nr_plane) - { + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 16) + { + if (tid < 8) + vdline[tid] += vdline[tid + 8]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - // if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } - //if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 8) + { + if (tid < 4) + vdline[tid] += vdline[tid + 4]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - __local volatile float* vdline = smem + winsz * get_local_id(2); + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 4) + { + if (tid < 2) + vdline[tid] += vdline[tid + 2]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; - if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; - if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; - if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; - if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; - if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 2) + { + if (tid < 1) + vdline[tid] += vdline[tid + 1]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); - if (tid == 0) - data_cost[cdisp_step1 * d] = convert_short_sat_rte(vdline[0]); + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (tid == 0) + data_cost[cdisp_step1 * d] = convert_short_sat_rte(vdline[0]); } } __kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr, __global float *data_cost_, - __global uchar *cleft, __global uchar *cright, __local float *smem, - int level, int rows, int cols, int h, int nr_plane, - int channels, int winsz, - int cmsg_step1, int cmsg_step2, int cdisp_step1,int cdisp_step2, float cdata_weight, - float cmax_data_term, int cimg_step, int cth) - + __global uchar *cleft, __global uchar *cright, __local float *smem, + int level, int rows, int cols, int h, int nr_plane, + int channels, int winsz, + int cmsg_step1, int cmsg_step2, int cdisp_step1,int cdisp_step2, float cdata_weight, + float cmax_data_term, int cimg_step, int cth) + { int x_out = get_group_id(0); int y_out = get_group_id(1) % h; int d = (get_group_id(1)/ h) * get_local_size(2) + get_local_id(2); - + int tid = get_local_id(0); - + __global const float *selected_disparity = selected_disp_pyr + y_out/2 * cmsg_step2 + x_out/2; __global float *data_cost = data_cost_ + y_out * cmsg_step1 + x_out; - + if (d < nr_plane) { int sel_disp = selected_disparity[d * cdisp_step2]; - + int x0 = x_out << level; int y0 = y_out << level; - + int len = min(y0 + winsz, rows) - y0; - + float val = 0.0f; if (x0 + tid < cols) { @@ -707,7 +894,7 @@ __kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr { __global uchar* lle = cleft + y0 * cimg_step + channels * (x0 + tid ); __global uchar* lri = cright + y0 * cimg_step + channels * (x0 + tid - sel_disp); - + for(int y = 0; y < len; ++y) { if(channels == 1) @@ -719,31 +906,87 @@ __kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr lri += cimg_step; } } - } - - __local float* dline = smem + winsz * get_local_id(2); - - dline[tid] = val; - } - - barrier(CLK_LOCAL_MEM_FENCE); - if(d < nr_plane) - { - - //if (winsz >= 256) { if (tid < 128) { dline[tid] += dline[tid + 128]; } barrier(CLK_LOCAL_MEM_FENCE); } - //if (winsz >= 128) { if (tid < 64) { dline[tid] += dline[tid + 64]; } barrier(CLK_LOCAL_MEM_FENCE); } - - __local volatile float* vdline = smem + winsz * get_local_id(2); - - if (winsz >= 64) if (tid < 32) vdline[tid] += vdline[tid + 32]; - if (winsz >= 32) if (tid < 16) vdline[tid] += vdline[tid + 16]; - if (winsz >= 16) if (tid < 8) vdline[tid] += vdline[tid + 8]; - if (winsz >= 8) if (tid < 4) vdline[tid] += vdline[tid + 4]; - if (winsz >= 4) if (tid < 2) vdline[tid] += vdline[tid + 2]; - if (winsz >= 2) if (tid < 1) vdline[tid] += vdline[tid + 1]; - - if (tid == 0) - data_cost[cdisp_step1 * d] = vdline[0]; + } + + __local float* dline = smem + winsz * get_local_id(2); + + dline[tid] = val; + } + + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 64) + { + if (tid < 32) + vdline[tid] += vdline[tid + 32]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + + + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 32) + { + if (tid < 16) + vdline[tid] += vdline[tid + 16]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 16) + { + if (tid < 8) + vdline[tid] += vdline[tid + 8]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 8) + { + if (tid < 4) + vdline[tid] += vdline[tid + 4]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 4) + { + if (tid < 2) + vdline[tid] += vdline[tid + 2]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (winsz >= 2) + { + if (tid < 1) + vdline[tid] += vdline[tid + 1]; + } + } + barrier(CLK_LOCAL_MEM_FENCE); + + if(d < nr_plane) + { + __local volatile float* vdline = smem + winsz * get_local_id(2); + if (tid == 0) + data_cost[cdisp_step1 * d] = vdline[0]; } } @@ -751,13 +994,13 @@ __kernel void compute_data_cost_reduce_1(__global const float *selected_disp_pyr //////////////////////// init message ///////////////////////// /////////////////////////////////////////////////////////////// void get_first_k_element_increase_0(__global short* u_new, __global short *d_new, __global short *l_new, - __global short *r_new, __global const short *u_cur, __global const short *d_cur, - __global const short *l_cur, __global const short *r_cur, - __global short *data_cost_selected, __global short *disparity_selected_new, - __global short *data_cost_new, __global const short* data_cost_cur, - __global const short *disparity_selected_cur, - int nr_plane, int nr_plane2, - int cdisp_step1, int cdisp_step2) + __global short *r_new, __global const short *u_cur, __global const short *d_cur, + __global const short *l_cur, __global const short *r_cur, + __global short *data_cost_selected, __global short *disparity_selected_new, + __global short *data_cost_new, __global const short* data_cost_cur, + __global const short *disparity_selected_cur, + int nr_plane, int nr_plane2, + int cdisp_step1, int cdisp_step2) { for(int i = 0; i < nr_plane; i++) { @@ -780,18 +1023,18 @@ void get_first_k_element_increase_0(__global short* u_new, __global short *d_new d_new[i * cdisp_step1] = d_cur[id * cdisp_step2]; l_new[i * cdisp_step1] = l_cur[id * cdisp_step2]; r_new[i * cdisp_step1] = r_cur[id * cdisp_step2]; - + data_cost_new[id * cdisp_step1] = SHRT_MAX; } } void get_first_k_element_increase_1(__global float *u_new, __global float *d_new, __global float *l_new, - __global float *r_new, __global const float *u_cur, __global const float *d_cur, - __global const float *l_cur, __global const float *r_cur, - __global float *data_cost_selected, __global float *disparity_selected_new, - __global float *data_cost_new, __global const float *data_cost_cur, - __global const float *disparity_selected_cur, - int nr_plane, int nr_plane2, - int cdisp_step1, int cdisp_step2) + __global float *r_new, __global const float *u_cur, __global const float *d_cur, + __global const float *l_cur, __global const float *r_cur, + __global float *data_cost_selected, __global float *disparity_selected_new, + __global float *data_cost_new, __global const float *data_cost_cur, + __global const float *disparity_selected_cur, + int nr_plane, int nr_plane2, + int cdisp_step1, int cdisp_step2) { for(int i = 0; i < nr_plane; i++) { @@ -820,16 +1063,16 @@ void get_first_k_element_increase_1(__global float *u_new, __global float *d_new } } __kernel void init_message_0(__global short *u_new_, __global short *d_new_, __global short *l_new_, - __global short *r_new_, __global short *u_cur_, __global const short *d_cur_, - __global const short *l_cur_, __global const short *r_cur_, __global short *ctemp, - __global short *selected_disp_pyr_new, __global const short *selected_disp_pyr_cur, - __global short *data_cost_selected_, __global const short *data_cost_, - int h, int w, int nr_plane, int h2, int w2, int nr_plane2, - int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2) + __global short *r_new_, __global short *u_cur_, __global const short *d_cur_, + __global const short *l_cur_, __global const short *r_cur_, __global short *ctemp, + __global short *selected_disp_pyr_new, __global const short *selected_disp_pyr_cur, + __global short *data_cost_selected_, __global const short *data_cost_, + int h, int w, int nr_plane, int h2, int w2, int nr_plane2, + int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2) { int x = get_global_id(0); int y = get_global_id(1); - + if (y < h && x < w) { __global const short *u_cur = u_cur_ + min(h2-1, y/2 + 1) * cmsg_step2 + x/2; @@ -838,7 +1081,7 @@ __kernel void init_message_0(__global short *u_new_, __global short *d_new_, __g __global const short *r_cur = r_cur_ + y/2 * cmsg_step2 + max(0, x/2 - 1); __global short *data_cost_new = ctemp + y * cmsg_step1 + x; - + __global const short *disparity_selected_cur = selected_disp_pyr_cur + y/2 * cmsg_step2 + x/2; __global const short *data_cost = data_cost_ + y * cmsg_step1 + x; @@ -864,34 +1107,35 @@ __kernel void init_message_0(__global short *u_new_, __global short *d_new_, __g r_cur = r_cur_ + y/2 * cmsg_step2 + x/2; get_first_k_element_increase_0(u_new, d_new, l_new, r_new, u_cur, d_cur, l_cur, r_cur, - data_cost_selected, disparity_selected_new, data_cost_new, - data_cost, disparity_selected_cur, nr_plane, nr_plane2, - cdisp_step1, cdisp_step2); + data_cost_selected, disparity_selected_new, data_cost_new, + data_cost, disparity_selected_cur, nr_plane, nr_plane2, + cdisp_step1, cdisp_step2); } } __kernel void init_message_1(__global float *u_new_, __global float *d_new_, __global float *l_new_, - __global float *r_new_, __global float *u_cur_, __global const float *d_cur_, - __global const float *l_cur_, __global const float *r_cur_, __global float *ctemp, - __global float *selected_disp_pyr_new, __global const float *selected_disp_pyr_cur, - __global float *data_cost_selected_, __global const float *data_cost_, - int h, int w, int nr_plane, int h2, int w2, int nr_plane2, - int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2) + __global float *r_new_, __global const float *u_cur_, __global const float *d_cur_, + __global const float *l_cur_, __global const float *r_cur_, __global float *ctemp, + __global float *selected_disp_pyr_new, __global const float *selected_disp_pyr_cur, + __global float *data_cost_selected_, __global const float *data_cost_, + int h, int w, int nr_plane, int h2, int w2, int nr_plane2, + int cdisp_step1, int cdisp_step2, int cmsg_step1, int cmsg_step2) { int x = get_global_id(0); int y = get_global_id(1); - - if (y < h && x < w) - { - __global const float *u_cur = u_cur_ + min(h2-1, y/2 + 1) * cmsg_step2 + x/2; - __global const float *d_cur = d_cur_ + max(0, y/2 - 1) * cmsg_step2 + x/2; - __global const float *l_cur = l_cur_ + y/2 * cmsg_step2 + min(w2-1, x/2 + 1); - __global const float *r_cur = r_cur_ + y/2 * cmsg_step2 + max(0, x/2 - 1); - __global float *data_cost_new = ctemp + y * cmsg_step1 + x; - - __global const float *disparity_selected_cur = selected_disp_pyr_cur + y/2 * cmsg_step2 + x/2; - __global const float *data_cost = data_cost_ + y * cmsg_step1 + x; + __global const float *u_cur = u_cur_ + min(h2-1, y/2 + 1) * cmsg_step2 + x/2; + __global const float *d_cur = d_cur_ + max(0, y/2 - 1) * cmsg_step2 + x/2; + __global const float *l_cur = l_cur_ + y/2 * cmsg_step2 + min(w2-1, x/2 + 1); + __global const float *r_cur = r_cur_ + y/2 * cmsg_step2 + max(0, x/2 - 1); + + __global float *data_cost_new = ctemp + y * cmsg_step1 + x; + + __global const float *disparity_selected_cur = selected_disp_pyr_cur + y/2 * cmsg_step2 + x/2; + __global const float *data_cost = data_cost_ + y * cmsg_step1 + x; + + if (y < h && x < w) + { for(int d = 0; d < nr_plane2; d++) { int idx2 = d * cdisp_step2; @@ -899,56 +1143,80 @@ __kernel void init_message_1(__global float *u_new_, __global float *d_new_, __g float val = data_cost[d * cdisp_step1] + u_cur[idx2] + d_cur[idx2] + l_cur[idx2] + r_cur[idx2]; data_cost_new[d * cdisp_step1] = val; } + } - __global float *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; - __global float *disparity_selected_new = selected_disp_pyr_new + y * cmsg_step1 + x; + __global float *data_cost_selected = data_cost_selected_ + y * cmsg_step1 + x; + __global float *disparity_selected_new = selected_disp_pyr_new + y * cmsg_step1 + x; + + __global float *u_new = u_new_ + y * cmsg_step1 + x; + __global float *d_new = d_new_ + y * cmsg_step1 + x; + __global float *l_new = l_new_ + y * cmsg_step1 + x; + __global float *r_new = r_new_ + y * cmsg_step1 + x; - __global float *u_new = u_new_ + y * cmsg_step1 + x; - __global float *d_new = d_new_ + y * cmsg_step1 + x; - __global float *l_new = l_new_ + y * cmsg_step1 + x; - __global float *r_new = r_new_ + y * cmsg_step1 + x; + barrier(CLK_LOCAL_MEM_FENCE); + if(y < h && x < w) + { u_cur = u_cur_ + y/2 * cmsg_step2 + x/2; d_cur = d_cur_ + y/2 * cmsg_step2 + x/2; l_cur = l_cur_ + y/2 * cmsg_step2 + x/2; r_cur = r_cur_ + y/2 * cmsg_step2 + x/2; - get_first_k_element_increase_1(u_new, d_new, l_new, r_new, u_cur, d_cur, l_cur, r_cur, - data_cost_selected, disparity_selected_new, data_cost_new, - data_cost, disparity_selected_cur, nr_plane, nr_plane2, - cdisp_step1, cdisp_step2); + for(int i = 0; i < nr_plane; i++) + { + float minimum = FLT_MAX; + int id = 0; + + for(int j = 0; j < nr_plane2; j++) + { + float cur = data_cost_new[j * cdisp_step1]; + if(cur < minimum) + { + minimum = cur; + id = j; + } + } + data_cost_selected[i * cdisp_step1] = data_cost[id * cdisp_step1]; + disparity_selected_new[i * cdisp_step1] = disparity_selected_cur[id * cdisp_step2]; + u_new[i * cdisp_step1] = u_cur[id * cdisp_step2]; + d_new[i * cdisp_step1] = d_cur[id * cdisp_step2]; + l_new[i * cdisp_step1] = l_cur[id * cdisp_step2]; + r_new[i * cdisp_step1] = r_cur[id * cdisp_step2]; + data_cost_new[id * cdisp_step1] = FLT_MAX; + } } } + /////////////////////////////////////////////////////////////// //////////////////// calc all iterations ///////////////////// /////////////////////////////////////////////////////////////// void message_per_pixel_0(__global const short *data, __global short *msg_dst, __global const short *msg1, - __global const short *msg2, __global const short *msg3, - __global const short *dst_disp, __global const short *src_disp, - int nr_plane, __global short *temp, - float cmax_disc_term, int cdisp_step1, float cdisc_single_jump) + __global const short *msg2, __global const short *msg3, + __global const short *dst_disp, __global const short *src_disp, + int nr_plane, __global short *temp, + float cmax_disc_term, int cdisp_step1, float cdisc_single_jump) { short minimum = SHRT_MAX; for(int d = 0; d < nr_plane; d++) { int idx = d * cdisp_step1; short val = data[idx] + msg1[idx] + msg2[idx] + msg3[idx]; - + if(val < minimum) minimum = val; - + msg_dst[idx] = val; } - + float sum = 0; for(int d = 0; d < nr_plane; d++) { float cost_min = minimum + cmax_disc_term; short src_disp_reg = src_disp[d * cdisp_step1]; - + for(int d2 = 0; d2 < nr_plane; d2++) cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] + - cdisc_single_jump * abs(dst_disp[d2 * cdisp_step1] - src_disp_reg))); + cdisc_single_jump * abs(dst_disp[d2 * cdisp_step1] - src_disp_reg))); temp[d * cdisp_step1] = convert_short_sat_rte(cost_min); sum += cost_min; @@ -959,32 +1227,32 @@ void message_per_pixel_0(__global const short *data, __global short *msg_dst, __ msg_dst[d * cdisp_step1] = convert_short_sat_rte(temp[d * cdisp_step1] - sum); } void message_per_pixel_1(__global const float *data, __global float *msg_dst, __global const float *msg1, - __global const float *msg2, __global const float *msg3, - __global const float *dst_disp, __global const float *src_disp, - int nr_plane, __global float *temp, - float cmax_disc_term, int cdisp_step1, float cdisc_single_jump) + __global const float *msg2, __global const float *msg3, + __global const float *dst_disp, __global const float *src_disp, + int nr_plane, __global float *temp, + float cmax_disc_term, int cdisp_step1, float cdisc_single_jump) { float minimum = FLT_MAX; for(int d = 0; d < nr_plane; d++) { int idx = d * cdisp_step1; float val = data[idx] + msg1[idx] + msg2[idx] + msg3[idx]; - + if(val < minimum) minimum = val; - + msg_dst[idx] = val; } - + float sum = 0; for(int d = 0; d < nr_plane; d++) { float cost_min = minimum + cmax_disc_term; float src_disp_reg = src_disp[d * cdisp_step1]; - + for(int d2 = 0; d2 < nr_plane; d2++) cost_min = fmin(cost_min, (msg_dst[d2 * cdisp_step1] + - cdisc_single_jump * fabs(dst_disp[d2 * cdisp_step1] - src_disp_reg))); + cdisc_single_jump * fabs(dst_disp[d2 * cdisp_step1] - src_disp_reg))); temp[d * cdisp_step1] = cost_min; sum += cost_min; @@ -995,64 +1263,64 @@ void message_per_pixel_1(__global const float *data, __global float *msg_dst, __ msg_dst[d * cdisp_step1] = temp[d * cdisp_step1] - sum; } __kernel void compute_message_0(__global short *u_, __global short *d_, __global short *l_, __global short *r_, - __global const short *data_cost_selected, __global const short *selected_disp_pyr_cur, - __global short *ctemp, int h, int w, int nr_plane, int i, - float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump) + __global const short *data_cost_selected, __global const short *selected_disp_pyr_cur, + __global short *ctemp, int h, int w, int nr_plane, int i, + float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump) { int y = get_global_id(1); int x = ((get_global_id(0)) << 1) + ((y + i) & 1); - + if (y > 0 && y < h - 1 && x > 0 && x < w - 1) { __global const short *data = data_cost_selected + y * cmsg_step1 + x; - + __global short *u = u_ + y * cmsg_step1 + x; __global short *d = d_ + y * cmsg_step1 + x; __global short *l = l_ + y * cmsg_step1 + x; __global short *r = r_ + y * cmsg_step1 + x; - + __global const short *disp = selected_disp_pyr_cur + y * cmsg_step1 + x; __global short *temp = ctemp + y * cmsg_step1 + x; message_per_pixel_0(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); message_per_pixel_0(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); message_per_pixel_0(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); message_per_pixel_0(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); } } __kernel void compute_message_1(__global float *u_, __global float *d_, __global float *l_, __global float *r_, - __global const float *data_cost_selected, __global const float *selected_disp_pyr_cur, - __global float *ctemp, int h, int w, int nr_plane, int i, - float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump) + __global const float *data_cost_selected, __global const float *selected_disp_pyr_cur, + __global float *ctemp, int h, int w, int nr_plane, int i, + float cmax_disc_term, int cdisp_step1, int cmsg_step1, float cdisc_single_jump) { int y = get_global_id(1); int x = ((get_global_id(0)) << 1) + ((y + i) & 1); - + if (y > 0 && y < h - 1 && x > 0 && x < w - 1) { __global const float *data = data_cost_selected + y * cmsg_step1 + x; - + __global float *u = u_ + y * cmsg_step1 + x; __global float *d = d_ + y * cmsg_step1 + x; __global float *l = l_ + y * cmsg_step1 + x; __global float *r = r_ + y * cmsg_step1 + x; - + __global const float *disp = selected_disp_pyr_cur + y * cmsg_step1 + x; __global float *temp = ctemp + y * cmsg_step1 + x; - + message_per_pixel_1(data, u, r - 1, u + cmsg_step1, l + 1, disp, disp - cmsg_step1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); message_per_pixel_1(data, d, d - cmsg_step1, r - 1, l + 1, disp, disp + cmsg_step1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); message_per_pixel_1(data, l, u + cmsg_step1, d - cmsg_step1, l + 1, disp, disp - 1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); message_per_pixel_1(data, r, u + cmsg_step1, d - cmsg_step1, r - 1, disp, disp + 1, nr_plane, temp, - cmax_disc_term, cdisp_step1, cdisc_single_jump); + cmax_disc_term, cdisp_step1, cdisc_single_jump); } } @@ -1060,15 +1328,15 @@ __kernel void compute_message_1(__global float *u_, __global float *d_, __global /////////////////////////// output //////////////////////////// /////////////////////////////////////////////////////////////// __kernel void compute_disp_0(__global const short *u_, __global const short *d_, __global const short *l_, - __global const short *r_, __global const short * data_cost_selected, - __global const short *disp_selected_pyr, - __global short* disp, - int res_step, int cols, int rows, int nr_plane, - int cmsg_step1, int cdisp_step1) + __global const short *r_, __global const short * data_cost_selected, + __global const short *disp_selected_pyr, + __global short* disp, + int res_step, int cols, int rows, int nr_plane, + int cmsg_step1, int cdisp_step1) { int x = get_global_id(0); int y = get_global_id(1); - + if (y > 0 && y < rows - 1 && x > 0 && x < cols - 1) { __global const short *data = data_cost_selected + y * cmsg_step1 + x; @@ -1078,15 +1346,15 @@ __kernel void compute_disp_0(__global const short *u_, __global const short *d_, __global const short *d = d_ + (y-1) * cmsg_step1 + (x+0); __global const short *l = l_ + (y+0) * cmsg_step1 + (x+1); __global const short *r = r_ + (y+0) * cmsg_step1 + (x-1); - + short best = 0; short best_val = SHRT_MAX; - + for (int i = 0; i < nr_plane; ++i) { int idx = i * cdisp_step1; short val = data[idx]+ u[idx] + d[idx] + l[idx] + r[idx]; - + if (val < best_val) { best_val = val; @@ -1097,15 +1365,15 @@ __kernel void compute_disp_0(__global const short *u_, __global const short *d_, } } __kernel void compute_disp_1(__global const float *u_, __global const float *d_, __global const float *l_, - __global const float *r_, __global const float *data_cost_selected, - __global const float *disp_selected_pyr, - __global short *disp, - int res_step, int cols, int rows, int nr_plane, - int cmsg_step1, int cdisp_step1) + __global const float *r_, __global const float *data_cost_selected, + __global const float *disp_selected_pyr, + __global short *disp, + int res_step, int cols, int rows, int nr_plane, + int cmsg_step1, int cdisp_step1) { int x = get_global_id(0); int y = get_global_id(1); - + if (y > 0 && y < rows - 1 && x > 0 && x < cols - 1) { __global const float *data = data_cost_selected + y * cmsg_step1 + x; @@ -1115,14 +1383,14 @@ __kernel void compute_disp_1(__global const float *u_, __global const float *d_, __global const float *d = d_ + (y-1) * cmsg_step1 + (x+0); __global const float *l = l_ + (y+0) * cmsg_step1 + (x+1); __global const float *r = r_ + (y+0) * cmsg_step1 + (x-1); - + short best = 0; short best_val = SHRT_MAX; for (int i = 0; i < nr_plane; ++i) { int idx = i * cdisp_step1; float val = data[idx]+ u[idx] + d[idx] + l[idx] + r[idx]; - + if (val < best_val) { best_val = val; @@ -1132,4 +1400,3 @@ __kernel void compute_disp_1(__global const float *u_, __global const float *d_, disp[res_step * y + x] = best; } } - From f788d010f789801e855951b3801e03b80d490b3b Mon Sep 17 00:00:00 2001 From: yao Date: Wed, 24 Apr 2013 14:12:41 +0800 Subject: [PATCH 12/49] fix a crash on CPU OCL for some specified image sizes --- modules/ocl/src/opencl/haarobjectdetect.cl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ocl/src/opencl/haarobjectdetect.cl b/modules/ocl/src/opencl/haarobjectdetect.cl index c7ed96a342..e0ab8603b7 100644 --- a/modules/ocl/src/opencl/haarobjectdetect.cl +++ b/modules/ocl/src/opencl/haarobjectdetect.cl @@ -194,7 +194,7 @@ __kernel void __attribute__((reqd_work_group_size(8,8,1)))gpuRunHaarClassifierCa int glb_x = grpoffx + (lcl_x<<2); int glb_y = grpoffy + lcl_y; - int glb_off = mad24(glb_y,pixelstep,glb_x); + int glb_off = mad24(min(glb_y, height - 1),pixelstep,glb_x); int4 data = *(__global int4*)&sum[glb_off]; int lcl_off = mad24(lcl_y, readwidth, lcl_x<<2); From 8606ee4beb8cff02a07d505ceb2ed30b5f7b606c Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Thu, 11 Apr 2013 14:34:20 +0400 Subject: [PATCH 13/49] Front/Back camera semantic support added to Android VideoCapture back-end. --- .../armeabi-v7a/libnative_camera_r2.2.0.so | Bin 58776 -> 87392 bytes .../armeabi-v7a/libnative_camera_r2.3.3.so | Bin 46280 -> 75104 bytes .../armeabi-v7a/libnative_camera_r3.0.1.so | Bin 46280 -> 75104 bytes .../armeabi-v7a/libnative_camera_r4.0.0.so | Bin 46280 -> 75104 bytes .../armeabi-v7a/libnative_camera_r4.0.3.so | Bin 46280 -> 75104 bytes .../armeabi-v7a/libnative_camera_r4.1.1.so | Bin 46280 -> 75104 bytes .../armeabi-v7a/libnative_camera_r4.2.0.so | Bin 46380 -> 79200 bytes .../lib/armeabi/libnative_camera_r2.2.0.so | Bin 58772 -> 87380 bytes .../lib/armeabi/libnative_camera_r2.3.3.so | Bin 46272 -> 75096 bytes .../lib/armeabi/libnative_camera_r3.0.1.so | Bin 46272 -> 75104 bytes .../lib/armeabi/libnative_camera_r4.0.0.so | Bin 46272 -> 75100 bytes .../lib/armeabi/libnative_camera_r4.0.3.so | Bin 46272 -> 75100 bytes .../lib/armeabi/libnative_camera_r4.1.1.so | Bin 46272 -> 79196 bytes .../lib/armeabi/libnative_camera_r4.2.0.so | Bin 46380 -> 79196 bytes 3rdparty/lib/mips/libnative_camera_r4.0.3.so | Bin 71832 -> 137828 bytes 3rdparty/lib/mips/libnative_camera_r4.1.1.so | Bin 71916 -> 137848 bytes 3rdparty/lib/mips/libnative_camera_r4.2.0.so | Bin 71916 -> 137852 bytes 3rdparty/lib/x86/libnative_camera_r2.3.3.so | Bin 54476 -> 95544 bytes 3rdparty/lib/x86/libnative_camera_r3.0.1.so | Bin 54476 -> 95544 bytes 3rdparty/lib/x86/libnative_camera_r4.0.3.so | Bin 54476 -> 95544 bytes 3rdparty/lib/x86/libnative_camera_r4.1.1.so | Bin 58572 -> 95544 bytes 3rdparty/lib/x86/libnative_camera_r4.2.0.so | Bin 58960 -> 95544 bytes .../camera_wrapper/camera_wrapper.cpp | 73 ++++++++++++++---- .../include/opencv2/highgui/highgui_c.h | 2 + 24 files changed, 62 insertions(+), 13 deletions(-) diff --git a/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so b/3rdparty/lib/armeabi-v7a/libnative_camera_r2.2.0.so index fb34509bd51fd0684bff32c5d1df8d53a64a2180..f62e5961f2b10d623cbd64d9d441170481bdbc0b 100755 GIT binary patch literal 87392 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 AZvX%Q literal 58776 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 Dj?zRowF&JgW{ETXDiIzu!b^ezNm9_=CY75$7r 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 |ido{NjL>f`1XqrHn<;p=&N&i6UYA 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 Fe*uztr(Xa7 literal 46280 zcmeHweOy#k8vh*_U_{i>u#mL9fEFgw3?L$D3o?u#h!db$YdefE$P_OVg9d7aX=P=F zX|26VZ=3B}tDElXZWe9Uy1TVYyS3}?y4!%VpaMeK4(%HJzR$hqGH31#qPzS1eSUv* zKODa2x_BUZ7M-sUV~PTlWbzvde@? zQn^A;xb=BCgit~+NaY823xX2%gbBh*ogjp=a_|#M_IQJc1}RXv7U9N@x-ueFA4+*4 z$`#&(Ip9x$>XPhX_*a8qM3{v1FA)k5Ux{!%;wKU4cv=R(|5t(T+X!@g58+XSJWAkr zLk8hSRvr($A9;DeB?!|IhdQL=Rs27UkcRx#2s05rlZym9@LHsou{1#{(j^EX2z1

M~jhIlJ*C&GFJ8s1WbP=o=b=K;+K*CD)& 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 xfE{{7XsJP&2?EXU{oMQ9Xz2kI~H9t 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 literal 46280 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 HisAkb*GINC literal 46280 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 literal 46280 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 SPZ?w?d;z`RGPe>=`2PS~s=k8& diff --git a/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so b/3rdparty/lib/armeabi/libnative_camera_r2.2.0.so index a0db0d19978587ab74960efa4395c3a2f8b81c4f..7c061d9eee651a6b342a5661b51005de71588e98 100755 GIT binary patch literal 87380 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 DW?qSs diff --git a/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so b/3rdparty/lib/armeabi/libnative_camera_r2.3.3.so index 6f167cb0cb8a9e9da33c955fb5023919f3d8319f..686bdfb6151448e702ab85617fb195bf745d112f 100755 GIT binary patch literal 75096 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 A^8f$< literal 46272 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

=NDq7=<@j6tZWQ6) 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 z%0AR#e?6e7d?l_&_NfrKO~4(%J?i;3b*Da&0)Jy5TZyuhD7!#G19J+i_Bl<4m@H|wYEb?!@jj9O+n5u~Im)}8(9T}IABVoM{;{}B#GL?c z061%0h#Lj&n2qinaK~+Q>4?|fu+c35Zq$bJ0e9MlD+cb24Yvunvl`BTERDd80cVY8 z*<%j6>9jKT9Ocw2KK>w%zlL=h_vp8`tUDDnd+{C;`inB}>*IcWyo~)kjzY=BK4_twUqpZEa`GK>yP5FNOC_jaA%V+8S*g$zX$`4|1gqKyxyRdAZ6Lub7n<-NmG#!ZBDGM*cJ;3caF}_|K zm>*P~Y?J$@L6jXQG2=@!x`Y=r>kgy5>f4CRReAYdM}V%Fe7U#kLs{4=gD>H-?Lq!L z%EUiozh=tnFW;N~*o=BeJ8R#}{b`?eKA!p+>2nOMEvv9UJEV9pj^R>4{;N=S3}t;R ztDNKAjJ8pn%6@J_Sta&!RzHbr1a6atV_6iq&A@fzo^cn}Su|nt=iY7vWj<3zZ`oc) z75nA|=^)BZV_(>=m6eoSgW8Th8n4~O_2fLjWXFk^r04w zQ!cq*#J+DAX`pv&U1nJU>YPN`8)lggKDv>5Wmy1a`>_vH`tn(E678oEWec$PJ3U^{ zxrti^4kq=(z2_*($%hwlJ;0r|;f?@z#)dl%+*up$4dBLXxG~_)X*lY@i9KjnAX6w2BtMI zt$}F`Olx3T1JfFq*1)s|rZq6FfoTm)YhYRf(;Ar8z_bRYH88D#X$?$kU|Ivy8kp9= zv<9X%Fs*@U4NPm`{|6d~;R=ULL3ux{-4jb3p_BjFu0R9+J{-w@T|gZs;=L%}m4rs; z7pTMEk0FiRi@!6x&&~~hm#FdU1}My6!I~|7q~f%-|pGnO8mfFo-lzkG>%FZH0_Tr!davk*2z; zE`f$T!gEr@$)ot&XTZ~dy^w+T=e2v+x9~U23U6rl1-L)1@MYS4m3AM|?%Q#HQqdpK z?)%ie)hEi}dK|ow%8{&V0Qg+w_aN13c*>UX8T?J(-($QqJY~CZ0J^i`DMKUZ2T`We zj{;u?+Ik!PS>R897IWB!KM#Bq_#PykkMl~*CE!-s@Gjsh(PqTf?gHS)Adkz2_X6Jm zd>@j*N0CMp9mjvcF_VHkM}fb9 z#9BRW6Mjj-7Zm(Q1;4N0sDeMo@0O*Y-tQHR0pd>v#cj*Yzma4s??yT^D@9xj$iG8; z57Ig0`8SNrbAIu6R`62gvpU9c(0IEGY+xfej9AEM8x$Nd2$`WZjw3H=A>rWf~e?gDadM?rHQiGGJZ zU=;WC5yt`PLk0lpV;T>Fr^T!Ns^AFV zu(}^mkQ6<*??#Fug^{X|0!V%&ACiHjUoPg6#-25?qktnw!zypl4j|uy)QuEXWnsW7 zqyUm1$%n+tP|&5IMB;vI0Qy53K^jIHK;qS-U^ieCDU4Kw6hQJL`H&1GUM@m)&-~b7 z@I)Fx8b;#9uio__bt6TQ!bnv}yaEdP0ewh@%A2MC-~9j9qN0_C_tteAZ!!v&EMKzY z=B>@mTk$K(`Mx~-^DQ^L_*q%?;engP>Z{O;txatr1@05yaTQBi>+yTnk?JjCNj-j$ zTr8>G+0?pon+YQ=VhO4eCzeF;RO>SugF@A}C zTc`;+2*0E{f}iN#(uN;BzVtESTEcaP>jT`6Oa)jVnCHc{h-oeoX^H1r#N@|9!8M3D z(zuY`jb!1tb}@0yvMy^qaRV_6iFLVlF>&qE+vOUz2#IyL26B(VG_V#Kb+JueJ|v5d z_Q~X@Q0lU7S0PV2wo?Tk!F0-E0vy}qRg7fO;qyR(X_v(WW!CKmjc)ij<`a^i3%

Bgel#HE0FG5i3)es1F2B&n6a~(@EWLal2qm8@N*bgK z7BiHQjy#`2B3~9oVW_*1j^W)MH~U+}H&)S?L1*zGjx@ZK RY-R@kzXZB(j_2ZZ{}-brj=KN= diff --git a/3rdparty/lib/x86/libnative_camera_r2.3.3.so b/3rdparty/lib/x86/libnative_camera_r2.3.3.so index d40409f2223be620f552a7058de795f40c895373..d9400638b5db830d1b073a54b504790f32d1742d 100755 GIT binary patch literal 95544 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 literal 54476 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 diff --git a/3rdparty/lib/x86/libnative_camera_r3.0.1.so b/3rdparty/lib/x86/libnative_camera_r3.0.1.so index 221b833a5bf2510ae88be506574bdaaa3d2b8298..cf2e9908ca2d1ed2b6641ae89bf3d6a8829b2b46 100755 GIT binary patch literal 95544 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
r%XB}u^P1l)RA2af=GF{(fy1w0XUC;F?gMPK? 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 diff --git a/modules/androidcamera/camera_wrapper/camera_wrapper.cpp b/modules/androidcamera/camera_wrapper/camera_wrapper.cpp index f6ec2f09cf..2d0ebc7a14 100644 --- a/modules/androidcamera/camera_wrapper/camera_wrapper.cpp +++ b/modules/androidcamera/camera_wrapper/camera_wrapper.cpp @@ -362,6 +362,9 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback, typedef sp (*Android23ConnectFuncType)(int); typedef sp (*Android3DConnectFuncType)(int, int); + const int BACK_CAMERA_INDEX = 99; + const int FRONT_CAMERA_INDEX = 98; + enum { CAMERA_SUPPORT_MODE_2D = 0x01, /* Camera Sensor supports 2D mode. */ CAMERA_SUPPORT_MODE_3D = 0x02, /* Camera Sensor supports 3D mode. */ @@ -373,7 +376,51 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback, const char Android23ConnectName[] = "_ZN7android6Camera7connectEi"; const char Android3DConnectName[] = "_ZN7android6Camera7connectEii"; - LOGD("CameraHandler::initCameraConnect(%p, %d, %p, %p)", callback, cameraId, userData, prevCameraParameters); + int localCameraIndex = cameraId; + +#if !defined(ANDROID_r2_2_0) + if (cameraId == BACK_CAMERA_INDEX) + { + LOGD("Back camera selected"); + for (int i = 0; i < Camera::getNumberOfCameras(); i++) + { + CameraInfo info; + Camera::getCameraInfo(i, &info); + if (info.facing == CAMERA_FACING_BACK) + { + localCameraIndex = i; + break; + } + } + } + else if (cameraId == FRONT_CAMERA_INDEX) + { + LOGD("Front camera selected"); + for (int i = 0; i < Camera::getNumberOfCameras(); i++) + { + CameraInfo info; + Camera::getCameraInfo(i, &info); + if (info.facing == CAMERA_FACING_FRONT) + { + localCameraIndex = i; + break; + } + } + } + + if (localCameraIndex == BACK_CAMERA_INDEX) + { + LOGE("Back camera not found!"); + return NULL; + } + else if (localCameraIndex == FRONT_CAMERA_INDEX) + { + LOGE("Front camera not found!"); + return NULL; + } +#endif + + LOGD("CameraHandler::initCameraConnect(%p, %d, %p, %p)", callback, localCameraIndex, userData, prevCameraParameters); sp camera = 0; @@ -381,8 +428,8 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback, if (!CameraHALHandle) { - LOGE("Cannot link to \"libcamera_client.so\""); - return NULL; + LOGE("Cannot link to \"libcamera_client.so\""); + return NULL; } // reset errors @@ -390,24 +437,24 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback, if (Android22ConnectFuncType Android22Connect = (Android22ConnectFuncType)dlsym(CameraHALHandle, Android22ConnectName)) { - LOGD("Connecting to CameraService v 2.2"); - camera = Android22Connect(); + LOGD("Connecting to CameraService v 2.2"); + camera = Android22Connect(); } else if (Android23ConnectFuncType Android23Connect = (Android23ConnectFuncType)dlsym(CameraHALHandle, Android23ConnectName)) { - LOGD("Connecting to CameraService v 2.3"); - camera = Android23Connect(cameraId); + LOGD("Connecting to CameraService v 2.3"); + camera = Android23Connect(localCameraIndex); } else if (Android3DConnectFuncType Android3DConnect = (Android3DConnectFuncType)dlsym(CameraHALHandle, Android3DConnectName)) { - LOGD("Connecting to CameraService v 3D"); - camera = Android3DConnect(cameraId, CAMERA_SUPPORT_MODE_2D); + LOGD("Connecting to CameraService v 3D"); + camera = Android3DConnect(localCameraIndex, CAMERA_SUPPORT_MODE_2D); } else { - dlclose(CameraHALHandle); - LOGE("Cannot connect to CameraService. Connect method was not found!"); - return NULL; + dlclose(CameraHALHandle); + LOGE("Cannot connect to CameraService. Connect method was not found!"); + return NULL; } dlclose(CameraHALHandle); @@ -422,7 +469,7 @@ CameraHandler* CameraHandler::initCameraConnect(const CameraCallback& callback, camera->setListener(handler); handler->camera = camera; - handler->cameraId = cameraId; + handler->cameraId = localCameraIndex; if (prevCameraParameters != 0) { diff --git a/modules/highgui/include/opencv2/highgui/highgui_c.h b/modules/highgui/include/opencv2/highgui/highgui_c.h index 58840cbd37..12be9867a2 100644 --- a/modules/highgui/include/opencv2/highgui/highgui_c.h +++ b/modules/highgui/include/opencv2/highgui/highgui_c.h @@ -305,6 +305,8 @@ enum CV_CAP_OPENNI_ASUS =910, // OpenNI (for Asus Xtion) CV_CAP_ANDROID =1000, // Android + CV_CAP_ANDROID_BACK =CV_CAP_ANDROID+99, // Android back camera + CV_CAP_ANDROID_FRONT =CV_CAP_ANDROID+98, // Android front camera CV_CAP_XIAPI =1100, // XIMEA Camera API From 60bf01878199264cfd4a67e68cfa6f1e44e47586 Mon Sep 17 00:00:00 2001 From: poiuytrez Date: Wed, 24 Apr 2013 12:38:15 +0200 Subject: [PATCH 14/49] Fix android tutorial 3 second picture taken bug --- .../samples/tutorial3/Tutorial3View.java | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java index 04c163ff88..ef15cb5ee0 100644 --- a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java +++ b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java @@ -6,17 +6,16 @@ import java.util.List; import org.opencv.android.JavaCameraView; import android.content.Context; -import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.hardware.Camera; import android.hardware.Camera.PictureCallback; import android.hardware.Camera.Size; import android.util.AttributeSet; import android.util.Log; -public class Tutorial3View extends JavaCameraView { +public class Tutorial3View extends JavaCameraView implements PictureCallback { private static final String TAG = "Sample::Tutorial3View"; + private String mPictureFileName; public Tutorial3View(Context context, AttributeSet attrs) { super(context, attrs); @@ -56,26 +55,31 @@ public class Tutorial3View extends JavaCameraView { } public void takePicture(final String fileName) { - Log.i(TAG, "Tacking picture"); - PictureCallback callback = new PictureCallback() { - - private String mPictureFileName = fileName; - - @Override - public void onPictureTaken(byte[] data, Camera camera) { - Log.i(TAG, "Saving a bitmap to file"); - Bitmap picture = BitmapFactory.decodeByteArray(data, 0, data.length); - try { - FileOutputStream out = new FileOutputStream(mPictureFileName); - picture.compress(Bitmap.CompressFormat.JPEG, 90, out); - picture.recycle(); - mCamera.startPreview(); - } catch (Exception e) { - e.printStackTrace(); - } - } - }; - - mCamera.takePicture(null, null, callback); + Log.i(TAG, "Taking picture"); + this.mPictureFileName = fileName; + // Call to garbage collector to avoid bug http://code.opencv.org/issues/2961 + System.gc(); + + // PictureCallback is implemented by the current class + mCamera.takePicture(null, null, this); + } + + @Override + public void onPictureTaken(byte[] data, Camera camera) { + Log.i(TAG, "Saving a bitmap to file"); + // The camera preview was automatically stopped. Start it again. + mCamera.startPreview(); + + // Write the image in a file (in jpeg format) + try { + FileOutputStream fos = new FileOutputStream(mPictureFileName); + + fos.write(data); + fos.close(); + + } catch (java.io.IOException e) { + Log.e("PictureDemo", "Exception in photoCallback", e); + } + } -} +} \ No newline at end of file From cfaae5917bc16303e4451d54ce56d1931a5d462e Mon Sep 17 00:00:00 2001 From: Dominik Rose Date: Fri, 26 Apr 2013 11:34:35 +0200 Subject: [PATCH 15/49] Calib3d documentation: - fixed reference to Slabaugh --- .../calib3d/doc/camera_calibration_and_3d_reconstruction.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst b/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst index b21d6f2bb7..b90fba7e12 100644 --- a/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst +++ b/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.rst @@ -1477,6 +1477,6 @@ The function reconstructs 3-dimensional points (in homogeneous coordinates) by u .. [HH08] Hirschmuller, H. Stereo Processing by Semiglobal Matching and Mutual Information, PAMI(30), No. 2, February 2008, pp. 328-341. -.. [Slabaugh] Slabaugh, G.G. Computing Euler angles from a rotation matrix. http://gregslabaugh.name/publications/euler.pdf +.. [Slabaugh] Slabaugh, G.G. Computing Euler angles from a rotation matrix. http://www.soi.city.ac.uk/~sbbh653/publications/euler.pdf (verified: 2013-04-15) .. [Zhang2000] Z. Zhang. A Flexible New Technique for Camera Calibration. IEEE Transactions on Pattern Analysis and Machine Intelligence, 22(11):1330-1334, 2000. From 2dc8642508b939d046a3988885fc846ddc1ee52c Mon Sep 17 00:00:00 2001 From: Roman Donchenko Date: Fri, 26 Apr 2013 14:22:55 +0400 Subject: [PATCH 16/49] Changed convexHull's documentation to essentially invert the meaning of ``clockwise``. The orientation of convexHull's result is currently the opposite of what the documentation would suggest: >>> import cv2, numpy as np >>> points = np.array([[0,0],[0,1],[1,0]], dtype=np.int32) >>> cv2.convexHull(points, clockwise=False) array([[[1, 0]], [[0, 1]], [[0, 0]]], dtype=int32) >>> cv2.convexHull(points, clockwise=True) array([[[0, 0]], [[0, 1]], [[1, 0]]], dtype=int32) Changing the function itself is probably not a good idea at this point, so this fixes the documentation by flipping the coordinate system. I also removed the mention of the origin, since it's irrelevant for this function. --- .../imgproc/doc/structural_analysis_and_shape_descriptors.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst b/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst index 99d02c2b36..37b23510d2 100644 --- a/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst +++ b/modules/imgproc/doc/structural_analysis_and_shape_descriptors.rst @@ -406,7 +406,7 @@ Finds the convex hull of a point set. :param hull_storage: Output memory storage in the old API (``cvConvexHull2`` returns a sequence containing the convex hull points or their indices). - :param clockwise: Orientation flag. If it is true, the output convex hull is oriented clockwise. Otherwise, it is oriented counter-clockwise. The usual screen coordinate system is assumed so that the origin is at the top-left corner, x axis is oriented to the right, and y axis is oriented downwards. + :param clockwise: Orientation flag. If it is true, the output convex hull is oriented clockwise. Otherwise, it is oriented counter-clockwise. The assumed coordinate system has its X axis pointing to the right, and its Y axis pointing upwards. :param orientation: Convex hull orientation parameter in the old API, ``CV_CLOCKWISE`` or ``CV_COUNTERCLOCKWISE``. From ef5578a7ce7e2b9a578dc17a02b36cbcac0756b2 Mon Sep 17 00:00:00 2001 From: ShengyinWu Date: Mon, 29 Apr 2013 12:16:42 +0800 Subject: [PATCH 17/49] Fixs: After scaling back to original image, some detected ROI will outside the original image ROI --- modules/objdetect/src/cascadedetect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp index 46a232ed6a..69f2d64181 100644 --- a/modules/objdetect/src/cascadedetect.cpp +++ b/modules/objdetect/src/cascadedetect.cpp @@ -1141,7 +1141,7 @@ void CascadeClassifier::detectMultiScale( const Mat& image, vector& object Size windowSize( cvRound(originalWindowSize.width*factor), cvRound(originalWindowSize.height*factor) ); Size scaledImageSize( cvRound( grayImage.cols/factor ), cvRound( grayImage.rows/factor ) ); - Size processingRectSize( scaledImageSize.width - originalWindowSize.width + 1, scaledImageSize.height - originalWindowSize.height + 1 ); + Size processingRectSize( scaledImageSize.width - originalWindowSize.width, scaledImageSize.height - originalWindowSize.height ); if( processingRectSize.width <= 0 || processingRectSize.height <= 0 ) break; From 456c56fe907626fe8552d0b46d0c4721e2d723a8 Mon Sep 17 00:00:00 2001 From: Alexander Smorkalov Date: Sat, 13 Apr 2013 19:15:45 +0400 Subject: [PATCH 18/49] NullPointerException in case of error on opening native camera fixed. --- .../src/java/android+NativeCameraView.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/modules/java/generator/src/java/android+NativeCameraView.java b/modules/java/generator/src/java/android+NativeCameraView.java index 6f3ab265cb..62d0775801 100644 --- a/modules/java/generator/src/java/android+NativeCameraView.java +++ b/modules/java/generator/src/java/android+NativeCameraView.java @@ -53,14 +53,16 @@ public class NativeCameraView extends CameraBridgeViewBase { /* 1. We need to stop thread which updating the frames * 2. Stop camera and release it */ - try { - mStopThread = true; - mThread.join(); - } catch (InterruptedException e) { - e.printStackTrace(); - } finally { - mThread = null; - mStopThread = false; + if (mThread != null) { + try { + mStopThread = true; + mThread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + } finally { + mThread = null; + mStopThread = false; + } } /* Now release camera */ From 108bb811c560afc4b40f749a643d4e59671371d5 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Mon, 29 Apr 2013 23:10:03 +0400 Subject: [PATCH 19/49] fixing precommit build on ubuntu-64 (now it takes OCL headers from non-default OCL SDK, but libs from default one) --- cmake/OpenCVDetectOpenCL.cmake | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/cmake/OpenCVDetectOpenCL.cmake b/cmake/OpenCVDetectOpenCL.cmake index 970632151a..014066bc7e 100644 --- a/cmake/OpenCVDetectOpenCL.cmake +++ b/cmake/OpenCVDetectOpenCL.cmake @@ -17,7 +17,8 @@ else(APPLE) NAMES OpenCL/cl.h CL/cl.h HINTS ${OPENCL_ROOT_DIR} PATH_SUFFIXES include include/nvidia-current - DOC "OpenCL include directory") + DOC "OpenCL include directory" + NO_DEFAULT_PATH) if (X86_64) set(OPENCL_POSSIBLE_LIB_SUFFIXES lib/Win64 lib/x86_64 lib/x64) @@ -29,7 +30,8 @@ else(APPLE) NAMES OpenCL HINTS ${OPENCL_ROOT_DIR} PATH_SUFFIXES ${OPENCL_POSSIBLE_LIB_SUFFIXES} - DOC "OpenCL library") + DOC "OpenCL library" + NO_DEFAULT_PATH) mark_as_advanced(OPENCL_INCLUDE_DIR OPENCL_LIBRARY) include(FindPackageHandleStandardArgs) From d13d5c0c1238eb5394d740b308e483dbb3d1c321 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20D=C3=ADaz=20M=C3=A1s?= Date: Wed, 1 May 2013 01:07:03 +0200 Subject: [PATCH 20/49] Added setting feature of FPS in cap_libv4l --- modules/highgui/src/cap_libv4l.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/highgui/src/cap_libv4l.cpp b/modules/highgui/src/cap_libv4l.cpp index ec048aff77..b081621b18 100644 --- a/modules/highgui/src/cap_libv4l.cpp +++ b/modules/highgui/src/cap_libv4l.cpp @@ -1665,6 +1665,17 @@ static int icvSetPropertyCAM_V4L(CvCaptureCAM_V4L* capture, int property_id, dou width = height = 0; } break; + case CV_CAP_PROP_FPS: + struct v4l2_streamparm setfps; + memset (&setfps, 0, sizeof(struct v4l2_streamparm)); + setfps.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; + setfps.parm.capture.timeperframe.numerator = 1; + setfps.parm.capture.timeperframe.denominator = value; + if (xioctl (capture->deviceHandle, VIDIOC_S_PARM, &setfps) < 0){ + fprintf(stderr, "HIGHGUI ERROR: V4L: Unable to set camera FPS\n"); + retval=0; + } + break; default: retval = icvSetControl(capture, property_id, value); } From bef6de902551d8203a0fa9aab5773aa5f8c78c1c Mon Sep 17 00:00:00 2001 From: poiuytrez Date: Wed, 1 May 2013 16:58:15 +0200 Subject: [PATCH 21/49] Fix tuto3 picture taken crash on all devices A modification of the JavaCameraView is needed to avoid a crash when the app is exited. It is a good practice to remove the callback after the stopPreview method. --- modules/java/generator/src/java/android+JavaCameraView.java | 2 ++ .../src/org/opencv/samples/tutorial3/Tutorial3View.java | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/modules/java/generator/src/java/android+JavaCameraView.java b/modules/java/generator/src/java/android+JavaCameraView.java index f07b7d2ca8..dec6cac823 100644 --- a/modules/java/generator/src/java/android+JavaCameraView.java +++ b/modules/java/generator/src/java/android+JavaCameraView.java @@ -179,6 +179,8 @@ public class JavaCameraView extends CameraBridgeViewBase implements PreviewCallb synchronized (this) { if (mCamera != null) { mCamera.stopPreview(); + mCamera.setPreviewCallback(null); + mCamera.release(); } mCamera = null; diff --git a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java index ef15cb5ee0..38d613bba4 100644 --- a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java +++ b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java @@ -57,8 +57,8 @@ public class Tutorial3View extends JavaCameraView implements PictureCallback { public void takePicture(final String fileName) { Log.i(TAG, "Taking picture"); this.mPictureFileName = fileName; - // Call to garbage collector to avoid bug http://code.opencv.org/issues/2961 - System.gc(); + // Clear up buffers to avoid bug http://code.opencv.org/issues/2961 + mCamera.setPreviewCallback(null); // PictureCallback is implemented by the current class mCamera.takePicture(null, null, this); @@ -69,6 +69,7 @@ public class Tutorial3View extends JavaCameraView implements PictureCallback { Log.i(TAG, "Saving a bitmap to file"); // The camera preview was automatically stopped. Start it again. mCamera.startPreview(); + mCamera.setPreviewCallback(this); // Write the image in a file (in jpeg format) try { From 355bc691fcc0b20ebdc8b74e7cfec283bd9b3980 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Thu, 2 May 2013 14:44:59 +0800 Subject: [PATCH 22/49] Add OpenCL version 1.2 query into ocl::Context::supportsFeature(). Add backwards portability for OpenCL 1.1 when OpenCV executables are compiled with OpenCL 1.2 profile support. --- modules/ocl/include/opencv2/ocl/ocl.hpp | 2 +- modules/ocl/src/initialization.cpp | 6 +++ modules/ocl/src/mcwutil.cpp | 54 ++++++++++++++----------- 3 files changed, 37 insertions(+), 25 deletions(-) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 613179f8b6..b46511e9b6 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -155,7 +155,7 @@ namespace cv static Context* getContext(); static void setContext(Info &oclinfo); - enum {CL_DOUBLE, CL_UNIFIED_MEM}; + enum {CL_DOUBLE, CL_UNIFIED_MEM, CL_VER_1_2}; bool supportsFeature(int ftype); size_t computeUnits(); void* oclContext(); diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 856064c32e..799c49c50c 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -130,6 +130,7 @@ namespace cv cl_platform_id oclplatform; std::vector devices; std::vector devName; + std::string clVersion; cl_context oclcontext; cl_command_queue clCmdQueue; @@ -304,6 +305,7 @@ namespace cv char deviceName[256]; int devcienums = 0; + char clVersion[256]; for (unsigned i = 0; i < numPlatforms; ++i) { cl_uint numsdev; @@ -319,6 +321,8 @@ namespace cv Info ocltmpinfo; ocltmpinfo.impl->oclplatform = platforms[i]; + openCLSafeCall(clGetPlatformInfo(platforms[i], CL_PLATFORM_VERSION, sizeof(clVersion), clVersion, NULL)); + ocltmpinfo.impl->clVersion = clVersion; for(unsigned j = 0; j < numsdev; ++j) { ocltmpinfo.impl->devices.push_back(devices[j]); @@ -997,6 +1001,8 @@ namespace cv return impl->double_support == 1; case CL_UNIFIED_MEM: return impl->unified_memory == 1; + case CL_VER_1_2: + return impl->clVersion.find("OpenCL 1.2") != string::npos; default: return false; } diff --git a/modules/ocl/src/mcwutil.cpp b/modules/ocl/src/mcwutil.cpp index 15df8e044a..ed3258b3d7 100644 --- a/modules/ocl/src/mcwutil.cpp +++ b/modules/ocl/src/mcwutil.cpp @@ -124,7 +124,7 @@ namespace cv build_options, finish_mode); } - cl_mem bindTexture(const oclMat &mat) + cl_mem bindTexture(const oclMat &mat) { cl_mem texture; cl_image_format format; @@ -162,30 +162,37 @@ namespace cv CV_Error(-1, "Image forma is not supported"); break; } + if(Context::getContext()->supportsFeature(Context::CL_VER_1_2)) + { #if CL_VERSION_1_2 - cl_image_desc desc; - desc.image_type = CL_MEM_OBJECT_IMAGE2D; - desc.image_width = mat.cols; - desc.image_height = mat.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((cl_context)mat.clCxt->oclContext(), CL_MEM_READ_WRITE, &format, &desc, NULL, &err); + cl_image_desc desc; + desc.image_type = CL_MEM_OBJECT_IMAGE2D; + desc.image_width = mat.cols; + desc.image_height = mat.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((cl_context)mat.clCxt->oclContext(), CL_MEM_READ_WRITE, &format, &desc, NULL, &err); #else - texture = clCreateImage2D( - (cl_context)mat.clCxt->oclContext(), - CL_MEM_READ_WRITE, - &format, - mat.cols, - mat.rows, - 0, - NULL, - &err); + CV_Error(CV_StsBadFunc, "Non-deprecated image creation API call is not supported."); #endif + } + else + { + texture = clCreateImage2D( + (cl_context)mat.clCxt->oclContext(), + CL_MEM_READ_WRITE, + &format, + mat.cols, + mat.rows, + 0, + NULL, + &err); + } size_t origin[] = { 0, 0, 0 }; size_t region[] = { mat.cols, mat.rows, 1 }; @@ -198,7 +205,7 @@ namespace cv clEnqueueCopyBufferRect((cl_command_queue)mat.clCxt->oclCommandQueue(), (cl_mem)mat.data, devData, origin, origin, regin, mat.step, 0, mat.cols * mat.elemSize(), 0, 0, NULL, NULL); clFlush((cl_command_queue)mat.clCxt->oclCommandQueue()); - } + } else { devData = (cl_mem)mat.data; @@ -214,7 +221,6 @@ namespace cv openCLSafeCall(err); return texture; } - void releaseTexture(cl_mem& texture) { openCLFree(texture); From 168c0b038549153d45f67d46faf22bf637f745fb Mon Sep 17 00:00:00 2001 From: peng xiao Date: Thu, 2 May 2013 16:14:28 +0800 Subject: [PATCH 23/49] Optimize ocl::stereobm. 1. Use macro defines for some parameters(radius). 2. Reduce local memory usage. 3. Fix accuracy problem on Intel GPU. --- modules/ocl/src/opencl/stereobm.cl | 201 +++++++++-------------------- modules/ocl/src/stereobm.cpp | 100 ++++++-------- modules/ocl/test/test_calib3d.cpp | 16 +-- 3 files changed, 107 insertions(+), 210 deletions(-) diff --git a/modules/ocl/src/opencl/stereobm.cl b/modules/ocl/src/opencl/stereobm.cl index 196a786d5b..ea983df01b 100644 --- a/modules/ocl/src/opencl/stereobm.cl +++ b/modules/ocl/src/opencl/stereobm.cl @@ -16,6 +16,8 @@ // // @Authors // Jia Haipeng, jiahaipeng95@gmail.com +// Sen Liu, swjtuls1987@126.com +// Peng Xiao, pengxiao@outlook.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -50,55 +52,33 @@ #define STEREO_MIND 0 // The minimum d range to check #define STEREO_DISP_STEP N_DISPARITIES // the d step, must be <= 1 to avoid aliasing -int SQ(int a) -{ - return a * a; -} +#ifndef radius +#define radius 64 +#endif -unsigned int CalcSSD(volatile __local unsigned int *col_ssd_cache, - volatile __local unsigned int *col_ssd, int radius) +unsigned int CalcSSD(__local unsigned int *col_ssd) { - unsigned int cache = 0; - unsigned int cache2 = 0; - - for(int i = 1; i <= radius; i++) - cache += col_ssd[i]; - - col_ssd_cache[0] = cache; + unsigned int cache = col_ssd[0]; - barrier(CLK_LOCAL_MEM_FENCE); - - if (get_local_id(0) < BLOCK_W - radius) - cache2 = col_ssd_cache[radius]; - else - for(int i = radius + 1; i < (2 * radius + 1); i++) - cache2 += col_ssd[i]; + for(int i = 1, j = radius + 1; i <= radius; i++, j++) + cache += col_ssd[i] + col_ssd[j]; - return col_ssd[0] + cache + cache2; + return cache; } -uint2 MinSSD(volatile __local unsigned int *col_ssd_cache, - volatile __local unsigned int *col_ssd, int radius) +uint2 MinSSD(__local unsigned int *col_ssd) { unsigned int ssd[N_DISPARITIES]; //See above: #define COL_SSD_SIZE (BLOCK_W + 2 * radius) - ssd[0] = CalcSSD(col_ssd_cache, col_ssd + 0 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); - ssd[1] = CalcSSD(col_ssd_cache, col_ssd + 1 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); - ssd[2] = CalcSSD(col_ssd_cache, col_ssd + 2 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); - ssd[3] = CalcSSD(col_ssd_cache, col_ssd + 3 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); - ssd[4] = CalcSSD(col_ssd_cache, col_ssd + 4 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); - ssd[5] = CalcSSD(col_ssd_cache, col_ssd + 5 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); - ssd[6] = CalcSSD(col_ssd_cache, col_ssd + 6 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); - ssd[7] = CalcSSD(col_ssd_cache, col_ssd + 7 * (BLOCK_W + 2 * radius), radius); - barrier(CLK_LOCAL_MEM_FENCE); + ssd[0] = CalcSSD(col_ssd + 0 * (BLOCK_W + 2 * radius)); + ssd[1] = CalcSSD(col_ssd + 1 * (BLOCK_W + 2 * radius)); + ssd[2] = CalcSSD(col_ssd + 2 * (BLOCK_W + 2 * radius)); + ssd[3] = CalcSSD(col_ssd + 3 * (BLOCK_W + 2 * radius)); + ssd[4] = CalcSSD(col_ssd + 4 * (BLOCK_W + 2 * radius)); + ssd[5] = CalcSSD(col_ssd + 5 * (BLOCK_W + 2 * radius)); + ssd[6] = CalcSSD(col_ssd + 6 * (BLOCK_W + 2 * radius)); + ssd[7] = CalcSSD(col_ssd + 7 * (BLOCK_W + 2 * radius)); unsigned int mssd = min(min(min(ssd[0], ssd[1]), min(ssd[4], ssd[5])), min(min(ssd[2], ssd[3]), min(ssd[6], ssd[7]))); @@ -113,124 +93,67 @@ uint2 MinSSD(volatile __local unsigned int *col_ssd_cache, } void StepDown(int idx1, int idx2, __global unsigned char* imageL, - __global unsigned char* imageR, int d, volatile __local unsigned int *col_ssd, int radius) + __global unsigned char* imageR, int d, __local unsigned int *col_ssd) { - unsigned char leftPixel1; - unsigned char leftPixel2; - unsigned char rightPixel1[8]; - unsigned char rightPixel2[8]; - unsigned int diff1, diff2; - - leftPixel1 = imageL[idx1]; - leftPixel2 = imageL[idx2]; - - idx1 = idx1 - d; - idx2 = idx2 - d; - - rightPixel1[7] = imageR[idx1 - 7]; - rightPixel1[0] = imageR[idx1 - 0]; - rightPixel1[1] = imageR[idx1 - 1]; - rightPixel1[2] = imageR[idx1 - 2]; - rightPixel1[3] = imageR[idx1 - 3]; - rightPixel1[4] = imageR[idx1 - 4]; - rightPixel1[5] = imageR[idx1 - 5]; - rightPixel1[6] = imageR[idx1 - 6]; - - rightPixel2[7] = imageR[idx2 - 7]; - rightPixel2[0] = imageR[idx2 - 0]; - rightPixel2[1] = imageR[idx2 - 1]; - rightPixel2[2] = imageR[idx2 - 2]; - rightPixel2[3] = imageR[idx2 - 3]; - rightPixel2[4] = imageR[idx2 - 4]; - rightPixel2[5] = imageR[idx2 - 5]; - rightPixel2[6] = imageR[idx2 - 6]; - - //See above: #define COL_SSD_SIZE (BLOCK_W + 2 * radius) - diff1 = leftPixel1 - rightPixel1[0]; - diff2 = leftPixel2 - rightPixel2[0]; - col_ssd[0 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); - - diff1 = leftPixel1 - rightPixel1[1]; - diff2 = leftPixel2 - rightPixel2[1]; - col_ssd[1 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); - - diff1 = leftPixel1 - rightPixel1[2]; - diff2 = leftPixel2 - rightPixel2[2]; - col_ssd[2 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); - - diff1 = leftPixel1 - rightPixel1[3]; - diff2 = leftPixel2 - rightPixel2[3]; - col_ssd[3 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); - - diff1 = leftPixel1 - rightPixel1[4]; - diff2 = leftPixel2 - rightPixel2[4]; - col_ssd[4 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); - - diff1 = leftPixel1 - rightPixel1[5]; - diff2 = leftPixel2 - rightPixel2[5]; - col_ssd[5 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); - - diff1 = leftPixel1 - rightPixel1[6]; - diff2 = leftPixel2 - rightPixel2[6]; - col_ssd[6 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); - - diff1 = leftPixel1 - rightPixel1[7]; - diff2 = leftPixel2 - rightPixel2[7]; - col_ssd[7 * (BLOCK_W + 2 * radius)] += SQ(diff2) - SQ(diff1); + uint8 imgR1 = convert_uint8(vload8(0, imageR + (idx1 - d - 7))); + uint8 imgR2 = convert_uint8(vload8(0, imageR + (idx2 - d - 7))); + uint8 diff1 = (uint8)(imageL[idx1]) - imgR1; + uint8 diff2 = (uint8)(imageL[idx2]) - imgR2; + uint8 res = diff2 * diff2 - diff1 * diff1; + col_ssd[0 * (BLOCK_W + 2 * radius)] += res.s7; + col_ssd[1 * (BLOCK_W + 2 * radius)] += res.s6; + col_ssd[2 * (BLOCK_W + 2 * radius)] += res.s5; + col_ssd[3 * (BLOCK_W + 2 * radius)] += res.s4; + col_ssd[4 * (BLOCK_W + 2 * radius)] += res.s3; + col_ssd[5 * (BLOCK_W + 2 * radius)] += res.s2; + col_ssd[6 * (BLOCK_W + 2 * radius)] += res.s1; + col_ssd[7 * (BLOCK_W + 2 * radius)] += res.s0; } void InitColSSD(int x_tex, int y_tex, int im_pitch, __global unsigned char* imageL, __global unsigned char* imageR, int d, - volatile __local unsigned int *col_ssd, int radius) + __local unsigned int *col_ssd) { - unsigned char leftPixel1; + uint8 leftPixel1; int idx; - unsigned int diffa[] = {0, 0, 0, 0, 0, 0, 0, 0}; + uint8 diffa = 0; for(int i = 0; i < (2 * radius + 1); i++) { idx = y_tex * im_pitch + x_tex; - leftPixel1 = imageL[idx]; - idx = idx - d; - - diffa[0] += SQ(leftPixel1 - imageR[idx - 0]); - diffa[1] += SQ(leftPixel1 - imageR[idx - 1]); - diffa[2] += SQ(leftPixel1 - imageR[idx - 2]); - diffa[3] += SQ(leftPixel1 - imageR[idx - 3]); - diffa[4] += SQ(leftPixel1 - imageR[idx - 4]); - diffa[5] += SQ(leftPixel1 - imageR[idx - 5]); - diffa[6] += SQ(leftPixel1 - imageR[idx - 6]); - diffa[7] += SQ(leftPixel1 - imageR[idx - 7]); + leftPixel1 = (uint8)(imageL[idx]); + uint8 imgR = convert_uint8(vload8(0, imageR + (idx - d - 7))); + uint8 res = leftPixel1 - imgR; + diffa += res * res; y_tex += 1; } //See above: #define COL_SSD_SIZE (BLOCK_W + 2 * radius) - col_ssd[0 * (BLOCK_W + 2 * radius)] = diffa[0]; - col_ssd[1 * (BLOCK_W + 2 * radius)] = diffa[1]; - col_ssd[2 * (BLOCK_W + 2 * radius)] = diffa[2]; - col_ssd[3 * (BLOCK_W + 2 * radius)] = diffa[3]; - col_ssd[4 * (BLOCK_W + 2 * radius)] = diffa[4]; - col_ssd[5 * (BLOCK_W + 2 * radius)] = diffa[5]; - col_ssd[6 * (BLOCK_W + 2 * radius)] = diffa[6]; - col_ssd[7 * (BLOCK_W + 2 * radius)] = diffa[7]; + col_ssd[0 * (BLOCK_W + 2 * radius)] = diffa.s7; + col_ssd[1 * (BLOCK_W + 2 * radius)] = diffa.s6; + col_ssd[2 * (BLOCK_W + 2 * radius)] = diffa.s5; + col_ssd[3 * (BLOCK_W + 2 * radius)] = diffa.s4; + col_ssd[4 * (BLOCK_W + 2 * radius)] = diffa.s3; + col_ssd[5 * (BLOCK_W + 2 * radius)] = diffa.s2; + col_ssd[6 * (BLOCK_W + 2 * radius)] = diffa.s1; + col_ssd[7 * (BLOCK_W + 2 * radius)] = diffa.s0; } __kernel void stereoKernel(__global unsigned char *left, __global unsigned char *right, __global unsigned int *cminSSDImage, int cminSSD_step, __global unsigned char *disp, int disp_step,int cwidth, int cheight, - int img_step, int maxdisp, int radius, + int img_step, int maxdisp, __local unsigned int *col_ssd_cache) { - - volatile __local unsigned int *col_ssd = col_ssd_cache + BLOCK_W + get_local_id(0); - volatile __local unsigned int *col_ssd_extra = get_local_id(0) < (2 * radius) ? col_ssd + BLOCK_W : 0; + __local unsigned int *col_ssd = col_ssd_cache + get_local_id(0); + __local unsigned int *col_ssd_extra = get_local_id(0) < (2 * radius) ? col_ssd + BLOCK_W : 0; int X = get_group_id(0) * BLOCK_W + get_local_id(0) + maxdisp + radius; // int Y = get_group_id(1) * ROWSperTHREAD + radius; #define Y (get_group_id(1) * ROWSperTHREAD + radius) - volatile __global unsigned int* minSSDImage = cminSSDImage + X + Y * cminSSD_step; + __global unsigned int* minSSDImage = cminSSDImage + X + Y * cminSSD_step; __global unsigned char* disparImage = disp + X + Y * disp_step; int end_row = ROWSperTHREAD < (cheight - Y) ? ROWSperTHREAD:(cheight - Y); @@ -244,14 +167,14 @@ __kernel void stereoKernel(__global unsigned char *left, __global unsigned char { y_tex = Y - radius; - InitColSSD(x_tex, y_tex, img_step, left, right, d, col_ssd, radius); + InitColSSD(x_tex, y_tex, img_step, left, right, d, col_ssd); if (col_ssd_extra > 0) if (x_tex + BLOCK_W < cwidth) - InitColSSD(x_tex + BLOCK_W, y_tex, img_step, left, right, d, col_ssd_extra, radius); + InitColSSD(x_tex + BLOCK_W, y_tex, img_step, left, right, d, col_ssd_extra); barrier(CLK_LOCAL_MEM_FENCE); //before MinSSD function - uint2 minSSD = MinSSD(col_ssd_cache + get_local_id(0), col_ssd, radius); + uint2 minSSD = MinSSD(col_ssd); if (X < cwidth - radius && Y < cheight - radius) { if (minSSD.x < minSSDImage[0]) @@ -266,19 +189,14 @@ __kernel void stereoKernel(__global unsigned char *left, __global unsigned char int idx1 = y_tex * img_step + x_tex; int idx2 = min(y_tex + (2 * radius + 1), cheight - 1) * img_step + x_tex; - barrier(CLK_GLOBAL_MEM_FENCE); - barrier(CLK_LOCAL_MEM_FENCE); - - StepDown(idx1, idx2, left, right, d, col_ssd, radius); + StepDown(idx1, idx2, left, right, d, col_ssd); if (col_ssd_extra > 0) if (x_tex + BLOCK_W < cwidth) - StepDown(idx1, idx2, left + BLOCK_W, right + BLOCK_W, d, col_ssd_extra, radius); - - y_tex += 1; + StepDown(idx1, idx2, left + BLOCK_W, right + BLOCK_W, d, col_ssd_extra); barrier(CLK_LOCAL_MEM_FENCE); - uint2 minSSD = MinSSD(col_ssd_cache + get_local_id(0), col_ssd, radius); + uint2 minSSD = MinSSD(col_ssd); if (X < cwidth - radius && row < cheight - radius - Y) { int idx = row * cminSSD_step; @@ -288,10 +206,11 @@ __kernel void stereoKernel(__global unsigned char *left, __global unsigned char minSSDImage[idx] = minSSD.x; } } + + y_tex++; } // for row loop } // for d loop } - ////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////// Sobel Prefiler (signal channel)////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/modules/ocl/src/stereobm.cpp b/modules/ocl/src/stereobm.cpp index fe3b2557df..e947e2e9bc 100644 --- a/modules/ocl/src/stereobm.cpp +++ b/modules/ocl/src/stereobm.cpp @@ -74,28 +74,21 @@ namespace stereoBM //////////////////////////////////////////////////////////////////////// static void prefilter_xsobel(const oclMat &input, oclMat &output, int prefilterCap) { - Context *clCxt = input.clCxt; - string kernelName = "prefilter_xsobel"; - cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereobm, kernelName); size_t blockSize = 1; size_t globalThreads[3] = { input.cols, input.rows, 1 }; size_t localThreads[3] = { blockSize, blockSize, 1 }; - openCLVerifyKernel(clCxt, kernel, localThreads); - openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&input.data)); - openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&output.data)); - openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_int), (void *)&input.rows)); - openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&input.cols)); - openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_int), (void *)&prefilterCap)); - - openCLSafeCall(clEnqueueNDRangeKernel((cl_command_queue)clCxt->oclCommandQueue(), kernel, 3, NULL, - globalThreads, localThreads, 0, NULL, NULL)); - - clFinish((cl_command_queue)clCxt->oclCommandQueue()); - openCLSafeCall(clReleaseKernel(kernel)); + std::vector> args; + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&input.data)); + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&output.data)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&input.rows)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&input.cols)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&prefilterCap)); + openCLExecuteKernel(Context::getContext(), &stereobm, kernelName, + globalThreads, localThreads, args, -1, -1); } ////////////////////////////////////////////////////////////////////////// //////////////////////////////common//////////////////////////////////// @@ -115,19 +108,13 @@ static void stereo_bm(const oclMat &left, const oclMat &right, oclMat &disp, { int winsz2 = winSize >> 1; - //if(winsz2 == 0 || winsz2 >= calles_num) - //cv::ocl:error("Unsupported window size", __FILE__, __LINE__, __FUNCTION__); - - Context *clCxt = left.clCxt; - string kernelName = "stereoKernel"; - cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereobm, kernelName); disp.setTo(Scalar_::all(0)); minSSD_buf.setTo(Scalar_::all(0xFFFFFFFF)); size_t minssd_step = minSSD_buf.step / minSSD_buf.elemSize(); - size_t local_mem_size = (BLOCK_W + N_DISPARITIES * (BLOCK_W + 2 * winsz2)) * + size_t local_mem_size = (N_DISPARITIES * (BLOCK_W + 2 * winsz2)) * sizeof(cl_uint); //size_t blockSize = 1; size_t localThreads[] = { BLOCK_W, 1,1}; @@ -136,26 +123,23 @@ static void stereo_bm(const oclMat &left, const oclMat &right, oclMat &disp, 1 }; - openCLVerifyKernel(clCxt, kernel, localThreads); - openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&left.data)); - openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&right.data)); - openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_mem), (void *)&minSSD_buf.data)); - openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&minssd_step)); - openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *)&disp.data)); - openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&disp.step)); - openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&left.cols)); - openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&left.rows)); - openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_int), (void *)&left.step)); - openCLSafeCall(clSetKernelArg(kernel, 9, sizeof(cl_int), (void *)&maxdisp)); - openCLSafeCall(clSetKernelArg(kernel, 10, sizeof(cl_int), (void *)&winsz2)); - openCLSafeCall(clSetKernelArg(kernel, 11, local_mem_size, (void *)NULL)); - - openCLSafeCall(clEnqueueNDRangeKernel((cl_command_queue)clCxt->oclCommandQueue(), kernel, 2, NULL, - globalThreads, localThreads, 0, NULL, NULL)); - - - clFinish((cl_command_queue)clCxt->oclCommandQueue()); - openCLSafeCall(clReleaseKernel(kernel)); + std::vector> args; + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&left.data)); + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&right.data)); + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&minSSD_buf.data)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&minssd_step)); + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&disp.data)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&disp.step)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&left.cols)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&left.rows)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&left.step)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&maxdisp)); + args.push_back(std::make_pair(local_mem_size, (void *)NULL)); + + char opt [128]; + sprintf(opt, "-D radius=%d", winsz2); + openCLExecuteKernel(Context::getContext(), &stereobm, kernelName, + globalThreads, localThreads, args, -1, -1, opt); } //////////////////////////////////////////////////////////////////////////// ///////////////////////////////postfilter_textureness/////////////////////// @@ -163,10 +147,7 @@ static void stereo_bm(const oclMat &left, const oclMat &right, oclMat &disp, static void postfilter_textureness(oclMat &left, int winSize, float avergeTexThreshold, oclMat &disparity) { - Context *clCxt = left.clCxt; - string kernelName = "textureness_kernel"; - cl_kernel kernel = openCLGetKernelFromSource(clCxt, &stereobm, kernelName); size_t blockSize = 1; size_t localThreads[] = { BLOCK_W, blockSize ,1}; @@ -177,22 +158,19 @@ static void postfilter_textureness(oclMat &left, int winSize, size_t local_mem_size = (localThreads[0] + localThreads[0] + (winSize / 2) * 2) * sizeof(float); - openCLVerifyKernel(clCxt, kernel, localThreads); - openCLSafeCall(clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&disparity.data)); - openCLSafeCall(clSetKernelArg(kernel, 1, sizeof(cl_int), (void *)&disparity.rows)); - openCLSafeCall(clSetKernelArg(kernel, 2, sizeof(cl_int), (void *)&disparity.cols)); - openCLSafeCall(clSetKernelArg(kernel, 3, sizeof(cl_int), (void *)&disparity.step)); - openCLSafeCall(clSetKernelArg(kernel, 4, sizeof(cl_mem), (void *)&left.data)); - openCLSafeCall(clSetKernelArg(kernel, 5, sizeof(cl_int), (void *)&left.rows)); - openCLSafeCall(clSetKernelArg(kernel, 6, sizeof(cl_int), (void *)&left.cols)); - openCLSafeCall(clSetKernelArg(kernel, 7, sizeof(cl_int), (void *)&winSize)); - openCLSafeCall(clSetKernelArg(kernel, 8, sizeof(cl_float), (void *)&avergeTexThreshold)); - openCLSafeCall(clSetKernelArg(kernel, 9, local_mem_size, NULL)); - openCLSafeCall(clEnqueueNDRangeKernel((cl_command_queue)clCxt->oclCommandQueue(), kernel, 2, NULL, - globalThreads, localThreads, 0, NULL, NULL)); - - clFinish((cl_command_queue)clCxt->oclCommandQueue()); - openCLSafeCall(clReleaseKernel(kernel)); + std::vector> args; + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&disparity.data)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&disparity.rows)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&disparity.cols)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&disparity.step)); + args.push_back(std::make_pair(sizeof(cl_mem), (void *)&left.data)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&left.rows)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&left.cols)); + args.push_back(std::make_pair(sizeof(cl_int), (void *)&winSize)); + args.push_back(std::make_pair(sizeof(cl_float), (void *)&avergeTexThreshold)); + args.push_back(std::make_pair(local_mem_size, (void*)NULL)); + openCLExecuteKernel(Context::getContext(), &stereobm, kernelName, + globalThreads, localThreads, args, -1, -1); } ////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////operator///////////////////////////////// diff --git a/modules/ocl/test/test_calib3d.cpp b/modules/ocl/test/test_calib3d.cpp index 179829e0e6..b556e5a3c9 100644 --- a/modules/ocl/test/test_calib3d.cpp +++ b/modules/ocl/test/test_calib3d.cpp @@ -59,7 +59,7 @@ PARAM_TEST_CASE(StereoMatchBM, int, int) virtual void SetUp() { n_disp = GET_PARAM(0); - winSize = GET_PARAM(1); + winSize = GET_PARAM(1); } }; @@ -69,27 +69,27 @@ TEST_P(StereoMatchBM, Regression) Mat left_image = readImage("stereobm/aloe-L.png", IMREAD_GRAYSCALE); Mat right_image = readImage("stereobm/aloe-R.png", IMREAD_GRAYSCALE); Mat disp_gold = readImage("stereobm/aloe-disp.png", IMREAD_GRAYSCALE); - ocl::oclMat d_left, d_right; - ocl::oclMat d_disp(left_image.size(), CV_8U); - Mat disp; + ocl::oclMat d_left, d_right; + ocl::oclMat d_disp(left_image.size(), CV_8U); + Mat disp; ASSERT_FALSE(left_image.empty()); ASSERT_FALSE(right_image.empty()); ASSERT_FALSE(disp_gold.empty()); - d_left.upload(left_image); - d_right.upload(right_image); + d_left.upload(left_image); + d_right.upload(right_image); ocl::StereoBM_OCL bm(0, n_disp, winSize); bm(d_left, d_right, d_disp); - d_disp.download(disp); + d_disp.download(disp); EXPECT_MAT_SIMILAR(disp_gold, disp, 1e-3); } INSTANTIATE_TEST_CASE_P(OCL_Calib3D, StereoMatchBM, testing::Combine(testing::Values(128), - testing::Values(19))); + testing::Values(19))); PARAM_TEST_CASE(StereoMatchBP, int, int, int, float, float, float, float) { From 1eca49f40b213d03751cb1667887261e4c8c4d5a Mon Sep 17 00:00:00 2001 From: peng xiao Date: Fri, 3 May 2013 09:45:56 +0800 Subject: [PATCH 24/49] ocl: Enable backward binary portability for setTo function. --- modules/ocl/src/matrix_operations.cpp | 20 ++++++++------------ modules/ocl/src/mcwutil.cpp | 14 +++++--------- 2 files changed, 13 insertions(+), 21 deletions(-) diff --git a/modules/ocl/src/matrix_operations.cpp b/modules/ocl/src/matrix_operations.cpp index 87d1d375ef..268a1fe9b5 100644 --- a/modules/ocl/src/matrix_operations.cpp +++ b/modules/ocl/src/matrix_operations.cpp @@ -593,11 +593,16 @@ static void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, stri CV_Error(CV_StsUnsupportedFormat, "unknown depth"); } #ifdef CL_VERSION_1_2 - if(dst.offset == 0 && dst.cols == dst.wholecols) + //this enables backwards portability to + //run on OpenCL 1.1 platform if library binaries are compiled with OpenCL 1.2 support + if(Context::getContext()->supportsFeature(Context::CL_VER_1_2) && + dst.offset == 0 && dst.cols == dst.wholecols) { - clEnqueueFillBuffer((cl_command_queue)dst.clCxt->oclCommandQueue(), (cl_mem)dst.data, args[0].second, args[0].first, 0, dst.step * dst.rows, 0, NULL, NULL); + clEnqueueFillBuffer((cl_command_queue)dst.clCxt->oclCommandQueue(), + (cl_mem)dst.data, args[0].second, args[0].first, 0, dst.step * dst.rows, 0, NULL, NULL); } else +#endif { args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst.data )); args.push_back( make_pair( sizeof(cl_int) , (void *)&dst.cols )); @@ -605,17 +610,8 @@ static void set_to_withoutmask_run(const oclMat &dst, const Scalar &scalar, stri args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel )); args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads, - localThreads, args, -1, -1, compile_option); + localThreads, args, -1, -1, compile_option); } -#else - 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.rows )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&step_in_pixel )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&offset_in_pixel)); - openCLExecuteKernel(dst.clCxt , &operator_setTo, kernelName, globalThreads, - localThreads, args, -1, -1, compile_option); -#endif } static void set_to_withmask_run(const oclMat &dst, const Scalar &scalar, const oclMat &mask, string kernelName) diff --git a/modules/ocl/src/mcwutil.cpp b/modules/ocl/src/mcwutil.cpp index ed3258b3d7..013af2d8aa 100644 --- a/modules/ocl/src/mcwutil.cpp +++ b/modules/ocl/src/mcwutil.cpp @@ -45,10 +45,6 @@ #include "precomp.hpp" -#ifndef CL_VERSION_1_2 -#define CL_VERSION_1_2 0 -#endif - using namespace std; namespace cv @@ -162,9 +158,11 @@ namespace cv CV_Error(-1, "Image forma is not supported"); break; } +#ifdef CL_VERSION_1_2 + //this enables backwards portability to + //run on OpenCL 1.1 platform if library binaries are compiled with OpenCL 1.2 support if(Context::getContext()->supportsFeature(Context::CL_VER_1_2)) { -#if CL_VERSION_1_2 cl_image_desc desc; desc.image_type = CL_MEM_OBJECT_IMAGE2D; desc.image_width = mat.cols; @@ -176,12 +174,10 @@ namespace cv desc.buffer = NULL; desc.num_mip_levels = 0; desc.num_samples = 0; - texture = clCreateImage((cl_context)mat.clCxt->oclContext(), CL_MEM_READ_WRITE, &format, &desc, NULL, &err); -#else - CV_Error(CV_StsBadFunc, "Non-deprecated image creation API call is not supported."); -#endif + texture = clCreateImage((cl_context)mat.clCxt->oclContext(), CL_MEM_READ_WRITE, &format, &desc, NULL, &err); } else +#endif { texture = clCreateImage2D( (cl_context)mat.clCxt->oclContext(), From ed2199a4970f643702d0e01eca27069d8bdd4fb5 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Fri, 3 May 2013 09:54:11 +0800 Subject: [PATCH 25/49] Fix build --- modules/ocl/src/stereobm.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/ocl/src/stereobm.cpp b/modules/ocl/src/stereobm.cpp index e947e2e9bc..e620c2a6dd 100644 --- a/modules/ocl/src/stereobm.cpp +++ b/modules/ocl/src/stereobm.cpp @@ -80,7 +80,7 @@ static void prefilter_xsobel(const oclMat &input, oclMat &output, int prefilterC size_t globalThreads[3] = { input.cols, input.rows, 1 }; size_t localThreads[3] = { blockSize, blockSize, 1 }; - std::vector> args; + std::vector< std::pair > args; args.push_back(std::make_pair(sizeof(cl_mem), (void *)&input.data)); args.push_back(std::make_pair(sizeof(cl_mem), (void *)&output.data)); args.push_back(std::make_pair(sizeof(cl_int), (void *)&input.rows)); @@ -123,7 +123,7 @@ static void stereo_bm(const oclMat &left, const oclMat &right, oclMat &disp, 1 }; - std::vector> args; + std::vector< std::pair > args; args.push_back(std::make_pair(sizeof(cl_mem), (void *)&left.data)); args.push_back(std::make_pair(sizeof(cl_mem), (void *)&right.data)); args.push_back(std::make_pair(sizeof(cl_mem), (void *)&minSSD_buf.data)); @@ -158,7 +158,7 @@ static void postfilter_textureness(oclMat &left, int winSize, size_t local_mem_size = (localThreads[0] + localThreads[0] + (winSize / 2) * 2) * sizeof(float); - std::vector> args; + std::vector< std::pair > args; args.push_back(std::make_pair(sizeof(cl_mem), (void *)&disparity.data)); args.push_back(std::make_pair(sizeof(cl_int), (void *)&disparity.rows)); args.push_back(std::make_pair(sizeof(cl_int), (void *)&disparity.cols)); From dc6a14439628c5391e55f15899c6e1d95c35af42 Mon Sep 17 00:00:00 2001 From: Egbert van der Wal Date: Sat, 4 May 2013 17:17:12 +0200 Subject: [PATCH 26/49] add (optional) index argument to RetrieveFrame method --- modules/python/src2/api | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/python/src2/api b/modules/python/src2/api index dc02e4ab04..0f09176b75 100644 --- a/modules/python/src2/api +++ b/modules/python/src2/api @@ -1595,6 +1595,7 @@ GrabFrame int CvCapture* capture RetrieveFrame ROIplImage* CvCapture* capture + int index 0 QueryFrame ROIplImage* CvCapture* capture GetCaptureProperty double From d34e7eca605cb495feb4a5448fccf4ca5779f089 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Mon, 6 May 2013 17:16:45 +0800 Subject: [PATCH 27/49] Suppress warning when compiling deprecated OpenCL function on GNU compilers. --- modules/ocl/src/mcwutil.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/ocl/src/mcwutil.cpp b/modules/ocl/src/mcwutil.cpp index 013af2d8aa..e56e2f15d0 100644 --- a/modules/ocl/src/mcwutil.cpp +++ b/modules/ocl/src/mcwutil.cpp @@ -179,6 +179,10 @@ namespace cv else #endif { +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wdeprecated-declarations" +#endif texture = clCreateImage2D( (cl_context)mat.clCxt->oclContext(), CL_MEM_READ_WRITE, @@ -188,6 +192,9 @@ namespace cv 0, NULL, &err); +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif } size_t origin[] = { 0, 0, 0 }; size_t region[] = { mat.cols, mat.rows, 1 }; From 52dbbae82c0269dc9db805b4f4939cde72391d9b Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 7 May 2013 16:14:50 +0800 Subject: [PATCH 28/49] some cleanup, remove some commented codes --- modules/ocl/test/test_arithm.cpp | 4 --- modules/ocl/test/test_blend.cpp | 15 ++------- modules/ocl/test/test_columnsum.cpp | 16 ++-------- modules/ocl/test/test_filters.cpp | 25 ++------------- modules/ocl/test/test_gemm.cpp | 3 +- modules/ocl/test/test_haar.cpp | 6 ---- modules/ocl/test/test_imgproc.cpp | 37 ++-------------------- modules/ocl/test/test_match_template.cpp | 5 --- modules/ocl/test/test_matrix_operation.cpp | 28 +++------------- modules/ocl/test/test_pyrdown.cpp | 11 ------- modules/ocl/test/test_pyrlk.cpp | 12 ------- modules/ocl/test/test_pyrup.cpp | 3 -- modules/ocl/test/test_split_merge.cpp | 12 ++----- 13 files changed, 18 insertions(+), 159 deletions(-) diff --git a/modules/ocl/test/test_arithm.cpp b/modules/ocl/test/test_arithm.cpp index e46fdbddd1..81dab430ee 100644 --- a/modules/ocl/test/test_arithm.cpp +++ b/modules/ocl/test/test_arithm.cpp @@ -125,10 +125,6 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() diff --git a/modules/ocl/test/test_blend.cpp b/modules/ocl/test/test_blend.cpp index f9c8657d04..fcc1925435 100644 --- a/modules/ocl/test/test_blend.cpp +++ b/modules/ocl/test/test_blend.cpp @@ -33,20 +33,14 @@ void blendLinearGold(const cv::Mat &img1, const cv::Mat &img2, const cv::Mat &we PARAM_TEST_CASE(Blend, cv::Size, MatType/*, UseRoi*/) { - //std::vector oclinfo; cv::Size size; int type; bool useRoi; virtual void SetUp() { - //devInfo = GET_PARAM(0); size = GET_PARAM(0); type = GET_PARAM(1); - /*useRoi = GET_PARAM(3);*/ - - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); } }; @@ -59,12 +53,9 @@ TEST_P(Blend, Accuracy) cv::Mat weights1 = randomMat(size, CV_32F, 0, 1); cv::Mat weights2 = randomMat(size, CV_32F, 0, 1); - cv::ocl::oclMat gimg1(size, type), gimg2(size, type), gweights1(size, CV_32F), gweights2(size, CV_32F); - cv::ocl::oclMat dst(size, type); - gimg1.upload(img1); - gimg2.upload(img2); - gweights1.upload(weights1); - gweights2.upload(weights2); + cv::ocl::oclMat gimg1(img1), gimg2(img2), gweights1(weights1), gweights2(weights2); + cv::ocl::oclMat dst; + cv::ocl::blendLinear(gimg1, gimg2, gweights1, gweights2, dst); cv::Mat result; cv::Mat result_gold; diff --git a/modules/ocl/test/test_columnsum.cpp b/modules/ocl/test/test_columnsum.cpp index 9bd2e6f8ef..bf389d1b84 100644 --- a/modules/ocl/test/test_columnsum.cpp +++ b/modules/ocl/test/test_columnsum.cpp @@ -47,27 +47,16 @@ #include "precomp.hpp" #include -/////////////////////////////////////////////////////////////////////////////// -/// ColumnSum - #ifdef HAVE_OPENCL -//////////////////////////////////////////////////////////////////////// -// ColumnSum - -PARAM_TEST_CASE(ColumnSum, cv::Size, bool ) +PARAM_TEST_CASE(ColumnSum, cv::Size) { cv::Size size; cv::Mat src; - bool useRoi; - //std::vector oclinfo; virtual void SetUp() { size = GET_PARAM(0); - useRoi = GET_PARAM(1); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); } }; @@ -99,8 +88,7 @@ TEST_P(ColumnSum, Accuracy) } } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ColumnSum, testing::Combine( - DIFFERENT_SIZES, testing::Values(Inverse(false), Inverse(true)))); +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ColumnSum, DIFFERENT_SIZES); #endif diff --git a/modules/ocl/test/test_filters.cpp b/modules/ocl/test/test_filters.cpp index 70d4079445..d598b6a18f 100644 --- a/modules/ocl/test/test_filters.cpp +++ b/modules/ocl/test/test_filters.cpp @@ -285,7 +285,7 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int) //src mat with roi cv::Mat mat_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -304,10 +304,6 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int) mat = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -388,7 +384,7 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -518,7 +514,7 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -540,11 +536,6 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -622,7 +613,6 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -645,10 +635,6 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -729,7 +715,6 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - //std::vector oclinfo; //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -752,10 +737,6 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() diff --git a/modules/ocl/test/test_gemm.cpp b/modules/ocl/test/test_gemm.cpp index c26a8481f2..a5d90ff01c 100644 --- a/modules/ocl/test/test_gemm.cpp +++ b/modules/ocl/test/test_gemm.cpp @@ -53,13 +53,12 @@ PARAM_TEST_CASE(Gemm, int, cv::Size, int) int type; cv::Size mat_size; int flags; - //vector info; + virtual void SetUp() { type = GET_PARAM(0); mat_size = GET_PARAM(1); flags = GET_PARAM(2); - //cv::ocl::getDevice(info); } }; diff --git a/modules/ocl/test/test_haar.cpp b/modules/ocl/test/test_haar.cpp index 9bff324662..eab6769214 100644 --- a/modules/ocl/test/test_haar.cpp +++ b/modules/ocl/test/test_haar.cpp @@ -63,7 +63,6 @@ struct getRect PARAM_TEST_CASE(HaarTestBase, int, int) { - //std::vector oclinfo; cv::ocl::OclCascadeClassifier cascade, nestedCascade; cv::CascadeClassifier cpucascade, cpunestedCascade; // Mat img; @@ -82,11 +81,6 @@ PARAM_TEST_CASE(HaarTestBase, int, int) cout << "ERROR: Could not load classifier cascade" << endl; return; } - //int devnums = getDevice(oclinfo); - //CV_Assert(devnums>0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); - //cv::ocl::setBinpath("E:\\"); } }; diff --git a/modules/ocl/test/test_imgproc.cpp b/modules/ocl/test/test_imgproc.cpp index 9cc6c1c898..92e2ee9d4b 100644 --- a/modules/ocl/test/test_imgproc.cpp +++ b/modules/ocl/test/test_imgproc.cpp @@ -327,7 +327,7 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType, MatType, MatType, MatType, MatType, bo cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - //std::vector oclinfo; + //ocl mat cv::ocl::oclMat clmat1; cv::ocl::oclMat clmat2; @@ -352,10 +352,6 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType, MatType, MatType, MatType, MatType, bo cv::RNG &rng = TS::ptr()->get_rng(); cv::Size size(MWIDTH, MHEIGHT); double min = 1, max = 20; - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); if(type1 != nulltype) { @@ -720,7 +716,7 @@ PARAM_TEST_CASE(WarpTestBase, MatType, int) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -740,10 +736,6 @@ PARAM_TEST_CASE(WarpTestBase, MatType, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -905,9 +897,6 @@ PARAM_TEST_CASE(Remap, MatType, MatType, MatType, int, int) interpolation = GET_PARAM(3); bordertype = GET_PARAM(4); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - cv::RNG &rng = TS::ptr()->get_rng(); cv::Size srcSize = cv::Size(MWIDTH, MHEIGHT); cv::Size map1Size = cv::Size(MWIDTH, MHEIGHT); @@ -1051,7 +1040,6 @@ PARAM_TEST_CASE(Resize, MatType, cv::Size, double, double, int) int dstx; int dsty; - //std::vector oclinfo; //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; @@ -1090,10 +1078,6 @@ PARAM_TEST_CASE(Resize, MatType, cv::Size, double, double, int) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, dsize, type, 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -1181,7 +1165,7 @@ PARAM_TEST_CASE(Threshold, MatType, ThreshOp) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -1199,11 +1183,6 @@ PARAM_TEST_CASE(Threshold, MatType, ThreshOp) mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -1288,7 +1267,6 @@ PARAM_TEST_CASE(meanShiftTestBase, MatType, MatType, int, int, cv::TermCriteria) cv::ocl::oclMat gdst; cv::ocl::oclMat gdstCoor; - //std::vector oclinfo; //ocl mat with roi cv::ocl::oclMat gsrc_roi; cv::ocl::oclMat gdst_roi; @@ -1311,10 +1289,6 @@ PARAM_TEST_CASE(meanShiftTestBase, MatType, MatType, int, int, cv::TermCriteria) dst = randomMat(rng, size, type, 5, 16, false); dstCoor = randomMat(rng, size, typeCoor, 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -1436,7 +1410,6 @@ PARAM_TEST_CASE(histTestBase, MatType, MatType) cv::ocl::oclMat gdst_hist; //ocl mat with roi cv::ocl::oclMat gsrc_roi; - // std::vector oclinfo; virtual void SetUp() { @@ -1447,10 +1420,6 @@ PARAM_TEST_CASE(histTestBase, MatType, MatType) src = randomMat(rng, size, type_src, 0, 256, false); - // int devnums = getDevice(oclinfo); - // CV_Assert(devnums > 0); - //if you want to use undefault device, set it here - //setDevice(oclinfo[0]); } void random_roi() diff --git a/modules/ocl/test/test_match_template.cpp b/modules/ocl/test/test_match_template.cpp index 5da7f01cd8..e6f1f7080d 100644 --- a/modules/ocl/test/test_match_template.cpp +++ b/modules/ocl/test/test_match_template.cpp @@ -62,7 +62,6 @@ PARAM_TEST_CASE(MatchTemplate8U, cv::Size, TemplateSize, Channels, TemplateMetho cv::Size templ_size; int cn; int method; - //std::vector oclinfo; virtual void SetUp() { @@ -70,8 +69,6 @@ PARAM_TEST_CASE(MatchTemplate8U, cv::Size, TemplateSize, Channels, TemplateMetho templ_size = GET_PARAM(1); cn = GET_PARAM(2); method = GET_PARAM(3); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); } }; @@ -114,8 +111,6 @@ PARAM_TEST_CASE(MatchTemplate32F, cv::Size, TemplateSize, Channels, TemplateMeth templ_size = GET_PARAM(1); cn = GET_PARAM(2); method = GET_PARAM(3); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); } }; diff --git a/modules/ocl/test/test_matrix_operation.cpp b/modules/ocl/test/test_matrix_operation.cpp index ef11aaa132..cfcafbcfc2 100644 --- a/modules/ocl/test/test_matrix_operation.cpp +++ b/modules/ocl/test/test_matrix_operation.cpp @@ -72,7 +72,7 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType) //src mat with roi cv::Mat mat_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -90,11 +90,6 @@ PARAM_TEST_CASE(ConvertToTestBase, MatType, MatType) mat = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - //std::vector oclinfo; - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -175,7 +170,7 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool) cv::Mat mat_roi; cv::Mat mask_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -197,10 +192,6 @@ PARAM_TEST_CASE(CopyToTestBase, MatType, bool) cv::threshold(mask, mask, 0.5, 255., CV_8UC1); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -301,7 +292,7 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool) //src mat with roi cv::Mat mat_roi; cv::Mat mask_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gmat_whole; @@ -322,10 +313,6 @@ PARAM_TEST_CASE(SetToTestBase, MatType, bool) cv::threshold(mask, mask, 0.5, 255., CV_8UC1); val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -417,7 +404,7 @@ PARAM_TEST_CASE(convertC3C4, MatType, cv::Size) //src mat with roi cv::Mat mat1_roi; cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -430,13 +417,6 @@ PARAM_TEST_CASE(convertC3C4, MatType, cv::Size) type = GET_PARAM(0); ksize = GET_PARAM(1); - - - //dst = randomMat(rng, size, type, 5, 16, false); - //int devnums = getDevice(oclinfo); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[1]); } void random_roi() diff --git a/modules/ocl/test/test_pyrdown.cpp b/modules/ocl/test/test_pyrdown.cpp index c7233cc78a..a67e0b0ac6 100644 --- a/modules/ocl/test/test_pyrdown.cpp +++ b/modules/ocl/test/test_pyrdown.cpp @@ -65,15 +65,6 @@ PARAM_TEST_CASE(PyrDown, MatType, int) { type = GET_PARAM(0); channels = GET_PARAM(1); - - //int devnums = getDevice(oclinfo); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); - } - - void Cleanup() - { } }; @@ -97,8 +88,6 @@ TEST_P(PyrDown, Mat) char s[1024] = {0}; EXPECT_MAT_NEAR(dst, dst_cpu, dst.depth() == CV_32F ? 1e-4f : 1.0f, s); - - Cleanup(); } } diff --git a/modules/ocl/test/test_pyrlk.cpp b/modules/ocl/test/test_pyrlk.cpp index 7c747ee4fc..064cb30bd8 100644 --- a/modules/ocl/test/test_pyrlk.cpp +++ b/modules/ocl/test/test_pyrlk.cpp @@ -50,19 +50,7 @@ using namespace cvtest; using namespace testing; using namespace std; -//#define DUMP - -///////////////////////////////////////////////////////////////////////////////////////////////// -// BroxOpticalFlow extern string workdir; -#define BROX_OPTICAL_FLOW_DUMP_FILE "opticalflow/brox_optical_flow.bin" -#define BROX_OPTICAL_FLOW_DUMP_FILE_CC20 "opticalflow/brox_optical_flow_cc20.bin" - - -///////////////////////////////////////////////////////////////////////////////////////////////// -// PyrLKOpticalFlow - -//IMPLEMENT_PARAM_CLASS(UseGray, bool) PARAM_TEST_CASE(Sparse, bool, bool) { diff --git a/modules/ocl/test/test_pyrup.cpp b/modules/ocl/test/test_pyrup.cpp index 9889b92ac0..b2d45ef4fd 100644 --- a/modules/ocl/test/test_pyrup.cpp +++ b/modules/ocl/test/test_pyrup.cpp @@ -58,12 +58,9 @@ PARAM_TEST_CASE(PyrUp, MatType, int) { int type; int channels; - //std::vector oclinfo; virtual void SetUp() { - //int devnums = cv::ocl::getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); type = GET_PARAM(0); channels = GET_PARAM(1); } diff --git a/modules/ocl/test/test_split_merge.cpp b/modules/ocl/test/test_split_merge.cpp index f41d16eeee..5543bbac41 100644 --- a/modules/ocl/test/test_split_merge.cpp +++ b/modules/ocl/test/test_split_merge.cpp @@ -87,7 +87,7 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int) //dst mat with roi cv::Mat dst_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; @@ -112,10 +112,6 @@ PARAM_TEST_CASE(MergeTestBase, MatType, int) mat4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); dst = randomMat(rng, size, CV_MAKETYPE(type, channels), 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() @@ -252,7 +248,7 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int) cv::Mat dst2_roi; cv::Mat dst3_roi; cv::Mat dst4_roi; - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst1_whole; cv::ocl::oclMat gdst2_whole; @@ -280,10 +276,6 @@ PARAM_TEST_CASE(SplitTestBase, MatType, int) dst3 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); dst4 = randomMat(rng, size, CV_MAKETYPE(type, 1), 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } void random_roi() From 7dda8e2cb85f273c3f19e187f3dcd222314b5722 Mon Sep 17 00:00:00 2001 From: poiuytrez Date: Tue, 7 May 2013 11:45:18 +0200 Subject: [PATCH 29/49] Link to bug tracker replaced by bug description --- .../src/org/opencv/samples/tutorial3/Tutorial3View.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java index 38d613bba4..7ba2d9f967 100644 --- a/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java +++ b/samples/android/tutorial-3-cameracontrol/src/org/opencv/samples/tutorial3/Tutorial3View.java @@ -57,7 +57,8 @@ public class Tutorial3View extends JavaCameraView implements PictureCallback { public void takePicture(final String fileName) { Log.i(TAG, "Taking picture"); this.mPictureFileName = fileName; - // Clear up buffers to avoid bug http://code.opencv.org/issues/2961 + // Postview and jpeg are sent in the same buffers if the queue is not empty when performing a capture. + // Clear up buffers to avoid mCamera.takePicture to be stuck because of a memory issue mCamera.setPreviewCallback(null); // PictureCallback is implemented by the current class From e4d3378230686510663528827400969e8a6ebe0c Mon Sep 17 00:00:00 2001 From: yao Date: Wed, 8 May 2013 15:12:12 +0800 Subject: [PATCH 30/49] simplify logics in filter tests, remove redundant code in arithm tests --- modules/ocl/test/test_arithm.cpp | 280 +++++----------- modules/ocl/test/test_filters.cpp | 532 ++++-------------------------- 2 files changed, 144 insertions(+), 668 deletions(-) diff --git a/modules/ocl/test/test_arithm.cpp b/modules/ocl/test/test_arithm.cpp index 81dab430ee..e23b3d104a 100644 --- a/modules/ocl/test/test_arithm.cpp +++ b/modules/ocl/test/test_arithm.cpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors @@ -21,6 +22,7 @@ // Jiang Liyuan,jlyuan001.good@163.com // Rock Li, Rock.Li@amd.com // Zailong Wu, bullet@yeah.net +// Yao Wang, bitwangyaoyao@gmail.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -87,14 +89,13 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) int maskx; int masky; - //src mat with roi cv::Mat mat1_roi; cv::Mat mat2_roi; cv::Mat mask_roi; cv::Mat dst_roi; cv::Mat dst1_roi; //bak - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; cv::ocl::oclMat gdst1_whole; //bak @@ -202,17 +203,12 @@ TEST_P(Lut, Mat) cv::Mat cpu_dst; gdst_whole.download (cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 0, ""); } } - - ////////////////////////////////exp///////////////////////////////////////////////// - struct Exp : ArithmTestBase {}; TEST_P(Exp, Mat) @@ -227,16 +223,13 @@ TEST_P(Exp, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 2, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 2, ""); } } ////////////////////////////////log///////////////////////////////////////////////// - struct Log : ArithmTestBase {}; TEST_P(Log, Mat) @@ -245,24 +238,17 @@ TEST_P(Log, Mat) { random_roi(); - cv::log(mat1_roi, dst_roi); cv::ocl::log(gmat1, gdst); cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1, s); - + EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); } } - - ////////////////////////////////add///////////////////////////////////////////////// - struct Add : ArithmTestBase {}; TEST_P(Add, Mat) @@ -276,9 +262,7 @@ TEST_P(Add, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -293,9 +277,7 @@ TEST_P(Add, Mat_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } TEST_P(Add, Scalar) @@ -309,9 +291,7 @@ TEST_P(Add, Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -326,9 +306,7 @@ TEST_P(Add, Scalar_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -348,9 +326,7 @@ TEST_P(Sub, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -365,11 +341,10 @@ TEST_P(Sub, Mat_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } + TEST_P(Sub, Scalar) { for(int j = 0; j < LOOP_TIMES; j++) @@ -381,9 +356,7 @@ TEST_P(Sub, Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -398,9 +371,7 @@ TEST_P(Sub, Scalar_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -420,9 +391,7 @@ TEST_P(Mul, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char s[1024]; - sprintf(s, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, s); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -440,9 +409,7 @@ TEST_P(Mul, Mat_Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.001, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.001, ""); } } @@ -461,10 +428,7 @@ TEST_P(Div, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); } } @@ -482,10 +446,7 @@ TEST_P(Div, Mat_Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.001, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.001, ""); } } @@ -503,10 +464,7 @@ TEST_P(Absdiff, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0, ""); } } @@ -521,10 +479,7 @@ TEST_P(Absdiff, Mat_Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -546,10 +501,8 @@ TEST_P(CartToPolar, angleInDegree) cv::Mat cpu_dst1; gdst1_whole.download(cpu_dst1); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, sss); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); + EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); } } @@ -567,16 +520,12 @@ TEST_P(CartToPolar, angleInRadians) cv::Mat cpu_dst1; gdst1_whole.download(cpu_dst1); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, sss); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); + EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); } } - - struct PolarToCart : ArithmTestBase {}; TEST_P(PolarToCart, angleInDegree) @@ -593,11 +542,9 @@ TEST_P(PolarToCart, angleInDegree) cv::Mat cpu_dst1; gdst1_whole.download(cpu_dst1); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, sss); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); + EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); } } @@ -615,11 +562,9 @@ TEST_P(PolarToCart, angleInRadians) cv::Mat cpu_dst1; gdst1_whole.download(cpu_dst1); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, sss); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); + EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); } } @@ -639,16 +584,12 @@ TEST_P(Magnitude, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } - - struct Transpose : ArithmTestBase {}; TEST_P(Transpose, Mat) @@ -662,17 +603,13 @@ TEST_P(Transpose, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } - - struct Flip : ArithmTestBase {}; TEST_P(Flip, X) @@ -686,10 +623,8 @@ TEST_P(Flip, X) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -704,10 +639,8 @@ TEST_P(Flip, Y) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -722,15 +655,12 @@ TEST_P(Flip, BOTH) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } - struct MinMax : ArithmTestBase {}; TEST_P(MinMax, MAT) @@ -761,12 +691,8 @@ TEST_P(MinMax, MAT) double minVal_, maxVal_; cv::ocl::minMax(gmat1, &minVal_, &maxVal_); - //check results - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_DOUBLE_EQ(minVal_, minVal) << sss; - EXPECT_DOUBLE_EQ(maxVal_, maxVal) << sss; + EXPECT_DOUBLE_EQ(minVal_, minVal); + EXPECT_DOUBLE_EQ(maxVal_, maxVal); } } @@ -799,12 +725,8 @@ TEST_P(MinMax, MASK) double minVal_, maxVal_; cv::ocl::minMax(gmat1, &minVal_, &maxVal_, gmask); - //check results - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_DOUBLE_EQ(minVal_, minVal) << sss; - EXPECT_DOUBLE_EQ(maxVal_, maxVal) << sss; + EXPECT_DOUBLE_EQ(minVal_, minVal); + EXPECT_DOUBLE_EQ(maxVal_, maxVal); } } @@ -915,17 +837,13 @@ TEST_P(MinMaxLoc, MAT) error1 = ::abs(mat1_roi.at(maxLoc_) - mat1_roi.at(maxLoc)); } - //check results - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_DOUBLE_EQ(minVal_, minVal) << sss; - EXPECT_DOUBLE_EQ(maxVal_, maxVal) << sss; - EXPECT_DOUBLE_EQ(minlocVal_, minlocVal) << sss; - EXPECT_DOUBLE_EQ(maxlocVal_, maxlocVal) << sss; + EXPECT_DOUBLE_EQ(minVal_, minVal); + EXPECT_DOUBLE_EQ(maxVal_, maxVal); + EXPECT_DOUBLE_EQ(minlocVal_, minlocVal); + EXPECT_DOUBLE_EQ(maxlocVal_, maxlocVal); - EXPECT_DOUBLE_EQ(error0, 0.0) << sss; - EXPECT_DOUBLE_EQ(error1, 0.0) << sss; + EXPECT_DOUBLE_EQ(error0, 0.0); + EXPECT_DOUBLE_EQ(error1, 0.0); } } @@ -1036,17 +954,13 @@ TEST_P(MinMaxLoc, MASK) error1 = ::abs(mat1_roi.at(maxLoc_) - mat1_roi.at(maxLoc)); } - //check results - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); + EXPECT_DOUBLE_EQ(minVal_, minVal); + EXPECT_DOUBLE_EQ(maxVal_, maxVal); + EXPECT_DOUBLE_EQ(minlocVal_, minlocVal); + EXPECT_DOUBLE_EQ(maxlocVal_, maxlocVal); - EXPECT_DOUBLE_EQ(minVal_, minVal) << sss; - EXPECT_DOUBLE_EQ(maxVal_, maxVal) << sss; - EXPECT_DOUBLE_EQ(minlocVal_, minlocVal) << sss; - EXPECT_DOUBLE_EQ(maxlocVal_, maxlocVal) << sss; - - EXPECT_DOUBLE_EQ(error0, 0.0) << sss; - EXPECT_DOUBLE_EQ(error1, 0.0) << sss; + EXPECT_DOUBLE_EQ(error0, 0.0); + EXPECT_DOUBLE_EQ(error1, 0.0); } } @@ -1060,14 +974,12 @@ TEST_P(Sum, MAT) random_roi(); Scalar cpures = cv::sum(mat1_roi); Scalar gpures = cv::ocl::sum(gmat1); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); //check results - EXPECT_NEAR(cpures[0], gpures[0], 0.1) << sss; - EXPECT_NEAR(cpures[1], gpures[1], 0.1) << sss; - EXPECT_NEAR(cpures[2], gpures[2], 0.1) << sss; - EXPECT_NEAR(cpures[3], gpures[3], 0.1) << sss; + EXPECT_NEAR(cpures[0], gpures[0], 0.1); + EXPECT_NEAR(cpures[1], gpures[1], 0.1); + EXPECT_NEAR(cpures[2], gpures[2], 0.1); + EXPECT_NEAR(cpures[3], gpures[3], 0.1); } } @@ -1082,11 +994,7 @@ TEST_P(CountNonZero, MAT) int cpures = cv::countNonZero(mat1_roi); int gpures = cv::ocl::countNonZero(gmat1); - //check results - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_DOUBLE_EQ((double)cpures, (double)gpures) << sss; + EXPECT_DOUBLE_EQ((double)cpures, (double)gpures); } } @@ -1112,9 +1020,7 @@ TEST_P(Phase, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-2, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-2, ""); } } } @@ -1134,10 +1040,8 @@ TEST_P(Bitwise_and, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -1152,10 +1056,8 @@ TEST_P(Bitwise_and, Mat_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } TEST_P(Bitwise_and, Scalar) @@ -1169,10 +1071,8 @@ TEST_P(Bitwise_and, Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -1188,11 +1088,8 @@ TEST_P(Bitwise_and, Scalar_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char *sss = new char[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); - delete[] sss; + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -1213,10 +1110,8 @@ TEST_P(Bitwise_or, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -1231,10 +1126,8 @@ TEST_P(Bitwise_or, Mat_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } TEST_P(Bitwise_or, Scalar) @@ -1248,10 +1141,8 @@ TEST_P(Bitwise_or, Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -1266,10 +1157,8 @@ TEST_P(Bitwise_or, Scalar_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -1290,10 +1179,8 @@ TEST_P(Bitwise_xor, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -1308,10 +1195,8 @@ TEST_P(Bitwise_xor, Mat_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } TEST_P(Bitwise_xor, Scalar) @@ -1325,10 +1210,8 @@ TEST_P(Bitwise_xor, Scalar) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -1343,10 +1226,8 @@ TEST_P(Bitwise_xor, Scalar_Mask) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -1366,10 +1247,8 @@ TEST_P(Bitwise_not, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -1386,7 +1265,7 @@ TEST_P(Compare, Mat) } int cmp_codes[] = {CMP_EQ, CMP_GT, CMP_GE, CMP_LT, CMP_LE, CMP_NE}; - const char *cmp_str[] = {"CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE"}; + //const char *cmp_str[] = {"CMP_EQ", "CMP_GT", "CMP_GE", "CMP_LT", "CMP_LE", "CMP_NE"}; int cmp_num = sizeof(cmp_codes) / sizeof(int); for (int i = 0; i < cmp_num; ++i) @@ -1401,10 +1280,8 @@ TEST_P(Compare, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "cmptype=%s, roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", cmp_str[i], roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); } } @@ -1430,10 +1307,7 @@ TEST_P(Pow, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); } } @@ -1464,16 +1338,13 @@ TEST_P(MagnitudeSqr, Mat) // end = cv::getTickCount(); - cv::ocl::oclMat clmat1(mat1), clmat2(mat2), cldst; cv::ocl::magnitudeSqr(clmat1, clmat2, cldst); cv::Mat cpu_dst; cldst.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); } } @@ -1498,10 +1369,7 @@ TEST_P(AddWeighted, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, maskx, masky, src2x, src2y); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } diff --git a/modules/ocl/test/test_filters.cpp b/modules/ocl/test/test_filters.cpp index d598b6a18f..dbca326937 100644 --- a/modules/ocl/test/test_filters.cpp +++ b/modules/ocl/test/test_filters.cpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors @@ -19,6 +20,7 @@ // Jia Haipeng, jiahaipeng95@gmail.com // Zero Lin, Zero.Lin@amd.com // Zhang Ying, zhangying913@gmail.com +// Yao Wang, bitwangyaoyao@gmail.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -55,191 +57,87 @@ using namespace testing; using namespace std; -PARAM_TEST_CASE(FilterTestBase, MatType, bool) +PARAM_TEST_CASE(FilterTestBase, + MatType, + cv::Size, // kernel size + cv::Size, // dx,dy + int // border type, or iteration + ) { - int type; - cv::Scalar val; - //src mat cv::Mat mat1; - cv::Mat mat2; - cv::Mat mask; cv::Mat dst; - cv::Mat dst1; //bak, for two outputs // set up roi int roicols; int roirows; int src1x; int src1y; - int src2x; - int src2y; int dstx; int dsty; - int maskx; - int masky; //src mat with roi cv::Mat mat1_roi; - cv::Mat mat2_roi; - cv::Mat mask_roi; cv::Mat dst_roi; - cv::Mat dst1_roi; //bak - //std::vector oclinfo; + //ocl dst mat for testing cv::ocl::oclMat gdst_whole; - cv::ocl::oclMat gdst1_whole; //bak //ocl mat with roi cv::ocl::oclMat gmat1; - cv::ocl::oclMat gmat2; cv::ocl::oclMat gdst; - cv::ocl::oclMat gdst1; //bak - cv::ocl::oclMat gmask; - - virtual void SetUp() - { - type = GET_PARAM(0); - - cv::RNG &rng = TS::ptr()->get_rng(); - cv::Size size(MWIDTH, MHEIGHT); - - mat1 = randomMat(rng, size, type, 5, 16, false); - mat2 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); - dst1 = randomMat(rng, size, type, 5, 16, false); - mask = randomMat(rng, size, CV_8UC1, 0, 2, false); - - cv::threshold(mask, mask, 0.5, 255., CV_8UC1); - - val = cv::Scalar(rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0), rng.uniform(-10.0, 10.0)); - } void random_roi() { #ifdef RANDOMROI //randomize ROI cv::RNG &rng = TS::ptr()->get_rng(); - roicols = rng.uniform(1, mat1.cols); - roirows = rng.uniform(1, mat1.rows); + roicols = rng.uniform(2, mat1.cols); + roirows = rng.uniform(2, mat1.rows); src1x = rng.uniform(0, mat1.cols - roicols); src1y = rng.uniform(0, mat1.rows - roirows); - src2x = rng.uniform(0, mat2.cols - roicols); - src2y = rng.uniform(0, mat2.rows - roirows); dstx = rng.uniform(0, dst.cols - roicols); dsty = rng.uniform(0, dst.rows - roirows); - maskx = rng.uniform(0, mask.cols - roicols); - masky = rng.uniform(0, mask.rows - roirows); #else roicols = mat1.cols; roirows = mat1.rows; src1x = 0; src1y = 0; - src2x = 0; - src2y = 0; dstx = 0; dsty = 0; - maskx = 0; - masky = 0; #endif + mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); - mat2_roi = mat2(Rect(src2x, src2y, roicols, roirows)); - mask_roi = mask(Rect(maskx, masky, roicols, roirows)); dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - dst1_roi = dst1(Rect(dstx, dsty, roicols, roirows)); gdst_whole = dst; gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - gdst1_whole = dst1; - gdst1 = gdst1_whole(Rect(dstx, dsty, roicols, roirows)); - gmat1 = mat1_roi; - gmat2 = mat2_roi; - gmask = mask_roi; } }; ///////////////////////////////////////////////////////////////////////////////////////////////// // blur - -PARAM_TEST_CASE(Blur, MatType, cv::Size, int) +struct Blur : FilterTestBase { int type; cv::Size ksize; int bordertype; - //src mat - cv::Mat mat1; - cv::Mat dst; - - // set up roi - int roicols; - int roirows; - int src1x; - int src1y; - int dstx; - int dsty; - - //src mat with roi - cv::Mat mat1_roi; - cv::Mat dst_roi; - //std::vector oclinfo; - //ocl dst mat for testing - cv::ocl::oclMat gdst_whole; - - //ocl mat with roi - cv::ocl::oclMat gmat1; - cv::ocl::oclMat gdst; - virtual void SetUp() { type = GET_PARAM(0); ksize = GET_PARAM(1); - bordertype = GET_PARAM(2); + bordertype = GET_PARAM(3); cv::RNG &rng = TS::ptr()->get_rng(); cv::Size size(MWIDTH, MHEIGHT); mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); - //int devnums = getDevice(oclinfo, OPENCV_DEFAULT_OPENCL_DEVICE); - //CV_Assert(devnums > 0); - ////if you want to use undefault device, set it here - ////setDevice(oclinfo[0]); } - - void random_roi() - { -#ifdef RANDOMROI - //randomize ROI - cv::RNG &rng = TS::ptr()->get_rng(); - roicols = rng.uniform(2, mat1.cols); - roirows = rng.uniform(2, mat1.rows); - src1x = rng.uniform(0, mat1.cols - roicols); - src1y = rng.uniform(0, mat1.rows - roirows); - dstx = rng.uniform(0, dst.cols - roicols); - dsty = rng.uniform(0, dst.rows - roirows); -#else - roicols = mat1.cols; - roirows = mat1.rows; - src1x = 0; - src1y = 0; - dstx = 0; - dsty = 0; -#endif - - mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); - dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - - gdst_whole = dst; - gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - - - gmat1 = mat1_roi; - } - }; TEST_P(Blur, Mat) @@ -253,9 +151,8 @@ TEST_P(Blur, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty); - EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, sss); + + EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, ""); } } @@ -264,34 +161,10 @@ TEST_P(Blur, Mat) ///////////////////////////////////////////////////////////////////////////////////////////////// //Laplacian - -PARAM_TEST_CASE(LaplacianTestBase, MatType, int) +struct Laplacian : FilterTestBase { int type; - int ksize; - - //src mat - cv::Mat mat; - cv::Mat dst; - - // set up roi - int roicols; - int roirows; - int srcx; - int srcy; - int dstx; - int dsty; - - //src mat with roi - cv::Mat mat_roi; - cv::Mat dst_roi; - - //ocl dst mat for testing - cv::ocl::oclMat gdst_whole; - - //ocl mat with roi - cv::ocl::oclMat gmat; - cv::ocl::oclMat gdst; + cv::Size ksize; virtual void SetUp() { @@ -301,58 +174,26 @@ PARAM_TEST_CASE(LaplacianTestBase, MatType, int) cv::RNG &rng = TS::ptr()->get_rng(); cv::Size size(MWIDTH, MHEIGHT); - mat = randomMat(rng, size, type, 5, 16, false); + mat1 = randomMat(rng, size, type, 5, 16, false); dst = randomMat(rng, size, type, 5, 16, false); } - void random_roi() - { -#ifdef RANDOMROI - //randomize ROI - cv::RNG &rng = TS::ptr()->get_rng(); - roicols = rng.uniform(2, mat.cols); - roirows = rng.uniform(2, mat.rows); - srcx = rng.uniform(0, mat.cols - roicols); - srcy = rng.uniform(0, mat.rows - roirows); - dstx = rng.uniform(0, dst.cols - roicols); - dsty = rng.uniform(0, dst.rows - roirows); -#else - roicols = mat.cols; - roirows = mat.rows; - srcx = 0; - srcy = 0; - dstx = 0; - dsty = 0; -#endif - - mat_roi = mat(Rect(srcx, srcy, roicols, roirows)); - dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - - gdst_whole = dst; - gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - - gmat = mat_roi; - } }; -struct Laplacian : LaplacianTestBase {}; - TEST_P(Laplacian, Accuracy) { for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::Laplacian(mat_roi, dst_roi, -1, ksize, 1); - cv::ocl::Laplacian(gmat, gdst, -1, ksize, 1); + cv::Laplacian(mat1_roi, dst_roi, -1, ksize.width, 1); + cv::ocl::Laplacian(gmat1, gdst, -1, ksize.width, 1); cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, srcx, srcy, dstx, dsty); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } } @@ -360,8 +201,7 @@ TEST_P(Laplacian, Accuracy) ///////////////////////////////////////////////////////////////////////////////////////////////// // erode & dilate - -PARAM_TEST_CASE(ErodeDilateBase, MatType, int) +struct ErodeDilate : FilterTestBase { int type; int iterations; @@ -369,33 +209,10 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, int) //erode or dilate kernel cv::Mat kernel; - //src mat - cv::Mat mat1; - cv::Mat dst; - - // set up roi - int roicols; - int roirows; - int src1x; - int src1y; - int dstx; - int dsty; - - //src mat with roi - cv::Mat mat1_roi; - cv::Mat dst_roi; - - //ocl dst mat for testing - cv::ocl::oclMat gdst_whole; - - //ocl mat with roi - cv::ocl::oclMat gmat1; - cv::ocl::oclMat gdst; - virtual void SetUp() { type = GET_PARAM(0); - iterations = GET_PARAM(1); + iterations = GET_PARAM(3); cv::RNG &rng = TS::ptr()->get_rng(); cv::Size size(MWIDTH, MHEIGHT); @@ -407,43 +224,11 @@ PARAM_TEST_CASE(ErodeDilateBase, MatType, int) } - void random_roi() - { -#ifdef RANDOMROI - //randomize ROI - cv::RNG &rng = TS::ptr()->get_rng(); - roicols = rng.uniform(2, mat1.cols); - roirows = rng.uniform(2, mat1.rows); - src1x = rng.uniform(0, mat1.cols - roicols); - src1y = rng.uniform(0, mat1.rows - roirows); - dstx = rng.uniform(0, dst.cols - roicols); - dsty = rng.uniform(0, dst.rows - roirows); -#else - roicols = mat1.cols; - roirows = mat1.rows; - src1x = 0; - src1y = 0; - dstx = 0; - dsty = 0; -#endif - - mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); - dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - - gdst_whole = dst; - gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - - - gmat1 = mat1_roi; - } - }; // erode -struct Erode : ErodeDilateBase {}; - -TEST_P(Erode, Mat) +TEST_P(ErodeDilate, Mat) { for(int j = 0; j < LOOP_TIMES; j++) { @@ -454,81 +239,39 @@ TEST_P(Erode, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } - -} - - - - - -// dilate - -struct Dilate : ErodeDilateBase {}; - -TEST_P(Dilate, Mat) -{ for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::erode(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations); - cv::ocl::erode(gmat1, gdst, kernel, Point(-1, -1), iterations); + cv::dilate(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations); + cv::ocl::dilate(gmat1, gdst, kernel, Point(-1, -1), iterations); cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); } - } - - ///////////////////////////////////////////////////////////////////////////////////////////////// // Sobel - -PARAM_TEST_CASE(Sobel, MatType, int, int, int, int) +struct Sobel : FilterTestBase { int type; int dx, dy, ksize, bordertype; - //src mat - cv::Mat mat1; - cv::Mat dst; - - // set up roi - int roicols; - int roirows; - int src1x; - int src1y; - int dstx; - int dsty; - - //src mat with roi - cv::Mat mat1_roi; - cv::Mat dst_roi; - - //ocl dst mat for testing - cv::ocl::oclMat gdst_whole; - - //ocl mat with roi - cv::ocl::oclMat gmat1; - cv::ocl::oclMat gdst; - virtual void SetUp() { type = GET_PARAM(0); - dx = GET_PARAM(1); - dy = GET_PARAM(2); - ksize = GET_PARAM(3); - bordertype = GET_PARAM(4); + Size s = GET_PARAM(1); + ksize = s.width; + s = GET_PARAM(2); + dx = s.width; + dy = s.height; + bordertype = GET_PARAM(3); cv::RNG &rng = TS::ptr()->get_rng(); @@ -538,36 +281,6 @@ PARAM_TEST_CASE(Sobel, MatType, int, int, int, int) dst = randomMat(rng, size, type, 5, 16, false); } - void random_roi() - { -#ifdef RANDOMROI - //randomize ROI - cv::RNG &rng = TS::ptr()->get_rng(); - roicols = rng.uniform(2, mat1.cols); - roirows = rng.uniform(2, mat1.rows); - src1x = rng.uniform(0, mat1.cols - roicols); - src1y = rng.uniform(0, mat1.rows - roirows); - dstx = rng.uniform(0, dst.cols - roicols); - dsty = rng.uniform(0, dst.rows - roirows); -#else - roicols = mat1.cols; - roirows = mat1.rows; - src1x = 0; - src1y = 0; - dstx = 0; - dsty = 0; -#endif - - mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); - dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - - gdst_whole = dst; - gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - - - gmat1 = mat1_roi; - } - }; TEST_P(Sobel, Mat) @@ -581,10 +294,8 @@ TEST_P(Sobel, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty); - EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); } } @@ -592,39 +303,17 @@ TEST_P(Sobel, Mat) ///////////////////////////////////////////////////////////////////////////////////////////////// // Scharr - -PARAM_TEST_CASE(Scharr, MatType, int, int, int) +struct Scharr : FilterTestBase { int type; int dx, dy, bordertype; - //src mat - cv::Mat mat1; - cv::Mat dst; - - // set up roi - int roicols; - int roirows; - int src1x; - int src1y; - int dstx; - int dsty; - - //src mat with roi - cv::Mat mat1_roi; - cv::Mat dst_roi; - //ocl dst mat for testing - cv::ocl::oclMat gdst_whole; - - //ocl mat with roi - cv::ocl::oclMat gmat1; - cv::ocl::oclMat gdst; - virtual void SetUp() { type = GET_PARAM(0); - dx = GET_PARAM(1); - dy = GET_PARAM(2); + Size s = GET_PARAM(2); + dx = s.width; + dy = s.height; bordertype = GET_PARAM(3); dx = 1; dy = 0; @@ -637,36 +326,6 @@ PARAM_TEST_CASE(Scharr, MatType, int, int, int) } - void random_roi() - { -#ifdef RANDOMROI - //randomize ROI - cv::RNG &rng = TS::ptr()->get_rng(); - roicols = rng.uniform(2, mat1.cols); - roirows = rng.uniform(2, mat1.rows); - src1x = rng.uniform(0, mat1.cols - roicols); - src1y = rng.uniform(0, mat1.rows - roirows); - dstx = rng.uniform(0, dst.cols - roicols); - dsty = rng.uniform(0, dst.rows - roirows); -#else - roicols = mat1.cols; - roirows = mat1.rows; - src1x = 0; - src1y = 0; - dstx = 0; - dsty = 0; -#endif - - mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); - dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - - gdst_whole = dst; - gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - - - gmat1 = mat1_roi; - } - }; TEST_P(Scharr, Mat) @@ -680,10 +339,8 @@ TEST_P(Scharr, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty); - EXPECT_MAT_NEAR(dst, cpu_dst, 1, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); } } @@ -691,42 +348,18 @@ TEST_P(Scharr, Mat) ///////////////////////////////////////////////////////////////////////////////////////////////// // GaussianBlur - -PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int) +struct GaussianBlur : FilterTestBase { int type; cv::Size ksize; int bordertype; - double sigma1, sigma2; - //src mat - cv::Mat mat1; - cv::Mat dst; - - // set up roi - int roicols; - int roirows; - int src1x; - int src1y; - int dstx; - int dsty; - - //src mat with roi - cv::Mat mat1_roi; - cv::Mat dst_roi; - //ocl dst mat for testing - cv::ocl::oclMat gdst_whole; - - //ocl mat with roi - cv::ocl::oclMat gmat1; - cv::ocl::oclMat gdst; - virtual void SetUp() { type = GET_PARAM(0); ksize = GET_PARAM(1); - bordertype = GET_PARAM(2); + bordertype = GET_PARAM(3); cv::RNG &rng = TS::ptr()->get_rng(); cv::Size size(MWIDTH, MHEIGHT); @@ -739,36 +372,6 @@ PARAM_TEST_CASE(GaussianBlur, MatType, cv::Size, int) } - void random_roi() - { -#ifdef RANDOMROI - //randomize ROI - cv::RNG &rng = TS::ptr()->get_rng(); - roicols = rng.uniform(2, mat1.cols); - roirows = rng.uniform(2, mat1.rows); - src1x = rng.uniform(0, mat1.cols - roicols); - src1y = rng.uniform(0, mat1.rows - roirows); - dstx = rng.uniform(0, dst.cols - roicols); - dsty = rng.uniform(0, dst.rows - roirows); -#else - roicols = mat1.cols; - roirows = mat1.rows; - src1x = 0; - src1y = 0; - dstx = 0; - dsty = 0; -#endif - - mat1_roi = mat1(Rect(src1x, src1y, roicols, roirows)); - dst_roi = dst(Rect(dstx, dsty, roicols, roirows)); - - gdst_whole = dst; - gdst = gdst_whole(Rect(dstx, dsty, roicols, roirows)); - - - gmat1 = mat1_roi; - } - }; TEST_P(GaussianBlur, Mat) @@ -782,47 +385,52 @@ TEST_P(GaussianBlur, Mat) cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, dstx, dsty); - EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, sss); + EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, ""); } } -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(Size(0, 0)), //not use 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( - Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4), - Values(1, 3))); - -INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1))); - -//INSTANTIATE_TEST_CASE_P(Filter, Erode, Combine(Values(CV_8UC1, CV_8UC1), Values(false))); - -INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), Values(1))); + Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4), + Values(Size(3, 3)), + Values(Size(0, 0)), //not use + Values(0))); //not use -//INSTANTIATE_TEST_CASE_P(Filter, Dilate, Combine(Values(CV_8UC1, CV_8UC1), Values(false))); +INSTANTIATE_TEST_CASE_P(Filter, ErodeDilate, Combine( + Values(CV_8UC1, CV_8UC4, CV_32FC1, CV_32FC4), + Values(Size(0, 0)), //not use + Values(Size(0, 0)), //not use + Values(1))); -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, - (MatType)cv::BORDER_REPLICATE))); +INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine( + Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC3, CV_32FC4), + Values(Size(3, 3), Size(5, 5)), + Values(Size(1, 0), Size(1, 1), Size(2, 0), Size(2, 1)), + Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); 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((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); + Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4), + Values(Size(0, 0)), //not use + Values(Size(0, 0), Size(0, 1), Size(1, 0), Size(1, 1)), + Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine( - Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4), - Values(cv::Size(3, 3), cv::Size(5, 5)), - Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); + Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4), + Values(Size(3, 3), Size(5, 5)), + Values(Size(0, 0)), //not use + Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); From 3928c1ee26deb3a51a1479225f04f4bdc7f5374d Mon Sep 17 00:00:00 2001 From: yao Date: Wed, 8 May 2013 15:21:53 +0800 Subject: [PATCH 31/49] add copyrights --- modules/ocl/test/test_blend.cpp | 44 +++++++++++++++++++ modules/ocl/test/test_brute_force_matcher.cpp | 14 +++--- modules/ocl/test/test_haar.cpp | 1 + modules/ocl/test/test_imgproc.cpp | 1 + modules/ocl/test/test_matrix_operation.cpp | 1 + modules/ocl/test/test_split_merge.cpp | 1 + 6 files changed, 57 insertions(+), 5 deletions(-) diff --git a/modules/ocl/test/test_blend.cpp b/modules/ocl/test/test_blend.cpp index fcc1925435..7e58303723 100644 --- a/modules/ocl/test/test_blend.cpp +++ b/modules/ocl/test/test_blend.cpp @@ -1,3 +1,47 @@ +/*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 +// Nathan, liujun@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" #include diff --git a/modules/ocl/test/test_brute_force_matcher.cpp b/modules/ocl/test/test_brute_force_matcher.cpp index d658c32d16..83182fe944 100644 --- a/modules/ocl/test/test_brute_force_matcher.cpp +++ b/modules/ocl/test/test_brute_force_matcher.cpp @@ -7,12 +7,16 @@ // copy or use the software. // // -// Intel License Agreement +// License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2010-2012, Multicoreware inc., all rights reserved. +// 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 +// Nathan, liujun@multicorewareinc.com +// // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // @@ -21,12 +25,12 @@ // // * Redistribution's in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. +// and/or other oclMaterials provided with the distribution. // -// * The name of Intel Corporation may not be used to endorse or promote products +// * 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 +// 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, diff --git a/modules/ocl/test/test_haar.cpp b/modules/ocl/test/test_haar.cpp index eab6769214..c28f6ddd97 100644 --- a/modules/ocl/test/test_haar.cpp +++ b/modules/ocl/test/test_haar.cpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors diff --git a/modules/ocl/test/test_imgproc.cpp b/modules/ocl/test/test_imgproc.cpp index 92e2ee9d4b..29e246adc2 100644 --- a/modules/ocl/test/test_imgproc.cpp +++ b/modules/ocl/test/test_imgproc.cpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors diff --git a/modules/ocl/test/test_matrix_operation.cpp b/modules/ocl/test/test_matrix_operation.cpp index cfcafbcfc2..654e1a61f3 100644 --- a/modules/ocl/test/test_matrix_operation.cpp +++ b/modules/ocl/test/test_matrix_operation.cpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors diff --git a/modules/ocl/test/test_split_merge.cpp b/modules/ocl/test/test_split_merge.cpp index 5543bbac41..2d60b2830b 100644 --- a/modules/ocl/test/test_split_merge.cpp +++ b/modules/ocl/test/test_split_merge.cpp @@ -12,6 +12,7 @@ // // Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. // Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // // @Authors From 1a53e2cfb20cde771f29d8e6a9c66656be014146 Mon Sep 17 00:00:00 2001 From: yao Date: Wed, 8 May 2013 15:27:35 +0800 Subject: [PATCH 32/49] remove interpolation.hpp --- modules/ocl/test/interpolation.hpp | 120 ----------------------------- modules/ocl/test/precomp.hpp | 1 - 2 files changed, 121 deletions(-) delete mode 100644 modules/ocl/test/interpolation.hpp diff --git a/modules/ocl/test/interpolation.hpp b/modules/ocl/test/interpolation.hpp deleted file mode 100644 index fb89e701d7..0000000000 --- a/modules/ocl/test/interpolation.hpp +++ /dev/null @@ -1,120 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// Intel License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000, Intel Corporation, all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of Intel Corporation may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ - -#ifndef __OPENCV_TEST_INTERPOLATION_HPP__ -#define __OPENCV_TEST_INTERPOLATION_HPP__ - -template T readVal(const cv::Mat &src, int y, int x, int c, int border_type, cv::Scalar borderVal = cv::Scalar()) -{ - if (border_type == cv::BORDER_CONSTANT) - return (y >= 0 && y < src.rows && x >= 0 && x < src.cols) ? src.at(y, x * src.channels() + c) : cv::saturate_cast(borderVal.val[c]); - - return src.at(cv::borderInterpolate(y, src.rows, border_type), cv::borderInterpolate(x, src.cols, border_type) * src.channels() + c); -} - -template struct NearestInterpolator -{ - static T getValue(const cv::Mat &src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar()) - { - return readVal(src, cvFloor(y), cvFloor(x), c, border_type, borderVal); - } -}; - -template struct LinearInterpolator -{ - static T getValue(const cv::Mat &src, float y, float x, int c, int border_type, cv::Scalar borderVal = cv::Scalar()) - { - x -= 0.5f; - y -= 0.5f; - - int x1 = cvFloor(x); - int y1 = cvFloor(y); - int x2 = x1 + 1; - int y2 = y1 + 1; - - float res = 0; - - res += readVal(src, y1, x1, c, border_type, borderVal) * ((x2 - x) * (y2 - y)); - res += readVal(src, y1, x2, c, border_type, borderVal) * ((x - x1) * (y2 - y)); - res += readVal(src, y2, x1, c, border_type, borderVal) * ((x2 - x) * (y - y1)); - res += readVal(src, y2, x2, c, border_type, borderVal) * ((x - x1) * (y - y1)); - - return cv::saturate_cast(res); - } -}; - -template struct CubicInterpolator -{ - 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]))); - } - - static float getValue(float p[4][4], float x, float y) - { - float arr[4]; - - arr[0] = getValue(p[0], x); - arr[1] = getValue(p[1], x); - arr[2] = getValue(p[2], x); - arr[3] = getValue(p[3], x); - - 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()) - { - int ix = cvRound(x); - int iy = cvRound(y); - - float vals[4][4] = - { - {readVal(src, iy - 2, ix - 2, c, border_type, borderVal), readVal(src, iy - 2, ix - 1, c, border_type, borderVal), readVal(src, iy - 2, ix, c, border_type, borderVal), readVal(src, iy - 2, ix + 1, c, border_type, borderVal)}, - {readVal(src, iy - 1, ix - 2, c, border_type, borderVal), readVal(src, iy - 1, ix - 1, c, border_type, borderVal), readVal(src, iy - 1, ix, c, border_type, borderVal), readVal(src, iy - 1, ix + 1, c, border_type, borderVal)}, - {readVal(src, iy , ix - 2, c, border_type, borderVal), readVal(src, iy , ix - 1, c, border_type, borderVal), readVal(src, iy , ix, c, border_type, borderVal), readVal(src, iy , ix + 1, c, border_type, borderVal)}, - {readVal(src, iy + 1, ix - 2, c, border_type, borderVal), readVal(src, iy + 1, ix - 1, c, border_type, borderVal), readVal(src, iy + 1, ix, c, border_type, borderVal), readVal(src, iy + 1, ix + 1, c, border_type, borderVal)}, - }; - - return cv::saturate_cast(getValue(vals, (x - ix + 2.0) / 4.0, (y - iy + 2.0) / 4.0)); - } -}; - -#endif // __OPENCV_TEST_INTERPOLATION_HPP__ diff --git a/modules/ocl/test/precomp.hpp b/modules/ocl/test/precomp.hpp index eec938ee81..090c9b3d3e 100644 --- a/modules/ocl/test/precomp.hpp +++ b/modules/ocl/test/precomp.hpp @@ -71,7 +71,6 @@ #include "opencv2/ocl/ocl.hpp" #include "utility.hpp" -#include "interpolation.hpp" //#include "add_test_info.h" #endif From 35c6860f061fe8fae1597978499fac31c26d4a71 Mon Sep 17 00:00:00 2001 From: yao Date: Wed, 8 May 2013 16:08:33 +0800 Subject: [PATCH 33/49] further simplify the logics in filter tests --- modules/ocl/test/test_filters.cpp | 123 +++++++----------------------- 1 file changed, 28 insertions(+), 95 deletions(-) diff --git a/modules/ocl/test/test_filters.cpp b/modules/ocl/test/test_filters.cpp index dbca326937..cf36360a56 100644 --- a/modules/ocl/test/test_filters.cpp +++ b/modules/ocl/test/test_filters.cpp @@ -116,6 +116,19 @@ PARAM_TEST_CASE(FilterTestBase, gmat1 = mat1_roi; } + void Init(int mat_type) + { + cv::Size size(MWIDTH, MHEIGHT); + mat1 = randomMat(size, mat_type, 5, 16); + dst = randomMat(size, mat_type, 5, 16); + } + + void Near(double threshold) + { + cv::Mat cpu_dst; + gdst_whole.download(cpu_dst); + EXPECT_MAT_NEAR(dst, cpu_dst, threshold, ""); + } }; ///////////////////////////////////////////////////////////////////////////////////////////////// @@ -131,12 +144,7 @@ struct Blur : FilterTestBase type = GET_PARAM(0); ksize = GET_PARAM(1); bordertype = GET_PARAM(3); - - cv::RNG &rng = TS::ptr()->get_rng(); - cv::Size size(MWIDTH, MHEIGHT); - - mat1 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); + Init(type); } }; @@ -145,20 +153,13 @@ TEST_P(Blur, Mat) for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::blur(mat1_roi, dst_roi, ksize, Point(-1, -1), bordertype); cv::ocl::blur(gmat1, gdst, ksize, Point(-1, -1), bordertype); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, ""); + Near(1.0); } - } - ///////////////////////////////////////////////////////////////////////////////////////////////// //Laplacian struct Laplacian : FilterTestBase @@ -170,15 +171,8 @@ struct Laplacian : FilterTestBase { type = GET_PARAM(0); ksize = GET_PARAM(1); - - cv::RNG &rng = TS::ptr()->get_rng(); - cv::Size size(MWIDTH, MHEIGHT); - - mat1 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); - + Init(type); } - }; TEST_P(Laplacian, Accuracy) @@ -186,14 +180,9 @@ TEST_P(Laplacian, Accuracy) for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::Laplacian(mat1_roi, dst_roi, -1, ksize.width, 1); cv::ocl::Laplacian(gmat1, gdst, -1, ksize.width, 1); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -213,45 +202,28 @@ struct ErodeDilate : FilterTestBase { type = GET_PARAM(0); iterations = GET_PARAM(3); - - cv::RNG &rng = TS::ptr()->get_rng(); - cv::Size size(MWIDTH, MHEIGHT); - - mat1 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); + Init(type); // 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(Size(3, 3), CV_8UC1, 0, 3); } }; -// erode - TEST_P(ErodeDilate, Mat) { for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::erode(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations); cv::ocl::erode(gmat1, gdst, kernel, Point(-1, -1), iterations); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); cv::dilate(mat1_roi, dst_roi, kernel, Point(-1, -1), iterations); cv::ocl::dilate(gmat1, gdst, kernel, Point(-1, -1), iterations); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -272,15 +244,8 @@ struct Sobel : FilterTestBase dx = s.width; dy = s.height; bordertype = GET_PARAM(3); - - - cv::RNG &rng = TS::ptr()->get_rng(); - cv::Size size(MWIDTH, MHEIGHT); - - mat1 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); + Init(type); } - }; TEST_P(Sobel, Mat) @@ -288,16 +253,10 @@ TEST_P(Sobel, Mat) for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::Sobel(mat1_roi, dst_roi, -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); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); + Near(1); } - } @@ -315,17 +274,8 @@ struct Scharr : FilterTestBase dx = s.width; dy = s.height; bordertype = GET_PARAM(3); - dx = 1; - dy = 0; - - cv::RNG &rng = TS::ptr()->get_rng(); - cv::Size size(MWIDTH, MHEIGHT); - - mat1 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); - + Init(type); } - }; TEST_P(Scharr, Mat) @@ -333,14 +283,9 @@ TEST_P(Scharr, Mat) for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::Scharr(mat1_roi, dst_roi, -1, dx, dy, /*scale*/1,/*delta*/0, bordertype); cv::ocl::Scharr(gmat1, gdst, -1, dx, dy,/*scale*/1,/*delta*/0, bordertype); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); + Near(1); } } @@ -360,18 +305,11 @@ struct GaussianBlur : FilterTestBase type = GET_PARAM(0); ksize = GET_PARAM(1); bordertype = GET_PARAM(3); - + Init(type); cv::RNG &rng = TS::ptr()->get_rng(); - cv::Size size(MWIDTH, MHEIGHT); - sigma1 = rng.uniform(0.1, 1.0); sigma2 = rng.uniform(0.1, 1.0); - - mat1 = randomMat(rng, size, type, 5, 16, false); - dst = randomMat(rng, size, type, 5, 16, false); - } - }; TEST_P(GaussianBlur, Mat) @@ -379,14 +317,9 @@ TEST_P(GaussianBlur, Mat) for(int j = 0; j < LOOP_TIMES; j++) { random_roi(); - cv::GaussianBlur(mat1_roi, dst_roi, ksize, sigma1, sigma2, bordertype); cv::ocl::GaussianBlur(gmat1, gdst, ksize, sigma1, sigma2, bordertype); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1.0, ""); + Near(1); } } @@ -423,7 +356,7 @@ INSTANTIATE_TEST_CASE_P(Filter, Sobel, Combine( INSTANTIATE_TEST_CASE_P(Filter, Scharr, Combine( Values(CV_8UC1, CV_8UC3, CV_8UC4, CV_32FC1, CV_32FC4), Values(Size(0, 0)), //not use - Values(Size(0, 0), Size(0, 1), Size(1, 0), Size(1, 1)), + Values(Size(0, 1), Size(1, 0)), Values((MatType)cv::BORDER_CONSTANT, (MatType)cv::BORDER_REPLICATE))); INSTANTIATE_TEST_CASE_P(Filter, GaussianBlur, Combine( From b6313951dce1900b201b1fac6919d668f5b06d91 Mon Sep 17 00:00:00 2001 From: yao Date: Wed, 8 May 2013 17:07:44 +0800 Subject: [PATCH 34/49] use clean EXPECT_MAT_NEAR (no string output) --- modules/ocl/test/test_arithm.cpp | 286 +++++++----------------------- modules/ocl/test/test_blend.cpp | 2 +- modules/ocl/test/test_calib3d.cpp | 2 +- modules/ocl/test/test_color.cpp | 6 +- modules/ocl/test/test_filters.cpp | 2 +- modules/ocl/test/test_hog.cpp | 3 +- modules/ocl/test/test_imgproc.cpp | 138 ++++---------- modules/ocl/test/utility.hpp | 8 +- 8 files changed, 108 insertions(+), 339 deletions(-) diff --git a/modules/ocl/test/test_arithm.cpp b/modules/ocl/test/test_arithm.cpp index e23b3d104a..9b9cec9381 100644 --- a/modules/ocl/test/test_arithm.cpp +++ b/modules/ocl/test/test_arithm.cpp @@ -172,14 +172,26 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) gmask = mask_roi; //end } + void Near(double threshold = 0.) + { + cv::Mat cpu_dst; + gdst_whole.download(cpu_dst); + EXPECT_MAT_NEAR(dst, cpu_dst, threshold); + } + + void Near1(double threshold = 0.) + { + cv::Mat cpu_dst1; + gdst1_whole.download(cpu_dst1); + EXPECT_MAT_NEAR(dst1, cpu_dst1, threshold); + } + }; ////////////////////////////////lut///////////////////////////////////////////////// - struct Lut : ArithmTestBase {}; #define VARNAME(A) string(#A); - TEST_P(Lut, Mat) { @@ -200,10 +212,7 @@ TEST_P(Lut, Mat) cv::LUT(mat1_roi, mat2_roi, dst_roi); cv::ocl::LUT(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download (cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0, ""); + Near(0); } } @@ -219,12 +228,7 @@ TEST_P(Exp, Mat) cv::exp(mat1_roi, dst_roi); cv::ocl::exp(gmat1, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 2, ""); - + Near(2); } } @@ -240,10 +244,7 @@ TEST_P(Log, Mat) cv::log(mat1_roi, dst_roi); cv::ocl::log(gmat1, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); + Near(1); } } @@ -259,10 +260,7 @@ TEST_P(Add, Mat) cv::add(mat1_roi, mat2_roi, dst_roi); cv::ocl::add(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -274,12 +272,10 @@ TEST_P(Add, Mat_Mask) cv::add(mat1_roi, mat2_roi, dst_roi, mask_roi); cv::ocl::add(gmat1, gmat2, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } + TEST_P(Add, Scalar) { for(int j = 0; j < LOOP_TIMES; j++) @@ -288,10 +284,7 @@ TEST_P(Add, Scalar) cv::add(mat1_roi, val, dst_roi); cv::ocl::add(gmat1, val, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -303,10 +296,7 @@ TEST_P(Add, Scalar_Mask) cv::add(mat1_roi, val, dst_roi, mask_roi); cv::ocl::add(gmat1, val, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -323,10 +313,7 @@ TEST_P(Sub, Mat) cv::subtract(mat1_roi, mat2_roi, dst_roi); cv::ocl::subtract(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -338,10 +325,7 @@ TEST_P(Sub, Mat_Mask) cv::subtract(mat1_roi, mat2_roi, dst_roi, mask_roi); cv::ocl::subtract(gmat1, gmat2, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -353,10 +337,7 @@ TEST_P(Sub, Scalar) cv::subtract(mat1_roi, val, dst_roi); cv::ocl::subtract(gmat1, val, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -368,10 +349,7 @@ TEST_P(Sub, Scalar_Mask) cv::subtract(mat1_roi, val, dst_roi, mask_roi); cv::ocl::subtract(gmat1, val, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -388,10 +366,7 @@ TEST_P(Mul, Mat) cv::multiply(mat1_roi, mat2_roi, dst_roi); cv::ocl::multiply(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -406,10 +381,7 @@ TEST_P(Mul, Mat_Scalar) cv::multiply(mat1_roi, mat2_roi, dst_roi, s); cv::ocl::multiply(gmat1, gmat2, gdst, s); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.001, ""); + Near(.001); } } @@ -425,10 +397,7 @@ TEST_P(Div, Mat) cv::divide(mat1_roi, mat2_roi, dst_roi); cv::ocl::divide(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); + Near(1); } } @@ -443,10 +412,7 @@ TEST_P(Div, Mat_Scalar) cv::divide(mat1_roi, mat2_roi, dst_roi, s); cv::ocl::divide(gmat1, gmat2, gdst, s); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.001, ""); + Near(.001); } } @@ -461,10 +427,7 @@ TEST_P(Absdiff, Mat) cv::absdiff(mat1_roi, mat2_roi, dst_roi); cv::ocl::absdiff(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 0, ""); + Near(0); } } @@ -476,10 +439,7 @@ TEST_P(Absdiff, Mat_Scalar) cv::absdiff(mat1_roi, val, dst_roi); cv::ocl::absdiff(gmat1, val, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -495,14 +455,8 @@ TEST_P(CartToPolar, angleInDegree) cv::cartToPolar(mat1_roi, mat2_roi, dst_roi, dst1_roi, 1); cv::ocl::cartToPolar(gmat1, gmat2, gdst, gdst1, 1); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - cv::Mat cpu_dst1; - gdst1_whole.download(cpu_dst1); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); + Near(.5); + Near1(.5); } } @@ -514,14 +468,8 @@ TEST_P(CartToPolar, angleInRadians) cv::cartToPolar(mat1_roi, mat2_roi, dst_roi, dst1_roi, 0); cv::ocl::cartToPolar(gmat1, gmat2, gdst, gdst1, 0); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - cv::Mat cpu_dst1; - gdst1_whole.download(cpu_dst1); - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); + Near(.5); + Near1(.5); } } @@ -536,15 +484,8 @@ TEST_P(PolarToCart, angleInDegree) cv::polarToCart(mat1_roi, mat2_roi, dst_roi, dst1_roi, 1); cv::ocl::polarToCart(gmat1, gmat2, gdst, gdst1, 1); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - cv::Mat cpu_dst1; - gdst1_whole.download(cpu_dst1); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); + Near(.5); + Near1(.5); } } @@ -556,15 +497,8 @@ TEST_P(PolarToCart, angleInRadians) cv::polarToCart(mat1_roi, mat2_roi, dst_roi, dst1_roi, 0); cv::ocl::polarToCart(gmat1, gmat2, gdst, gdst1, 0); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - cv::Mat cpu_dst1; - gdst1_whole.download(cpu_dst1); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.5, ""); - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.5, ""); + Near(.5); + Near1(.5); } } @@ -581,11 +515,7 @@ TEST_P(Magnitude, Mat) cv::magnitude(mat1_roi, mat2_roi, dst_roi); cv::ocl::magnitude(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -600,16 +530,11 @@ TEST_P(Transpose, Mat) cv::transpose(mat1_roi, dst_roi); cv::ocl::transpose(gmat1, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } - struct Flip : ArithmTestBase {}; TEST_P(Flip, X) @@ -620,11 +545,7 @@ TEST_P(Flip, X) cv::flip(mat1_roi, dst_roi, 0); cv::ocl::flip(gmat1, gdst, 0); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -636,11 +557,7 @@ TEST_P(Flip, Y) cv::flip(mat1_roi, dst_roi, 1); cv::ocl::flip(gmat1, gdst, 1); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -652,11 +569,7 @@ TEST_P(Flip, BOTH) cv::flip(mat1_roi, dst_roi, -1); cv::ocl::flip(gmat1, gdst, -1); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -1016,11 +929,7 @@ TEST_P(Phase, Mat) random_roi(); cv::phase(mat1_roi, mat2_roi, dst_roi, angelInDegrees ? true : false); cv::ocl::phase(gmat1, gmat2, gdst, angelInDegrees ? true : false); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-2, ""); + Near(1e-2); } } } @@ -1037,11 +946,7 @@ TEST_P(Bitwise_and, Mat) cv::bitwise_and(mat1_roi, mat2_roi, dst_roi); cv::ocl::bitwise_and(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -1053,13 +958,10 @@ TEST_P(Bitwise_and, Mat_Mask) cv::bitwise_and(mat1_roi, mat2_roi, dst_roi, mask_roi); cv::ocl::bitwise_and(gmat1, gmat2, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } + TEST_P(Bitwise_and, Scalar) { for(int j = 0; j < LOOP_TIMES; j++) @@ -1068,12 +970,7 @@ TEST_P(Bitwise_and, Scalar) cv::bitwise_and(mat1_roi, val, dst_roi); cv::ocl::bitwise_and(gmat1, val, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); - + Near(1e-5); } } @@ -1085,11 +982,7 @@ TEST_P(Bitwise_and, Scalar_Mask) cv::bitwise_and(mat1_roi, val, dst_roi, mask_roi); cv::ocl::bitwise_and(gmat1, val, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -1107,11 +1000,7 @@ TEST_P(Bitwise_or, Mat) cv::bitwise_or(mat1_roi, mat2_roi, dst_roi); cv::ocl::bitwise_or(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -1123,13 +1012,10 @@ TEST_P(Bitwise_or, Mat_Mask) cv::bitwise_or(mat1_roi, mat2_roi, dst_roi, mask_roi); cv::ocl::bitwise_or(gmat1, gmat2, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } + TEST_P(Bitwise_or, Scalar) { for(int j = 0; j < LOOP_TIMES; j++) @@ -1138,11 +1024,7 @@ TEST_P(Bitwise_or, Scalar) cv::bitwise_or(mat1_roi, val, dst_roi); cv::ocl::bitwise_or(gmat1, val, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -1154,11 +1036,7 @@ TEST_P(Bitwise_or, Scalar_Mask) cv::bitwise_or(mat1_roi, val, dst_roi, mask_roi); cv::ocl::bitwise_or(gmat1, val, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -1176,11 +1054,7 @@ TEST_P(Bitwise_xor, Mat) cv::bitwise_xor(mat1_roi, mat2_roi, dst_roi); cv::ocl::bitwise_xor(gmat1, gmat2, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -1192,13 +1066,10 @@ TEST_P(Bitwise_xor, Mat_Mask) cv::bitwise_xor(mat1_roi, mat2_roi, dst_roi, mask_roi); cv::ocl::bitwise_xor(gmat1, gmat2, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } + TEST_P(Bitwise_xor, Scalar) { for(int j = 0; j < LOOP_TIMES; j++) @@ -1207,11 +1078,7 @@ TEST_P(Bitwise_xor, Scalar) cv::bitwise_xor(mat1_roi, val, dst_roi); cv::ocl::bitwise_xor(gmat1, val, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -1223,11 +1090,7 @@ TEST_P(Bitwise_xor, Scalar_Mask) cv::bitwise_xor(mat1_roi, val, dst_roi, mask_roi); cv::ocl::bitwise_xor(gmat1, val, gdst, gmask); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } @@ -1244,11 +1107,7 @@ TEST_P(Bitwise_not, Mat) cv::bitwise_not(mat1_roi, dst_roi); cv::ocl::bitwise_not(gmat1, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -1277,11 +1136,7 @@ TEST_P(Compare, Mat) cv::compare(mat1_roi, mat2_roi, dst_roi, cmp_codes[i]); cv::ocl::compare(gmat1, gmat2, gdst, cmp_codes[i]); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, ""); + Near(0); } } @@ -1303,11 +1158,7 @@ TEST_P(Pow, Mat) double p = 4.5; cv::pow(mat1_roi, p, dst_roi); cv::ocl::pow(gmat1, p, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); + Near(1); } } @@ -1344,7 +1195,7 @@ TEST_P(MagnitudeSqr, Mat) cv::Mat cpu_dst; cldst.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, 1, ""); + EXPECT_MAT_NEAR(dst, cpu_dst, 1); } } @@ -1365,18 +1216,13 @@ TEST_P(AddWeighted, Mat) cv::ocl::addWeighted(gmat1, alpha, gmat2, beta, gama, gdst); - - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1e-5, ""); + Near(1e-5); } } - //********test**************** INSTANTIATE_TEST_CASE_P(Arithm, Lut, Combine( diff --git a/modules/ocl/test/test_blend.cpp b/modules/ocl/test/test_blend.cpp index 7e58303723..292353be60 100644 --- a/modules/ocl/test/test_blend.cpp +++ b/modules/ocl/test/test_blend.cpp @@ -109,7 +109,7 @@ TEST_P(Blend, Accuracy) else blendLinearGold(img1, img2, weights1, weights2, result_gold); - EXPECT_MAT_NEAR(result_gold, result, CV_MAT_DEPTH(type) == CV_8U ? 1.f : 1e-5f, 0); + EXPECT_MAT_NEAR(result_gold, result, CV_MAT_DEPTH(type) == CV_8U ? 1.f : 1e-5f); } INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Blend, Combine( diff --git a/modules/ocl/test/test_calib3d.cpp b/modules/ocl/test/test_calib3d.cpp index 179829e0e6..4c635682c9 100644 --- a/modules/ocl/test/test_calib3d.cpp +++ b/modules/ocl/test/test_calib3d.cpp @@ -129,7 +129,7 @@ TEST_P(StereoMatchBP, Regression) bp(d_left, d_right, d_disp); d_disp.download(disp); disp.convertTo(disp, disp_gold.depth()); - EXPECT_MAT_NEAR(disp_gold, disp, 0.0, ""); + EXPECT_MAT_NEAR(disp_gold, disp, 0.0); } INSTANTIATE_TEST_CASE_P(OCL_Calib3D, StereoMatchBP, testing::Combine(testing::Values(64), testing::Values(8),testing::Values(2),testing::Values(25.0f), diff --git a/modules/ocl/test/test_color.cpp b/modules/ocl/test/test_color.cpp index 202967b7a6..9748104de6 100644 --- a/modules/ocl/test/test_color.cpp +++ b/modules/ocl/test/test_color.cpp @@ -100,7 +100,7 @@ PARAM_TEST_CASE(CvtColor, cv::Size, MatDepth) cv::cvtColor(src, dst_gold, CVTCODE(name));\ cv::Mat dst_mat;\ dst.download(dst_mat);\ - EXPECT_MAT_NEAR(dst_gold, dst_mat, 1e-5, "");\ + EXPECT_MAT_NEAR(dst_gold, dst_mat, 1e-5);\ } //add new ones here using macro @@ -141,7 +141,7 @@ TEST_P(CvtColor_Gray2RGB, Accuracy) cv::cvtColor(src, dst_gold, code); cv::Mat dst_mat; dst.download(dst_mat); - EXPECT_MAT_NEAR(dst_gold, dst_mat, 1e-5, ""); + EXPECT_MAT_NEAR(dst_gold, dst_mat, 1e-5); } @@ -171,7 +171,7 @@ TEST_P(CvtColor_YUV420, Accuracy) cv::Mat dst_mat; dst.download(dst_mat); MAT_DIFF(dst_mat, dst_gold); - EXPECT_MAT_NEAR(dst_gold, dst_mat, 1e-5, ""); + EXPECT_MAT_NEAR(dst_gold, dst_mat, 1e-5); } INSTANTIATE_TEST_CASE_P(OCL_ImgProc, CvtColor, testing::Combine( diff --git a/modules/ocl/test/test_filters.cpp b/modules/ocl/test/test_filters.cpp index cf36360a56..316076cc35 100644 --- a/modules/ocl/test/test_filters.cpp +++ b/modules/ocl/test/test_filters.cpp @@ -127,7 +127,7 @@ PARAM_TEST_CASE(FilterTestBase, { cv::Mat cpu_dst; gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, threshold, ""); + EXPECT_MAT_NEAR(dst, cpu_dst, threshold); } }; diff --git a/modules/ocl/test/test_hog.cpp b/modules/ocl/test/test_hog.cpp index 02cfe65b8a..c95c25fe95 100644 --- a/modules/ocl/test/test_hog.cpp +++ b/modules/ocl/test/test_hog.cpp @@ -240,8 +240,7 @@ TEST_P(HOG, Detect) } } - 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); } diff --git a/modules/ocl/test/test_imgproc.cpp b/modules/ocl/test/test_imgproc.cpp index 29e246adc2..664f8a3919 100644 --- a/modules/ocl/test/test_imgproc.cpp +++ b/modules/ocl/test/test_imgproc.cpp @@ -442,6 +442,13 @@ PARAM_TEST_CASE(ImgprocTestBase, MatType, MatType, MatType, MatType, MatType, bo clmask_roi = clmask(Rect(maskx, masky, roicols, roirows)); } } + + void Near(double threshold) + { + cv::Mat cpu_cldst; + cldst.download(cpu_cldst); + EXPECT_MAT_NEAR(dst, cpu_cldst, threshold); + } }; ////////////////////////////////equalizeHist////////////////////////////////////////// @@ -461,11 +468,7 @@ TEST_P(equalizeHist, Mat) random_roi(); cv::equalizeHist(mat1_roi, dst_roi); cv::ocl::equalizeHist(clmat1_roi, cldst_roi); - cv::Mat cpu_cldst; - cldst.download(cpu_cldst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x=%d,src1y=%d,dstx=%d,dsty=%d,dst1x=%d,dst1y=%d,maskx=%d,masky=%d,src2x=%d,src2y=%d", roicols, roirows, src1x, src1y, dstx, dsty, dst1x, dst1y, maskx, masky, src2x, src2y); - EXPECT_MAT_NEAR(dst, cpu_cldst, 1.1, sss); + Near(1.1); } } } @@ -485,7 +488,7 @@ TEST_P(bilateralFilter, Mat) int d = 2 * radius + 1; double sigmaspace = 20.0; 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.depth() != CV_8U || mat1.type() != dst.type()) { @@ -514,25 +517,7 @@ TEST_P(bilateralFilter, Mat) 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::Mat cpu_cldst; - cldst.download(cpu_cldst); - - - 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]); - //for(int i=0;i(i,j)!=cpu_cldst.at(i,j)) - // cout<< i <<" "<< j <<" "<< (int)dst.at(i,j)<<" "<< (int)cpu_cldst.at(i,j)<<" "; - // } - // cout<get_rng(); int top = rng.uniform(0, 10); int bottom = rng.uniform(0, 10); @@ -584,24 +569,12 @@ TEST_P(CopyMakeBorder, Mat) cv::Mat cpu_cldst; #ifndef RANDOMROI cldst_roi.download(cpu_cldst); + EXPECT_MAT_NEAR(dst_roi, cpu_cldst, 0.0); #else cldst.download(cpu_cldst); + EXPECT_MAT_NEAR(dst, cpu_cldst, 0.0); #endif - 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]); -#ifndef RANDOMROI - EXPECT_MAT_NEAR(dst_roi, cpu_cldst, 0.0, sss); -#else - //for(int i=0;i(i,j)<<" "; - //} - //cout< Date: Wed, 8 May 2013 17:29:24 +0800 Subject: [PATCH 35/49] Optimize stereobm a bit. Speedup about 30% on 6730M GPU. --- modules/ocl/src/opencl/stereobm.cl | 82 ++++++++++++++++-------------- 1 file changed, 43 insertions(+), 39 deletions(-) diff --git a/modules/ocl/src/opencl/stereobm.cl b/modules/ocl/src/opencl/stereobm.cl index ea983df01b..bd86a7f3fb 100644 --- a/modules/ocl/src/opencl/stereobm.cl +++ b/modules/ocl/src/opencl/stereobm.cl @@ -60,8 +60,9 @@ unsigned int CalcSSD(__local unsigned int *col_ssd) { unsigned int cache = col_ssd[0]; - for(int i = 1, j = radius + 1; i <= radius; i++, j++) - cache += col_ssd[i] + col_ssd[j]; +#pragma unroll + for(int i = 1; i <= (radius << 1); i++) + cache += col_ssd[i]; return cache; } @@ -69,20 +70,22 @@ unsigned int CalcSSD(__local unsigned int *col_ssd) uint2 MinSSD(__local unsigned int *col_ssd) { unsigned int ssd[N_DISPARITIES]; - - //See above: #define COL_SSD_SIZE (BLOCK_W + 2 * radius) - ssd[0] = CalcSSD(col_ssd + 0 * (BLOCK_W + 2 * radius)); - ssd[1] = CalcSSD(col_ssd + 1 * (BLOCK_W + 2 * radius)); - ssd[2] = CalcSSD(col_ssd + 2 * (BLOCK_W + 2 * radius)); - ssd[3] = CalcSSD(col_ssd + 3 * (BLOCK_W + 2 * radius)); - ssd[4] = CalcSSD(col_ssd + 4 * (BLOCK_W + 2 * radius)); - ssd[5] = CalcSSD(col_ssd + 5 * (BLOCK_W + 2 * radius)); - ssd[6] = CalcSSD(col_ssd + 6 * (BLOCK_W + 2 * radius)); - ssd[7] = CalcSSD(col_ssd + 7 * (BLOCK_W + 2 * radius)); + const int win_size = (radius << 1); + + //See above: #define COL_SSD_SIZE (BLOCK_W + WIN_SIZE) + ssd[0] = CalcSSD(col_ssd + 0 * (BLOCK_W + win_size)); + ssd[1] = CalcSSD(col_ssd + 1 * (BLOCK_W + win_size)); + ssd[2] = CalcSSD(col_ssd + 2 * (BLOCK_W + win_size)); + ssd[3] = CalcSSD(col_ssd + 3 * (BLOCK_W + win_size)); + ssd[4] = CalcSSD(col_ssd + 4 * (BLOCK_W + win_size)); + ssd[5] = CalcSSD(col_ssd + 5 * (BLOCK_W + win_size)); + ssd[6] = CalcSSD(col_ssd + 6 * (BLOCK_W + win_size)); + ssd[7] = CalcSSD(col_ssd + 7 * (BLOCK_W + win_size)); unsigned int mssd = min(min(min(ssd[0], ssd[1]), min(ssd[4], ssd[5])), min(min(ssd[2], ssd[3]), min(ssd[6], ssd[7]))); int bestIdx = 0; + for (int i = 0; i < N_DISPARITIES; i++) { if (mssd == ssd[i]) @@ -100,14 +103,15 @@ void StepDown(int idx1, int idx2, __global unsigned char* imageL, uint8 diff1 = (uint8)(imageL[idx1]) - imgR1; uint8 diff2 = (uint8)(imageL[idx2]) - imgR2; uint8 res = diff2 * diff2 - diff1 * diff1; - col_ssd[0 * (BLOCK_W + 2 * radius)] += res.s7; - col_ssd[1 * (BLOCK_W + 2 * radius)] += res.s6; - col_ssd[2 * (BLOCK_W + 2 * radius)] += res.s5; - col_ssd[3 * (BLOCK_W + 2 * radius)] += res.s4; - col_ssd[4 * (BLOCK_W + 2 * radius)] += res.s3; - col_ssd[5 * (BLOCK_W + 2 * radius)] += res.s2; - col_ssd[6 * (BLOCK_W + 2 * radius)] += res.s1; - col_ssd[7 * (BLOCK_W + 2 * radius)] += res.s0; + const int win_size = (radius << 1); + col_ssd[0 * (BLOCK_W + win_size)] += res.s7; + col_ssd[1 * (BLOCK_W + win_size)] += res.s6; + col_ssd[2 * (BLOCK_W + win_size)] += res.s5; + col_ssd[3 * (BLOCK_W + win_size)] += res.s4; + col_ssd[4 * (BLOCK_W + win_size)] += res.s3; + col_ssd[5 * (BLOCK_W + win_size)] += res.s2; + col_ssd[6 * (BLOCK_W + win_size)] += res.s1; + col_ssd[7 * (BLOCK_W + win_size)] += res.s0; } void InitColSSD(int x_tex, int y_tex, int im_pitch, __global unsigned char* imageL, @@ -115,28 +119,27 @@ void InitColSSD(int x_tex, int y_tex, int im_pitch, __global unsigned char* imag __local unsigned int *col_ssd) { uint8 leftPixel1; - int idx; uint8 diffa = 0; - - for(int i = 0; i < (2 * radius + 1); i++) + int idx = y_tex * im_pitch + x_tex; + const int win_size = (radius << 1); + for(int i = 0; i < (win_size + 1); i++) { - idx = y_tex * im_pitch + x_tex; leftPixel1 = (uint8)(imageL[idx]); uint8 imgR = convert_uint8(vload8(0, imageR + (idx - d - 7))); uint8 res = leftPixel1 - imgR; diffa += res * res; - y_tex += 1; + idx += im_pitch; } - //See above: #define COL_SSD_SIZE (BLOCK_W + 2 * radius) - col_ssd[0 * (BLOCK_W + 2 * radius)] = diffa.s7; - col_ssd[1 * (BLOCK_W + 2 * radius)] = diffa.s6; - col_ssd[2 * (BLOCK_W + 2 * radius)] = diffa.s5; - col_ssd[3 * (BLOCK_W + 2 * radius)] = diffa.s4; - col_ssd[4 * (BLOCK_W + 2 * radius)] = diffa.s3; - col_ssd[5 * (BLOCK_W + 2 * radius)] = diffa.s2; - col_ssd[6 * (BLOCK_W + 2 * radius)] = diffa.s1; - col_ssd[7 * (BLOCK_W + 2 * radius)] = diffa.s0; + //See above: #define COL_SSD_SIZE (BLOCK_W + WIN_SIZE) + col_ssd[0 * (BLOCK_W + win_size)] = diffa.s7; + col_ssd[1 * (BLOCK_W + win_size)] = diffa.s6; + col_ssd[2 * (BLOCK_W + win_size)] = diffa.s5; + col_ssd[3 * (BLOCK_W + win_size)] = diffa.s4; + col_ssd[4 * (BLOCK_W + win_size)] = diffa.s3; + col_ssd[5 * (BLOCK_W + win_size)] = diffa.s2; + col_ssd[6 * (BLOCK_W + win_size)] = diffa.s1; + col_ssd[7 * (BLOCK_W + win_size)] = diffa.s0; } __kernel void stereoKernel(__global unsigned char *left, __global unsigned char *right, @@ -145,15 +148,14 @@ __kernel void stereoKernel(__global unsigned char *left, __global unsigned char int img_step, int maxdisp, __local unsigned int *col_ssd_cache) { - __local unsigned int *col_ssd = col_ssd_cache + get_local_id(0); - __local unsigned int *col_ssd_extra = get_local_id(0) < (2 * radius) ? col_ssd + BLOCK_W : 0; + __local unsigned int *col_ssd = col_ssd_cache + get_local_id(0); + __local unsigned int *col_ssd_extra = get_local_id(0) < (radius << 1) ? col_ssd + BLOCK_W : 0; int X = get_group_id(0) * BLOCK_W + get_local_id(0) + maxdisp + radius; - // int Y = get_group_id(1) * ROWSperTHREAD + radius; #define Y (get_group_id(1) * ROWSperTHREAD + radius) - __global unsigned int* minSSDImage = cminSSDImage + X + Y * cminSSD_step; + __global unsigned int* minSSDImage = cminSSDImage + X + Y * cminSSD_step; __global unsigned char* disparImage = disp + X + Y * disp_step; int end_row = ROWSperTHREAD < (cheight - Y) ? ROWSperTHREAD:(cheight - Y); @@ -187,7 +189,9 @@ __kernel void stereoKernel(__global unsigned char *left, __global unsigned char for(int row = 1; row < end_row; row++) { int idx1 = y_tex * img_step + x_tex; - int idx2 = min(y_tex + (2 * radius + 1), cheight - 1) * img_step + x_tex; + int idx2 = min(y_tex + ((radius << 1) + 1), cheight - 1) * img_step + x_tex; + + barrier(CLK_LOCAL_MEM_FENCE); StepDown(idx1, idx2, left, right, d, col_ssd); if (col_ssd_extra > 0) From e14acabb3d14ce42a7c562ee39a28dc0667de5ce Mon Sep 17 00:00:00 2001 From: peng xiao Date: Thu, 9 May 2013 14:00:36 +0800 Subject: [PATCH 36/49] Fix ocl moudle build with latest Intel OpenCL SDK. We found that cl.h file provided in latest Intel SDK muted deprecated interfaces. --- modules/ocl/src/mcwutil.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/ocl/src/mcwutil.cpp b/modules/ocl/src/mcwutil.cpp index e56e2f15d0..3bcb8700b7 100644 --- a/modules/ocl/src/mcwutil.cpp +++ b/modules/ocl/src/mcwutil.cpp @@ -43,6 +43,7 @@ // //M*/ +#define CL_USE_DEPRECATED_OPENCL_1_1_APIS #include "precomp.hpp" using namespace std; From 81779d82875a229a75f3a2c9f161f5a8f21c0596 Mon Sep 17 00:00:00 2001 From: Bo Li Date: Thu, 9 May 2013 15:20:00 +0800 Subject: [PATCH 37/49] fixed pca bug for fixed mean input --- modules/core/src/matmul.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/core/src/matmul.cpp b/modules/core/src/matmul.cpp index 9b3868505a..5988363d3c 100644 --- a/modules/core/src/matmul.cpp +++ b/modules/core/src/matmul.cpp @@ -2855,8 +2855,9 @@ PCA& PCA::operator()(InputArray _data, InputArray __mean, int flags, int maxComp if( _mean.data ) { - CV_Assert( _mean.size() == mean_sz ); + CV_Assert( _mean.size() == mean_sz ); _mean.convertTo(mean, ctype); + covar_flags |= CV_COVAR_USE_AVG; } calcCovarMatrix( data, covar, mean, covar_flags, ctype ); From ada8f92cc7dc5c6461af01aa5fb6e40445f5f572 Mon Sep 17 00:00:00 2001 From: yao Date: Thu, 9 May 2013 17:57:13 +0800 Subject: [PATCH 38/49] fix warnings, unify test names --- modules/ocl/test/test_arithm.cpp | 33 ++++------------- modules/ocl/test/test_blend.cpp | 2 +- modules/ocl/test/test_columnsum.cpp | 2 +- modules/ocl/test/test_filters.cpp | 4 +-- modules/ocl/test/test_hog.cpp | 2 +- modules/ocl/test/test_match_template.cpp | 8 ++--- modules/ocl/test/test_matrix_operation.cpp | 42 ++++------------------ modules/ocl/test/test_moments.cpp | 10 +++--- modules/ocl/test/test_pyrdown.cpp | 8 ++--- modules/ocl/test/test_pyrup.cpp | 7 ++-- modules/ocl/test/test_split_merge.cpp | 26 +++----------- 11 files changed, 34 insertions(+), 110 deletions(-) diff --git a/modules/ocl/test/test_arithm.cpp b/modules/ocl/test/test_arithm.cpp index 9b9cec9381..d12cef0b22 100644 --- a/modules/ocl/test/test_arithm.cpp +++ b/modules/ocl/test/test_arithm.cpp @@ -174,16 +174,12 @@ PARAM_TEST_CASE(ArithmTestBase, MatType, bool) void Near(double threshold = 0.) { - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, threshold); + EXPECT_MAT_NEAR(dst, Mat(gdst_whole), threshold); } void Near1(double threshold = 0.) - { - cv::Mat cpu_dst1; - gdst1_whole.download(cpu_dst1); - EXPECT_MAT_NEAR(dst1, cpu_dst1, threshold); + { + EXPECT_MAT_NEAR(dst1, Mat(gdst1_whole), threshold); } }; @@ -1169,33 +1165,18 @@ TEST_P(MagnitudeSqr, Mat) { for(int j = 0; j < LOOP_TIMES; j++) { - // random_roi(); - // int64 start, end; - // start = cv::getTickCount(); + random_roi(); for(int i = 0; i < mat1.rows; ++i) for(int j = 0; j < mat1.cols; ++j) { float val1 = mat1.at(i, j); float val2 = mat2.at(i, j); - ((float *)(dst.data))[i * dst.step / 4 + j] = val1 * val1 + val2 * val2; - - // float val1 =((float *)( mat1.data))[(i*mat1.step/8 +j)*2]; - // - // float val2 =((float *)( mat1.data))[(i*mat1.step/8 +j)*2+ 1 ]; - - // ((float *)(dst.data))[i*dst.step/4 +j]= val1 * val1 +val2 * val2; } - // end = cv::getTickCount(); - - cv::ocl::oclMat clmat1(mat1), clmat2(mat2), cldst; - cv::ocl::magnitudeSqr(clmat1, clmat2, cldst); - - cv::Mat cpu_dst; - cldst.download(cpu_dst); - - EXPECT_MAT_NEAR(dst, cpu_dst, 1); + cv::ocl::oclMat clmat1(mat1), clmat2(mat2); + cv::ocl::magnitudeSqr(clmat1, clmat2, gdst); + Near(1); } } diff --git a/modules/ocl/test/test_blend.cpp b/modules/ocl/test/test_blend.cpp index 292353be60..fa1aea1727 100644 --- a/modules/ocl/test/test_blend.cpp +++ b/modules/ocl/test/test_blend.cpp @@ -112,7 +112,7 @@ TEST_P(Blend, Accuracy) EXPECT_MAT_NEAR(result_gold, result, CV_MAT_DEPTH(type) == CV_8U ? 1.f : 1e-5f); } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, Blend, Combine( +INSTANTIATE_TEST_CASE_P(OCL_ImgProc, Blend, Combine( DIFFERENT_SIZES, testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4), MatType(CV_32FC1), MatType(CV_32FC4)) )); diff --git a/modules/ocl/test/test_columnsum.cpp b/modules/ocl/test/test_columnsum.cpp index bf389d1b84..231f0657b0 100644 --- a/modules/ocl/test/test_columnsum.cpp +++ b/modules/ocl/test/test_columnsum.cpp @@ -88,7 +88,7 @@ TEST_P(ColumnSum, Accuracy) } } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, ColumnSum, DIFFERENT_SIZES); +INSTANTIATE_TEST_CASE_P(OCL_ImgProc, ColumnSum, DIFFERENT_SIZES); #endif diff --git a/modules/ocl/test/test_filters.cpp b/modules/ocl/test/test_filters.cpp index 316076cc35..cfd57413e1 100644 --- a/modules/ocl/test/test_filters.cpp +++ b/modules/ocl/test/test_filters.cpp @@ -125,9 +125,7 @@ PARAM_TEST_CASE(FilterTestBase, void Near(double threshold) { - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - EXPECT_MAT_NEAR(dst, cpu_dst, threshold); + EXPECT_MAT_NEAR(dst, Mat(gdst_whole), threshold); } }; diff --git a/modules/ocl/test/test_hog.cpp b/modules/ocl/test/test_hog.cpp index c95c25fe95..cfc4e3963f 100644 --- a/modules/ocl/test/test_hog.cpp +++ b/modules/ocl/test/test_hog.cpp @@ -244,7 +244,7 @@ TEST_P(HOG, Detect) } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, HOG, testing::Combine( +INSTANTIATE_TEST_CASE_P(OCL_ObjDetect, HOG, testing::Combine( testing::Values(cv::Size(64, 128), cv::Size(48, 96)), testing::Values(MatType(CV_8UC1), MatType(CV_8UC4)))); diff --git a/modules/ocl/test/test_match_template.cpp b/modules/ocl/test/test_match_template.cpp index e6f1f7080d..a393abdeb3 100644 --- a/modules/ocl/test/test_match_template.cpp +++ b/modules/ocl/test/test_match_template.cpp @@ -89,12 +89,10 @@ TEST_P(MatchTemplate8U, Accuracy) cv::Mat dst_gold; cv::matchTemplate(image, templ, dst_gold, method); - char sss [100] = ""; - cv::Mat mat_dst; dst.download(mat_dst); - EXPECT_MAT_NEAR(dst_gold, mat_dst, templ_size.area() * 1e-1, sss); + EXPECT_MAT_NEAR(dst_gold, mat_dst, templ_size.area() * 1e-1); } PARAM_TEST_CASE(MatchTemplate32F, cv::Size, TemplateSize, Channels, TemplateMethod) @@ -125,12 +123,10 @@ TEST_P(MatchTemplate32F, Accuracy) cv::Mat dst_gold; cv::matchTemplate(image, templ, dst_gold, method); - char sss [100] = ""; - cv::Mat mat_dst; dst.download(mat_dst); - EXPECT_MAT_NEAR(dst_gold, mat_dst, templ_size.area() * 1e-1, sss); + EXPECT_MAT_NEAR(dst_gold, mat_dst, templ_size.area() * 1e-1); } INSTANTIATE_TEST_CASE_P(OCL_ImgProc, MatchTemplate8U, diff --git a/modules/ocl/test/test_matrix_operation.cpp b/modules/ocl/test/test_matrix_operation.cpp index 654e1a61f3..92d810818b 100644 --- a/modules/ocl/test/test_matrix_operation.cpp +++ b/modules/ocl/test/test_matrix_operation.cpp @@ -135,12 +135,7 @@ TEST_P(ConvertTo, Accuracy) mat_roi.convertTo(dst_roi, dst_type); gmat.convertTo(gdst, dst_type); - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,srcx =%d,srcy=%d,dstx=%d,dsty=%d", roicols, roirows, srcx , srcy, dstx, dsty); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, Mat(gdst_whole), 0.0); } } @@ -242,12 +237,7 @@ TEST_P(CopyTo, Without_mask) mat_roi.copyTo(dst_roi); gmat.copyTo(gdst); - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,srcx =%d,srcy=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d", roicols, roirows, srcx , srcy, dstx, dsty, maskx, masky); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, Mat(gdst_whole), 0.0); } } @@ -260,12 +250,7 @@ TEST_P(CopyTo, With_mask) mat_roi.copyTo(dst_roi, mask_roi); gmat.copyTo(gdst, gmask); - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,srcx =%d,srcy=%d,dstx=%d,dsty=%d,maskx=%d,masky=%d", roicols, roirows, srcx , srcy, dstx, dsty, maskx, masky); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, Mat(gdst_whole), 0.0); } } @@ -357,12 +342,7 @@ TEST_P(SetTo, Without_mask) mat_roi.setTo(val); gmat.setTo(val); - cv::Mat cpu_dst; - gmat_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,srcx =%d,srcy=%d,maskx=%d,masky=%d", roicols, roirows, srcx , srcy, maskx, masky); - - EXPECT_MAT_NEAR(mat, cpu_dst, 1., sss); + EXPECT_MAT_NEAR(mat, Mat(gmat_whole), 1.); } } @@ -375,12 +355,7 @@ TEST_P(SetTo, With_mask) mat_roi.setTo(val, mask_roi); gmat.setTo(val, gmask); - cv::Mat cpu_dst; - gmat_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,srcx =%d,srcy=%d,maskx=%d,masky=%d", roicols, roirows, srcx , srcy, maskx, masky); - - EXPECT_MAT_NEAR(mat, cpu_dst, 1., sss); + EXPECT_MAT_NEAR(mat, Mat(gmat_whole), 1.); } } @@ -464,11 +439,8 @@ TEST_P(convertC3C4, Accuracy) mat1 = randomMat(rng, size, type, 0, 40, false); gmat1 = mat1; - cv::Mat cpu_dst; - gmat1.download(cpu_dst); - char sss[1024]; - sprintf(sss, "cols=%d,rows=%d", mat1.cols, mat1.rows); - EXPECT_MAT_NEAR(mat1, cpu_dst, 0.0, sss); + + EXPECT_MAT_NEAR(mat1, Mat(gmat1), 0.0); } } diff --git a/modules/ocl/test/test_moments.cpp b/modules/ocl/test/test_moments.cpp index 715ad8963a..98c66def31 100644 --- a/modules/ocl/test/test_moments.cpp +++ b/modules/ocl/test/test_moments.cpp @@ -10,7 +10,7 @@ using namespace cvtest; using namespace testing; using namespace std; extern string workdir; -PARAM_TEST_CASE(MomentsTestBase, MatType, bool) +PARAM_TEST_CASE(MomentsTest, MatType, bool) { int type; cv::Mat mat1; @@ -30,13 +30,13 @@ PARAM_TEST_CASE(MomentsTestBase, MatType, bool) Mat gpu_dst, cpu_dst; HuMoments(cpu, cpu_dst); HuMoments(gpu, gpu_dst); - EXPECT_MAT_NEAR(gpu_dst,cpu_dst, .5, ""); + EXPECT_MAT_NEAR(gpu_dst,cpu_dst, .5); } }; -struct ocl_Moments : MomentsTestBase {}; -TEST_P(ocl_Moments, Mat) + +TEST_P(MomentsTest, Mat) { bool binaryImage = 0; SetUp(); @@ -67,6 +67,6 @@ TEST_P(ocl_Moments, Mat) } } -INSTANTIATE_TEST_CASE_P(Moments, ocl_Moments, Combine( +INSTANTIATE_TEST_CASE_P(OCL_ImgProc, MomentsTest, Combine( Values(CV_8UC1, CV_16UC1, CV_16SC1, CV_64FC1), Values(true,false))); #endif // HAVE_OPENCL diff --git a/modules/ocl/test/test_pyrdown.cpp b/modules/ocl/test/test_pyrdown.cpp index a67e0b0ac6..6d00fb5e45 100644 --- a/modules/ocl/test/test_pyrdown.cpp +++ b/modules/ocl/test/test_pyrdown.cpp @@ -83,15 +83,11 @@ TEST_P(PyrDown, Mat) cv::pyrDown(src, dst_cpu); cv::ocl::pyrDown(gsrc, gdst); - cv::Mat dst; - gdst.download(dst); - char s[1024] = {0}; - - EXPECT_MAT_NEAR(dst, dst_cpu, dst.depth() == CV_32F ? 1e-4f : 1.0f, s); + EXPECT_MAT_NEAR(dst_cpu, Mat(gdst), type == CV_32F ? 1e-4f : 1.0f); } } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrDown, Combine( +INSTANTIATE_TEST_CASE_P(OCL_ImgProc, PyrDown, Combine( Values(CV_8U, CV_32F), Values(1, 3, 4))); diff --git a/modules/ocl/test/test_pyrup.cpp b/modules/ocl/test/test_pyrup.cpp index b2d45ef4fd..afd3e8b1b8 100644 --- a/modules/ocl/test/test_pyrup.cpp +++ b/modules/ocl/test/test_pyrup.cpp @@ -77,17 +77,14 @@ TEST_P(PyrUp, Accuracy) ocl::oclMat dst; ocl::oclMat srcMat(src); ocl::pyrUp(srcMat, dst); - Mat cpu_dst; - dst.download(cpu_dst); - 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, Mat(dst), (type == CV_32F ? 1e-4f : 1.0)); } } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, PyrUp, testing::Combine( +INSTANTIATE_TEST_CASE_P(OCL_ImgProc, PyrUp, testing::Combine( Values(CV_8U, CV_32F), Values(1, 3, 4))); diff --git a/modules/ocl/test/test_split_merge.cpp b/modules/ocl/test/test_split_merge.cpp index 2d60b2830b..854ce309c2 100644 --- a/modules/ocl/test/test_split_merge.cpp +++ b/modules/ocl/test/test_split_merge.cpp @@ -202,12 +202,7 @@ TEST_P(Merge, Accuracy) cv::merge(dev_src, dst_roi); cv::ocl::merge(dev_gsrc, gdst); - cv::Mat cpu_dst; - gdst_whole.download(cpu_dst); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,src1x =%d,src1y=%d,src2x =%d,src2y=%d,src3x =%d,src3y=%d,src4x =%d,src4y=%d,dstx=%d,dsty=%d", roicols, roirows, src1x, src1y, src2x , src2y, src3x , src3y, src4x , src4y, dstx, dsty); - - EXPECT_MAT_NEAR(dst, cpu_dst, 0.0, sss); + EXPECT_MAT_NEAR(dst, Mat(gdst_whole), 0.0); } } @@ -349,28 +344,17 @@ TEST_P(Split, Accuracy) cv::split(mat_roi, dev_dst); cv::ocl::split(gmat, dev_gdst); - cv::Mat cpu_dst1; - cv::Mat cpu_dst2; - cv::Mat cpu_dst3; - cv::Mat cpu_dst4; - gdst1_whole.download(cpu_dst1); - gdst2_whole.download(cpu_dst2); - gdst3_whole.download(cpu_dst3); - gdst4_whole.download(cpu_dst4); - char sss[1024]; - sprintf(sss, "roicols=%d,roirows=%d,dst1x =%d,dsty=%d,dst2x =%d,dst2y=%d,dst3x =%d,dst3y=%d,dst4x =%d,dst4y=%d,srcx=%d,srcy=%d", roicols, roirows, dst1x , dst1y, dst2x , dst2y, dst3x , dst3y, dst4x , dst4y, srcx, srcy); - if(channels >= 1) - EXPECT_MAT_NEAR(dst1, cpu_dst1, 0.0, sss); + EXPECT_MAT_NEAR(dst1, Mat(gdst1_whole), 0.0); if(channels >= 2) - EXPECT_MAT_NEAR(dst2, cpu_dst2, 0.0, sss); + EXPECT_MAT_NEAR(dst2, Mat(gdst2_whole), 0.0); if(channels >= 3) - EXPECT_MAT_NEAR(dst3, cpu_dst3, 0.0, sss); + EXPECT_MAT_NEAR(dst3, Mat(gdst3_whole), 0.0); if(channels >= 4) - EXPECT_MAT_NEAR(dst4, cpu_dst4, 0.0, sss); + EXPECT_MAT_NEAR(dst4, Mat(gdst4_whole), 0.0); } } From d5881bc00a08d6208cde03366bf6289371595f76 Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Sun, 12 May 2013 18:36:55 +0400 Subject: [PATCH 39/49] adding version info to test log --- modules/ts/include/opencv2/ts/ts.hpp | 2 ++ modules/ts/include/opencv2/ts/ts_perf.hpp | 1 + modules/ts/src/ts_func.cpp | 26 +++++++++++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/modules/ts/include/opencv2/ts/ts.hpp b/modules/ts/include/opencv2/ts/ts.hpp index a10251d414..fcef5896c6 100644 --- a/modules/ts/include/opencv2/ts/ts.hpp +++ b/modules/ts/include/opencv2/ts/ts.hpp @@ -554,6 +554,7 @@ namespace cvtest CV_EXPORTS void fillGradient(Mat& img, int delta = 5); CV_EXPORTS void smoothBorder(Mat& img, const Scalar& color, int delta = 3); +CV_EXPORTS void printVersionInfo(bool useStdOut = true); } //namespace cvtest // fills c with zeros @@ -573,6 +574,7 @@ int main(int argc, char **argv) \ { \ cvtest::TS::ptr()->init(resourcesubdir); \ ::testing::InitGoogleTest(&argc, argv); \ + cvtest::printVersionInfo();\ return RUN_ALL_TESTS(); \ } diff --git a/modules/ts/include/opencv2/ts/ts_perf.hpp b/modules/ts/include/opencv2/ts/ts_perf.hpp index c62d483949..fe57655157 100644 --- a/modules/ts/include/opencv2/ts/ts_perf.hpp +++ b/modules/ts/include/opencv2/ts/ts_perf.hpp @@ -484,6 +484,7 @@ int main(int argc, char **argv)\ ::perf::Regression::Init(#testsuitname);\ ::perf::TestBase::Init(argc, argv);\ ::testing::InitGoogleTest(&argc, argv);\ + cvtest::printVersionInfo();\ return RUN_ALL_TESTS();\ } diff --git a/modules/ts/src/ts_func.cpp b/modules/ts/src/ts_func.cpp index 62e16fee4d..1d636e6746 100644 --- a/modules/ts/src/ts_func.cpp +++ b/modules/ts/src/ts_func.cpp @@ -2934,8 +2934,34 @@ MatComparator::operator()(const char* expr1, const char* expr2, << "'" << expr2 << "': " << MatPart(m2part, border > 0 ? &loc : 0) << ".\n"; } +void printVersionInfo(bool useStdOut) +{ + ::testing::Test::RecordProperty("CV_VERSION", CV_VERSION); + if(useStdOut) std::cout << "OpenCV version: " << CV_VERSION << std::endl; + + std::string buildInfo( cv::getBuildInformation() ); + + size_t pos1 = buildInfo.find("Version control"); + size_t pos2 = buildInfo.find("\n", pos1);\ + if(pos1 != std::string::npos && pos2 != std::string::npos) + { + std::string ver( buildInfo.substr(pos1, pos2-pos1) ); + ::testing::Test::RecordProperty("Version_control", ver); + if(useStdOut) std::cout << ver << std::endl; + } + + pos1 = buildInfo.find("inner version"); + pos2 = buildInfo.find("\n", pos1);\ + if(pos1 != std::string::npos && pos2 != std::string::npos) + { + std::string ver( buildInfo.substr(pos1, pos2-pos1) ); + ::testing::Test::RecordProperty("inner_version", ver); + if(useStdOut) std::cout << ver << std::endl; + } } +} //namespace cvtest + void cvTsConvert( const CvMat* src, CvMat* dst ) { Mat _src = cvarrToMat(src), _dst = cvarrToMat(dst); From e23884a238efae54505c918ec97978ef3e5daff8 Mon Sep 17 00:00:00 2001 From: yao Date: Mon, 13 May 2013 15:04:23 +0800 Subject: [PATCH 40/49] fix the warnings in fft tests --- modules/ocl/test/test_fft.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ocl/test/test_fft.cpp b/modules/ocl/test/test_fft.cpp index 0fee8b03d4..fda55ddcc2 100644 --- a/modules/ocl/test/test_fft.cpp +++ b/modules/ocl/test/test_fft.cpp @@ -68,7 +68,7 @@ TEST_P(Dft, C2C) cv::dft(a, b_gold, dft_flags); cv::ocl::dft(cv::ocl::oclMat(a), d_b, a.size(), dft_flags); - EXPECT_MAT_NEAR(b_gold, cv::Mat(d_b), a.size().area() * 1e-4, ""); + EXPECT_MAT_NEAR(b_gold, cv::Mat(d_b), a.size().area() * 1e-4); } TEST_P(Dft, R2C) @@ -81,11 +81,11 @@ TEST_P(Dft, R2C) cv::dft(a, b_gold, cv::DFT_COMPLEX_OUTPUT | dft_flags); b_gold_roi = b_gold(cv::Rect(0, 0, d_b.cols, d_b.rows)); - EXPECT_MAT_NEAR(b_gold_roi, cv::Mat(d_b), a.size().area() * 1e-4, ""); + EXPECT_MAT_NEAR(b_gold_roi, cv::Mat(d_b), a.size().area() * 1e-4); cv::Mat c_gold; cv::dft(b_gold, c_gold, cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT | cv::DFT_SCALE); - EXPECT_MAT_NEAR(b_gold_roi, cv::Mat(d_b), a.size().area() * 1e-4, ""); + EXPECT_MAT_NEAR(b_gold_roi, cv::Mat(d_b), a.size().area() * 1e-4); } TEST_P(Dft, R2CthenC2R) @@ -95,7 +95,7 @@ TEST_P(Dft, R2CthenC2R) cv::ocl::oclMat d_b, d_c; cv::ocl::dft(cv::ocl::oclMat(a), d_b, a.size(), 0); cv::ocl::dft(d_b, d_c, a.size(), cv::DFT_SCALE | cv::DFT_INVERSE | cv::DFT_REAL_OUTPUT); - EXPECT_MAT_NEAR(a, d_c, a.size().area() * 1e-4, ""); + EXPECT_MAT_NEAR(a, d_c, a.size().area() * 1e-4); } From 60059a7aa0a5f7ab1ce33715e1f05af75c685aef Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 17 Apr 2013 16:55:05 +0400 Subject: [PATCH 41/49] Improve handling of native_app_glue dependency in Android samples --- cmake/OpenCVDetectAndroidSDK.cmake | 22 +++++++++++++++------- samples/android/CMakeLists.txt | 9 +++------ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/cmake/OpenCVDetectAndroidSDK.cmake b/cmake/OpenCVDetectAndroidSDK.cmake index 92d7ba3272..393dbb62d2 100644 --- a/cmake/OpenCVDetectAndroidSDK.cmake +++ b/cmake/OpenCVDetectAndroidSDK.cmake @@ -176,7 +176,8 @@ macro(android_get_compatible_target VAR) endmacro() unset(__android_project_chain CACHE) -#add_android_project(target_name ${path} NATIVE_DEPS opencv_core LIBRARY_DEPS ${OpenCV_BINARY_DIR} SDK_TARGET 11) + +# add_android_project(target_name ${path} NATIVE_DEPS opencv_core LIBRARY_DEPS ${OpenCV_BINARY_DIR} SDK_TARGET 11) macro(add_android_project target path) # parse arguments set(android_proj_arglist NATIVE_DEPS LIBRARY_DEPS SDK_TARGET IGNORE_JAVA IGNORE_MANIFEST) @@ -212,6 +213,16 @@ macro(add_android_project target path) ocv_check_dependencies(${android_proj_NATIVE_DEPS} opencv_java) endif() + if(EXISTS "${path}/jni/Android.mk" ) + # find if native_app_glue is used + file(STRINGS "${path}/jni/Android.mk" NATIVE_APP_GLUE REGEX ".*(call import-module,android/native_app_glue)" ) + if(NATIVE_APP_GLUE) + if(ANDROID_NATIVE_API_LEVEL LESS 9 OR NOT EXISTS "${ANDROID_NDK}/sources/android/native_app_glue") + set(OCV_DEPENDENCIES_FOUND FALSE) + endif() + endif() + endif() + if(OCV_DEPENDENCIES_FOUND AND android_proj_sdk_target AND ANDROID_EXECUTABLE AND ANT_EXECUTABLE AND ANDROID_TOOLS_Pkg_Revision GREATER 13 AND EXISTS "${path}/${ANDROID_MANIFEST_FILE}") project(${target}) @@ -268,9 +279,6 @@ macro(add_android_project target path) file(STRINGS "${path}/jni/Android.mk" JNI_LIB_NAME REGEX "LOCAL_MODULE[ ]*:=[ ]*.*" ) string(REGEX REPLACE "LOCAL_MODULE[ ]*:=[ ]*([a-zA-Z_][a-zA-Z_0-9]*)[ ]*" "\\1" JNI_LIB_NAME "${JNI_LIB_NAME}") - # find using of native app glue to determine native activity - file(STRINGS "${path}/jni/Android.mk" NATIVE_APP_GLUE REGEX ".*(call import-module,android/native_app_glue)" ) - if(JNI_LIB_NAME) ocv_include_modules_recurse(${android_proj_NATIVE_DEPS}) ocv_include_directories("${path}/jni") @@ -291,9 +299,9 @@ macro(add_android_project target path) ) get_target_property(android_proj_jni_location "${JNI_LIB_NAME}" LOCATION) - if (NOT (CMAKE_BUILD_TYPE MATCHES "debug")) - add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}") - endif() + if (NOT (CMAKE_BUILD_TYPE MATCHES "debug")) + add_custom_command(TARGET ${JNI_LIB_NAME} POST_BUILD COMMAND ${CMAKE_STRIP} --strip-unneeded "${android_proj_jni_location}") + endif() endif() endif() diff --git a/samples/android/CMakeLists.txt b/samples/android/CMakeLists.txt index 9d7b0cbf0f..c0b626d9b1 100644 --- a/samples/android/CMakeLists.txt +++ b/samples/android/CMakeLists.txt @@ -10,16 +10,13 @@ add_subdirectory(15-puzzle) add_subdirectory(face-detection) add_subdirectory(image-manipulations) add_subdirectory(color-blob-detection) - -if (ANDROID_NATIVE_API_LEVEL GREATER 8) - add_subdirectory(native-activity) -endif() - add_subdirectory(tutorial-1-camerapreview) add_subdirectory(tutorial-2-mixedprocessing) add_subdirectory(tutorial-3-cameracontrol) -#hello-android sample +add_subdirectory(native-activity) + +# hello-android sample if(HAVE_opencv_highgui) ocv_include_modules_recurse(opencv_highgui opencv_core) add_executable(hello-android hello-android/main.cpp) From 2665c39a0de7f3b8a69a3ef2b560ba467427cca6 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 17 Apr 2013 22:01:03 +0400 Subject: [PATCH 42/49] Fix build warnings from gcc 4.8 --- 3rdparty/libjasper/CMakeLists.txt | 3 +- cmake/OpenCVDetectCXXCompiler.cmake | 2 +- .../include/opencv2/flann/ground_truth.h | 1 - modules/highgui/src/grfmt_jpeg.cpp | 5 ++ modules/highgui/src/grfmt_png.cpp | 5 ++ modules/imgproc/src/floodfill.cpp | 2 - modules/imgproc/src/imgwarp.cpp | 2 - modules/legacy/src/blobtrackgenyml.cpp | 2 +- modules/legacy/src/kdtree.cpp | 6 +- modules/ocl/src/brute_force_matcher.cpp | 56 +++++++++---------- modules/ocl/src/gemm.cpp | 2 +- modules/ocl/src/haar.cpp | 3 +- 12 files changed, 48 insertions(+), 41 deletions(-) diff --git a/3rdparty/libjasper/CMakeLists.txt b/3rdparty/libjasper/CMakeLists.txt index 42855e2a6d..97919bee49 100644 --- a/3rdparty/libjasper/CMakeLists.txt +++ b/3rdparty/libjasper/CMakeLists.txt @@ -23,7 +23,8 @@ if(WIN32 AND NOT MINGW) add_definitions(-DJAS_WIN_MSVC_BUILD) endif(WIN32 AND NOT MINGW) -ocv_warnings_disable(CMAKE_C_FLAGS -Wno-implicit-function-declaration -Wno-uninitialized -Wmissing-prototypes -Wmissing-declarations -Wunused -Wshadow -Wsign-compare) +ocv_warnings_disable(CMAKE_C_FLAGS -Wno-implicit-function-declaration -Wno-uninitialized -Wmissing-prototypes + -Wno-unused-but-set-parameter -Wmissing-declarations -Wunused -Wshadow -Wsign-compare) ocv_warnings_disable(CMAKE_C_FLAGS -Wunused-parameter) # clang ocv_warnings_disable(CMAKE_C_FLAGS /wd4013 /wd4018 /wd4101 /wd4244 /wd4267 /wd4715) # vs2005 diff --git a/cmake/OpenCVDetectCXXCompiler.cmake b/cmake/OpenCVDetectCXXCompiler.cmake index 9b841dad8a..7efcba7c1e 100644 --- a/cmake/OpenCVDetectCXXCompiler.cmake +++ b/cmake/OpenCVDetectCXXCompiler.cmake @@ -101,7 +101,7 @@ endif() if(MSVC64 OR MINGW64) set(X86_64 1) -elseif(MSVC AND NOT CMAKE_CROSSCOMPILING) +elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING)) set(X86 1) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") set(X86_64 1) diff --git a/modules/flann/include/opencv2/flann/ground_truth.h b/modules/flann/include/opencv2/flann/ground_truth.h index 69d978ba07..fd8f3ae7f0 100644 --- a/modules/flann/include/opencv2/flann/ground_truth.h +++ b/modules/flann/include/opencv2/flann/ground_truth.h @@ -42,7 +42,6 @@ template void find_nearest(const Matrix& dataset, typename Distance::ElementType* query, int* matches, int nn, int skip = 0, Distance distance = Distance()) { - typedef typename Distance::ElementType ElementType; typedef typename Distance::ResultType DistanceType; int n = nn + skip; diff --git a/modules/highgui/src/grfmt_jpeg.cpp b/modules/highgui/src/grfmt_jpeg.cpp index 3dedf440de..bd21e2c471 100644 --- a/modules/highgui/src/grfmt_jpeg.cpp +++ b/modules/highgui/src/grfmt_jpeg.cpp @@ -52,6 +52,11 @@ #include #include +// the following defines are a hack to avoid multiple problems with frame ponter handling and setjmp +// see http://gcc.gnu.org/ml/gcc/2011-10/msg00324.html for some details +#define mingw_getsp(...) 0 +#define __builtin_frame_address(...) 0 + #ifdef WIN32 #define XMD_H // prevent redefinition of INT32 diff --git a/modules/highgui/src/grfmt_png.cpp b/modules/highgui/src/grfmt_png.cpp index 196b1e65f8..9bb5d32be3 100644 --- a/modules/highgui/src/grfmt_png.cpp +++ b/modules/highgui/src/grfmt_png.cpp @@ -73,6 +73,11 @@ #pragma warning( disable: 4611 ) #endif +// the following defines are a hack to avoid multiple problems with frame ponter handling and setjmp +// see http://gcc.gnu.org/ml/gcc/2011-10/msg00324.html for some details +#define mingw_getsp(...) 0 +#define __builtin_frame_address(...) 0 + namespace cv { diff --git a/modules/imgproc/src/floodfill.cpp b/modules/imgproc/src/floodfill.cpp index d93511353e..ada6dcce36 100644 --- a/modules/imgproc/src/floodfill.cpp +++ b/modules/imgproc/src/floodfill.cpp @@ -93,7 +93,6 @@ icvFloodFill_CnIR( uchar* pImage, int step, CvSize roi, CvPoint seed, _Tp newVal, CvConnectedComp* region, int flags, std::vector* buffer ) { - typedef typename cv::DataType<_Tp>::channel_type _CTp; _Tp* img = (_Tp*)(pImage + step * seed.y); int i, L, R; int area = 0; @@ -252,7 +251,6 @@ icvFloodFillGrad_CnIR( uchar* pImage, int step, uchar* pMask, int maskStep, CvConnectedComp* region, int flags, std::vector* buffer ) { - typedef typename cv::DataType<_Tp>::channel_type _CTp; _Tp* img = (_Tp*)(pImage + step*seed.y); uchar* mask = (pMask += maskStep + 1) + maskStep*seed.y; int i, L, R; diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index 848f6e980d..e6c189421f 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -1219,8 +1219,6 @@ static void resizeGeneric_( const Mat& src, Mat& dst, const int* yofs, const void* _beta, int xmin, int xmax, int ksize ) { - typedef typename HResize::value_type T; - typedef typename HResize::buf_type WT; typedef typename HResize::alpha_type AT; const AT* beta = (const AT*)_beta; diff --git a/modules/legacy/src/blobtrackgenyml.cpp b/modules/legacy/src/blobtrackgenyml.cpp index 5d0e870fef..8a414915c1 100644 --- a/modules/legacy/src/blobtrackgenyml.cpp +++ b/modules/legacy/src/blobtrackgenyml.cpp @@ -61,7 +61,7 @@ protected: { int ObjNum = m_TrackList.GetBlobNum(); int i; - char video_name[1024]; + char video_name[1024+1]; char* struct_name = NULL; CvFileStorage* storage = cvOpenFileStorage(m_pFileName,NULL,CV_STORAGE_WRITE_TEXT); diff --git a/modules/legacy/src/kdtree.cpp b/modules/legacy/src/kdtree.cpp index 12a4acd692..a32677b79b 100644 --- a/modules/legacy/src/kdtree.cpp +++ b/modules/legacy/src/kdtree.cpp @@ -117,10 +117,10 @@ class CvKDTreeWrap : public CvFeatureTree { CvMat* results) { int rn = results->rows * results->cols; std::vector inbounds; - dispatch_cvtype(mat, ((__treetype*)data)-> - find_ortho_range((typename __treetype::scalar_type*)bounds_min->data.ptr, + assert(CV_MAT_DEPTH(mat->type) == CV_32F || CV_MAT_DEPTH(mat->type) == CV_64F); + ((__treetype*)data)->find_ortho_range((typename __treetype::scalar_type*)bounds_min->data.ptr, (typename __treetype::scalar_type*)bounds_max->data.ptr, - inbounds)); + inbounds); std::copy(inbounds.begin(), inbounds.begin() + std::min((int)inbounds.size(), rn), (int*) results->data.ptr); diff --git a/modules/ocl/src/brute_force_matcher.cpp b/modules/ocl/src/brute_force_matcher.cpp index 9c4a217f42..c12fa73064 100644 --- a/modules/ocl/src/brute_force_matcher.cpp +++ b/modules/ocl/src/brute_force_matcher.cpp @@ -65,12 +65,12 @@ namespace cv static const int OPT_SIZE = 100; static const char * T_ARR [] = { - "uchar", - "char", - "ushort", - "short", - "int", - "float -D T_FLOAT", + "uchar", + "char", + "ushort", + "short", + "int", + "float -D T_FLOAT", "double"}; template < int BLOCK_SIZE, int MAX_DESC_LEN/*, typename Mask*/ > @@ -86,8 +86,8 @@ void matchUnrolledCached(const oclMat &query, const oclMat &train, const oclMat vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", T_ARR[query.depth()], distType, block_size, m_size); if(globalSize[0] != 0) @@ -128,8 +128,8 @@ void match(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", T_ARR[query.depth()], distType, block_size); if(globalSize[0] != 0) { @@ -171,8 +171,8 @@ void matchUnrolledCached(const oclMat &query, const oclMat &train, float maxDist vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", T_ARR[query.depth()], distType, block_size, m_size); if(globalSize[0] != 0) @@ -212,8 +212,8 @@ void radius_match(const oclMat &query, const oclMat &train, float maxDistance, c vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", T_ARR[query.depth()], distType, block_size); if(globalSize[0] != 0) @@ -312,8 +312,8 @@ void knn_matchUnrolledCached(const oclMat &query, const oclMat &train, const ocl vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", T_ARR[query.depth()], distType, block_size, m_size); if(globalSize[0] != 0) @@ -348,8 +348,8 @@ void knn_match(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", T_ARR[query.depth()], distType, block_size); if(globalSize[0] != 0) @@ -384,8 +384,8 @@ void calcDistanceUnrolled(const oclMat &query, const oclMat &train, const oclMat vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d -D MAX_DESC_LEN=%d", T_ARR[query.depth()], distType, block_size, m_size); if(globalSize[0] != 0) @@ -420,8 +420,8 @@ void calcDistance(const oclMat &query, const oclMat &train, const oclMat &/*mask vector< pair > args; char opt [OPT_SIZE] = ""; - sprintf(opt, - "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", + sprintf(opt, + "-D T=%s -D DIST_TYPE=%d -D BLOCK_SIZE=%d", T_ARR[query.depth()], distType, block_size); if(globalSize[0] != 0) @@ -561,7 +561,7 @@ void cv::ocl::BruteForceMatcher_OCL_base::matchSingle(const oclMat &query, const { if (query.empty() || train.empty()) return; - + CV_Assert(query.channels() == 1 && query.depth() < CV_64F); CV_Assert(train.cols == query.cols && train.type() == query.type()); @@ -673,7 +673,7 @@ void cv::ocl::BruteForceMatcher_OCL_base::matchCollection(const oclMat &query, c return; CV_Assert(query.channels() == 1 && query.depth() < CV_64F); - + const int nQuery = query.rows; ensureSizeIsEnough(1, nQuery, CV_32S, trainIdx); @@ -845,8 +845,8 @@ void cv::ocl::BruteForceMatcher_OCL_base::knnMatch2Collection(const oclMat &quer if (query.empty() || trainCollection.empty()) return; - typedef void (*caller_t)(const oclMat & query, const oclMat & trains, const oclMat & masks, - const oclMat & trainIdx, const oclMat & imgIdx, const oclMat & distance); + // typedef void (*caller_t)(const oclMat & query, const oclMat & trains, const oclMat & masks, + // const oclMat & trainIdx, const oclMat & imgIdx, const oclMat & distance); CV_Assert(query.channels() == 1 && query.depth() < CV_64F); @@ -993,7 +993,7 @@ void cv::ocl::BruteForceMatcher_OCL_base::knnMatch(const oclMat &query, vector< // radiusMatchSingle void cv::ocl::BruteForceMatcher_OCL_base::radiusMatchSingle(const oclMat &query, const oclMat &train, - oclMat &trainIdx, oclMat &distance, oclMat &nMatches, float maxDistance, const oclMat &mask) + oclMat &trainIdx, oclMat &distance, oclMat &nMatches, float maxDistance, const oclMat &mask) { if (query.empty() || train.empty()) return; @@ -1095,9 +1095,9 @@ void cv::ocl::BruteForceMatcher_OCL_base::radiusMatchCollection(const oclMat &qu if (query.empty() || empty()) return; +#if 0 typedef void (*caller_t)(const oclMat & query, const oclMat * trains, int n, float maxDistance, const oclMat * masks, const oclMat & trainIdx, const oclMat & imgIdx, const oclMat & distance, const oclMat & nMatches); -#if 0 static const caller_t callers[3][6] = { { diff --git a/modules/ocl/src/gemm.cpp b/modules/ocl/src/gemm.cpp index 840f6285cc..44f23da69c 100644 --- a/modules/ocl/src/gemm.cpp +++ b/modules/ocl/src/gemm.cpp @@ -60,7 +60,7 @@ void cv::ocl::gemm(const oclMat &src1, const oclMat &src2, double alpha, const oclMat &src3, double beta, oclMat &dst, int flags) { 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 if(!src3.empty()) { diff --git a/modules/ocl/src/haar.cpp b/modules/ocl/src/haar.cpp index 1c727f01f9..8257a4322d 100644 --- a/modules/ocl/src/haar.cpp +++ b/modules/ocl/src/haar.cpp @@ -145,7 +145,8 @@ typedef struct int imgoff; float factor; } detect_piramid_info; -#ifdef WIN32 + +#if defined WIN32 && !defined __MINGW__ && !defined __MINGW32__ #define _ALIGNED_ON(_ALIGNMENT) __declspec(align(_ALIGNMENT)) typedef _ALIGNED_ON(128) struct GpuHidHaarFeature { From f856f78ac078e5c4ba67d5856281f3d60b8a4779 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Wed, 17 Apr 2013 22:02:01 +0400 Subject: [PATCH 43/49] Update CMake scripts to recognize Qt 5.0 --- CMakeLists.txt | 7 +++++-- cmake/OpenCVFindLibsGUI.cmake | 29 ++++++++++++++++++++++++----- modules/highgui/CMakeLists.txt | 21 ++++++++++++++++++++- modules/highgui/src/window_QT.h | 8 ++++---- 4 files changed, 53 insertions(+), 12 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f7e9489548..93549c9430 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -594,12 +594,15 @@ endif() status("") status(" GUI: ") -if(HAVE_QT) +if(HAVE_QT5) + status(" QT 5.x:" HAVE_QT THEN "YES (ver ${Qt5Core_VERSION_STRING})" ELSE NO) + status(" QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${Qt5OpenGL_LIBRARIES} ${Qt5OpenGL_VERSION_STRING})" ELSE NO) +elseif(HAVE_QT) status(" QT 4.x:" HAVE_QT THEN "YES (ver ${QT_VERSION_MAJOR}.${QT_VERSION_MINOR}.${QT_VERSION_PATCH} ${QT_EDITION})" ELSE NO) status(" QT OpenGL support:" HAVE_QT_OPENGL THEN "YES (${QT_QTOPENGL_LIBRARY})" ELSE NO) else() if(DEFINED WITH_QT) - status(" QT 4.x:" NO) + status(" QT:" NO) endif() if(DEFINED WITH_WIN32UI) status(" Win32 UI:" HAVE_WIN32UI THEN YES ELSE NO) diff --git a/cmake/OpenCVFindLibsGUI.cmake b/cmake/OpenCVFindLibsGUI.cmake index 3b42f1b0b3..2ea864c16f 100644 --- a/cmake/OpenCVFindLibsGUI.cmake +++ b/cmake/OpenCVFindLibsGUI.cmake @@ -13,12 +13,31 @@ if(WITH_WIN32UI) endif(WITH_WIN32UI) # --- QT4 --- -ocv_clear_vars(HAVE_QT) +ocv_clear_vars(HAVE_QT HAVE_QT5) if(WITH_QT) - find_package(Qt4) - if(QT4_FOUND) - set(HAVE_QT TRUE) - add_definitions(-DHAVE_QT) # We need to define the macro this way, using cvconfig.h does not work + if(NOT CMAKE_VERSION VERSION_LESS 2.8.3 AND NOT WITH_QT EQUAL 4) + find_package(Qt5Core) + find_package(Qt5Gui) + find_package(Qt5Widgets) + find_package(Qt5Test) + find_package(Qt5Concurrent) + if(Qt5Core_FOUND AND Qt5Gui_FOUND AND Qt5Widgets_FOUND AND Qt5Test_FOUND AND Qt5Concurrent_FOUND) + set(HAVE_QT5 ON) + set(HAVE_QT ON) + add_definitions(-DHAVE_QT) + find_package(Qt5OpenGL) + if(Qt5OpenGL_FOUND) + set(QT_QTOPENGL_FOUND ON) + endif() + endif() + endif() + + if(NOT HAVE_QT) + find_package(Qt4) + if(QT4_FOUND) + set(HAVE_QT TRUE) + add_definitions(-DHAVE_QT) # We need to define the macro this way, using cvconfig.h does not work + endif() endif() endif() diff --git a/modules/highgui/CMakeLists.txt b/modules/highgui/CMakeLists.txt index 3eec81d116..4c60867af3 100644 --- a/modules/highgui/CMakeLists.txt +++ b/modules/highgui/CMakeLists.txt @@ -70,7 +70,26 @@ set(highgui_srcs file(GLOB highgui_ext_hdrs "include/opencv2/${name}/*.hpp" "include/opencv2/${name}/*.h") -if(HAVE_QT) +if(HAVE_QT5) + set(CMAKE_AUTOMOC ON) + set(CMAKE_INCLUDE_CURRENT_DIR ON) + + QT5_ADD_RESOURCES(_RCC_OUTFILES src/window_QT.qrc) + list(APPEND highgui_srcs src/window_QT.cpp src/window_QT.h ${_RCC_OUTFILES}) + + foreach(dt5_dep Core Gui Widgets Test Concurrent) + add_definitions(${Qt5${dt5_dep}_DEFINITIONS}) + include_directories(${Qt5${dt5_dep}_INCLUDE_DIRS}) + list(APPEND HIGHGUI_LIBRARIES ${Qt5${dt5_dep}_LIBRARIES}) + endforeach() + + if(HAVE_QT_OPENGL) + add_definitions(${Qt5OpenGL_DEFINITIONS}) + include_directories(${Qt5OpenGL_INCLUDE_DIRS}) + list(APPEND HIGHGUI_LIBRARIES ${Qt5OpenGL_LIBRARIES}) + endif() + +elseif(HAVE_QT) if (HAVE_QT_OPENGL) set(QT_USE_QTOPENGL TRUE) endif() diff --git a/modules/highgui/src/window_QT.h b/modules/highgui/src/window_QT.h index 1b07442dc9..089997f514 100644 --- a/modules/highgui/src/window_QT.h +++ b/modules/highgui/src/window_QT.h @@ -48,13 +48,13 @@ #endif #include -#include +#include #include #include -#include +#include #include #include -#include +#include #include #include #include @@ -78,7 +78,7 @@ #include #include #include -#include +#include //start private enum enum { CV_MODE_NORMAL = 0, CV_MODE_OPENGL = 1 }; From 1d1d28baf2b14e5697a61ba92e8e46e80cdedc17 Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 14 May 2013 18:02:53 +0800 Subject: [PATCH 44/49] fix black screen when input Mat is large --- modules/ocl/src/moments.cpp | 2 +- modules/ocl/src/opencl/moments.cl | 114 +++++++++++++++++++++++++----- 2 files changed, 98 insertions(+), 18 deletions(-) diff --git a/modules/ocl/src/moments.cpp b/modules/ocl/src/moments.cpp index 8028ca5c7c..d6baba207c 100644 --- a/modules/ocl/src/moments.cpp +++ b/modules/ocl/src/moments.cpp @@ -327,7 +327,7 @@ static void ocl_cvMoments( const void* array, CvMoments* mom, int binary ) mom->m12 = dstsum[8]; mom->m03 = dstsum[9]; delete [] dstsum; - + openCLSafeCall(clReleaseMemObject(sum)); icvCompleteMomentState( mom ); } diff --git a/modules/ocl/src/opencl/moments.cl b/modules/ocl/src/opencl/moments.cl index f8d6024e9f..2378f4f849 100644 --- a/modules/ocl/src/opencl/moments.cl +++ b/modules/ocl/src/opencl/moments.cl @@ -1,3 +1,48 @@ +/*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 +// Sen Liu, swjtuls1987@126.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*/ + #if defined (DOUBLE_SUPPORT) #ifdef cl_khr_fp64 @@ -609,22 +654,33 @@ __kernel void CvMoments_D5( __global float* src_data, int src_rows, int src_cols int y = wgidy*TILE_SIZE; // real Y index of pixel int x = wgidx*TILE_SIZE; // real X index of pixel int kcn = (cn==2)?2:4; - int rstep = min(src_step/4, TILE_SIZE); + src_step /= sizeof(*src_data); + int rstep = min(src_step, TILE_SIZE); tileSize_height = min(TILE_SIZE, src_rows - y); tileSize_width = min(TILE_SIZE, src_cols -x); - if(tileSize_width < TILE_SIZE) - for(int i = tileSize_width; i < rstep; i++ ) - *((__global float*)src_data+(y+lidy)*src_step/4+x+i) = 0; + int maxIdx = mul24(src_rows, src_cols); + int yOff = (y+lidy)*src_step; + int index; + if(tileSize_width < TILE_SIZE && yOff < src_rows) + for(int i = tileSize_width; i < rstep && (yOff+x+i) < maxIdx; i++ ) + *(src_data+yOff+x+i) = 0; if( coi > 0 ) for(int i=0; i < tileSize_width; i+=VLEN_F) { +#pragma unroll for(int j=0; j<4; j++) - tmp_coi[j] = *(src_data+(y+lidy)*src_step/4+(x+i+j)*kcn+coi-1); + { + index = yOff+(x+i+j)*kcn+coi-1; + if (index < maxIdx) + tmp_coi[j] = *(src_data+index); + else + tmp_coi[j] = 0; + } tmp[i/VLEN_F] = (float4)(tmp_coi[0],tmp_coi[1],tmp_coi[2],tmp_coi[3]); } else - for(int i=0; i < tileSize_width; i+=VLEN_F) - tmp[i/VLEN_F] = (float4)(*(src_data+(y+lidy)*src_step/4+x+i),*(src_data+(y+lidy)*src_step/4+x+i+1),*(src_data+(y+lidy)*src_step/4+x+i+2),*(src_data+(y+lidy)*src_step/4+x+i+3)); + for(int i=0; i < tileSize_width && (yOff+x+i) < maxIdx; i+=VLEN_F) + tmp[i/VLEN_F] = (*(__global float4 *)(src_data+yOff+x+i)); float4 zero = (float4)(0); float4 full = (float4)(255); if( binary ) @@ -714,35 +770,59 @@ __kernel void CvMoments_D5( __global float* src_data, int src_rows, int src_cols // accumulate moments computed in each tile dst_step /= sizeof(F); + int dst_x_off = mad24(wgidy, dst_cols, wgidx); + int dst_off = 0; + int max_dst_index = 10 * blocky * get_global_size(1); + // + m00 ( = m00' ) - *(dst_m + mad24(DST_ROW_00 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[0]; + dst_off = mad24(DST_ROW_00 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[0]; // + m10 ( = m10' + x*m00' ) - *(dst_m + mad24(DST_ROW_10 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[1] + xm; + dst_off = mad24(DST_ROW_10 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[1] + xm; // + m01 ( = m01' + y*m00' ) - *(dst_m + mad24(DST_ROW_01 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[2] + ym; + dst_off = mad24(DST_ROW_01 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[2] + ym; // + m20 ( = m20' + 2*x*m10' + x*x*m00' ) - *(dst_m + mad24(DST_ROW_20 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[3] + x * (mom[1] * 2 + xm); + dst_off = mad24(DST_ROW_20 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[3] + x * (mom[1] * 2 + xm); // + m11 ( = m11' + x*m01' + y*m10' + x*y*m00' ) - *(dst_m + mad24(DST_ROW_11 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[4] + x * (mom[2] + ym) + y * mom[1]; + dst_off = mad24(DST_ROW_11 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[4] + x * (mom[2] + ym) + y * mom[1]; // + m02 ( = m02' + 2*y*m01' + y*y*m00' ) - *(dst_m + mad24(DST_ROW_02 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[5] + y * (mom[2] * 2 + ym); + dst_off = mad24(DST_ROW_02 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[5] + y * (mom[2] * 2 + ym); // + m30 ( = m30' + 3*x*m20' + 3*x*x*m10' + x*x*x*m00' ) - *(dst_m + mad24(DST_ROW_30 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[6] + x * (3. * mom[3] + x * (3. * mom[1] + xm)); + dst_off = mad24(DST_ROW_30 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[6] + x * (3. * mom[3] + x * (3. * mom[1] + xm)); // + m21 ( = m21' + x*(2*m11' + 2*y*m10' + x*m01' + x*y*m00') + y*m20') - *(dst_m + mad24(DST_ROW_21 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[7] + x * (2 * (mom[4] + y * mom[1]) + x * (mom[2] + ym)) + y * mom[3]; + dst_off = mad24(DST_ROW_21 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[7] + x * (2 * (mom[4] + y * mom[1]) + x * (mom[2] + ym)) + y * mom[3]; // + m12 ( = m12' + y*(2*m11' + 2*x*m01' + y*m10' + x*y*m00') + x*m02') - *(dst_m + mad24(DST_ROW_12 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[8] + y * (2 * (mom[4] + x * mom[2]) + y * (mom[1] + xm)) + x * mom[5]; + dst_off = mad24(DST_ROW_12 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[8] + y * (2 * (mom[4] + x * mom[2]) + y * (mom[1] + xm)) + x * mom[5]; // + m03 ( = m03' + 3*y*m02' + 3*y*y*m01' + y*y*y*m00' ) - *(dst_m + mad24(DST_ROW_03 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[9] + y * (3. * mom[5] + y * (3. * mom[2] + ym)); + dst_off = mad24(DST_ROW_03 * blocky, dst_step, dst_x_off); + if (dst_off < max_dst_index) + *(dst_m + dst_off) = mom[9] + y * (3. * mom[5] + y * (3. * mom[2] + ym)); } } From df3997b108600d95835944c26cb98e7bbdcdbf18 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Wed, 15 May 2013 08:51:21 +0800 Subject: [PATCH 45/49] Fix ocl::pyrUp Use predefined OpenCL function to convert integers to floating points. This is more accurate than before as it enables: 1. saturate cast 2. customized rounding --- modules/ocl/src/opencl/pyr_up.cl | 82 +++++++------------------------- 1 file changed, 16 insertions(+), 66 deletions(-) diff --git a/modules/ocl/src/opencl/pyr_up.cl b/modules/ocl/src/opencl/pyr_up.cl index 0b7f0c9025..ef41c9408d 100644 --- a/modules/ocl/src/opencl/pyr_up.cl +++ b/modules/ocl/src/opencl/pyr_up.cl @@ -18,6 +18,7 @@ // Zhang Chunpeng chunpeng@multicorewareinc.com // Dachuan Zhao, dachuan@multicorewareinc.com // Yao Wang, yao@multicorewareinc.com +// Peng Xiao, pengxiao@outlook.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -47,7 +48,7 @@ //#pragma OPENCL EXTENSION cl_amd_printf : enable -uchar get_valid_uchar(uchar data) +uchar get_valid_uchar(float data) { return (uchar)(data <= 255 ? data : data > 0 ? 255 : 0); } @@ -142,7 +143,7 @@ __kernel void pyrUp_C1_D0(__global uchar* src,__global uchar* dst, sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][tidx]; if ((x < dstCols) && (y < dstRows)) - dst[x + y * dstStep] = (float)(4.0f * sum); + dst[x + y * dstStep] = convert_uchar_sat_rte(4.0f * sum); } @@ -244,7 +245,7 @@ __kernel void pyrUp_C1_D2(__global ushort* src,__global ushort* dst, sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][get_local_id(0)]; if ((x < dstCols) && (y < dstRows)) - dst[x + y * dstStep] = (float)(4.0f * sum); + dst[x + y * dstStep] = convert_short_sat_rte(4.0f * sum); } @@ -351,31 +352,6 @@ __kernel void pyrUp_C1_D5(__global float* src,__global float* dst, /////////////////////////////////////////////////////////////////////// ////////////////////////// CV_8UC4 ////////////////////////////////// /////////////////////////////////////////////////////////////////////// -float4 covert_uchar4_to_float4(uchar4 data) -{ - float4 f4Data = {0,0,0,0}; - - f4Data.x = (float)data.x; - f4Data.y = (float)data.y; - f4Data.z = (float)data.z; - f4Data.w = (float)data.w; - - return f4Data; -} - - -uchar4 convert_float4_to_uchar4(float4 data) -{ - uchar4 u4Data; - - u4Data.x = get_valid_uchar(data.x); - u4Data.y = get_valid_uchar(data.y); - u4Data.z = get_valid_uchar(data.z); - u4Data.w = get_valid_uchar(data.w); - - return u4Data; -} - __kernel void pyrUp_C4_D0(__global uchar4* src,__global uchar4* dst, int srcRows,int dstRows,int srcCols,int dstCols, int srcOffset,int dstOffset,int srcStep,int dstStep) @@ -406,7 +382,7 @@ __kernel void pyrUp_C4_D0(__global uchar4* src,__global uchar4* dst, srcy = abs(srcy); srcy = min(srcRows -1 ,srcy); - s_srcPatch[tidy][tidx] = covert_uchar4_to_float4(src[srcx + srcy * srcStep]); + s_srcPatch[tidy][tidx] = convert_float4(src[srcx + srcy * srcStep]); } barrier(CLK_LOCAL_MEM_FENCE); @@ -476,38 +452,12 @@ __kernel void pyrUp_C4_D0(__global uchar4* src,__global uchar4* dst, if ((x < dstCols) && (y < dstRows)) { - dst[x + y * dstStep] = convert_float4_to_uchar4(4.0f * sum); + dst[x + y * dstStep] = convert_uchar4_sat_rte(4.0f * sum); } } /////////////////////////////////////////////////////////////////////// ////////////////////////// CV_16UC4 ////////////////////////////////// /////////////////////////////////////////////////////////////////////// -float4 covert_ushort4_to_float4(ushort4 data) -{ - float4 f4Data = {0,0,0,0}; - - f4Data.x = (float)data.x; - f4Data.y = (float)data.y; - f4Data.z = (float)data.z; - f4Data.w = (float)data.w; - - return f4Data; -} - - -ushort4 convert_float4_to_ushort4(float4 data) -{ - ushort4 u4Data; - - u4Data.x = (float)data.x; - u4Data.y = (float)data.y; - u4Data.z = (float)data.z; - u4Data.w = (float)data.w; - - return u4Data; -} - - __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, int srcRows,int dstRows,int srcCols,int dstCols, int srcOffset,int dstOffset,int srcStep,int dstStep) @@ -535,7 +485,7 @@ __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, srcy = abs(srcy); srcy = min(srcRows -1 ,srcy); - s_srcPatch[get_local_id(1)][get_local_id(0)] = covert_ushort4_to_float4(src[srcx + srcy * srcStep]); + s_srcPatch[get_local_id(1)][get_local_id(0)] = convert_float4(src[srcx + srcy * srcStep]); } barrier(CLK_LOCAL_MEM_FENCE); @@ -570,11 +520,11 @@ __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, if (eveny) { - sum = sum + (evenFlag * co3) * s_srcPatch[0][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * co2 ) * s_srcPatch[0][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * co3 ) * s_srcPatch[0][1 + ((tidx - 2) >> 1)]; + sum = sum + (oddFlag * co2 ) * s_srcPatch[0][1 + ((tidx - 1) >> 1)]; sum = sum + (evenFlag * co1 ) * s_srcPatch[0][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * co2 ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)]; - sum = sum + (evenFlag * co3) * s_srcPatch[0][1 + ((tidx + 2) >> 1)]; + sum = sum + (oddFlag * co2 ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * co3 ) * s_srcPatch[0][1 + ((tidx + 2) >> 1)]; } s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; @@ -610,7 +560,7 @@ __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, if ((x < dstCols) && (y < dstRows)) { - dst[x + y * dstStep] = convert_float4_to_ushort4(4.0f * sum); + dst[x + y * dstStep] = convert_ushort4_sat_rte(4.0f * sum); } } @@ -681,11 +631,11 @@ __kernel void pyrUp_C4_D5(__global float4* src,__global float4* dst, if (eveny) { - sum = sum + (evenFlag * co3) * s_srcPatch[lsizey-16][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * co2 ) * s_srcPatch[lsizey-16][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * co3 ) * s_srcPatch[lsizey-16][1 + ((tidx - 2) >> 1)]; + sum = sum + (oddFlag * co2 ) * s_srcPatch[lsizey-16][1 + ((tidx - 1) >> 1)]; sum = sum + (evenFlag * co1 ) * s_srcPatch[lsizey-16][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * co2 ) * s_srcPatch[lsizey-16][1 + ((tidx + 1) >> 1)]; - sum = sum + (evenFlag * co3) * s_srcPatch[lsizey-16][1 + ((tidx + 2) >> 1)]; + sum = sum + ( oddFlag * co2 ) * s_srcPatch[lsizey-16][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * co3 ) * s_srcPatch[lsizey-16][1 + ((tidx + 2) >> 1)]; } s_dstPatch[tidy][tidx] = sum; From 3f93c3cc4e7d106fb5386695173f34578191745b Mon Sep 17 00:00:00 2001 From: peng xiao Date: Wed, 15 May 2013 10:43:47 +0800 Subject: [PATCH 46/49] Clean up spaces in ocl.hpp --- modules/ocl/include/opencv2/ocl/ocl.hpp | 372 ------------------------ 1 file changed, 372 deletions(-) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 6f29377f48..5c6a39ee12 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -866,7 +866,6 @@ namespace cv std::vector image_sqsums; }; - //! computes the proximity map for the raster template and the image where the template is searched for // Supports TM_SQDIFF, TM_SQDIFF_NORMED, TM_CCORR, TM_CCORR_NORMED, TM_CCOEFF, TM_CCOEFF_NORMED for type 8UC1 and 8UC4 // Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4 @@ -877,71 +876,36 @@ namespace cv // Supports TM_SQDIFF, TM_CCORR for type 32FC1 and 32FC4 CV_EXPORTS void matchTemplate(const oclMat &image, const oclMat &templ, oclMat &result, int method, MatchTemplateBuf &buf); - - ///////////////////////////////////////////// Canny ///////////////////////////////////////////// - struct CV_EXPORTS CannyBuf; - - - //! compute edges of the input image using Canny operator - // Support CV_8UC1 only - CV_EXPORTS void Canny(const oclMat &image, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false); - CV_EXPORTS void Canny(const oclMat &image, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, int apperture_size = 3, bool L2gradient = false); - CV_EXPORTS void Canny(const oclMat &dx, const oclMat &dy, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false); - CV_EXPORTS void Canny(const oclMat &dx, const oclMat &dy, CannyBuf &buf, oclMat &edges, double low_thresh, double high_thresh, bool L2gradient = false); - - struct CV_EXPORTS CannyBuf - { - CannyBuf() : counter(NULL) {} - ~CannyBuf() { release(); } - explicit CannyBuf(const Size &image_size, int apperture_size = 3) : counter(NULL) - { - create(image_size, apperture_size); - } - CannyBuf(const oclMat &dx_, const oclMat &dy_); - - void create(const Size &image_size, int apperture_size = 3); - - - void release(); - - - oclMat dx, dy; - oclMat dx_buf, dy_buf; - oclMat edgeBuf; - oclMat trackBuf1, trackBuf2; - void *counter; - Ptr filterDX, filterDY; - }; ///////////////////////////////////////// clAmdFft related ///////////////////////////////////////// @@ -966,159 +930,69 @@ namespace cv const oclMat &src3, double beta, oclMat &dst, int flags = 0); //////////////// HOG (Histogram-of-Oriented-Gradients) Descriptor and Object Detector ////////////// - struct CV_EXPORTS HOGDescriptor - { - enum { DEFAULT_WIN_SIGMA = -1 }; - enum { DEFAULT_NLEVELS = 64 }; - enum { DESCR_FORMAT_ROW_BY_ROW, DESCR_FORMAT_COL_BY_COL }; - - - HOGDescriptor(Size win_size = Size(64, 128), Size block_size = Size(16, 16), - Size block_stride = Size(8, 8), Size cell_size = Size(8, 8), - int nbins = 9, double win_sigma = DEFAULT_WIN_SIGMA, - double threshold_L2hys = 0.2, bool gamma_correction = true, - int nlevels = DEFAULT_NLEVELS); - - size_t getDescriptorSize() const; - size_t getBlockHistogramSize() const; - - - void setSVMDetector(const vector &detector); - - - static vector getDefaultPeopleDetector(); - static vector getPeopleDetector48x96(); - static vector getPeopleDetector64x128(); - - - void detect(const oclMat &img, vector &found_locations, - double hit_threshold = 0, Size win_stride = Size(), - Size padding = Size()); - - - void detectMultiScale(const oclMat &img, vector &found_locations, - double hit_threshold = 0, Size win_stride = Size(), - Size padding = Size(), double scale0 = 1.05, - int group_threshold = 2); - - - void getDescriptors(const oclMat &img, Size win_stride, - oclMat &descriptors, - int descr_format = DESCR_FORMAT_COL_BY_COL); - - - Size win_size; - Size block_size; - Size block_stride; - Size cell_size; int nbins; - double win_sigma; - double threshold_L2hys; - bool gamma_correction; - int nlevels; - - protected: - // initialize buffers; only need to do once in case of multiscale detection - void init_buffer(const oclMat &img, Size win_stride); - - - void computeBlockHistograms(const oclMat &img); - void computeGradient(const oclMat &img, oclMat &grad, oclMat &qangle); - - - double getWinSigma() const; - bool checkDetectorSize() const; - - static int numPartsWithin(int size, int part_size, int stride); - static Size numPartsWithin(Size size, Size part_size, Size stride); - - // Coefficients of the separating plane - float free_coef; - oclMat detector; - - - // Results of the last classification step - oclMat labels; - Mat labels_host; - - - // Results of the last histogram evaluation step - oclMat block_hists; - - - // Gradients conputation results - oclMat grad, qangle; - - - // scaled image - oclMat image_scale; - - - // effect size of input image (might be different from original size after scaling) - Size effect_size; - }; @@ -1126,13 +1000,11 @@ namespace cv /****************************************************************************************\ * Distance * \****************************************************************************************/ - template struct CV_EXPORTS Accumulator { typedef T Type; }; - template<> struct Accumulator { typedef float Type; @@ -1206,469 +1078,225 @@ namespace cv { public: enum DistType {L1Dist = 0, L2Dist, HammingDist}; - explicit BruteForceMatcher_OCL_base(DistType distType = L2Dist); - - - // Add descriptors to train descriptor collection - void add(const std::vector &descCollection); - - - // Get train descriptors collection - const std::vector &getTrainDescriptors() const; - - - // Clear train descriptors collection - void clear(); - - - // Return true if there are not train descriptors in collection - bool empty() const; - - // Return true if the matcher supports mask in match methods - bool isMaskSupported() const; - - // Find one best match for each query descriptor - void matchSingle(const oclMat &query, const oclMat &train, - oclMat &trainIdx, oclMat &distance, - const oclMat &mask = oclMat()); - - // Download trainIdx and distance and convert it to CPU vector with DMatch - static void matchDownload(const oclMat &trainIdx, const oclMat &distance, std::vector &matches); - // Convert trainIdx and distance to vector with DMatch - static void matchConvert(const Mat &trainIdx, const Mat &distance, std::vector &matches); - - // Find one best match for each query descriptor - void match(const oclMat &query, const oclMat &train, std::vector &matches, const oclMat &mask = oclMat()); - - // Make gpu collection of trains and masks in suitable format for matchCollection function - void makeGpuCollection(oclMat &trainCollection, oclMat &maskCollection, const std::vector &masks = std::vector()); - // Find one best match from train collection for each query descriptor - void matchCollection(const oclMat &query, const oclMat &trainCollection, - oclMat &trainIdx, oclMat &imgIdx, oclMat &distance, - const oclMat &masks = oclMat()); - - // Download trainIdx, imgIdx and distance and convert it to vector with DMatch - static void matchDownload(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, std::vector &matches); - // Convert trainIdx, imgIdx and distance to vector with DMatch - static void matchConvert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance, std::vector &matches); - - // Find one best match from train collection for each query descriptor. - void match(const oclMat &query, std::vector &matches, const std::vector &masks = std::vector()); - - // Find k best matches for each query descriptor (in increasing order of distances) - void knnMatchSingle(const oclMat &query, const oclMat &train, - oclMat &trainIdx, oclMat &distance, oclMat &allDist, int k, - const oclMat &mask = oclMat()); - - // Download trainIdx and distance and convert it to vector with DMatch - // compactResult is used when mask is not empty. If compactResult is false matches - // vector will have the same size as queryDescriptors rows. If compactResult is true - // matches vector will not contain matches for fully masked out query descriptors. - static void knnMatchDownload(const oclMat &trainIdx, const oclMat &distance, - std::vector< std::vector > &matches, bool compactResult = false); // Convert trainIdx and distance to vector with DMatch - static void knnMatchConvert(const Mat &trainIdx, const Mat &distance, - std::vector< std::vector > &matches, bool compactResult = false); - - // Find k best matches for each query descriptor (in increasing order of distances). - // compactResult is used when mask is not empty. If compactResult is false matches - // vector will have the same size as queryDescriptors rows. If compactResult is true - // matches vector will not contain matches for fully masked out query descriptors. - void knnMatch(const oclMat &query, const oclMat &train, - std::vector< std::vector > &matches, int k, const oclMat &mask = oclMat(), - bool compactResult = false); - - // Find k best matches from train collection for each query descriptor (in increasing order of distances) - void knnMatch2Collection(const oclMat &query, const oclMat &trainCollection, - oclMat &trainIdx, oclMat &imgIdx, oclMat &distance, - const oclMat &maskCollection = oclMat()); - - // Download trainIdx and distance and convert it to vector with DMatch - // compactResult is used when mask is not empty. If compactResult is false matches - // vector will have the same size as queryDescriptors rows. If compactResult is true - // matches vector will not contain matches for fully masked out query descriptors. - static void knnMatch2Download(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, - std::vector< std::vector > &matches, bool compactResult = false); // Convert trainIdx and distance to vector with DMatch - static void knnMatch2Convert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance, - std::vector< std::vector > &matches, bool compactResult = false); - - // Find k best matches for each query descriptor (in increasing order of distances). - // compactResult is used when mask is not empty. If compactResult is false matches - // vector will have the same size as queryDescriptors rows. If compactResult is true - // matches vector will not contain matches for fully masked out query descriptors. - void knnMatch(const oclMat &query, std::vector< std::vector > &matches, int k, - const std::vector &masks = std::vector(), bool compactResult = false); - - // Find best matches for each query descriptor which have distance less than maxDistance. - // nMatches.at(0, queryIdx) will contain matches count for queryIdx. - // carefully nMatches can be greater than trainIdx.cols - it means that matcher didn't find all matches, - // because it didn't have enough memory. - // If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nTrain / 100), 10), - // otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches - // Matches doesn't sorted. - void radiusMatchSingle(const oclMat &query, const oclMat &train, - oclMat &trainIdx, oclMat &distance, oclMat &nMatches, float maxDistance, - const oclMat &mask = oclMat()); - - // Download trainIdx, nMatches and distance and convert it to vector with DMatch. - // matches will be sorted in increasing order of distances. - // compactResult is used when mask is not empty. If compactResult is false matches - // vector will have the same size as queryDescriptors rows. If compactResult is true - // matches vector will not contain matches for fully masked out query descriptors. - static void radiusMatchDownload(const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches, - std::vector< std::vector > &matches, bool compactResult = false); - // Convert trainIdx, nMatches and distance to vector with DMatch. - static void radiusMatchConvert(const Mat &trainIdx, const Mat &distance, const Mat &nMatches, - std::vector< std::vector > &matches, bool compactResult = false); - - - // Find best matches for each query descriptor which have distance less than maxDistance - // in increasing order of distances). - void radiusMatch(const oclMat &query, const oclMat &train, - std::vector< std::vector > &matches, float maxDistance, - const oclMat &mask = oclMat(), bool compactResult = false); - - - // Find best matches for each query descriptor which have distance less than maxDistance. - // If trainIdx is empty, then trainIdx and distance will be created with size nQuery x max((nQuery / 100), 10), - // otherwize user can pass own allocated trainIdx and distance with size nQuery x nMaxMatches - // Matches doesn't sorted. - void radiusMatchCollection(const oclMat &query, oclMat &trainIdx, oclMat &imgIdx, oclMat &distance, oclMat &nMatches, float maxDistance, - const std::vector &masks = std::vector()); - - - // Download trainIdx, imgIdx, nMatches and distance and convert it to vector with DMatch. - // matches will be sorted in increasing order of distances. - // compactResult is used when mask is not empty. If compactResult is false matches - // vector will have the same size as queryDescriptors rows. If compactResult is true - // matches vector will not contain matches for fully masked out query descriptors. - static void radiusMatchDownload(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, const oclMat &nMatches, - std::vector< std::vector > &matches, bool compactResult = false); - // Convert trainIdx, nMatches and distance to vector with DMatch. - static void radiusMatchConvert(const Mat &trainIdx, const Mat &imgIdx, const Mat &distance, const Mat &nMatches, - std::vector< std::vector > &matches, bool compactResult = false); - - - // Find best matches from train collection for each query descriptor which have distance less than - // maxDistance (in increasing order of distances). - void radiusMatch(const oclMat &query, std::vector< std::vector > &matches, float maxDistance, - const std::vector &masks = std::vector(), bool compactResult = false); - - - DistType distType; - - - private: - std::vector trainDescCollection; - }; - - template - class CV_EXPORTS BruteForceMatcher_OCL; - - template - class CV_EXPORTS BruteForceMatcher_OCL< L1 > : public BruteForceMatcher_OCL_base - { - public: - explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(L1Dist) {} - explicit BruteForceMatcher_OCL(L1 /*d*/) : BruteForceMatcher_OCL_base(L1Dist) {} - }; template - class CV_EXPORTS BruteForceMatcher_OCL< L2 > : public BruteForceMatcher_OCL_base - { - public: - explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(L2Dist) {} - explicit BruteForceMatcher_OCL(L2 /*d*/) : BruteForceMatcher_OCL_base(L2Dist) {} - }; template <> class CV_EXPORTS BruteForceMatcher_OCL< Hamming > : public BruteForceMatcher_OCL_base - { - public: - explicit BruteForceMatcher_OCL() : BruteForceMatcher_OCL_base(HammingDist) {} - explicit BruteForceMatcher_OCL(Hamming /*d*/) : BruteForceMatcher_OCL_base(HammingDist) {} - }; - - /////////////////////////////// PyrLKOpticalFlow ///////////////////////////////////// - class CV_EXPORTS PyrLKOpticalFlow - { - public: - PyrLKOpticalFlow() - { - winSize = Size(21, 21); - maxLevel = 3; - iters = 30; - derivLambda = 0.5; - useInitialFlow = false; - minEigThreshold = 1e-4f; - getMinEigenVals = false; - isDeviceArch11_ = false; - } - - void sparse(const oclMat &prevImg, const oclMat &nextImg, const oclMat &prevPts, oclMat &nextPts, - oclMat &status, oclMat *err = 0); - - - void dense(const oclMat &prevImg, const oclMat &nextImg, oclMat &u, oclMat &v, oclMat *err = 0); - - - Size winSize; - int maxLevel; - int iters; - double derivLambda; - bool useInitialFlow; - float minEigThreshold; - bool getMinEigenVals; - - - void releaseMemory() - { - dx_calcBuf_.release(); - dy_calcBuf_.release(); - - prevPyr_.clear(); - nextPyr_.clear(); - - dx_buf_.release(); - dy_buf_.release(); - } - - - private: - void calcSharrDeriv(const oclMat &src, oclMat &dx, oclMat &dy); - - - void buildImagePyramid(const oclMat &img0, vector &pyr, bool withBorder); - - oclMat dx_calcBuf_; - oclMat dy_calcBuf_; - - vector prevPyr_; - vector nextPyr_; - - oclMat dx_buf_; - oclMat dy_buf_; - - - oclMat uPyr_[2]; - oclMat vPyr_[2]; - - - bool isDeviceArch11_; - }; //////////////// build warping maps //////////////////// //! builds plane warping maps From d053f2165d12e6044b51a713c0b586a5cf2d6f27 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Wed, 15 May 2013 10:47:17 +0800 Subject: [PATCH 47/49] Add BFMatcher_OCL class alias for BruteForceMatcher_OCL. This adds a similar interface with pure-cpp and gpu versions. --- modules/ocl/include/opencv2/ocl/ocl.hpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 5c6a39ee12..17210699b0 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -1245,6 +1245,11 @@ namespace cv explicit BruteForceMatcher_OCL(Hamming /*d*/) : BruteForceMatcher_OCL_base(HammingDist) {} }; + class CV_EXPORTS BFMatcher_OCL : public BruteForceMatcher_OCL_base + { + public: + explicit BFMatcher_OCL(int norm = NORM_L2) : BruteForceMatcher_OCL_base(norm == NORM_L1 ? L1Dist : norm == NORM_L2 ? L2Dist : HammingDist) {} + }; /////////////////////////////// PyrLKOpticalFlow ///////////////////////////////////// class CV_EXPORTS PyrLKOpticalFlow { From ec52096e30860d59717f81816fafe0c9e4c6fdc0 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 16 May 2013 13:47:24 +0400 Subject: [PATCH 48/49] removed VIBE implementation --- .../nonfree/doc/background_subtraction.rst | 79 ----- modules/nonfree/doc/nonfree.rst | 1 - .../nonfree/include/opencv2/nonfree/gpu.hpp | 35 --- modules/nonfree/perf/perf_gpu.cpp | 83 ------ modules/nonfree/src/cuda/vibe.cu | 271 ------------------ modules/nonfree/src/vibe_gpu.cpp | 141 --------- modules/nonfree/test/test_gpu.cpp | 38 --- samples/gpu/bgfg_segm.cpp | 37 +-- 8 files changed, 2 insertions(+), 683 deletions(-) delete mode 100644 modules/nonfree/doc/background_subtraction.rst delete mode 100644 modules/nonfree/src/cuda/vibe.cu delete mode 100644 modules/nonfree/src/vibe_gpu.cpp diff --git a/modules/nonfree/doc/background_subtraction.rst b/modules/nonfree/doc/background_subtraction.rst deleted file mode 100644 index 11603ca566..0000000000 --- a/modules/nonfree/doc/background_subtraction.rst +++ /dev/null @@ -1,79 +0,0 @@ -Background Subtraction -====================== - -.. highlight:: cpp - - - -gpu::VIBE_GPU -------------- -.. ocv:class:: gpu::VIBE_GPU - -Class used for background/foreground segmentation. :: - - class VIBE_GPU - { - public: - explicit VIBE_GPU(unsigned long rngSeed = 1234567); - - void initialize(const GpuMat& firstFrame, Stream& stream = Stream::Null()); - - void operator()(const GpuMat& frame, GpuMat& fgmask, Stream& stream = Stream::Null()); - - void release(); - - ... - }; - -The class discriminates between foreground and background pixels by building and maintaining a model of the background. Any pixel which does not fit this model is then deemed to be foreground. The class implements algorithm described in [VIBE2011]_. - - - -gpu::VIBE_GPU::VIBE_GPU ------------------------ -The constructor. - -.. ocv:function:: gpu::VIBE_GPU::VIBE_GPU(unsigned long rngSeed = 1234567) - - :param rngSeed: Value used to initiate a random sequence. - -Default constructor sets all parameters to default values. - - - -gpu::VIBE_GPU::initialize -------------------------- -Initialize background model and allocates all inner buffers. - -.. ocv:function:: void gpu::VIBE_GPU::initialize(const GpuMat& firstFrame, Stream& stream = Stream::Null()) - - :param firstFrame: First frame from video sequence. - - :param stream: Stream for the asynchronous version. - - - -gpu::VIBE_GPU::operator() -------------------------- -Updates the background model and returns the foreground mask - -.. ocv:function:: void gpu::VIBE_GPU::operator()(const GpuMat& frame, GpuMat& fgmask, Stream& stream = Stream::Null()) - - :param frame: Next video frame. - - :param fgmask: The output foreground mask as an 8-bit binary image. - - :param stream: Stream for the asynchronous version. - - - -gpu::VIBE_GPU::release ----------------------- -Releases all inner buffer's memory. - -.. ocv:function:: void gpu::VIBE_GPU::release() - - - - -.. [VIBE2011] O. Barnich and M. Van D Roogenbroeck. *ViBe: A universal background subtraction algorithm for video sequences*. IEEE Transactions on Image Processing, 20(6) :1709-1724, June 2011 diff --git a/modules/nonfree/doc/nonfree.rst b/modules/nonfree/doc/nonfree.rst index f8fa1d6eba..e524ea82f8 100644 --- a/modules/nonfree/doc/nonfree.rst +++ b/modules/nonfree/doc/nonfree.rst @@ -8,4 +8,3 @@ The module contains algorithms that may be patented in some countries or have so :maxdepth: 2 feature_detection - background_subtraction diff --git a/modules/nonfree/include/opencv2/nonfree/gpu.hpp b/modules/nonfree/include/opencv2/nonfree/gpu.hpp index c8a24e01ec..3cb0b47621 100644 --- a/modules/nonfree/include/opencv2/nonfree/gpu.hpp +++ b/modules/nonfree/include/opencv2/nonfree/gpu.hpp @@ -125,41 +125,6 @@ public: GpuMat maxPosBuffer; }; -/*! - * The class implements the following algorithm: - * "ViBe: A universal background subtraction algorithm for video sequences" - * O. Barnich and M. Van D Roogenbroeck - * IEEE Transactions on Image Processing, 20(6) :1709-1724, June 2011 - */ -class CV_EXPORTS VIBE_GPU -{ -public: - //! the default constructor - explicit VIBE_GPU(unsigned long rngSeed = 1234567); - - //! re-initiaization method - void initialize(const GpuMat& firstFrame, Stream& stream = Stream::Null()); - - //! the update operator - void operator()(const GpuMat& frame, GpuMat& fgmask, Stream& stream = Stream::Null()); - - //! releases all inner buffers - void release(); - - int nbSamples; // number of samples per pixel - int reqMatches; // #_min - int radius; // R - int subsamplingFactor; // amount of random subsampling - -private: - Size frameSize_; - - unsigned long rngSeed_; - GpuMat randStates_; - - GpuMat samples_; -}; - } // namespace gpu } // namespace cv diff --git a/modules/nonfree/perf/perf_gpu.cpp b/modules/nonfree/perf/perf_gpu.cpp index aa8516b1c4..9f451deaba 100644 --- a/modules/nonfree/perf/perf_gpu.cpp +++ b/modules/nonfree/perf/perf_gpu.cpp @@ -50,18 +50,6 @@ using namespace std; using namespace testing; using namespace perf; -#if defined(HAVE_XINE) || \ - defined(HAVE_GSTREAMER) || \ - defined(HAVE_QUICKTIME) || \ - defined(HAVE_AVFOUNDATION) || \ - defined(HAVE_FFMPEG) || \ - defined(WIN32) /* assume that we have ffmpeg */ - -# define BUILD_WITH_VIDEO_INPUT_SUPPORT 1 -#else -# define BUILD_WITH_VIDEO_INPUT_SUPPORT 0 -#endif - ////////////////////////////////////////////////////////////////////// // SURF @@ -108,75 +96,4 @@ PERF_TEST_P(Image, GPU_SURF, } } -////////////////////////////////////////////////////// -// VIBE - -#if BUILD_WITH_VIDEO_INPUT_SUPPORT - -DEF_PARAM_TEST(Video_Cn, string, int); - -PERF_TEST_P(Video_Cn, GPU_VIBE, - Combine(Values("gpu/video/768x576.avi", "gpu/video/1920x1080.avi"), - GPU_CHANNELS_1_3_4)) -{ - const string inputFile = perf::TestBase::getDataPath(GET_PARAM(0)); - const int cn = GET_PARAM(1); - - cv::VideoCapture cap(inputFile); - ASSERT_TRUE(cap.isOpened()); - - cv::Mat frame; - cap >> frame; - ASSERT_FALSE(frame.empty()); - - if (cn != 3) - { - cv::Mat temp; - if (cn == 1) - cv::cvtColor(frame, temp, cv::COLOR_BGR2GRAY); - else - cv::cvtColor(frame, temp, cv::COLOR_BGR2BGRA); - cv::swap(temp, frame); - } - - if (PERF_RUN_GPU()) - { - cv::gpu::GpuMat d_frame(frame); - cv::gpu::VIBE_GPU vibe; - cv::gpu::GpuMat foreground; - - vibe(d_frame, foreground); - - for (int i = 0; i < 10; ++i) - { - cap >> frame; - ASSERT_FALSE(frame.empty()); - - if (cn != 3) - { - cv::Mat temp; - if (cn == 1) - cv::cvtColor(frame, temp, cv::COLOR_BGR2GRAY); - else - cv::cvtColor(frame, temp, cv::COLOR_BGR2BGRA); - cv::swap(temp, frame); - } - - d_frame.upload(frame); - - startTimer(); next(); - vibe(d_frame, foreground); - stopTimer(); - } - - GPU_SANITY_CHECK(foreground); - } - else - { - FAIL_NO_CPU(); - } -} - -#endif - #endif diff --git a/modules/nonfree/src/cuda/vibe.cu b/modules/nonfree/src/cuda/vibe.cu deleted file mode 100644 index ba678abae2..0000000000 --- a/modules/nonfree/src/cuda/vibe.cu +++ /dev/null @@ -1,271 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ - -#include "opencv2/opencv_modules.hpp" - -#ifdef HAVE_OPENCV_GPU - -#include "opencv2/gpu/device/common.hpp" - -namespace cv { namespace gpu { namespace device -{ - namespace vibe - { - void loadConstants(int nbSamples, int reqMatches, int radius, int subsamplingFactor); - - void init_gpu(PtrStepSzb frame, int cn, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream); - - void update_gpu(PtrStepSzb frame, int cn, PtrStepSzb fgmask, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream); - } -}}} - -namespace cv { namespace gpu { namespace device -{ - namespace vibe - { - __constant__ int c_nbSamples; - __constant__ int c_reqMatches; - __constant__ int c_radius; - __constant__ int c_subsamplingFactor; - - void loadConstants(int nbSamples, int reqMatches, int radius, int subsamplingFactor) - { - cudaSafeCall( cudaMemcpyToSymbol(c_nbSamples, &nbSamples, sizeof(int)) ); - cudaSafeCall( cudaMemcpyToSymbol(c_reqMatches, &reqMatches, sizeof(int)) ); - cudaSafeCall( cudaMemcpyToSymbol(c_radius, &radius, sizeof(int)) ); - cudaSafeCall( cudaMemcpyToSymbol(c_subsamplingFactor, &subsamplingFactor, sizeof(int)) ); - } - - __device__ __forceinline__ uint nextRand(uint& state) - { - const unsigned int CV_RNG_COEFF = 4164903690U; - state = state * CV_RNG_COEFF + (state >> 16); - return state; - } - - __constant__ int c_xoff[9] = {-1, 0, 1, -1, 1, -1, 0, 1, 0}; - __constant__ int c_yoff[9] = {-1, -1, -1, 0, 0, 1, 1, 1, 0}; - - __device__ __forceinline__ int2 chooseRandomNeighbor(int x, int y, uint& randState, int count = 8) - { - int idx = nextRand(randState) % count; - - return make_int2(x + c_xoff[idx], y + c_yoff[idx]); - } - - __device__ __forceinline__ uchar cvt(uchar val) - { - return val; - } - __device__ __forceinline__ uchar4 cvt(const uchar3& val) - { - return make_uchar4(val.x, val.y, val.z, 0); - } - __device__ __forceinline__ uchar4 cvt(const uchar4& val) - { - return val; - } - - template - __global__ void init(const PtrStepSz frame, PtrStep samples, PtrStep randStates) - { - const int x = blockIdx.x * blockDim.x + threadIdx.x; - const int y = blockIdx.y * blockDim.y + threadIdx.y; - - if (x >= frame.cols || y >= frame.rows) - return; - - uint localState = randStates(y, x); - - for (int k = 0; k < c_nbSamples; ++k) - { - int2 np = chooseRandomNeighbor(x, y, localState, 9); - - np.x = ::max(0, ::min(np.x, frame.cols - 1)); - np.y = ::max(0, ::min(np.y, frame.rows - 1)); - - SrcT pix = frame(np.y, np.x); - - samples(k * frame.rows + y, x) = cvt(pix); - } - - randStates(y, x) = localState; - } - - template - void init_caller(PtrStepSzb frame, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream) - { - dim3 block(32, 8); - dim3 grid(divUp(frame.cols, block.x), divUp(frame.rows, block.y)); - - cudaSafeCall( cudaFuncSetCacheConfig(init, cudaFuncCachePreferL1) ); - - init<<>>((PtrStepSz) frame, (PtrStepSz) samples, randStates); - cudaSafeCall( cudaGetLastError() ); - - if (stream == 0) - cudaSafeCall( cudaDeviceSynchronize() ); - } - - void init_gpu(PtrStepSzb frame, int cn, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream) - { - typedef void (*func_t)(PtrStepSzb frame, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream); - static const func_t funcs[] = - { - 0, init_caller, 0, init_caller, init_caller - }; - - funcs[cn](frame, samples, randStates, stream); - } - - __device__ __forceinline__ int calcDist(uchar a, uchar b) - { - return ::abs(a - b); - } - __device__ __forceinline__ int calcDist(const uchar3& a, const uchar4& b) - { - return (::abs(a.x - b.x) + ::abs(a.y - b.y) + ::abs(a.z - b.z)) / 3; - } - __device__ __forceinline__ int calcDist(const uchar4& a, const uchar4& b) - { - return (::abs(a.x - b.x) + ::abs(a.y - b.y) + ::abs(a.z - b.z)) / 3; - } - - template - __global__ void update(const PtrStepSz frame, PtrStepb fgmask, PtrStep samples, PtrStep randStates) - { - const int x = blockIdx.x * blockDim.x + threadIdx.x; - const int y = blockIdx.y * blockDim.y + threadIdx.y; - - if (x >= frame.cols || y >= frame.rows) - return; - - uint localState = randStates(y, x); - - SrcT imgPix = frame(y, x); - - // comparison with the model - - int count = 0; - for (int k = 0; (count < c_reqMatches) && (k < c_nbSamples); ++k) - { - SampleT samplePix = samples(k * frame.rows + y, x); - - int distance = calcDist(imgPix, samplePix); - - if (distance < c_radius) - ++count; - } - - // pixel classification according to reqMatches - - fgmask(y, x) = (uchar) (-(count < c_reqMatches)); - - if (count >= c_reqMatches) - { - // the pixel belongs to the background - - // gets a random number between 0 and subsamplingFactor-1 - int randomNumber = nextRand(localState) % c_subsamplingFactor; - - // update of the current pixel model - if (randomNumber == 0) - { - // random subsampling - - int k = nextRand(localState) % c_nbSamples; - - samples(k * frame.rows + y, x) = cvt(imgPix); - } - - // update of a neighboring pixel model - randomNumber = nextRand(localState) % c_subsamplingFactor; - - if (randomNumber == 0) - { - // random subsampling - - // chooses a neighboring pixel randomly - int2 np = chooseRandomNeighbor(x, y, localState); - - np.x = ::max(0, ::min(np.x, frame.cols - 1)); - np.y = ::max(0, ::min(np.y, frame.rows - 1)); - - // chooses the value to be replaced randomly - int k = nextRand(localState) % c_nbSamples; - - samples(k * frame.rows + np.y, np.x) = cvt(imgPix); - } - } - - randStates(y, x) = localState; - } - - template - void update_caller(PtrStepSzb frame, PtrStepSzb fgmask, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream) - { - dim3 block(32, 8); - dim3 grid(divUp(frame.cols, block.x), divUp(frame.rows, block.y)); - - cudaSafeCall( cudaFuncSetCacheConfig(update, cudaFuncCachePreferL1) ); - - update<<>>((PtrStepSz) frame, fgmask, (PtrStepSz) samples, randStates); - cudaSafeCall( cudaGetLastError() ); - - if (stream == 0) - cudaSafeCall( cudaDeviceSynchronize() ); - } - - void update_gpu(PtrStepSzb frame, int cn, PtrStepSzb fgmask, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream) - { - typedef void (*func_t)(PtrStepSzb frame, PtrStepSzb fgmask, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream); - static const func_t funcs[] = - { - 0, update_caller, 0, update_caller, update_caller - }; - - funcs[cn](frame, fgmask, samples, randStates, stream); - } - } -}}} - -#endif /* HAVE_OPENCV_GPU */ diff --git a/modules/nonfree/src/vibe_gpu.cpp b/modules/nonfree/src/vibe_gpu.cpp deleted file mode 100644 index e34862765d..0000000000 --- a/modules/nonfree/src/vibe_gpu.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ - -#include "precomp.hpp" - -#if defined(HAVE_OPENCV_GPU) - -#if !defined HAVE_CUDA || defined(CUDA_DISABLER) - -cv::gpu::VIBE_GPU::VIBE_GPU(unsigned long) { throw_nogpu(); } -void cv::gpu::VIBE_GPU::initialize(const GpuMat&, Stream&) { throw_nogpu(); } -void cv::gpu::VIBE_GPU::operator()(const GpuMat&, GpuMat&, Stream&) { throw_nogpu(); } -void cv::gpu::VIBE_GPU::release() {} - -#else - -namespace cv { namespace gpu { namespace device -{ - namespace vibe - { - void loadConstants(int nbSamples, int reqMatches, int radius, int subsamplingFactor); - - void init_gpu(PtrStepSzb frame, int cn, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream); - - void update_gpu(PtrStepSzb frame, int cn, PtrStepSzb fgmask, PtrStepSzb samples, PtrStepSz randStates, cudaStream_t stream); - } -}}} - -namespace -{ - const int defaultNbSamples = 20; - const int defaultReqMatches = 2; - const int defaultRadius = 20; - const int defaultSubsamplingFactor = 16; -} - -cv::gpu::VIBE_GPU::VIBE_GPU(unsigned long rngSeed) : - frameSize_(0, 0), rngSeed_(rngSeed) -{ - nbSamples = defaultNbSamples; - reqMatches = defaultReqMatches; - radius = defaultRadius; - subsamplingFactor = defaultSubsamplingFactor; -} - -void cv::gpu::VIBE_GPU::initialize(const GpuMat& firstFrame, Stream& s) -{ - using namespace cv::gpu::device::vibe; - - CV_Assert(firstFrame.type() == CV_8UC1 || firstFrame.type() == CV_8UC3 || firstFrame.type() == CV_8UC4); - - cudaStream_t stream = StreamAccessor::getStream(s); - - loadConstants(nbSamples, reqMatches, radius, subsamplingFactor); - - frameSize_ = firstFrame.size(); - - if (randStates_.size() != frameSize_) - { - cv::RNG rng(rngSeed_); - cv::Mat h_randStates(frameSize_, CV_8UC4); - rng.fill(h_randStates, cv::RNG::UNIFORM, 0, 255); - randStates_.upload(h_randStates); - } - - int ch = firstFrame.channels(); - int sample_ch = ch == 1 ? 1 : 4; - - samples_.create(nbSamples * frameSize_.height, frameSize_.width, CV_8UC(sample_ch)); - - init_gpu(firstFrame, ch, samples_, randStates_, stream); -} - -void cv::gpu::VIBE_GPU::operator()(const GpuMat& frame, GpuMat& fgmask, Stream& s) -{ - using namespace cv::gpu::device::vibe; - - CV_Assert(frame.depth() == CV_8U); - - int ch = frame.channels(); - int sample_ch = ch == 1 ? 1 : 4; - - if (frame.size() != frameSize_ || sample_ch != samples_.channels()) - initialize(frame); - - fgmask.create(frameSize_, CV_8UC1); - - update_gpu(frame, ch, fgmask, samples_, randStates_, StreamAccessor::getStream(s)); -} - -void cv::gpu::VIBE_GPU::release() -{ - frameSize_ = Size(0, 0); - - randStates_.release(); - - samples_.release(); -} - -#endif - -#endif // defined(HAVE_OPENCV_GPU) diff --git a/modules/nonfree/test/test_gpu.cpp b/modules/nonfree/test/test_gpu.cpp index 30aec352cd..3f63eeddf2 100644 --- a/modules/nonfree/test/test_gpu.cpp +++ b/modules/nonfree/test/test_gpu.cpp @@ -191,42 +191,4 @@ INSTANTIATE_TEST_CASE_P(GPU_Features2D, SURF, testing::Combine( testing::Values(SURF_Extended(false), SURF_Extended(true)), testing::Values(SURF_Upright(false), SURF_Upright(true)))); -////////////////////////////////////////////////////// -// VIBE - -PARAM_TEST_CASE(VIBE, cv::Size, MatType, UseRoi) -{ -}; - -GPU_TEST_P(VIBE, Accuracy) -{ - const cv::Size size = GET_PARAM(0); - const int type = GET_PARAM(1); - const bool useRoi = GET_PARAM(2); - - const cv::Mat fullfg(size, CV_8UC1, cv::Scalar::all(255)); - - cv::Mat frame = randomMat(size, type, 0.0, 100); - cv::gpu::GpuMat d_frame = loadMat(frame, useRoi); - - cv::gpu::VIBE_GPU vibe; - cv::gpu::GpuMat d_fgmask = createMat(size, CV_8UC1, useRoi); - vibe.initialize(d_frame); - - for (int i = 0; i < 20; ++i) - vibe(d_frame, d_fgmask); - - frame = randomMat(size, type, 160, 255); - d_frame = loadMat(frame, useRoi); - vibe(d_frame, d_fgmask); - - // now fgmask should be entirely foreground - ASSERT_MAT_NEAR(fullfg, d_fgmask, 0); -} - -INSTANTIATE_TEST_CASE_P(GPU_Video, VIBE, testing::Combine( - DIFFERENT_SIZES, - testing::Values(MatType(CV_8UC1), MatType(CV_8UC3), MatType(CV_8UC4)), - WHOLE_SUBMAT)); - #endif diff --git a/samples/gpu/bgfg_segm.cpp b/samples/gpu/bgfg_segm.cpp index a77d336a9e..6963e75ff8 100644 --- a/samples/gpu/bgfg_segm.cpp +++ b/samples/gpu/bgfg_segm.cpp @@ -1,15 +1,10 @@ #include #include -#include "opencv2/opencv_modules.hpp" #include "opencv2/core/core.hpp" #include "opencv2/gpu/gpu.hpp" #include "opencv2/highgui/highgui.hpp" -#ifdef HAVE_OPENCV_NONFREE -#include "opencv2/nonfree/gpu.hpp" -#endif - using namespace std; using namespace cv; using namespace cv::gpu; @@ -19,9 +14,6 @@ enum Method FGD_STAT, MOG, MOG2, -#ifdef HAVE_OPENCV_NONFREE - VIBE, -#endif GMG }; @@ -30,7 +22,7 @@ int main(int argc, const char** argv) cv::CommandLineParser cmd(argc, argv, "{ c | camera | false | use camera }" "{ f | file | 768x576.avi | input video file }" - "{ m | method | mog | method (fgd, mog, mog2, vibe, gmg) }" + "{ m | method | mog | method (fgd, mog, mog2, gmg) }" "{ h | help | false | print help message }"); if (cmd.get("help")) @@ -48,9 +40,6 @@ int main(int argc, const char** argv) if (method != "fgd" && method != "mog" && method != "mog2" - #ifdef HAVE_OPENCV_NONFREE - && method != "vibe" - #endif && method != "gmg") { cerr << "Incorrect method" << endl; @@ -60,9 +49,6 @@ int main(int argc, const char** argv) Method m = method == "fgd" ? FGD_STAT : method == "mog" ? MOG : method == "mog2" ? MOG2 : - #ifdef HAVE_OPENCV_NONFREE - method == "vibe" ? VIBE : - #endif GMG; VideoCapture cap; @@ -86,9 +72,6 @@ int main(int argc, const char** argv) FGDStatModel fgd_stat; MOG_GPU mog; MOG2_GPU mog2; -#ifdef HAVE_OPENCV_NONFREE - VIBE_GPU vibe; -#endif GMG_GPU gmg; gmg.numInitializationFrames = 40; @@ -114,12 +97,6 @@ int main(int argc, const char** argv) mog2(d_frame, d_fgmask); break; -#ifdef HAVE_OPENCV_NONFREE - case VIBE: - vibe.initialize(d_frame); - break; -#endif - case GMG: gmg.initialize(d_frame.size()); break; @@ -128,11 +105,7 @@ int main(int argc, const char** argv) namedWindow("image", WINDOW_NORMAL); namedWindow("foreground mask", WINDOW_NORMAL); namedWindow("foreground image", WINDOW_NORMAL); - if (m != GMG - #ifdef HAVE_OPENCV_NONFREE - && m != VIBE - #endif - ) + if (m != GMG) { namedWindow("mean background image", WINDOW_NORMAL); } @@ -165,12 +138,6 @@ int main(int argc, const char** argv) mog2.getBackgroundImage(d_bgimg); break; -#ifdef HAVE_OPENCV_NONFREE - case VIBE: - vibe(d_frame, d_fgmask); - break; -#endif - case GMG: gmg(d_frame, d_fgmask); break; From 4162ebfad344891d809056026313462712a5f400 Mon Sep 17 00:00:00 2001 From: yao Date: Fri, 17 May 2013 15:34:22 +0800 Subject: [PATCH 49/49] add OpticalFlowDual_TVL1_OCL function --- modules/ocl/include/opencv2/ocl/ocl.hpp | 93 ++++ modules/ocl/src/arithm.cpp | 7 + modules/ocl/src/opencl/tvl1flow.cl | 407 +++++++++++++++ modules/ocl/src/tvl1flow.cpp | 475 ++++++++++++++++++ .../test/{test_pyrlk.cpp => test_optflow.cpp} | 65 ++- 5 files changed, 1037 insertions(+), 10 deletions(-) create mode 100644 modules/ocl/src/opencl/tvl1flow.cl create mode 100644 modules/ocl/src/tvl1flow.cpp rename modules/ocl/test/{test_pyrlk.cpp => test_optflow.cpp} (69%) diff --git a/modules/ocl/include/opencv2/ocl/ocl.hpp b/modules/ocl/include/opencv2/ocl/ocl.hpp index 2b01f94e3d..1cace848c3 100644 --- a/modules/ocl/include/opencv2/ocl/ocl.hpp +++ b/modules/ocl/include/opencv2/ocl/ocl.hpp @@ -407,6 +407,9 @@ namespace cv //! computes element-wise product of the two arrays (c = a * b) // supports all types except CV_8SC1,CV_8SC2,CV8SC3 and CV_8SC4 CV_EXPORTS void multiply(const oclMat &a, const oclMat &b, oclMat &c, double scale = 1); + //! multiplies matrix to a number (dst = scalar * src) + // supports CV_32FC1 only + CV_EXPORTS void multiply(double scalar, const oclMat &src, oclMat &dst); //! computes element-wise quotient of the two arrays (c = a / b) // supports all types except CV_8SC1,CV_8SC2,CV8SC3 and CV_8SC4 CV_EXPORTS void divide(const oclMat &a, const oclMat &b, oclMat &c, double scale = 1); @@ -1372,6 +1375,7 @@ namespace cv private: oclMat minSSD, leBuf, riBuf; }; + class CV_EXPORTS StereoBeliefPropagation { public: @@ -1402,6 +1406,7 @@ namespace cv std::vector datas; oclMat out; }; + class CV_EXPORTS StereoConstantSpaceBP { public: @@ -1440,6 +1445,94 @@ namespace cv oclMat temp; oclMat out; }; + + // Implementation of the Zach, Pock and Bischof Dual TV-L1 Optical Flow method + // + // see reference: + // [1] C. Zach, T. Pock and H. Bischof, "A Duality Based Approach for Realtime TV-L1 Optical Flow". + // [2] Javier Sanchez, Enric Meinhardt-Llopis and Gabriele Facciolo. "TV-L1 Optical Flow Estimation". + class CV_EXPORTS OpticalFlowDual_TVL1_OCL + { + public: + OpticalFlowDual_TVL1_OCL(); + + void operator ()(const oclMat& I0, const oclMat& I1, oclMat& flowx, oclMat& flowy); + + void collectGarbage(); + + /** + * Time step of the numerical scheme. + */ + double tau; + + /** + * Weight parameter for the data term, attachment parameter. + * This is the most relevant parameter, which determines the smoothness of the output. + * The smaller this parameter is, the smoother the solutions we obtain. + * It depends on the range of motions of the images, so its value should be adapted to each image sequence. + */ + double lambda; + + /** + * Weight parameter for (u - v)^2, tightness parameter. + * It serves as a link between the attachment and the regularization terms. + * In theory, it should have a small value in order to maintain both parts in correspondence. + * The method is stable for a large range of values of this parameter. + */ + double theta; + + /** + * Number of scales used to create the pyramid of images. + */ + int nscales; + + /** + * Number of warpings per scale. + * Represents the number of times that I1(x+u0) and grad( I1(x+u0) ) are computed per scale. + * This is a parameter that assures the stability of the method. + * It also affects the running time, so it is a compromise between speed and accuracy. + */ + int warps; + + /** + * Stopping criterion threshold used in the numerical scheme, which is a trade-off between precision and running time. + * A small value will yield more accurate solutions at the expense of a slower convergence. + */ + double epsilon; + + /** + * Stopping criterion iterations number used in the numerical scheme. + */ + int iterations; + + bool useInitialFlow; + + private: + void procOneScale(const oclMat& I0, const oclMat& I1, oclMat& u1, oclMat& u2); + + std::vector I0s; + std::vector I1s; + std::vector u1s; + std::vector u2s; + + oclMat I1x_buf; + oclMat I1y_buf; + + oclMat I1w_buf; + oclMat I1wx_buf; + oclMat I1wy_buf; + + oclMat grad_buf; + oclMat rho_c_buf; + + oclMat p11_buf; + oclMat p12_buf; + oclMat p21_buf; + oclMat p22_buf; + + oclMat diff_buf; + oclMat norm_buf; + }; } } #if defined _MSC_VER && _MSC_VER >= 1200 diff --git a/modules/ocl/src/arithm.cpp b/modules/ocl/src/arithm.cpp index d679a93480..ed2515dc6d 100644 --- a/modules/ocl/src/arithm.cpp +++ b/modules/ocl/src/arithm.cpp @@ -22,6 +22,7 @@ // Jiang Liyuan, jlyuan001.good@163.com // Rock Li, Rock.Li@amd.com // Zailong Wu, bullet@yeah.net +// Peng Xiao, pengxiao@outlook.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -286,6 +287,7 @@ void cv::ocl::multiply(const oclMat &src1, const oclMat &src2, oclMat &dst, doub else arithmetic_run(src1, src2, dst, "arithm_mul", &arithm_mul, (void *)(&scalar)); } + void cv::ocl::divide(const oclMat &src1, const oclMat &src2, oclMat &dst, double scalar) { @@ -468,6 +470,11 @@ void cv::ocl::subtract(const Scalar &src2, const oclMat &src1, oclMat &dst, cons const char **kernelString = mask.data ? &arithm_add_scalar_mask : &arithm_add_scalar; arithmetic_scalar( src1, src2, dst, mask, kernelName, kernelString, -1); } +void cv::ocl::multiply(double scalar, const oclMat &src, oclMat &dst) +{ + string kernelName = "arithm_muls"; + arithmetic_scalar_run( src, dst, kernelName, &arithm_mul, scalar); +} void cv::ocl::divide(double scalar, const oclMat &src, oclMat &dst) { if(!src.clCxt->supportsFeature(Context::CL_DOUBLE)) diff --git a/modules/ocl/src/opencl/tvl1flow.cl b/modules/ocl/src/opencl/tvl1flow.cl new file mode 100644 index 0000000000..e0ff7307b1 --- /dev/null +++ b/modules/ocl/src/opencl/tvl1flow.cl @@ -0,0 +1,407 @@ +/*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 +// Jin Ma jin@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 centeredGradientKernel(__global const float* src, int src_col, int src_row, int src_step, +__global float* dx, __global float* dy, int dx_step) +{ + int x = get_global_id(0); + int y = get_global_id(1); + + if((x < src_col)&&(y < src_row)) + { + int src_x1 = (x + 1) < (src_col -1)? (x + 1) : (src_col - 1); + int src_x2 = (x - 1) > 0 ? (x -1) : 0; + + //if(src[y * src_step + src_x1] == src[y * src_step+ src_x2]) + //{ + // printf("y = %d\n", y); + // printf("src_x1 = %d\n", src_x1); + // printf("src_x2 = %d\n", src_x2); + //} + dx[y * dx_step+ x] = 0.5f * (src[y * src_step + src_x1] - src[y * src_step+ src_x2]); + + int src_y1 = (y+1) < (src_row - 1) ? (y + 1) : (src_row - 1); + int src_y2 = (y - 1) > 0 ? (y - 1) : 0; + dy[y * dx_step+ x] = 0.5f * (src[src_y1 * src_step + x] - src[src_y2 * src_step+ x]); + } + +} + +float bicubicCoeff(float x_) +{ + + float x = fabs(x_); + if (x <= 1.0f) + { + return x * x * (1.5f * x - 2.5f) + 1.0f; + } + else if (x < 2.0f) + { + return x * (x * (-0.5f * x + 2.5f) - 4.0f) + 2.0f; + } + else + { + return 0.0f; + } + +} + +__kernel void warpBackwardKernel(__global const float* I0, int I0_step, int I0_col, int I0_row, + image2d_t tex_I1, image2d_t tex_I1x, image2d_t tex_I1y, + __global const float* u1, int u1_step, + __global const float* u2, + __global float* I1w, + __global float* I1wx, /*int I1wx_step,*/ + __global float* I1wy, /*int I1wy_step,*/ + __global float* grad, /*int grad_step,*/ + __global float* rho, + int I1w_step, + int u2_step, + int u1_offset_x, + int u1_offset_y, + int u2_offset_x, + int u2_offset_y) +{ + const int x = get_global_id(0); + const int y = get_global_id(1); + + if(x < I0_col&&y < I0_row) + { + //const float u1Val = u1(y, x); + const float u1Val = u1[(y + u1_offset_y) * u1_step + x + u1_offset_x]; + //const float u2Val = u2(y, x); + const float u2Val = u2[(y + u2_offset_y) * u2_step + x + u2_offset_x]; + + const float wx = x + u1Val; + const float wy = y + u2Val; + + const int xmin = ceil(wx - 2.0f); + const int xmax = floor(wx + 2.0f); + + const int ymin = ceil(wy - 2.0f); + const int ymax = floor(wy + 2.0f); + + float sum = 0.0f; + float sumx = 0.0f; + float sumy = 0.0f; + float wsum = 0.0f; + sampler_t sampleri = CLK_NORMALIZED_COORDS_FALSE | CLK_ADDRESS_CLAMP_TO_EDGE | CLK_FILTER_NEAREST; + + for (int cy = ymin; cy <= ymax; ++cy) + { + for (int cx = xmin; cx <= xmax; ++cx) + { + const float w = bicubicCoeff(wx - cx) * bicubicCoeff(wy - cy); + + //sum += w * tex2D(tex_I1 , cx, cy); + int2 cood = (int2)(cx, cy); + sum += w * read_imagef(tex_I1, sampleri, cood).x; + //sumx += w * tex2D(tex_I1x, cx, cy); + sumx += w * read_imagef(tex_I1x, sampleri, cood).x; + //sumy += w * tex2D(tex_I1y, cx, cy); + sumy += w * read_imagef(tex_I1y, sampleri, cood).x; + + wsum += w; + } + } + + const float coeff = 1.0f / wsum; + + const float I1wVal = sum * coeff; + const float I1wxVal = sumx * coeff; + const float I1wyVal = sumy * coeff; + + I1w[y * I1w_step + x] = I1wVal; + I1wx[y * I1w_step + x] = I1wxVal; + I1wy[y * I1w_step + x] = I1wyVal; + + const float Ix2 = I1wxVal * I1wxVal; + const float Iy2 = I1wyVal * I1wyVal; + + // store the |Grad(I1)|^2 + grad[y * I1w_step + x] = Ix2 + Iy2; + + // compute the constant part of the rho function + const float I0Val = I0[y * I0_step + x]; + rho[y * I1w_step + x] = I1wVal - I1wxVal * u1Val - I1wyVal * u2Val - I0Val; + } + +} + +float readImage(__global const float *image, const int x, const int y, const int rows, const int cols, const int elemCntPerRow) +{ + int i0 = clamp(x, 0, cols - 1); + int j0 = clamp(y, 0, rows - 1); + int i1 = clamp(x + 1, 0, cols - 1); + int j1 = clamp(y + 1, 0, rows - 1); + + return image[j0 * elemCntPerRow + i0]; +} + +__kernel void warpBackwardKernelNoImage2d(__global const float* I0, int I0_step, int I0_col, int I0_row, + __global const float* tex_I1, __global const float* tex_I1x, __global const float* tex_I1y, + __global const float* u1, int u1_step, + __global const float* u2, + __global float* I1w, + __global float* I1wx, /*int I1wx_step,*/ + __global float* I1wy, /*int I1wy_step,*/ + __global float* grad, /*int grad_step,*/ + __global float* rho, + int I1w_step, + int u2_step, + int I1_step, + int I1x_step) +{ + const int x = get_global_id(0); + const int y = get_global_id(1); + + if(x < I0_col&&y < I0_row) + { + //const float u1Val = u1(y, x); + const float u1Val = u1[y * u1_step + x]; + //const float u2Val = u2(y, x); + const float u2Val = u2[y * u2_step + x]; + + const float wx = x + u1Val; + const float wy = y + u2Val; + + const int xmin = ceil(wx - 2.0f); + const int xmax = floor(wx + 2.0f); + + const int ymin = ceil(wy - 2.0f); + const int ymax = floor(wy + 2.0f); + + float sum = 0.0f; + float sumx = 0.0f; + float sumy = 0.0f; + float wsum = 0.0f; + + for (int cy = ymin; cy <= ymax; ++cy) + { + for (int cx = xmin; cx <= xmax; ++cx) + { + const float w = bicubicCoeff(wx - cx) * bicubicCoeff(wy - cy); + + int2 cood = (int2)(cx, cy); + sum += w * readImage(tex_I1, cood.x, cood.y, I0_col, I0_row, I1_step); + sumx += w * readImage(tex_I1x, cood.x, cood.y, I0_col, I0_row, I1x_step); + sumy += w * readImage(tex_I1y, cood.x, cood.y, I0_col, I0_row, I1x_step); + wsum += w; + } + } + + const float coeff = 1.0f / wsum; + + const float I1wVal = sum * coeff; + const float I1wxVal = sumx * coeff; + const float I1wyVal = sumy * coeff; + + I1w[y * I1w_step + x] = I1wVal; + I1wx[y * I1w_step + x] = I1wxVal; + I1wy[y * I1w_step + x] = I1wyVal; + + const float Ix2 = I1wxVal * I1wxVal; + const float Iy2 = I1wyVal * I1wyVal; + + // store the |Grad(I1)|^2 + grad[y * I1w_step + x] = Ix2 + Iy2; + + // compute the constant part of the rho function + const float I0Val = I0[y * I0_step + x]; + rho[y * I1w_step + x] = I1wVal - I1wxVal * u1Val - I1wyVal * u2Val - I0Val; + } + +} + + +__kernel void estimateDualVariablesKernel(__global const float* u1, int u1_col, int u1_row, int u1_step, + __global const float* u2, + __global float* p11, int p11_step, + __global float* p12, + __global float* p21, + __global float* p22, + const float taut, + int u2_step, + int u1_offset_x, + int u1_offset_y, + int u2_offset_x, + int u2_offset_y) +{ + + //const int x = blockIdx.x * blockDim.x + threadIdx.x; + //const int y = blockIdx.y * blockDim.y + threadIdx.y; + const int x = get_global_id(0); + const int y = get_global_id(1); + + if(x < u1_col && y < u1_row) + { + int src_x1 = (x + 1) < (u1_col - 1) ? (x + 1) : (u1_col - 1); + const float u1x = u1[(y + u1_offset_y) * u1_step + src_x1 + u1_offset_x] - u1[(y + u1_offset_y) * u1_step + x + u1_offset_x]; + + int src_y1 = (y + 1) < (u1_row - 1) ? (y + 1) : (u1_row - 1); + const float u1y = u1[(src_y1 + u1_offset_y) * u1_step + x + u1_offset_x] - u1[(y + u1_offset_y) * u1_step + x + u1_offset_x]; + + int src_x2 = (x + 1) < (u1_col - 1) ? (x + 1) : (u1_col - 1); + const float u2x = u2[(y + u2_offset_y) * u2_step + src_x2 + u2_offset_x] - u2[(y + u2_offset_y) * u2_step + x + u2_offset_x]; + + int src_y2 = (y + 1) < (u1_row - 1) ? (y + 1) : (u1_row - 1); + const float u2y = u2[(src_y2 + u2_offset_y) * u2_step + x + u2_offset_x] - u2[(y + u2_offset_y) * u2_step + x + u2_offset_x]; + + const float g1 = hypot(u1x, u1y); + const float g2 = hypot(u2x, u2y); + + const float ng1 = 1.0f + taut * g1; + const float ng2 = 1.0f + taut * g2; + + p11[y * p11_step + x] = (p11[y * p11_step + x] + taut * u1x) / ng1; + p12[y * p11_step + x] = (p12[y * p11_step + x] + taut * u1y) / ng1; + p21[y * p11_step + x] = (p21[y * p11_step + x] + taut * u2x) / ng2; + p22[y * p11_step + x] = (p22[y * p11_step + x] + taut * u2y) / ng2; + } + +} + +float divergence(__global const float* v1, __global const float* v2, int y, int x, int v1_step, int v2_step) +{ + + if (x > 0 && y > 0) + { + const float v1x = v1[y * v1_step + x] - v1[y * v1_step + x - 1]; + const float v2y = v2[y * v2_step + x] - v2[(y - 1) * v2_step + x]; + return v1x + v2y; + } + else + { + if (y > 0) + return v1[y * v1_step + 0] + v2[y * v2_step + 0] - v2[(y - 1) * v2_step + 0]; + else + { + if (x > 0) + return v1[0 * v1_step + x] - v1[0 * v1_step + x - 1] + v2[0 * v2_step + x]; + else + return v1[0 * v1_step + 0] + v2[0 * v2_step + 0]; + } + } + +} + +__kernel void estimateUKernel(__global const float* I1wx, int I1wx_col, int I1wx_row, int I1wx_step, + __global const float* I1wy, /*int I1wy_step,*/ + __global const float* grad, /*int grad_step,*/ + __global const float* rho_c, /*int rho_c_step,*/ + __global const float* p11, /*int p11_step,*/ + __global const float* p12, /*int p12_step,*/ + __global const float* p21, /*int p21_step,*/ + __global const float* p22, /*int p22_step,*/ + __global float* u1, int u1_step, + __global float* u2, + __global float* error, const float l_t, const float theta, int u2_step, + int u1_offset_x, + int u1_offset_y, + int u2_offset_x, + int u2_offset_y) +{ + + //const int x = blockIdx.x * blockDim.x + threadIdx.x; + //const int y = blockIdx.y * blockDim.y + threadIdx.y; + + int x = get_global_id(0); + int y = get_global_id(1); + + + if(x < I1wx_col && y < I1wx_row) + { + const float I1wxVal = I1wx[y * I1wx_step + x]; + const float I1wyVal = I1wy[y * I1wx_step + x]; + const float gradVal = grad[y * I1wx_step + x]; + const float u1OldVal = u1[(y + u1_offset_y) * u1_step + x + u1_offset_x]; + const float u2OldVal = u2[(y + u2_offset_y) * u2_step + x + u2_offset_x]; + + const float rho = rho_c[y * I1wx_step + x] + (I1wxVal * u1OldVal + I1wyVal * u2OldVal); + + // estimate the values of the variable (v1, v2) (thresholding operator TH) + + float d1 = 0.0f; + float d2 = 0.0f; + + if (rho < -l_t * gradVal) + { + d1 = l_t * I1wxVal; + d2 = l_t * I1wyVal; + } + else if (rho > l_t * gradVal) + { + d1 = -l_t * I1wxVal; + d2 = -l_t * I1wyVal; + } + else if (gradVal > 1.192092896e-07f) + { + const float fi = -rho / gradVal; + d1 = fi * I1wxVal; + d2 = fi * I1wyVal; + } + + const float v1 = u1OldVal + d1; + const float v2 = u2OldVal + d2; + + // compute the divergence of the dual variable (p1, p2) + + const float div_p1 = divergence(p11, p12, y, x, I1wx_step, I1wx_step); + const float div_p2 = divergence(p21, p22, y, x, I1wx_step, I1wx_step); + + // estimate the values of the optical flow (u1, u2) + + const float u1NewVal = v1 + theta * div_p1; + const float u2NewVal = v2 + theta * div_p2; + + u1[(y + u1_offset_y) * u1_step + x + u1_offset_x] = u1NewVal; + u2[(y + u2_offset_y) * u2_step + x + u2_offset_x] = u2NewVal; + + const float n1 = (u1OldVal - u1NewVal) * (u1OldVal - u1NewVal); + const float n2 = (u2OldVal - u2NewVal) * (u2OldVal - u2NewVal); + error[y * I1wx_step + x] = n1 + n2; + } + +} diff --git a/modules/ocl/src/tvl1flow.cpp b/modules/ocl/src/tvl1flow.cpp new file mode 100644 index 0000000000..8182f41a19 --- /dev/null +++ b/modules/ocl/src/tvl1flow.cpp @@ -0,0 +1,475 @@ +/*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 +// Jin Ma, jin@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 std; +using namespace cv; +using namespace cv::ocl; + +namespace cv +{ + namespace ocl + { + ///////////////////////////OpenCL kernel strings/////////////////////////// + extern const char* tvl1flow; + } +} + +cv::ocl::OpticalFlowDual_TVL1_OCL::OpticalFlowDual_TVL1_OCL() +{ + tau = 0.25; + lambda = 0.15; + theta = 0.3; + nscales = 5; + warps = 5; + epsilon = 0.01; + iterations = 300; + useInitialFlow = false; +} + +void cv::ocl::OpticalFlowDual_TVL1_OCL::operator()(const oclMat& I0, const oclMat& I1, oclMat& flowx, oclMat& flowy) +{ + CV_Assert( I0.type() == CV_8UC1 || I0.type() == CV_32FC1 ); + CV_Assert( I0.size() == I1.size() ); + CV_Assert( I0.type() == I1.type() ); + CV_Assert( !useInitialFlow || (flowx.size() == I0.size() && flowx.type() == CV_32FC1 && flowy.size() == flowx.size() && flowy.type() == flowx.type()) ); + CV_Assert( nscales > 0 ); + + // allocate memory for the pyramid structure + I0s.resize(nscales); + I1s.resize(nscales); + u1s.resize(nscales); + u2s.resize(nscales); + //I0s_step == I1s_step + I0.convertTo(I0s[0], CV_32F, I0.depth() == CV_8U ? 1.0 : 255.0); + I1.convertTo(I1s[0], CV_32F, I1.depth() == CV_8U ? 1.0 : 255.0); + + + if (!useInitialFlow) + { + flowx.create(I0.size(), CV_32FC1); + flowy.create(I0.size(), CV_32FC1); + } + //u1s_step != u2s_step + u1s[0] = flowx; + u2s[0] = flowy; + + I1x_buf.create(I0.size(), CV_32FC1); + I1y_buf.create(I0.size(), CV_32FC1); + + I1w_buf.create(I0.size(), CV_32FC1); + I1wx_buf.create(I0.size(), CV_32FC1); + I1wy_buf.create(I0.size(), CV_32FC1); + + grad_buf.create(I0.size(), CV_32FC1); + rho_c_buf.create(I0.size(), CV_32FC1); + + p11_buf.create(I0.size(), CV_32FC1); + p12_buf.create(I0.size(), CV_32FC1); + p21_buf.create(I0.size(), CV_32FC1); + p22_buf.create(I0.size(), CV_32FC1); + + diff_buf.create(I0.size(), CV_32FC1); + + // create the scales + for (int s = 1; s < nscales; ++s) + { + ocl::pyrDown(I0s[s - 1], I0s[s]); + ocl::pyrDown(I1s[s - 1], I1s[s]); + + if (I0s[s].cols < 16 || I0s[s].rows < 16) + { + nscales = s; + break; + } + + if (useInitialFlow) + { + ocl::pyrDown(u1s[s - 1], u1s[s]); + ocl::pyrDown(u2s[s - 1], u2s[s]); + + //ocl::multiply(u1s[s], Scalar::all(0.5), u1s[s]); + multiply(0.5, u1s[s], u1s[s]); + //ocl::multiply(u2s[s], Scalar::all(0.5), u2s[s]); + multiply(0.5, u1s[s], u2s[s]); + } + } + + // pyramidal structure for computing the optical flow + for (int s = nscales - 1; s >= 0; --s) + { + // compute the optical flow at the current scale + procOneScale(I0s[s], I1s[s], u1s[s], u2s[s]); + + // if this was the last scale, finish now + if (s == 0) + break; + + // otherwise, upsample the optical flow + + // zoom the optical flow for the next finer scale + ocl::resize(u1s[s], u1s[s - 1], I0s[s - 1].size()); + ocl::resize(u2s[s], u2s[s - 1], I0s[s - 1].size()); + + // scale the optical flow with the appropriate zoom factor + multiply(2, u1s[s - 1], u1s[s - 1]); + multiply(2, u2s[s - 1], u2s[s - 1]); + + } + +} + +namespace ocl_tvl1flow +{ + void centeredGradient(const oclMat &src, oclMat &dx, oclMat &dy); + + void warpBackward(const oclMat &I0, const oclMat &I1, oclMat &I1x, oclMat &I1y, + oclMat &u1, oclMat &u2, oclMat &I1w, oclMat &I1wx, oclMat &I1wy, + oclMat &grad, oclMat &rho); + + void estimateU(oclMat &I1wx, oclMat &I1wy, oclMat &grad, + oclMat &rho_c, oclMat &p11, oclMat &p12, + oclMat &p21, oclMat &p22, oclMat &u1, + oclMat &u2, oclMat &error, float l_t, float theta); + + void estimateDualVariables(oclMat &u1, oclMat &u2, + oclMat &p11, oclMat &p12, oclMat &p21, oclMat &p22, float taut); +} + +void cv::ocl::OpticalFlowDual_TVL1_OCL::procOneScale(const oclMat &I0, const oclMat &I1, oclMat &u1, oclMat &u2) +{ + using namespace ocl_tvl1flow; + + const double scaledEpsilon = epsilon * epsilon * I0.size().area(); + + CV_DbgAssert( I1.size() == I0.size() ); + CV_DbgAssert( I1.type() == I0.type() ); + CV_DbgAssert( u1.empty() || u1.size() == I0.size() ); + CV_DbgAssert( u2.size() == u1.size() ); + + if (u1.empty()) + { + u1.create(I0.size(), CV_32FC1); + u1.setTo(Scalar::all(0)); + + u2.create(I0.size(), CV_32FC1); + u2.setTo(Scalar::all(0)); + } + + oclMat I1x = I1x_buf(Rect(0, 0, I0.cols, I0.rows)); + oclMat I1y = I1y_buf(Rect(0, 0, I0.cols, I0.rows)); + + centeredGradient(I1, I1x, I1y); + + oclMat I1w = I1w_buf(Rect(0, 0, I0.cols, I0.rows)); + oclMat I1wx = I1wx_buf(Rect(0, 0, I0.cols, I0.rows)); + oclMat I1wy = I1wy_buf(Rect(0, 0, I0.cols, I0.rows)); + + oclMat grad = grad_buf(Rect(0, 0, I0.cols, I0.rows)); + oclMat rho_c = rho_c_buf(Rect(0, 0, I0.cols, I0.rows)); + + oclMat p11 = p11_buf(Rect(0, 0, I0.cols, I0.rows)); + oclMat p12 = p12_buf(Rect(0, 0, I0.cols, I0.rows)); + oclMat p21 = p21_buf(Rect(0, 0, I0.cols, I0.rows)); + oclMat p22 = p22_buf(Rect(0, 0, I0.cols, I0.rows)); + p11.setTo(Scalar::all(0)); + p12.setTo(Scalar::all(0)); + p21.setTo(Scalar::all(0)); + p22.setTo(Scalar::all(0)); + + oclMat diff = diff_buf(Rect(0, 0, I0.cols, I0.rows)); + + const float l_t = static_cast(lambda * theta); + const float taut = static_cast(tau / theta); + + for (int warpings = 0; warpings < warps; ++warpings) + { + warpBackward(I0, I1, I1x, I1y, u1, u2, I1w, I1wx, I1wy, grad, rho_c); + + double error = numeric_limits::max(); + for (int n = 0; error > scaledEpsilon && n < iterations; ++n) + { + estimateU(I1wx, I1wy, grad, rho_c, p11, p12, p21, p22, + u1, u2, diff, l_t, static_cast(theta)); + + error = ocl::sum(diff)[0]; + + estimateDualVariables(u1, u2, p11, p12, p21, p22, taut); + + } + } + +} + +void cv::ocl::OpticalFlowDual_TVL1_OCL::collectGarbage() +{ + I0s.clear(); + I1s.clear(); + u1s.clear(); + u2s.clear(); + + I1x_buf.release(); + I1y_buf.release(); + + I1w_buf.release(); + I1wx_buf.release(); + I1wy_buf.release(); + + grad_buf.release(); + rho_c_buf.release(); + + p11_buf.release(); + p12_buf.release(); + p21_buf.release(); + p22_buf.release(); + + diff_buf.release(); + norm_buf.release(); +} + +void ocl_tvl1flow::centeredGradient(const oclMat &src, oclMat &dx, oclMat &dy) +{ + Context *clCxt = src.clCxt; + size_t localThreads[3] = {32, 8, 1}; + size_t globalThreads[3] = {src.cols, src.rows, 1}; + + int srcElementSize = src.elemSize(); + int src_step = src.step/srcElementSize; + + int dElememntSize = dx.elemSize(); + int dx_step = dx.step/dElememntSize; + + string kernelName = "centeredGradientKernel"; + vector< pair > args; + args.push_back( make_pair( sizeof(cl_mem), (void*)&src.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*)&src_step)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&dx.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&dy.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&dx_step)); + openCLExecuteKernel(clCxt, &tvl1flow, kernelName, globalThreads, localThreads, args, -1, -1); + +} + +void ocl_tvl1flow::estimateDualVariables(oclMat &u1, oclMat &u2, oclMat &p11, oclMat &p12, oclMat &p21, oclMat &p22, float taut) +{ + Context *clCxt = u1.clCxt; + + size_t localThread[] = {32, 8, 1}; + size_t globalThread[] = + { + u1.cols, + u1.rows, + 1 + }; + + int u1_element_size = u1.elemSize(); + int u1_step = u1.step/u1_element_size; + + int u2_element_size = u2.elemSize(); + int u2_step = u2.step/u2_element_size; + + int p11_element_size = p11.elemSize(); + int p11_step = p11.step/p11_element_size; + + int u1_offset_y = u1.offset/u1.step; + int u1_offset_x = u1.offset%u1.step; + u1_offset_x = u1_offset_x/u1.elemSize(); + + int u2_offset_y = u2.offset/u2.step; + int u2_offset_x = u2.offset%u2.step; + u2_offset_x = u2_offset_x/u2.elemSize(); + + string kernelName = "estimateDualVariablesKernel"; + vector< pair > args; + args.push_back( make_pair( sizeof(cl_mem), (void*)&u1.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1.cols)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1.rows)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_step)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&u2.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p11.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&p11_step)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p12.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p21.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p22.data)); + args.push_back( make_pair( sizeof(cl_float), (void*)&taut)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_step)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_offset_x)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_offset_y)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_offset_x)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_offset_y)); + + openCLExecuteKernel(clCxt, &tvl1flow, kernelName, globalThread, localThread, args, -1, -1); +} + +void ocl_tvl1flow::estimateU(oclMat &I1wx, oclMat &I1wy, oclMat &grad, + oclMat &rho_c, oclMat &p11, oclMat &p12, + oclMat &p21, oclMat &p22, oclMat &u1, + oclMat &u2, oclMat &error, float l_t, float theta) +{ + Context* clCxt = I1wx.clCxt; + + size_t localThread[] = {32, 8, 1}; + size_t globalThread[] = + { + I1wx.cols, + I1wx.rows, + 1 + }; + + int I1wx_element_size = I1wx.elemSize(); + int I1wx_step = I1wx.step/I1wx_element_size; + + int u1_element_size = u1.elemSize(); + int u1_step = u1.step/u1_element_size; + + int u2_element_size = u2.elemSize(); + int u2_step = u2.step/u2_element_size; + + int u1_offset_y = u1.offset/u1.step; + int u1_offset_x = u1.offset%u1.step; + u1_offset_x = u1_offset_x/u1.elemSize(); + + int u2_offset_y = u2.offset/u2.step; + int u2_offset_x = u2.offset%u2.step; + u2_offset_x = u2_offset_x/u2.elemSize(); + + string kernelName = "estimateUKernel"; + vector< pair > args; + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1wx.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&I1wx.cols)); + args.push_back( make_pair( sizeof(cl_int), (void*)&I1wx.rows)); + args.push_back( make_pair( sizeof(cl_int), (void*)&I1wx_step)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1wy.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&grad.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&rho_c.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p11.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p12.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p21.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&p22.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&u1.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_step)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&u2.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&error.data)); + args.push_back( make_pair( sizeof(cl_float), (void*)&l_t)); + args.push_back( make_pair( sizeof(cl_float), (void*)&theta)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_step)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_offset_x)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_offset_y)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_offset_x)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_offset_y)); + + openCLExecuteKernel(clCxt, &tvl1flow, kernelName, globalThread, localThread, args, -1, -1); +} + +void ocl_tvl1flow::warpBackward(const oclMat &I0, const oclMat &I1, oclMat &I1x, oclMat &I1y, oclMat &u1, oclMat &u2, oclMat &I1w, oclMat &I1wx, oclMat &I1wy, oclMat &grad, oclMat &rho) +{ + Context* clCxt = I0.clCxt; + const bool isImgSupported = support_image2d(clCxt); + + CV_Assert(isImgSupported); + + int u1ElementSize = u1.elemSize(); + int u1Step = u1.step/u1ElementSize; + + int u2ElementSize = u2.elemSize(); + int u2Step = u2.step/u2ElementSize; + + int I0ElementSize = I0.elemSize(); + int I0Step = I0.step/I0ElementSize; + + int I1w_element_size = I1w.elemSize(); + int I1w_step = I1w.step/I1w_element_size; + + int u1_offset_y = u1.offset/u1.step; + int u1_offset_x = u1.offset%u1.step; + u1_offset_x = u1_offset_x/u1.elemSize(); + + int u2_offset_y = u2.offset/u2.step; + int u2_offset_x = u2.offset%u2.step; + u2_offset_x = u2_offset_x/u2.elemSize(); + + size_t localThread[] = {32, 8, 1}; + size_t globalThread[] = + { + I0.cols, + I0.rows, + 1 + }; + + cl_mem I1_tex; + cl_mem I1x_tex; + cl_mem I1y_tex; + I1_tex = bindTexture(I1); + I1x_tex = bindTexture(I1x); + I1y_tex = bindTexture(I1y); + + string kernelName = "warpBackwardKernel"; + vector< pair > args; + args.push_back( make_pair( sizeof(cl_mem), (void*)&I0.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&I0Step)); + args.push_back( make_pair( sizeof(cl_int), (void*)&I0.cols)); + args.push_back( make_pair( sizeof(cl_int), (void*)&I0.rows)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1_tex)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1x_tex)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1y_tex)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&u1.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1Step)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&u2.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1w.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1wx.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&I1wy.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&grad.data)); + args.push_back( make_pair( sizeof(cl_mem), (void*)&rho.data)); + args.push_back( make_pair( sizeof(cl_int), (void*)&I1w_step)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2Step)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_offset_x)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u1_offset_y)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_offset_x)); + args.push_back( make_pair( sizeof(cl_int), (void*)&u2_offset_y)); + + openCLExecuteKernel(clCxt, &tvl1flow, kernelName, globalThread, localThread, args, -1, -1); +} \ No newline at end of file diff --git a/modules/ocl/test/test_pyrlk.cpp b/modules/ocl/test/test_optflow.cpp similarity index 69% rename from modules/ocl/test/test_pyrlk.cpp rename to modules/ocl/test/test_optflow.cpp index 064cb30bd8..b08d33a08f 100644 --- a/modules/ocl/test/test_pyrlk.cpp +++ b/modules/ocl/test/test_optflow.cpp @@ -1,4 +1,4 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// +/////////////////////////////////////////////////////////////////////////////////////// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // @@ -7,12 +7,16 @@ // copy or use the software. // // -// Intel License Agreement +// License Agreement // For Open Source Computer Vision Library -// -// Copyright (C) 2000, Intel Corporation, all rights reserved. +// Copyright (C) 2010-2012, Multicoreware, Inc., all rights reserved. +// Copyright (C) 2010-2012, Institute Of Software Chinese Academy Of Science, all rights reserved. +// Copyright (C) 2010-2012, Advanced Micro Devices, Inc., all rights reserved. // Third party copyrights are property of their respective owners. // +// @Authors +// +// // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // @@ -21,9 +25,9 @@ // // * Redistribution's in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. +// and/or other oclMaterials provided with the distribution. // -// * The name of Intel Corporation may not be used to endorse or promote products +// * 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 @@ -51,6 +55,47 @@ using namespace testing; using namespace std; extern string workdir; +////////////////////////////////////////////////////////////////////////// +PARAM_TEST_CASE(TVL1, bool) +{ + bool useRoi; + + virtual void SetUp() + { + useRoi = GET_PARAM(0); + } + +}; + +TEST_P(TVL1, Accuracy) +{ + cv::Mat frame0 = readImage(workdir + "../gpu/rubberwhale1.png", cv::IMREAD_GRAYSCALE); + ASSERT_FALSE(frame0.empty()); + + cv::Mat frame1 = readImage(workdir + "../gpu/rubberwhale2.png", cv::IMREAD_GRAYSCALE); + ASSERT_FALSE(frame1.empty()); + + cv::ocl::OpticalFlowDual_TVL1_OCL d_alg; + cv::RNG &rng = TS::ptr()->get_rng(); + cv::Mat flowx = randomMat(rng, frame0.size(), CV_32FC1, 0, 0, useRoi); + cv::Mat flowy = randomMat(rng, frame0.size(), CV_32FC1, 0, 0, useRoi); + cv::ocl::oclMat d_flowx(flowx), d_flowy(flowy); + d_alg(oclMat(frame0), oclMat(frame1), d_flowx, d_flowy); + + cv::Ptr alg = cv::createOptFlow_DualTVL1(); + cv::Mat flow; + alg->calc(frame0, frame1, flow); + cv::Mat gold[2]; + cv::split(flow, gold); + + EXPECT_MAT_SIMILAR(gold[0], d_flowx, 3e-3); + EXPECT_MAT_SIMILAR(gold[1], d_flowy, 3e-3); +} +INSTANTIATE_TEST_CASE_P(OCL_Video, TVL1, Values(true, false)); + + +///////////////////////////////////////////////////////////////////////////////////////////////// +// PyrLKOpticalFlow PARAM_TEST_CASE(Sparse, bool, bool) { @@ -60,7 +105,7 @@ PARAM_TEST_CASE(Sparse, bool, bool) virtual void SetUp() { UseSmart = GET_PARAM(0); - useGray = GET_PARAM(0); + useGray = GET_PARAM(1); } }; @@ -147,9 +192,9 @@ TEST_P(Sparse, Mat) } -INSTANTIATE_TEST_CASE_P(Video, Sparse, Combine( - Values(false, true), - Values(false))); +INSTANTIATE_TEST_CASE_P(OCL_Video, Sparse, Combine( + Values(false, true), + Values(false, true))); #endif // HAVE_OPENCL
Y243y;97jdp&xU@`7>y6KSSo-Lv#&cZFB<@>D9L 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 OG3cHP-v9+KzyAYxpd>i} literal 54476 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 Li1=wBCc6I%6sFy@ diff --git a/3rdparty/lib/x86/libnative_camera_r4.0.3.so b/3rdparty/lib/x86/libnative_camera_r4.0.3.so index 786d6dccbf4166ce1299f32496ae0c587fd9ac1f..420ec818fa4efb26c1c43257babeee9de25716a0 100755 GIT binary patch literal 95544 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 F{2#1mFBAX( literal 54476 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 diff --git a/3rdparty/lib/x86/libnative_camera_r4.1.1.so b/3rdparty/lib/x86/libnative_camera_r4.1.1.so index 8ec6cb74d9a686729633c97de1365483f18e5573..5468d206c6ce962bd238b1b2ec26f3b98ba5dc4e 100755 GIT binary patch literal 95544 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 c-#$bxHjj4b!mL1ROIv>S+#CCHXR9Jbd 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 J1}J#>{a?siHzWW6 literal 58572 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

0l@%6OGdChs zMzUBUZ5fym`n!b)`3M16Mz}4NA~35}@Z>!I72i1G$L@zidABFZOJI`IB~xY8&~ z-uH>)sZaxA=!{f6<8ynet8Tnep4`<-SS8Ny9NIe-_DXD(MTAlqc*xXH;c?<`9ORi` zQ`T4;{=<A$|TtfbK1OG&CorG-?Zjf-Z zgj*!sD&aN>cSv|h!ow0K$iG=klrUYw3<=96td?-Kgli?#|K@SC#Q7T})N`wZ+a%l} z;a&+3NO(}fP6>M?JR#vo`8VHI33DaPldw)gmxOH+Zjey_oAIp@-yz{n33o}@F5y85 zJ0(0M;b94nN*I*zxP(0to|2G1HcLBLButPnMZyshj+D?UVY-AF5@t!5En%L7g%Zw^ zuvo%{5|&F?En%&M9toF8xKhFv3D-&3CgBDNH%ho!!YvYRm2jJcyCiIvaIb_1Bs?f# zr-X+jJS^c63A-dbDq&E<;}Z5rctXNn2~SC=;BQ5R{Uzkz?h;RwFj+$W1{KRkNH|hL z{?-D^QzcB3kiYTA@(c;HB;;>-v3#l<HQ}518+$?reoKIGNSxv##1EHy2w%kCSQED6_lXFf z!rw#_-X5nMA-oEIe~-9IxK6@e2@4UoSiVuhF4DK+H|kgq*e2mA31^WG<&R5vl=S%F z?a8bM+#sRCdf>$pZjvxa`n)(Lmvn#|CA6>}c$tKoB|JrX{N92>IzWqrWfIPpaG``L zZv9 zW4s8T#5fUd!Qb2yK8N3mA>4^^B77O+KnP!0P55X0HV5HR{9Xsj;s7@g{|NRc{1^WA zov;tT@j!@Q(dZ<^57Qqa#ENw>DA$~yLLiyiE{|Hwj z{t^BK{UqFreiD99`|XgpMRAIi_$0(V!Zr8}J3{=pdKMvm10b8wia1BO9=~ZqcrpGq zpRf{sO^DxCm_>*m=Px6~kGRh#oB=x#&c$#2zpH&S;4mS6`{M{90$dj%ex%|k;kEdU zT0;Eo|8c@}{Kf#`82lbGp$)&2K{ye=^+9;EB7Vep$Sv>>jPH<{=r^r z`b{_={U*E%<3L!gC|1H+^q+7E`cH@-XGtggI{bjJ34TE6fjtP9!ybh9!ybfw*n=a3k6;(VXW>7DKZE}eZpVBl{001o5dP#Md;!1vLAVR^ zo$vtWJ7FjMjPNb^8Q~w`XM}&nd?!4Hc}(~*{EhGg{EhIRn8$>cIAs&zIdRHnLi~9B z7D8*BvXu}YBG^VaI!@U^h#$b;Nth9*>>|Vm7}^PMjZ^j#=Eo@q2ycs14ie(W@jD6e zQGi2)cK9(Neu)1FAwB}pMc4?xCd5Yrf`s@{{J!lL3~t|(a1n9!J;}+7fx^!-clF_V z5vZ34$+ zP-?dkZxJ|EtKCW5CGa}p?ZnFkPE~6U5HA+Ehj=IPT!B+{u3qTBz*iFQB5oCU3-KWF zWPz_H-a}jw_*&w<#Ctwx|JM;mWJLc3-bS3C3pv&)@D0S1iMI=UBXNEz;@CEUKTaH; zjs6RK6LJ1j`LQ;EZzc}UM*juAg?Kh`m%z6Y&m~?i@NL8ki5Cle2k~O!xdPuw91$A* z7x*sX<;1N5Zzqn3js6RKFLBHO^k3jKZS6ARJ*U|JgTz~icL|)Pu3byKQ{ab)w-Ij_ zI89%>k@z-&A0fVp_$GmO5#K_*P2fj~ZzJ9!a1KrFPU0?sA1B^Uyj7{LHZ~ zfhQB^&(R#~6gYpyzBZY7yTC^fA3=PZ!1-(JwN~Pr1a2jsM!XF;lnY&R{eLM9viq$a zH{mB_e8*E-UfKyl#XCmzWh3Laqz0EjN!7x<=3KopO55mzP%}T z-Q7{sCgjl_TRYzK2zjdSag8xG;M+xkd8rmDVqt3H{=C!#DnoJA@C8jypjip*x`E|F zULi8A9S>{rz+qvHR1f@WegfI^p^aqsT(9$&2G0}BC14Id35qs(sUuT6+W22-@EA*cS-) zAB5Rc!EWuoe9cMEg_BaAiYsWZ^_>fwcnupeMp>$y&-vYjo-8Z1&tNeAT7B;@=UvLGKQleBMfFh~H z?;toG{kXfMG`L;}eh2#r6jF7y}iy@j8zWoWa*L>)G6K#$ZieP-t6+(*#&}3yu6Po3B@Ws}Sks41I6$z|F zuP3Jl|JW-=Pj_6pBRx2HKYT#-?S-%V+7tYP0|hBUSy;S|9N;ViME|p3M=BmHV<)Op ztsHnU77Vtn9Y4la48=!5nxSTpLCyAi&~J!nMI+J%{#Sx-V7r4?v9G&7ylT`d{-Ct| zB|^|WnxH5TXbbhUH25K=L~BP@m@<8LSA492x%3i1)kENf1BEw=XV;ljKqzX0v8X;1oAJ4~9A^n5$p7bCL|mTv7h zUz55c;JXSl|Kp_OywqCwX7$HO!x0D~ zSglE``L(M1F7bUH=c)F6eooSA+{`FzKJ;93YzG3R@AE}TtKSDj(z^TURiD=;t$7^f z$1Y{%zQh0m75dMHv}RGjP-O{z_awDT&r7wcWuRekS!zP}IE^XW%tQ)HuqMPL7__-6 zsz4vy`Om(-V^d_qzGiT86&{SlMLa)|@ zCbCTRtwwG4ZJNXii0QsF;PVsKYYN6My+>Wo4T$LV29vDcVUD2Jmus>LQ47z|N8t&K zLiZh-=;t94xLR ze=~L{lb{9JKg8{H&ZkM!z6j(^iSzaLc`P|S?sEhwq>3fC)W+F<7&9d+_#QmAwc~oo zU-O11z4fye_M$9xWb;seN@}qEN*JBfZX`wja2%{#mYS{30zMQXu=qH7f(|WJVte{X}_-th9v+pv|F|M>`dF=fUguq~}?7eRb z<4=UZ@_=uK79Yfl7!e-=tIC5vgiQhkg?`xKr=0i&8O;7jWW~Z=@e#)@0ai;1%uC?R z2^nrMt9)D8X0b)hP4Hi=mcXJHbKA5Sb-F>#nnUs6C$z*(n&QW)GJ88p?k~>mzt^R~ zX9VksMWW9bi$iQ*AB$|`Sp1cJ>u)S-gqUYEF&GOWMmJryaV)+MG1Sg|X}@EE9$hTt z-L1=8?~!Wx_GH65)b(w^11^htn?)^2@F%DD%tC*&4cOd|kK4E{q?d)J7N+FF#W6B4)Ah~gcpFNMy$GS!8U!M#;^U_19v zeKcw{Wg9K(m1F z*D(lFKzK}qQ#j#LAaJ`SNzWIbi?%ZW>3`{fLjcnN2Lq-8o&#tFv;d9-j0YS6I0z8C z%HlY{)B%-Aqqf-2!TCmM9nz-rsqn zuLt>0l18_Gl60qU*?Xclli$NFo{Ek7+Y7N;tV~T0_!hD6Lh2_;_i#O7P!{s#jrV%W zK^tP{0)2QY@JZ5eUzZTS02@#4%7aDF5SGa0U6x!~dokp#9k*5s6CFacyx+}(w-p8o z%KaGZ6|ixvSfYxUw!c6eK3T2y+GV{RInyi$vLclwpNR#?WHx*@n)eOVLp>cpru9ciCbM94&hD^(xVu z%|7fC1|>c4Hd<4C>oCB!ldv4`{$29s=NS&!EB^g~S=bolrRJhK6-%*&%Q1uHhadFy zVf&Q^mQ=BMPy0A&0S0ThWgFLVY(PNhx$D6}lhfDcrQYhvS>5g(;`?Hdx3GJ1z_*jb z#(r={VxF?!+JK=yavyIAzJNBmM-=$Ji1#D}R>U1!NgL#)dfv`ko!gCjhwKac4%`tw^*7vzH zY4sXlypO{T+aP4&2T2c)BgOv-iX};_R|890=fS_e&+C%be4mvo@Q=8OgOa>=6MIYE z!4aEm*pmM`$osj`AUXCBcvN35#DWfIAHw1OfPVP*_^Tu>j%iN@xvZwIAarkhOa{t%f}dZo^@p z{}tOw^(ApnX!(WMDr3su05;tEuik-X;g{!l|9tF6$g1mk|Av@AliE%OU4mbI=>&y` zxsRb3F?9tvhj{t=wmS6~`aG7DR6?%;MgSn{)l~B%$>I zt>{^BX6UA_jVqQ@5O33nx$n1%EuQz9fUiMQfyzUGF%B$+3f*Op7FdP#@^1{Q36%Yu zmc?L<5UZrVul^h8WyIDtki#RY4}`1H4YBivX0O9~tsNI@nu(2}I+%?VAYAQdaN-)P zpHlr$5Ffi+6l%l;sn~|x=v$Spc&)fW*E$m;s6F);2rNkN&Qs^5!O;>BX9+EUss5DI zzD|T#49Ktg72t#bI{!1;JqcB!Ws`(T^E8!s5}hhGMzG^ezlZtK*q1+&bzi`DFG_I4 znxcxkleH*??ihmoD5vdZ_%@t+pEwE`DWQS&V10(Xk2Mu^6Rv~*wsyR^Fl3d~;5^*e ze!4Fi*7IDfa<5=;4O+Il+26CeeK{<4?pwkGV_0k%+WvH3E@go3)_&=VLD%|M1ujpz zmVW8dK&Ox8+!t_PuF!t3!f8q%KU732Hx;3>2RG(}HQW@C(5{iF% zg~0N#)gpG~C!5vPseBZqodcqqBT&$b0%TK=J)vcj)qIxl$O}(Kp4W8Lm;T^Ge@278 zzp-?6>OpYu(x)*E{u?=f{|3pLlS!-V(Ai)ux$;u)gHzDF!NYiDv!>m@$5X^s;9IGI zU8x5kDd4jn7Df&=cm-I6<4sQOd!sm@H7dB!*u}idS}iz_{gLc>sg-&g9=(lup*DQe zB88*Tz2FMI08(iH(G*m~)+4&PALDiebmZx7LR)!yTM2qw?r>YxQEj!et=Z9S!F&mf zf-&11r?p95M3KpqAG*o>0c3TL;!OK79mcl?O~Ss$12S7*@DK0f#^C^Vha_ADLflbb#f|;5r$b_y%9z5)W()wUSU|@!r&DUddDF-UBG|@l9 zg09e|;WuJOg+rmF)jom$TXsxE89F3mwk5DNbtmeB`?`cAGW*jtr@Rn~7DGBU)z{%9 zcpvJ)#g#Z{)%s%OdiRgu66COMGNgk1*chx*QW99VQ6O!Wo*KLdef}D%WEnQsli$_` zjf#>=DjQ6tEO~Oa6YU0kWu%lds2TPFHTbKd`NekfD0TI5`sqB=LOjd+;n^m5iVZx& zLOkE+G;i^>W3#!@a#0S^TQBN zbw51G3CbI`yuIK=Z}KRh1r=>B>b zdUE^9J!@e7A#!MY*5DM#Va+|SAhx%hDws@9QXt|4r_Ito^!1fc zx~c_&rJ6cvtW!~kK}9^-=X1y>W!p zAFog0ZUZrQav(R(|64Gp+dd5Vc&p)m3s@G;d^Dli-RI2cL-m70#C_;Ej|H2g4|87k zEb@Q0^IY@~=h}&>zR!4C!~5H`q@q1i7oH_pfqAONTD_6BmCo`$Y!ld!x`jnF zYzprqQiGSFxL7QF+~f%Zi}DL#1^+%#k&+rr1=X69;Xv!TD&TV)EQ-<5&pxb@f2 z`$_C-G0pN(7m#rfEBQXmV2sIHEK|Y1B6?!o+2fm_S33`rG6PAeb;CFOk6ZQjzyXA_<8`q05=K*2l>7XhO5ydHrcF-xB+5|?? z6f+S`eSu{LDul|VHt5j_wxFTt%<9y~H5nU32KEgv<1a#nzFO?is^tpV#Tv=+3LXM! zYviE#VjPg-nGZ+gL+&IG!W+5M%Fxt;Q}KpYo)zHIhmUI9D%dLQ6r^h`?aXpU6n z6BR%)83Xd6TI&f&s^+6K?R2q+$8i(?5)nLI`{?$JOZhb))_%46SwFH(@K5H{mxSiP6q+F2L|uvr6lh$nQx8r%mJ zLtm>nL&3dRaNfZ1P+F%`cg7qL&XOOp0oxz)%G*!H*BDP=wUlT}mrJ+^uS!~-e zmcfsC^6qT z_d~Ss6l(p#>KRn`8|<)tzE>KYiMi0)(N-i}DTo$@nU8!fi1@hFaPfUHyu^mH{ont@E&b_D9dlUTL-oSRgzryumInQT@>>omt zp4>Z#FBS5vm4<1cFMy<()9CIKs<&6Y_muzm-5qTKyw(T%OZnr3{1vg~Un=EehMVON zlkzX_Pd;z_e-96A?YIKMeaF*P9B#fOG{-dkB_0&1gSW(avjXd>^2xn%{<%lJiQTsd z{eXJLwHzGeAFSpd<*g&TbRL@mkLP_(^zUIW%HF=6t*hx!ZTUa7DGX9AtrF@d{)z-@gn#BkHUAtB3t)N#pyKX54ptg#Yf| z;G0mowc|1f@_SFg1RRr9a9Y*34Q+~7w$!_ORj)QSZL%L?d<6e`!T%2a-XzRFo7j?a8a!-OkndZz6O&$5ZX_}yK?2kUdKpzZX4Qkyz9ket>pmptgeSIBa zdj#u6{k5U`jgj?WLTtHPZQ&`Z_P(pM*OM5x){YNm8vFai7n(2g^|7$Av`7;8CC5E% zuPVX+R0RK((42M`?-quP9h?7J!M`}fk7xI)uR1hT_fuiKh#~^v0yr_{{v9#YpqD_y2^bhapP$hjjK! z_lLF6N(+s`ALMvkD3}(6+Nb`{O8qCCPXE&2VVI}2g06|Hq85ei=sn zwnWlP{oI1-MKFcuhpykZ|8*MsmIkv0>wW#T7d1Z;1pOQXeVS1}0jDJl1 zPWGNwzm0G%Anr?uaF!TNo$>i!Nnx^`W=3a_PDCQ_U4=0%U1Ifx#im=`2IGHCc(}ifg3-u zPzF|UALP&P3c6nH>wAG)oj`G%s;x=Ao_Mv$lJi@)JEzw(%s=-C*Z7?WVL@bZk2Uv5 z@UveD40rW{#dD`RI}vvq^DMp(xcgH5T-^M#yVU$H-2NnB8^tYfu=Lkp6CCQ?qx&q$ zioYjfM~P*h0`@~h_g-yPRp%!9U#7JE`A7MOGU_8j^xUo&iFH3A;$t>DyZtvb(q~hR zoxN8)fu2wAG%URj2odO%8{G&L#`*WO{);A9I*orpA@qX=R9t;jk^->=H^5dA>PIRs zR$UxXq2K=eBf;Mv5H?b0cZJL})L&#_-!|8@p(W7+tvT7bZk6{NzT=`le}=_dJ4VOo z&sus*to}TSCeNZjdpU~6;W%x72LFfsxlr_HL2mT;>^u?KpBdtX*x&Du?944ugL4Pz z#K?R`-TLnd_EF(+nF6`+qgSSTahp#Uh$4BeW;Irt@ z=(Ffg!@e)kpNRYI;4(ONYsW9A=<$ye{!^$ByaxZsjvMZ8gN1_r;RyQur2m+G)NY`R z^dkhlJ%avG((j2)AB1Bf{zuR+BK;$=>30hHzFUm?Pb7V1Z2Gl={`Cm@A*9a)y_$$W zLZ=l``o zK5$!HPtyKj-hcZ4jlXYGamu3dd`sLsYi5Fc?R+FL_%SrV`@fVPKJQo=+N*}nJ8(Np zW4Cq;6CFtAsU~8fqHb5@-F$Zk9dHwL(hqi2-%4T_*XQ=4ZawwI+egiKZ!np>`}2~8 z4BSTE(gNK3H`SL1n*FR)_UCGqd+`zh?@rD47h*n)6FRM!tSGJbCbobpyyo1Sy!6(< z9eHB$I2t^k8sy`h<{`U-@qxStPN@n0VOS9S86XHI(VdOQ3|ecvTgXCH_n)KvODx*S z!JlF9T08!QKg@^ya0f0<-Q-K9b3T{XMofKJ_MW)g7eH?Miws zKOt_7yVt_{oO=%^1#W`}$AWTc#Gw#MX}e+0a09 zd3dO>>Fy!E_j~<%bPL6`m=1+Elp?097T4gQ>LB*(-{@EOyTF%G&C>P$3m5TNs!|#9S@u3&(w@gvIRjO|xvaq$f zUQBR=v9w?I^|5ZG>Pux*7UO-C?KGer_~E>LgX4l%(y0*nQ0w2X+3UI8toGdD>rM1z z;{5RY?Qo@Ly!Xf^KmuwA83pm^&VEn86oCT1Z}M3^NG3oKdJiro_#lM{d#FC4A?kmG zvhLkne}c>Q(6qmt!11sI&lMwK!Jm)o@h4537>iqq*@AQfNMQvyX=`5#8d#bZd=umB z+dpLYKM>M)omNmHvxB{evHr<;-66<_l3YK} z=H#{ipRnH*5pCDB_5Gfe(?q5B&#F%>m5|?p5_P+X?V+-DH10|7!LThqK#6Y4DaeP< zC$;&l9ZCl?gi1@tHKo2bGo@OL3?5QW2V`8QNGZMHZ3 zujvZ{SA&2BstCQ}x__nl2jklW3~6h}y;=02$#}S+dJ_@l5Z>q=!o9ig!Pp;!n}oug zKmU+tPM}~2!koSpxc5-pM+iLsi1YQudBy}Rwilr}rq)4ePv4$6f1H1JTu;tt-cJzu ze8=LGp8H6heK78${iMXof?zjUJIcqtU(R3c_V?}+nj;4vz!|TFe8&`Y+Gu{>kNfv^ALa8A@ghG4^bq>Z znZB?474!Zn zv4Zgf?j9T}xW5K&ZQ{0m(SmVncBq52p{Pa&0!3Vpu?Xet_S_6xV@QH=^xC;cb29zA z{XIzqgZ#6P@~)20boktM-%eN^2MyR{2MgG9RKISDjx}xSpzcj#T;!3&HgfIneoNmL zG9JqPWF>~Twc{r?F&?J<RK{=y^bCaIIi{Jww;e)ZPIMht?jR zf7;r`6DnP4p>Lt!f7rmEfj|?|cVoyn5$FGcX#tp`^__5feGg+M;{2<>_R>P_LEoJs zUhtusxS+53d72r=&N>H=kdijE%il{8gO(Vq6s`W`CNci{^Jg4lX!Ft66DQY4o&OQZ zFURLv!M>R6q48M-Zbrd^_l@HNbN72`AGIvhe#L*%q@qTTvu61uYrT6>8Gfbsmg}mm z_+Y0^!c4%S${c)3cltbhGKjw)tMMx)G2(ll+UK^@uB%SBURN_psjpZz#<2{a2gb*< z##A-dLy8+B8XJ^)XG1?V`I6phq_^TrR90t$ReV~-D!#U1O}oySew}mFSS2<`MfGB@ z8%%D&>-M@__`Z~*daQ!)hq`O6_4pBI>vita*P}VFBSza0!f%(KPDr@Ee<63&Iz0|+ zWknr7fPNZbG3fdiIu&0=s>Imhv+}1A8Aa8tH|--?x%wYr+L;UBA1R=Dw5 zAbcMNN<{jJHT)R^n!XA@-R-DWN*q;btE%4>u;#*vuN%C^H+-Rg5lvD8Jf@Zx~1}Igv3RTp)Ihg25X& zU22>S)i8G*OyqGip}Gp4X|Q5cZn@44VHj~|wY5e#Dn2w0(Nzxj*vR3UG>M;{mg9

bZN|sy-7YPYp=UCkO4FiBd?j94>~fgKJVHpnJ~MXgSUDuLOhp|((6QWFG~SDzuj<`2{1k%C=w9=EloqR#EG zrfIbZO5$_u2w~Qx_%emH(qR=}6o+NBF${%OsU;W?h1{;mGiN*M8=IC-xgM%Y=ep$< zcF&sD&}gk`f;U<{jn-Nbmd{F>lx%IRT#S#+v)_$1!nK5L&PK0k-kKV?imTDtK$n4} zSoYT^lNGZc(H(8VAK4{16Tdz^$yze?j-lpu2j(hnbbFee@M~d=FCl>6`!+Wl^$BQg zns9-V(*?hat_?1}q@#Z%QBI*cXTuT>$~7@)u2JwM>;`n6ffh8{@R#C~u}%c@W^3ly z%mFFJ4L~t258V-yS^8a6Lu0K{3oB-MZDX}{X@$1n)imN0c2`G#0ecb#t)j9{_*#EL zhsI(nb$CQqUE)LZO_&%>jrEB6j%H^gmO?o{H1}+;=M)*%*W-$1;aoDGeIW`XB9skZY{+m@2^h#nORu%U>uJ;$iF$6CI2+7Du8Acj%!e>SLEsb;Vz4i7_GV>rEs2_~ zlMsK6+6aGRh!By6GT|>VxJ-0m6=IXiMxbV~<{R>>^kOx+S$FPw=ORz7*bXjjY+8b~ zps5K1S+`s%(;6TXUuM}AolUmA=0lp@N^-v#7%=?vd$#Kbjy50C{B-vUHI^mhPB z74Z!~6qvsMhmweI{{hF>%S_+gW&5UY{^2_>;hy5dlibVUgGSgn4%IC(@K=0v%GfZ1 zzrQcvM0{@shr^f0-@FmWAUI)DUVN&rk1u!a0_366%Ya7!6Q9O!_~6jycEBvahX88< zcLJ^hOxfDkcMz}ukiYBl1YkOzdUgU91Li%`*S8w54X_>XMZlwgJ%9;#T6{f@qS68H z0h|x`AmD1iKLTz8%=#JR0@eVgoCCc83jv32@9V1rECFl-Y~In=*9kcI=Y4(2gB7I# zFb{ACU@f5K`M$mlfG-0c0Q?N_1Yqtj`uau;fqsB_fI&bPU^dSC9tV67$8kphpL!AP zC*T`0fN6j$aB9O}_Fje4sx5%Saj+c(oD7(FuA;mJmciD1@3V`KJMccx1vOeTbU4dd7{O_!}(;CjYRrlOJ5&Qaj^_% zUdnMpnH6{*(mN;<6L0FUgxh_C@`h!s9F{P(V;D>-cxnMHKk4hk>nVx?nyJGQrw&WL z-DkN!{sB;1ox_qroj7$Ls`i76?eOojlE5>)AD(&>j}>&CNLPYqwB!-GSm%dy!Rr9Z z38YleER-~wE>nl4-0nN)e#-;#YoJgrQVKLmhDM3dC}HX=qAynP@JVeh`03B=i`GVY zs0}<4ROW-G2sC#{npkaQ+!x)174#dxyZAKnX&W9ZE(47xLVn1e8H4VLG!Av*GnJj- z!Cx&H#vroa8TG?b3QgU%f}FqUasa&j*_AZ2K=T@C@Vv=jm#UCmNaF%c*J)_dK(hff zAA<&uHg!F3_r>2&H>tv4bU@%f4hCu4LHh-0)1ztUn`w_r+R|v+mBSMALUQRNBM>{T zM{Jr081~mlTb0L8iH{yZMX`cqKKLdh_Vni?9K)5MxeYY)kq@^K8bj-#X^~@S1=%+6 zG=N7R!-8QMbA0&w7=5mh<`8JU4VoFqhyBwVqGA7fLBkj+p2vpfV`Tqa@k8T=rA#+@ z1NsI2Y}o$^#LhO^Moj-6)EtXl%UB z=*KT}2R$E46~W&Ley-V;2wfuk;u>_kU;bpQ!LNaTJ?2M$?U%=Yqu+U74F0RJw)Yn& z>31H`q=DwU5q%8V%Q|RHq`5erTfp-$cn0!2(jEdW_Zg3bbrQ6z z!?clepdnh9EbtUy-}3V?Pe}d`4Dvai<)G~Z?ez12U_1*@AL&~&hV{h7UwvMTNMQxb zCh+r3n`y|CU)x)_LUW#N>;=uopb>wV-jC0?;(KEHuNC|j?2lf=3sKh~A8Nx|9BPBb zUtM2W;42G!Wr43O@RbF=vcOjs_{subS>P)Rd}V>JEbx^D{#zEn%b0y#wK(J3q)8;+ z2HbdkR)^;(^@>ut80V-?MQK`sX9>vfMfpQW16|c;Ktmau5953cDgAAnCjgck1V4gy z|K5UUHcN5NgahbDyoO4d-2~m4h#mmVH)GJSuAKkGxTb+;Et2^%%FRUmvKTbv!O>pK zt3SD?peqxZPA8Y&TwaZ|7m43l&PD1$-q_wluumIObu*rGA(<~@TV<%<8iU3tPv?IP zHcW{@Yn1mgXe=>k{@e2SP3blyUi_|o=eLmgHqPVMiz4w4ziaP8*(OstziXfTC~Svh zq~~|-i#IAt3zD&%-?i^Sne{u7BH~Z7jJ<6NJjcRmZP7^tTXhN-?eYUp<5@)T9|-){ttQsGQZZ4|E?kbH1gDeG`kG> z-x%_LGUPu&p1P6#oR`D-i;$-dEWc6a%aOkYd0us_+lsy-S)bA9%2CJf-t$@qn1S+g zq)u7C3H9XTMYMeXR1dwHyAtfRXjU+^(Kc7ItF}G3;xj6P!P7KA_FJKYm@VJqDJjOln zuA&SA%)mb>fWwh4K{{HY<#)_ilnYpYE}oMD;y6(mfyC?IeSP>MGoIrD?iD3x_RltH zGg6PPR+LFdw;?S+T8y*;=|QB&ke)(%5$RQ=caT0n`V48P1N}xCjWh}AHlzhei;-3! zJ&5!e(o;w;BE5?A4$=ompCJvc0YB1cq)AA(AuT{!jI;vjL8Ql!ow$CkcMLIx(sPF(j=tYkQN{< zMp}Wy>i}ZNe9Z4{fNS5^%DRx})go~X!!s+C=YqBko!RlTTmBqfsWTk_|#gYO`uOU$Yb3Il+QPe<9w+X>&m+D4`i=H+JIyMJ_2bY@|%&m zkbfM|cs-7?LW3T~KMdC{)7t^f|La#ST9`3?`Xp=GjH0=ttXX5T#*X{{U&&Z^E#5cx zR8%TsYw=eX%Gm1V4esUj8uTJLMUFWr{IcuXO%K`Q6ofZ0xR8aWi0-*q~6isIg3GJ zEIJ2?F^DmXiGhkZFN;i!OQaQasAoKLAy6@f#Yq~*G{#1jk&dyCi7`*VNXzSLB!o0U z#~8=N7)L%{Y&QXEG?Gron8?IfNxH#EI^9_0DVt>}h)+x|R?3T6Ciqf_j{8@p6Zw(| zK#%b`l8)_c!kWUAsaK-Rio|Ow65A!+A*?w}kF!8tx(a;OsnfaIp&L>fJ0>rk?oQxb zZ)iiVF-(SLMIXq55UM00k&bJRNXYA#F7N9oV7sJa%wXE6SE7tI=Culmwj&+a2c{8V zB+iR0qiSI<|7wMSRA?b8V7Z4*FgQC?OF9|bfN Z3%Vc5Is&~e)TXQ(`aZ@^<_UDV{|D^YEXe=> diff --git a/3rdparty/lib/x86/libnative_camera_r4.2.0.so b/3rdparty/lib/x86/libnative_camera_r4.2.0.so index 7fe74d21ab5e67e1423a8e3b0f126772239c8647..9923310326b1d8b70f418e230962d5a719de62f7 100755 GIT binary patch literal 95544 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

}sP@!lL%U?yK0!RJ6pekN0zrV6Jy3 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 literal 46272 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/`?ktQ&pbOu*kgmTE4B%um zLHHW@4$He5$Y;7E+Jv%i!v7CCps^@}@9IOyCv2x2oco73UES>xNdH=pcLL!O@`_;d zB7$;JQy>_kXeZo|uP1Pz>%pqqi;e}!oyG$S-)w9%RyH8+LEXvS$`LxhwDJ3h*F zl`j`k?D&d+kW#s(mfi&~p{rgeoMIq|T9Us{5JXf|NU2?-twT`w(Rycp8~Z3l z$tWW_3NDULXh)(AdoF--5e;2y5r{9fLq4n$bbAn2E=5I;AVcXBl@Z;m3K3Vf332dp aDn()MV(+dbI69>dO3`%CZC4T;-Twi^_DV|t diff --git a/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so b/3rdparty/lib/armeabi/libnative_camera_r4.0.0.so index f29707cae3d5917b189b906b167de5d749fe777e..694cfb80dd736de9f542bd146c49b04e0911ec32 100755 GIT binary patch literal 75100 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 CaZWq{ diff --git a/3rdparty/lib/armeabi/libnative_camera_r4.1.1.so b/3rdparty/lib/armeabi/libnative_camera_r4.1.1.so index 35c5141b9c70aa43f48308180d7c73dda1b49835..94966c82e79a919ae349f8bc6fabc3c4075359b5 100755 GIT binary patch literal 79196 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 rdbI*a`^U=t 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 z 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 diff --git a/3rdparty/lib/mips/libnative_camera_r4.0.3.so b/3rdparty/lib/mips/libnative_camera_r4.0.3.so index 616323de962fe6bca14abb149115e30315b64fd0..c8c9e2c5716cc39d21b2ed4c475f765e7dbdc2b4 100755 GIT binary patch literal 137828 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 VghnobUf(3&4BhX`jk!F!{|n9lA%*|| diff --git a/3rdparty/lib/mips/libnative_camera_r4.1.1.so b/3rdparty/lib/mips/libnative_camera_r4.1.1.so index 7ee4f257666f3aee1f70593ad3486eb809b567bb..6845d715d9e8e8520cb2f23ec5cc31a10bec13ca 100755 GIT binary patch literal 137848 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 eb9_xNsRlZahj60N<<`xK@V^HZ%N$lMA5 literal 71916 zcmeIbe_)kImH0im2@oi4FEp)DQJ-6G(pyOJCJi)2)Bp($+Z1j|TB+hDA-N%GLlTof z!Nu?1Qmj#9lD4SyyR3~Zt*BW@TWX_H8!LAC`o;aSySU5lvc6fxio5KJF0Sla&HFj? z%#%C!$qhfczVG|To2MPlGiT16IdkUBnKSb|xz8V$SFXy)$WY#usj`*iVsWL4fjh3x zP&0xmR;(N~Lq*gL>Uv%7(F+{;8#hhU$P8V6W@d)+((YMGZMaIQ>83m&b*{-6Po*>{ zX$JT#QtT&P4Hv$nl$UmZlq6-6?xq|t;S&B*zK(LQZGpKINRl$?+r=)SnE}x*(%*7_ z4e1l4pOJn+x(ocD0OeXd3A67}c9kh>=DvjcKQQ^NQjzOlT%i6ExPkOj(ize_NUbEf zI!PZRp(^!j;9rr#hEE0ee@*%yB)RHH|3Lb8(l$f$e(u+i3LEB+#%q8(m#@_NesKb+9;Fje*jMa|Ctozz8p9Q_)VZ( z{}<^P=>w#%k~%2+G|;&Wi|egG)f2H*~Jzl;1V?icG4rJe)6-<16q_c`1rOxbMi zuQT^o3!ZcfNv^v|w{!n)(tEjY0R8~D!j!+xyPg2*-nGiy{LaAd1D_#%kyLEzo1*{6zziSfTwh+YPx)}C$%jePEd2G>y?48gKHNy= z?HaIvr|83x&Hu%-1PAza5sl`X%3hq6m&EOlXvIn@|XyyOdy7z8(nwvYR?_C|< zje+Hqm2y9uRA-J~&GLCTO1k5(23I z4V+KfV(N#0w~=o$`D&m;{>P+6+}{WMDCy5gnWTrny$|?v(w~zqkmNc?T15I^k}=m| z;A^A+>43p~i28EnkUp>PSl{$1p6)>x(18t4ai8`>%gW|_hdf?LV`ReoY$zQ~vNvNv&a ziKx4M3nk63q}EstOq(NFC$;^fV)mgekTh<1bVSQ zq5mF6wSRVoUjHP2E$z><+W*rV@J~IipON}cA#ac%M|_sh_ZJXD4Y>Lc`F=JZTFO2C zSvQhr;(PMHjrL2e_Md?M*ymhZmHMw`5~nr0ahtSv7^69hzQk9|K?C9!+xuPpU8jCA z_Ct*M{Hw0bi2lAn{wV$N(mIhzLb9j`LbC&Jo!HOZtkDOzZ?FK(Ej;P zC&%|Q=r_^suHjPu2k`HK|0%=&amMq!HJ-;A{{l-tSJPgtrTdLsas zgH_ROl?ckelK;in8^{x}#^;M!6ksnAfXLfRc?I$^tXkf`rGF9h>Gh}mW~B~W_WJiY z$|HZ`?zyFY=dDT&(EoXc->cLgvg92@f0dU0e$66u+S2bn>XkIQ@vV%<6A0Gw1>`Z~ z_hsg1iN$XSeY|1mt0)XT{5^U99eGDBdA~;cO;-KWjPK}E?!HRoZ=*lw=`X{i_3?h_ z%b4#TzY{DNO@m4Md1xW}HF=Tu4E7ZLNOC^hNB@sn?cK!0tz~}4w0^HqYti=wOTNad z==&B@mfQXa^Jn%K-St!C`wjDVFZM3uCGB0Hzr|MnZ=?M%_PoKAhaoK3n;ef}`nSOv zukF}-%l>5le~Ewg{1qn$V;#t`tJ&?pwD$?d>)bwfZz}Tq1M)P<{4?#%Vtj@y|Fhw0 z<{yLSP(BB%DuS>d`^Yx*b?C2~An!DJ;deLk_9O2Flb?k>+4}te^P!vh0GaN88{?m_ z^t+t`o8J#91-^ZDc$I-9nUoOz!QLDXgKzNpN2YNjol-uJMS%`nbzA8+4 za2EE#d_8IMUt)g8%zT#mf0Ye?#^()FekO#yTjSM>er)^yChN<-9_Seo8Lye}b1Z%@ z29UkUJr|Jjd(gM-FSpW8)bfALG9K91Y}5X|@GG(S9iaVOYkXR!Q;t7rfnLVzn+#OH zrSE@WJesU{;J484LEmDZBF{s#H=FiKOnbj2Z^wVv`|Rf^^FPM?&o%T+FLhovE?jen zzSl9{cD&SrzddKozq19bf7ovp^dUyFVO!|T|QUcOMAnwy60mOAH1LP z9ba_M-9+9H_8lOOUAusye7(kv)*tC)7FDNgiT>OEQe~s~3 z&-h$t>VE`zx{;@hytMy)^kMtQnTuH8o_5a@bUF3s;ZIvz#oV4gGp_8+Hx#qB2U5q4CYgd6_34#_BYVJXJ5a;Ue;Um@5ley@oE-^aoETs^X;AJXBqktdy)2jhJDSp z#_xxWPxfGPJb%vovE%FiKt9_)oI{?ImOomIyhE0}Uq{g0jPKR7C-!~-c?aO{nD)!D z#|rxI`I8S}sAsUx-IR;{JxV_Dc(Qyw{j=A@P$s%-O8Sow<9XJa&)0Au6eTbH75{hu zdrYuD*qkX!e^(A}i;YL?}kuL-L-DlbF(i?c@@JafJ z-HLuIef_-!`hLqFm%!LwpWZ_GkR^ZKbjlyVXBmC`Bl_5}!(E@G{XY7i-JF#FE8?hL zAaTi@nt46;`n=BS{0j1;R=x;(J#OXyT@24$!s^Ahcsa3O&SGIYV$pvV44Q zyastktokx2LstGnv(UelkNf(cz~A&+eJ^fGLg+S2lxSB`F#9A ztyRB@i5Ii-AHm*Bt^D&aiCX#h`TF0&{B*4He?Xr>EB_zJtE~JE^5=$J0Y(2mzY6_Z z`NQI9%ryu2>1!Adt2{*ByQKWH$UkD0A431$CFMta`uGg?HDuBM4fAcl%J0Gd^jrB= z%)f+{-wV@rEC1yg=+nyYmrj{W+Rx>mm{soh`u8DdO0DuJ@<*+Fk=VDD--iB!R=!f& zv-10B@7zIG04e%D<3DQUf6IJ5Zsi@9RR2p;>UGhlRsKoFXUNK*_Vw>WzVUe1yV0jb z{{!0ZxAL2@?}U{_xkc*^zj?@$@g0c+{`8N6#3*^W|d3-zT|5^>f?XR zM?c$_pMgDkm$dh3pMHMk%RlOP)b9Fu%$I+{$Nvsr|DN&XAMnw?-N)}6zV`3+m4C{o zpB29Te8^WG^y#a>H$J!c+PlL?ztt!INng3DxubIJish9xYgetRDzC1oUcRETyhhb* zYOiT%?rc{zHTB!-Y8snc>sp#W8YjDI^_tZ+%h#=2eqRk_H7l#vuB)kBT~)1flvP`W zQnjutzOA_n$}*esgKLVSE8AK-w``7gR5o{Z#arVYRb5*)7A|RPUDZ*yIlg>rU2{v_ z#+G>bR#h`8^=)mfE4DN?#ydLK#arTao$&^j{Lb6zS{pjrni~p>s@gib;tlu4>$}=I zRoQ{T3^y{;o( z9=mgE)sh<3+0{|M8HIds&3~KwVz_T^+ZwNFZ0mTiuA`wmwv|TiSDWLT1^s(zV~N+s z#=80k>_&bM9Vmf!XM0OsmnS$pJ&k*sTv=GY?#`+xHuB$B*ll_=+P7QH{kO+JMz|r) zptcFy`$bHD7s?8MPu5hV90J#w;ISbyLIG*zUyXrBXrtntR zq$^myTH+l`THCss8@HD?H#f6@nkB8KrEOD9JF69o>Ic{OY82kq-qzVwR@YTm-Mks^ zR=2smd|UInJIDK3)Y;B@7p=K%^|pbI;Zwf2zHN&um8Xs+Zg+|bJKW`Y zUA(@nqk)B1ukkDpEWNHoK7o>JtS2ZPqs#FQ8Q7Y}mbSVs;*&;XFDz<^Z``t}s;TY4 zRk125m9S&e7S`38y84f7Y3_)t&h3O4n?)rl#YU=hdMsppYwmIzA_Az7HP$!BV)YUQ zbhS04t5MY4S<|_tyE?d54WqFmJHGWfx!uqbZhWMH- zo6BQJ(QE|v)0Nb>v~|Yac36E{nO~{1%g9hz*xA+A9_xs2ZH_;fo+8Sa)!Qt_m+{-o z%5r-{yuOM>xpkAoU1>BzT(h#SrNvuCeZqRBm$dka23Fijfa{9wV_M?Psq#zAq*zg5 zy&jI5Mj7H7M!BwmxtOLKC@bC->u76_cXTnqwMC69Bh9E5GgwBoRU&818!d0DrK_Wx z(8HnYh!?Sgu?e;##)2Fra#f>t1-n=w=B3*$r(UCkR=WAM(GFPLxa zmanN^y<+*Avej$uxRhAB=H=6S7RUZfP4q`A6$WWMp_x-FZ8vGw7-M_o_nD{e`|~3+%b8$&J}-)1#Omve_Q2^fhkB zg1$&phG0Al^;Po%mr2l*Nl{lNyE?|eb|mAzySdfpyQ{j2iBz_t8hkp2RkM-J!|M8~ zy4Ce;vTs90o`PyNqO=FfWoOj-pxz%%&}gAWUcOFfs=A7bYic^XT57tQI@%trX^FRP z>T0TqcXYIM$g+x%zW%Yvimlqn4vY|}-0V)hzIxqQ>27YuL#BzI)oj)L%nNTL0ySpn zEtKo-Ot#ldgRzUSEtdm;`u6Rrp@ns!6`*?p?A*SYf3@99r#y+13vay3+XbZrRfT?w zaJ|Jv7Mj~|-d!BWq+h>f7A8Xtw<&MKe~Afy`<7OZwGR7Is*MZe^++Nkt05f-c)gxD z9z{O?7+bxv`kr;=HC3xWc*#YiNXJXb<;SbLYVEqamRGxx(-pM5uKeEBgiZ#nuS6*Hh3R78>uUb{U z^3qE4tr}G;%h!}&){0+rn;Y25dR((|EvwC%d)5-@-n+W2d~LY|=dI?9Zt@{3T#^in zR<(6(mQyU(SB%%OPh6Pm8zs!CzBl~_*`AN7XD@7r+yl;}FBsqML^+29opS!^Zp9`{ z?%R^$R>!w>ZQ(@H-ZvF4UR|}Nqp_|&?v8b0+<`O^4so<)Xx=o#_`w4IU z6|vdq@B&VJ!34*qmsg*2EnHmJ-rlm^M77OCez91UUMj{lJ7FJ=v%UX*rR$}v-_+Jk zRCN|b@%wTXyQM2$(~1UabfE685uLZoqR@`FV#uXur6HI;QqQ z@RWfxdPusU!VA zRGARbR zJtd$_Bjge*n5|hHt@z-j6p>P4$(2@Eeor+X&k6?8h*Xji_SalSm7?2ItE{YCdr#SY zHD$~1t6Y6YMfD{bEGkN^eYw>Zr&e24dC%H)<+3VVvcV;(HCL}$$?oH_suucsT2-;U zEY)*PRH(my)gM@WIch0fY^_?CF$gL2dZlObj;YX?3-4Mbx+?2mj{5 zR!+*%`|Ta^&UnYx@yD!k9G|MGOOgAxT=v0!8t%7V8TaBVBVT-F;SrFz+q9)w?ixGdai(WOoqkj*PfR(c z>AIcgNBUqy9u-NM54l;NzEIX$XAWL`1iHkBYlmgLuAyc#@%T0#M%6!{Qc+u4Q;_U} z8fqS_;~fx>Ok*~7wAD4#<1|yA$kc7*@rn2ugpY5lkGFR1!h9pVkC)^qIpMwFqqh~ zrHnMCo>n?|5XaLl_bAM+a%)P7Az!>jY>S6#4^FJ$FPp52c`A;~{u)+yig~+bl6HJW zrWqeLsjWhP$+&I{3p?ssH>K&ijW_IVl*Ky*on)MR$ixS=4orkCf?_2 z?Xnw~P-q&NfVUc&Se9&zS7|oaHMdSwX-a|DlN4f0O)2;!b9-1Uc~a0x>NImR*+iN` zwia(-KUU+q|-g4}Xvd<7cKL2l+rNO3hvGS|3u~&XD`RdVOs|e9WPY_A5&FR-?XLm0q;p% zTZfM6^alK5ZQ;eLc+DZsTeNXrqIF|JPK~?F1AiHwni@C4ba|I}&-(OJKFV=UZEc%t zn%tM2+)&b0m#=1F31{FQFGJ3AyscY}l%oFRqgPKAX`a98=d?>|*2rVpU7>lWU}xk&THsd_EHf1Q3;!Zj7Ytc-pQC)k?tMR>|s z>2vu@5sHva@w#^Rq)bdP0 zo_I30mu04$$fjd@sW~B|E3bS@bItlK_J&Iu_Y${G`MAWwpq_0{S9~0W*q!b1`sT)F z)@)<{h&YbBlw1=nF=4x}@;DdXUCWF5)%PnBPUH(;1g0zog{ytR~go zCT}L`EcBE9i<%s7>rZ&m;$p7L=KXt8xle-M7gsD!yp(x?1Wg!(Jzt7b?ZxigMaV9u zvx{)N@{akK`P= zsE4~$RkOFa6qze?b=74>zN;^f$`)5_Dn%jbW8g`2lAbu73MQdUqlHN*(<&l8t+-TP zC9qX{5kfhJ8XrA(iY4>OZKH+r?8vSd|A@qgI{uS$sd0v_@_0WDe#yo-e=Rg#s5d|3 zmE-`iv#X(g;X-pPxY@vZfi;c9HmtFY?z^a)_#>vcdt0-S&5#Z$DCM4lR$fKbXbDIV zPX{J7(m-onS2KUJWDX}giWe2~AMD4kv-~ase;%nW7#QYvJ|rJ8u)@Gf16vGiH?YgV zZ3gZ!aIb;#J3qqjkb%Pn9yaiVfhP^TVBi}D%I|7O{Tu_M1{NDwZQyzXcNmy3aF>DI z2KE>@XyA~6^7}f{&M^az8+gLNa|WI_Fo)j<5c*sL<@XIFUuDI2KE@(Z{S`72MpY2;C=%S z88~d{}Kz;x>CjNyV_Z%=#euQ1}8w@;T z;5?xR9~M5f8LC)dU55UBwM>2hw?gv#0B(*zez-eVAU{kS708d$c1!(D{8o;%!w<+h z1|Bo;xPf75kMf9t1qPlr@Qi_H4Xl=W%^7N+fmwnlUu)p7fsV8e?U4LV>_GAl^Mesn*OUgPG%%%s z{}(mDs<6yixc8>e=o6WvV=v!S{O}Wfk;JaPpgMeTo_gir%nMFth~MfV-$%Z0H)WB; z$NT0b9_hQV^NGG}+sKG~WRgii{wilQ|Ndq5HAt66M=W z`EleHokoy3jJytV7toJT0-oLa_ez3U>aW7ra2rFX(oU{=mcD(-9Z&iseaTW;`BLuo zuTV2=qRZl+7F73q%G;U=*1mZ6+sKa2ep=AR$Szd_1eJv@gVQgtwTlV1m^Z88qJO@5MUZYg}EO|5e?4uX@s$Yi%G za{Q9ECu_IKw98jedd`on=m|MH)tnyIJr(B5 zCxcmP=b+GLsa;{A&6$MfE+5ac`N=sxK%2;oeZ8XR(2vIEWQ7t5J%?qCW$wyc*azL( zSt=;=SlZfec=+W%=W8or==NLkFPlXE>PdK(-JhzH0!#kEE0F(Pmi%Y(Tpjr3AM&*| zV(5k}`6tu=?n!uNJ&-DYi=h*redr40|M|?M{v(FRaN^-U;Ui4>?-z>#1REpp1Pbj_qB>I`} z4>K=T4!Z5SZ8qTdq`g{vk=y1p?K_%imtQ^Y%~gpU_#$JsmeF}(TK?V_rss)FLN8_6 zs;qYp@@qLGPC#%%mz(%RA2ReIQy((*A(Q4I^^U#pdRXRWjQMiZ)J0H!^RzT5^)plr z9`%m?Abkj^_5HbtPa@~=!A!Nb-__N@gIQ`#zwnx;4jklHb^C*d^79<^XXvi7Kdc51 z&QN#uN7PpjW~)Eo6A52AI8&APN7XahKZ$(V_^za^{o}GpKPnGR&-eNkqEG&QNPj)~ zWlVlI7SKLs=tkF0Mi`R_V~~s9a~YR`oWRav`VwV)3K*Xfb?Db~RcW=9AHkls&76}p zkdu`^oBl)JH_!M@enmJe`CMX?qtNZo**Q3v^YGwT4ZT~|-}g>6Jv@{%qc=nSB>XnM zT6I2SM8Syfq15IK8{6D(D@|S=c+@sZ zJ$;!2YL$a+V9;CFy^0XzS0Udy3p^M-TOPxO)_wP0z7L4`JVj{#JBdYJ6;2$kp{Qx-QW%&f$aVbJJC+I&^TEdf{L(dX6#%Wik(# zIWcVL?mhe?~qc79yX zcWFy>#CRP%jy*`bqQ3&{@pJgaOf@5%Nt`=ft;`X+gcH=|p~OCZNgEOQJdgMZ&j-4C z`-%2>Bj`@*i0`R=RejgB2Uiy*Mi-?<-iyX)_(0+l9jCbQ?T8XRiO#Z!yCg2bYP60d zCRz}T27WbGT8-cA9UGeymKY@zbOMvbiHF~r9FKYEO2$LR!omK;?y}Xcp4s@(UFglT z6UzH2?}J{?33nbm6Fxbrt_2YrF?e9 z9c!_NWc_J+ttol&^{|wOteEQr_V(nMyXJdwn8@$NU|}P_%oAe!@o|xUD1Om?24gaW zoSw{{ykeIFFS_$Km-Ry0y$bobhxTF8PSdw|_}q)D!tPkQ^-^uJ1@lZ-uT+8JWpRzX4_uV+ugoO zY*WEnsRkY?D`7r~pU6!-+Nbt^qDrvRoA`9q)n9a0HL025@2b@|NZFr4^BHjNcs`@&v7?^7>FNPTuZ{dBe_2=! z{8Y+i&qf*i=j4aje~0m%VlzU2mq(vH9r|a`-xsOl1fHNyCGri^f01eZOL47x;V1nH zb(bp9x0DM`_;tNhp7&Pe%+>x>d|l$PzR$p41*exSz`16t#PtiB@&hx}!1cL_K6Kox z>u!7LyLlg@y$0G7yy!g0IJk2qp5On{>u%e`r#;Y>>G6Kdn;-cPgFEuls{HRuTe*R< zX{xH=dR03&!P;}0u?$^!Rq=GR?+iA%jWtE&4MkOEId&W&-V=GVkT=4*JDWY^dia$< zC-cyiAus>K;Lg9)$Qta;sl5C+xSZkF!^#Qp`K>bAOa#xOlSD;;vx(Ii{DOavw3(G` zGb5tg+&`hs_rR-1x7k15W+}L3!_)Jf7xIX6AJzB@a2tm6^Y3EpRU}ZBt?rb*&N+wP z6796x^l!8~_!((;!^2)*6B)B~yMq(jUB~F3SRNgTsya zDjF!uQtJ!&`P1vpqn|{SHiM1mw?_B%i1aloXEv`K{MX;&Cyc$|yS08J$Rs)*5xa?w zYTry{`Oc{s*Y5E)PYqAc6I&455}K>WX_8}*1upCBuZO4UIT+86emy^>j@SxwR^~9V z&U3^%L+lmY7*F;EvhS*WOL7eof9LJp#P^FIe;2yrX;+WAK9L|e;qV*_PY57@w>Oq z%vPTWFJm2a=aR%&;&Wa($QN7>)UqzhzEAYp@b%Zi8(1?dRDc*@r(W-`#s8LR+|1tj zk#NRCYJb6W`E=StPxQ$d#G>h<55*Y}k7k%VJ7&3gxtDrTHH(<_Q^Ea=9lRv|Qc*P< zUc2D+Re05o^Lo3FSF^=S>WhqGFTy*E_PGFx&8uxWFH;$=N7l zKUZvvuQT-4;`h#vl@VK+Gf^k3&k|KiTvbk7^|VE^QpZ(np$@RW2&9Xxx^vwAiVV^R zS;tu`b&Qpx27(e-%^~)_o|xew^|XwO#2*Js8RH*JbH{WVV=OUA5IwxXevq}EIPDqs z$$= zR`gOU`-^@zb_;duwHF_)4!nW?Jx9IS>J0XMI?M?*q?ORmoe^V>Ayq&N7dI3o>DI!JjuTD1Tn^O_#Q(a zM;Wuw{senT_LBo6>ioCj;U>o59qfJ1sBaxStzOdmu~7FYd!EDiHpYk8QF!OPQm*H? z&`McEmwjB96~E%nf7#PZ8NU!tA0NYixMwzQOjDkJl0F5ICkMGizqxvh4)+bS7nAdX zpp3;gcIkF9&|PS#RLgJ|csq>SA-%Ug+;=PONxATr zHiUnL;eXvY|4-_8qvad{;yfDMXuh?lNWiVZ^LSkIhnX#e4Ui%3Izf2T`rBBTU{V_KmUzq^TZeYRo0xWCeb<1YUG)d z&^fftSF(FUPN|xSK0?ui(a|Ad?9#dWv0uJCYkb?keP%!XaAjSi=>}vTISD-`QnsJ7 z59(>&gu7~h zYTb<5MEouIy@s#k#sA2eh~T@w`HY^kA>v_) zp@rw3Z@y;PmfL5cKTABO<%WmI?bdP6$cDc8Y}z_uVzh~MdUQL-zWGSnI?K}5`LwQc z_M44q>*S`D&7CXRhgYSo)0DQ3JBK5O^V8O;OgOO{fA#mTSxX26UXNZx}773U%M$? zI}(>qtg}bg89h8bZ5`Pw*>zkUd|ua){%5`Xx<1FZbzsYO%eeo0vQN$gotJ-Nd_bwn zH)Y*BAL*05fb4zjw)U7g=grq_Ro$!Y7oRa3dZFE8=7-RFb9O|Z6Cdsy(Pt8gpp2Jw zmXa^AO7Y997|T9B`IN;t#`AZ)?CvkU^+?9Ww#_x;{rDWbKHC@CQ_5OQD&d{Xum4Rx z!9Z~2>o4(qwKJbDj_>@L8sH2!H~hxf@V$cj3FX3j{<*Gz_&m;}*nf^>N*|7JCd|2% z_Ip9SPD#1Dwh0a8+E2|Y`BC7fV*@wv7F_;9H5wGZk_q3a)F~MWXc!q)!q3*@?g@JQ zfYIaVxE^;KJqqnaJ-*N9wJsGM?A;xbgCjd-{>v?dwWC2ZirV z@MXUc_H-&SCb1gNX-j!dE3i!SPTI*+ec^{bi9cVESE3?$e2pEN3ZV`5==Lg2d!PPH z&v<)x>h|71=6>u-uX<{qKLKd%XT#x_*ToZ`apLS+{z+PtM82 z&iUfISp)NWMb?lL*L!85lXB4sx{ICE_Wh)uld`^tzxBF%w!{1sIw>cf&@#$dli+0T z%JUW(Pj^l~s>`>1i?asG6X2y!Qcv={b7JPv?(x03?(?@E(e#X4K=#V_{1=b3u@C9Wq%E+uZ4_1@F7 z@Tnjss)kpLSh|v!TArKAScr~9pVhDA>wPV;^9}A?dt`jBvA+p!d*wCuJ1gWIJV$7g z=Tp=2_rKDpc}PEYKubGX_rh1&pnYuW?p}$3X7g@{;7jO-;Jx=Jq9z}T^6fpbEAm2@ zjok=c0r_F##~3`aRXmS<;6W+pd8g*%&2x`W33x9?5?;c?qw(4f%ky8(%%s03Us;tW zvKFIj(Md$z+AI9CRIxk{=o1?|{GW2ByicR$bIb^h?k>w5i_dLoCr&N(-TEZ%d*tZzS?C-Y9qC*z-h zzu1n{bNRcml*lM`O1}Nb`1vO10*1dE*SY79Zu|Y;eodcy??+dRrQYv~US+JYDV~GB zkn$W{>~p<2``D4?+I0c_uCnaC!Qhk6ww~iT--=OO6k^Og$`gqUq=KI1Q zzAz_ieqvf+z7tamb01}{*XlDMZ|^V9A-*TRo&7)eeG4n*1o&!X{;ckqfl&9HjD;n4 zt4zLRD*NPxv1njca6ur#y!5{lbS%@ASDq1~H{@~826#SqFv|QXVE)LNL5Q=0X7w!3 z-9*NRd*=6lmvgBGp7ZSNnIGIqTXIIVf_bw`=NCp+1Xim7zT~+mKPooB`Q*#8e~FX^ zWKEYblC>kWN2!O@D$YbkI1_nFpNaHmi0zfCX__a`BdPxq=OmtO=Q0Ko8*ny)z0T+j zv7eZq`y)-yK2ME}J%b$G1M*y!x2?m!85`KZ^Rk3e&5^5eXR44>9|#2#E`4rkU~H@& z`aghP-rZUOeJ%70b}Dt}f~)$kQlb9GnC+!c<#6W4IK@H(U4d&jyAz0~;=FAi=WT=Z zAu)d5_I~<6C9M~MpE2h=Zk?P1LC#9}R9i4dUB`W9@BHXrsOjY88FpyoM)+R$aA?~` zYX18d$Hra@|JT^aJdrJk456TwXMjj&XHdPXSE(OA9aM9AL;XdZXU#pp*x{p9fbqkZ zyfERM#CzU)Ji{G(vB?PI9A=z3-#X}>qsf?yjn41>E;<-N-@AH(Jl~riJ;L+mzf^PN z?1A%=Y06obLmy6<^(+*10+L6B-ca{PIMBRt?tDl3bO)=}O;2(51Ad>nR*&zT1B`tv zsAi7W7k!C+2rfs>>Mdsc=a(+X2+8w=NK@c$y$>!8h;2(hksZ5!o;B2c1}pQ?d++b8 za{DOnaLC-z?-p?WB7RVwg}cw!4)d((xr58-Yp7e+igLYHWWVY?XHo%q&h&^1%oVvB zRpx>ln2*iss&D|`vP5Og%~aDCWOLS+rLx0$JS&rDP8mFd`jVQ#bEHrA5wHelt8jk1 z%4QEebHRI*bA17^_%t;u`~@{j(=PR{t7sUtD{BkG#D52$M~+R^L9Z?_N^cdJ~@_aSHktS!RBekLXJi}yXy zUGh1VLtX`UmPsAv$ST=yN}J+$rM~oE=4KZC6P&znA-D+p@Dj!;3Qdz9pQm{LX8`{p z&l_&+oxmefs+^rWStFkcX77BG*yk0_Qa;hwz&>R*e&+nnhrvA^tbSPD@!gjr?ahXl ztYNZ8pT+&@Z$HEHbrn4J^`EfM=th?+c<$TN^5nT4#umKr?YunoYI&a24LJkm`Lz2C z*ps&cd6yY^Hz23TEPiM?^>fw0-^z10ukZ80iEUO|IG)dFoIJ_&)#qe=VXO|rBW%eeI+3=- zCv(<~zjIg{riDwXyPdjHHdD%YKS$<)`%I@?uf3618}-^JF;&y6&fhR6WX|wBC;9G* z_s&lLZ{4|72H&t*>x8#l663X-@+|XgB0^j8EJn&@j(T(zhEAS&{K8r@qnBAf+t5`Y zhh6{N8?JmgjK9~e$aT`-Wgqh^tG$s)==U3ZCH!sreuMY?r<^k>+G32g4;9}jKGgH8 zGS2P623$dacPCaxb9fFQ_MkFWM(5#AMCa|n4tx*$+?>LE-q#D3p|g1;6kxBEFF_C&1_`AvKi4J%F#?`I& z+(qJVukW&k=;t5!QdgEN`g|jO&J5F!sP40xe_$HxznpDX7@0?McIo)HJ(z``O1@Jg za?1F5?@r{tiMDl{w5^o$rrRC(FSpOJhjt>*3Ve^)@XkTe$1YP=P1$atjZU&F1mHF2ds)i^o2TN9{wrH>20igv!d0nBefiY*io5;@PIiHjU?- zc%K6@-)-M!%P4Yu#o}LP_&1=xCZoT9vh)`=!An{s!qyZX(tYF@#h!m;}3X_ z?CELbf~%)(RvRZR83s(b=yAstv~k#KV}s$5u-bUVYGawz#;z-9<7umn3%^c|x9G|q z?|m21#bXwaLxxAUH69_1#x4Ong1<1uK;Wz6?oK^yP4+GsL7_FHW{Yw5DWYGd#U+Q_%s$g+6I zc-Uk9>5Gi{^%jqjUnT8E=Ag~vcRUB0%-3XDJa$+-a+v=f58DrHu>6AfxQaJXC+AJn z89kru-{s0S_$KOXdlPlaOr3OVOT^+gnmsJ=3VbO2Y!~OpQph|U!{*( zrjIhV(yy$H=X+$lWd3>QI9^|6%w;ai_~~&R7+@XG>djKux%)fDGhaQCH`vX=N`f?}UVoDm@+| zzt9U`&4amcZp?kBTKXY>_v+fCODA%AxMkPJdjEAynX}DZed6bYHt`)dwvL&+yc;Vz zI`(r{N74`BEwQ_tfe1f|;oW`>9kkn%7}jf(_Vjzv%dWqBQ2Hn1XrIG)F?)lr9XVqX z8!RwmA#F+9a&{+ez1lrZ>mboRM@4B*^VYuO#$Kr-{!L`yjkg2I_L6&q^Z(}dYedh7 z7c}o;_GcyRv7}EWyw6k2yFgL(BEIj?LD{2;Ov{jiXN$eEUx_Am_bp>zBhL>)L-KAE zX9{C)3BQ|j9vLI0@}PU9hi&wrQXePP9>9J{*Y}p@^4AjT#r*L8mja>vThxc-Y}y%M z&z9L62wks2xeu$*{(E#EX^T2yXIl=;-~SZnk^9&$eW&+Thn+J?_NgIfS72e}`M{a6 zfw_U)l^qMCPY3>SY$OMH`$D-Zk!Ah?`ouo{Yxva{@vDdMHxu`LvUh*GdOmPIqckA& z9vyw}<7E2h{5od`mKks}^_9o-||9?%|P8l+C9xMB|gWmgZa*o2Y zi<|z$_|;tXH2cb|@b&!ih1mDlSXRFDG0J(4^fOcv!zb-iztiWjpBR*9bj)pq(m2N$ z)qjT^iVktUyNhSOi5#V#9Sk^`9ifs>AnT~MKmU7hXV1Da%6pz-;}^yF;mXAJY-r6seX}^T5fwvj|JDc-|Yt_o29e<8O>$bsr zq1697ql3xDPR=VX=2OK6Wc~2uo{W#^EB4PxA0=Z}qP~SsdWpD1{E_%9@k#uhgz-yJ z{8a(|s)4nl318MCz6rYxv3`e!M>ua4|MbrA3f@}~oroWDebBe?LDy&Syp#DPK4@c4 z1G-h})dNaB)kA*p56t^+qDR|DNq@voxohGI=rheZ(Ut?6R@MxwzxcskrS2td>+a_7C!GL)ETICykF+z{i9haDXY@RJ zRG-}(J>!mpdye$gACqyiJm2_F`Vh(;&^{u|^uhCUVowjLl?5{I-hv(c>zu(Dgq@vwZ75UE zF?RBf@-qizUWbUsXusE$&$aEOzMh6}d(T{audCC5%mr=BUR@bW_qkQ-c-mtu`i!GX z8E03Q1FBl=jprufr^N3HfAJ&PR^L3mN*}#Gz18TpO#Nk8uXV`p^+o>9O!@(wsO#u= z>C3CKo-pq69=i1Vc#18Ge~`0Tk<*sn)4%r|uHh$1{mYokJaT0XERubRE33TA`rRHP zo*bEf5An`C>ji&b_)4EUCYkwS58>R6{KnW*JXhQpOlUhBQSZ~XEPZ*_*z$LJ%J5AK zqnUxLa;Nj$&HXLyPKbk9`1wgif= zz~;v<;U6>nM`&O8OZ$JP`{lMDwc0;&1?|^P(tZa1+!H|e|3|KVj+!$QkAyX!O z7u|@hN=zkdv3=$ea#GLTmz%cpgZp%!d1hZAZ8cc@j#>PEh0TdfZVa`eWK6AyiX0M~ z30xTbxE5J>IEKf&ROT}LP4U>+BjJT5M~FwCCjCee=Pg@UvXb`*Mq^_$c1Fb~vG(Th z{y@Pr-mef`Ci6*M2;kew7?fSbvX{f}m!130iW4fjt1Og}SQQA}xGJC?Vr@&TA}(8{ z9A}j)6MqY5t{}D++BT}+t^80%ZrIL$(3ii@m;Zn-e~&L;?aNpB^6Py0yM6h!zWf?r z{w`m>(wATD%UAgFt9&bFL0|rAU;ZjzewHtv?aNR1<)``bS-yORFRy(0 zG2T6~{lV|Zdw#=%Yx$({%6s|jnEd9l`ypE8f(rL@8B3S0Y3pik+`iP=+_|Zm@7cUJ zufgGGo(l~u0&;M+E?(c((a_ww$*JGC)PW?grGxj3+>pJ7(V(9PpMhv@~o#sxbp{+H}j%amR&B_%^o#?i_ZCCV9dU-`wcz-nB(Z16NAsLUzP9Hy#9PonSG>cC zyrXV>3>(^3@(cfwt!>Q>3kn?huysw>%}YIL>nYpFhq{H0d@6K%=rZfO+85Tkx;s>z zPGen5XWWUnr4FCrYmL{-2lku?`38uyG49m2v~|WCZl(|E<)lhym($t4Z1r97&21gq z-D^FJLsj;)#kY0YPmvwhPTtU@qWaUzPB~%k<|LRGTByaX>4Tt z+S{62WgOw<4uijcp2<7TJ$z!E&wB7#R^2fMSUwTI)LFOu12Q>$dbxDH7?WvhbNoS9 zDSCcgF%S7j_QbZCz2;Nv+aq}mm~kVD-dwls7CO+@$wzH(k*}u5TRZU~ZLQSb+}t{8 zS-Gi$RV3>;G8Hg;{dqS>f0>S{&|Hw$e6tvO`Z{$D_iw>SP_@+V+|u68CmrJrRN#B_ zolVYWK9=C*b*3S(%4u;+JWca@ey!4T?jn4WsT+L2=JQem*(U;P4qACzVMguN^~czgcbHx}~@%+Sx93wr|-wexE|Vbg6uF z$3?Aly^YI2tkp20KHnCo*KUyysd-;KHGa6Ix%B~YBsZp^xl!6SY(>?OxlL8^E#hWI zbgNUesOU0iZoMSUt!xHFpL%UDese;5iyR}2!=lmD*5Eu?=gxt~HomVJ;_Yg`GL|xO zbsJl>tDKB09wSY?s(4qI^truGTx|!gy`yb2V;|qz+{Sw3s?)e%o>!#h@u9rV4=b1Q z7WugBwm2(Wl{a6FE;|VtWWh_~W6kv}{Bfs>#mX(6Shh+#%`|mIK#VGFT~l_cx_Z@i z*2#y)CdgLZv}H5jsc3GoTCio;GufN)cj1UU7FPetSuyInynv(`At)qh>ZP_k%+*Q}%&K%d=CebTSu!GfAHxap+z)3#N z?5rd_l38b_mzlCGu0(t=GW0}=RAy8m@HB7~cmb%M9vhoIO{v{L4s2C;-`H3sa1XEv7<`5&iog=!9$*7- z5ZD780UigQ0$u=~1BRdF4U6eYRRVK?{lH@2Ft7r68n^*C`%7bE?Z6nY2RH!SFXg}^ zz~cSz1&(}qZ0rr-QDATe_^-kbSTHy?wjS6GYzLP78GL|;frG%^2gb&Z0;_qu=QJ=p zG&aWJxC%ZuHZ~8K`{LMG8E`$Y7T6B#0`3EL1CIgs0@X`nW5d7*@EEWKcm{Y5m^G89 zdBbC44lwccv9VHM_`73cEx--HUBEZ~oPGgwj*g8T1`YyG0{4H9egS*_H}YUBXZ~Vr zY#A{7|M2z)Fbb5DqYB_QU^}n}*bN*24ge1Uhk-|d$APDSXMpE`r;m?~z;0j}a4)bDI0Wnm9s`~Lo&gsBHT|89K7qNwE?@z07+3*3 z3ETjjcLI5V%YZ$=1aLp_2=EB-H1H%a>jz_FXMq*KY+h<<0?q>t0!x6$fR(`D-(ZKp zC~ya`3%Cb33_JvU19)7@{}wrc4M24b_6y7f9s@>!>LhXki-EPk7_bYt2iOnn|2z5( z?D~870lWVJxvoWCATMyJ!Bf}^Fy|ks58MUZ0X*|V-kbvV{9numV96-s0E_|80h@qX zJcGIbbbyf`G0woDAJZ>j*J);vW0Y-o& zz*1l(a6PaV*beLhb_37TkNvC z{m;xZU=FYaSP9$(To2p>v@gWeSH?%zsf-=(%6R+L@6Znhc@0AC{!{d6%7w0g)NSE- zkA!DQ{Czt({>~5uUK3gWXl8%bV}U0#$V#1B(h15Ppj?9MB8^%&;nPhz3vM?MKGF40 zX7p!0n)z6Otd#F3)qa6-2l~rJ)}y53lnZYuucm(HqXBsrPn{-3o*b8Pyi8=_!Km6r zSw!x+1jipEt3BYPzj6sK0&d8n6TZv99RXJ+M6qj}SbwtL>nS^H(F>0jaB3ixZvtE{ zIIn%-yBk~qxO9AnD66*Uh3^q?O+LOS!6hs@;d>U`?lgR*EE`21rYy$2s=mfqZ~7u- zVam>>sh2}pDP_5=U%DRS-@?etc&!H?1K&fN=q9$o8c&gVo3zJzmd(9f4ygy+5IC); z*fpgU{nHy>%s3QyblPKCPx8c7XojGGX2qMk7w?tOk_F%JjPnM z!KI1BkV*F+ysV8wF1`eOKPWA4HvIQdw#zL`u|KIBp*)*)@T6NFseY8P?&l}b$(K=f zgt8I0%&F)PbjbvevRcZTzJz~r%S0C4rj+fVY~Fr+swtC>h&*A^9?H&AmYqcg{Z)t} zDj%I5du&?ulbQW99tSTxMxZ;!dRof8*kH9~gQqAvN14#cC3-&x?mW0+jd5{V@XBEg zwrwyMTm)RPJATrqcIlJwD5k8Gwc4hy09OsJO!!)JLE3JhYzJk#+_DtiB`7;h*=|$j z=|^lxVxbKOS##a8=mys#h#35>BKAXh2{FPx);etVTt-X(tVd@)mi_pQ-P1oi?Q>aA zW^DL;<`)9mCeA=R^iBM)%PWF^P>$S7JOq9~6d${0eWjREt=Q6&8IMs%`WuF(@>@wg zN}o!=#lY?1o_f*s{h3c@;BOqV)s!8h>7u|Q>i7TS4K-j8D~mHJ1LG70V&xFK-fxCm|(+z}t$ zd2mO4blJpfr+jqtz>WHFQE;byxH52Oe7N=C&RRGJSz5rI1Luur#p3~S)6*)X=ah?H z`M85R`d!v(?&)`=qCXRwM|ls4^_;TEYvX==yiEFel(JoviSFbQoW!C%;2c443GN)Y zJ>Z0&T!PCY*4*pE<$@akm#wK>*$Tkz23ICHpN&^gc6gGq2FgxTR%_~2_6KUcxs;$R z^5>~C?gm$E;Y8N`;7Y;y+ZOqcP}bz5KMAgD68iI$?e)=T)6xBD=%sD`&{Q2yQzmVf zQg*@OCAeyESx1w75*|(9g5c80zl*XGAN?M1Ws}e!qO8S7e-zxdN$5{gHsGVb08Zk1 zzdRyq4l(|TNy?&>y^*F&)}2bq!vD+oR_vpaK^A-i_|i1^9pE>l!S4pYEe(DU{O&aP zBjAU8co~ON;E#d#=7jX^9JmwUD!8|8SZHRm2T|V}Ut3FR`;AYcA5vaG`AN!8b5GqA zf9!y&q)f29iePc%Bru4Y@lt5Go_#F zDXV5b=k-%?E#TH$I4Mhj+W@Ygdx^VPXKBLaFMGS=lto<`BNdMZYNc-xNQWsq&AzbP z$lvZRc*zA&uY4|_)6kZ(*E=F@FmC8bLXAwZO*I?eO_}Z=eQ2O@kxTCv+4t=b8uae1 z%TiWMofDLua?7Il=oZndl*K69%|6iRE9%8bVm~dE&13I(dc0oNdf6(-V2XZZ?>S1j z@R3V!1K>{kaEHL1@!^hwJL|)p0(Z`bI|uH(g%cfQu?IccXUz$8AZ^Ruww=9bHurJ~ zE(%WCaRk97vX+6n0Ip0B*190{wUiC|cyxh_fOCYNOL%mHD+ZU2$3DuoQ6@T+OX!Ee zB_^RiLD_!F=&HV?kFw7m09PUy{hCxBHj_ZWvs*luun#8ko|+lm@0WFr|Sh z4NPfZN&{0Gn9{(M2BtJHrGY68Ole?B15+B9(!i7krZh06fhi44X<$kNQyQ4kz?252 zG%%%sDGf|%U`hj18ko|+lm@0WFr|Sh4NPfZN&{0Gn9{(M2BtJHrGY68Ole?B15+CK z|A7X^xMFd)qjEoB-3wN50<+{F-xY1kaBi5_~r08`99&{GyHgoh51Le%g7! z&yBxpwD@&HbBg4@T4wRLfTRl29+J)9qy6v5dkmfzNVOg_A3R4N%hJfj&l8ME67r+a z%u7QfWwr8;xlW;jd0qTnV+()B$B&{pf8>=Uq0M(MG#5UaEVJ)+T$Q21q-xS2DV<(~ zelq!O-Cs=p)9}ujEr0aqUKR9V52?S2zL0u0AtPfvOgc%r)Kz*JG{U3(nhdr3RoVjX z1MWu#xgWOfk8^+6;76_d^V}ab`0Vc_?;Y#D*t)Oa{)C}lZ{4?;d#_I-!|~7Zw{xH4 z&lpMGH3a@F_%d)|3oo)ABR}*%`P)qkFR~rp!`~<2y_IxkW`=q@Q2vhbZKU($M*FY`-& zr-h#~P~G#DnhvbEN~u}EmGI$K|Gj1=Fu@-r^D{Z>*nNC#MezLn`*lG1n@3o*i!AVI z4*=oQ4iG-=+kw<;-vt5n+TTH*dhNdh=91+4&DdC*)PK{L{$uGkUHi%_mZq(e(3(J& zQIvXyRB}BwOS-`QInsI3SyJM0e#_&F{GIMotVvHZ7Tli#e_G0(#K!mGcep=6I!-zT z&UqHU2Y&yTu+jbK|I7F(Qqxzc|5e5Zdz5Pgzb|WtqK%XIIq{W2aI#*NFo(p~9fs#9 z<)?P@XRHVC-EB%8`Uw0wsK1%NLGNT8q#t2Mu@vZ#f~4#%3>-WwkfVu#&E;Nvew2Lw zpI~eF{sz*H9rS@Vw|$I1$NnVp_3%3zq=8;&X(s_+`Kn+kG7OPQn0qmj_#yE*P2BGx ziJvKDo{0aDxf$VJ=57!ub2|ae1(Nt3@d2aUi;p-86dy7K6dzNt7oKLm$=vPdUgqWy zP|^R(x?Vv4&(j9!ILW(4xE~@77+k-B31GXquQgEW#JDddMM(}RNK&M8&%v8?oMc}k zv9wjvF{)px}nMA0YLU5~OxgElIAJ zfu+DG$sq*=M>=;9zNF(MxkiBUWjya1;J%-fAhjEOEigtZB}GXNNv@!Q3V4oj8NJ-G zajXA-^6wohS1xrTcdWVRW~X@3l11BY+0@pyiCBY zon2ctc2d+Pzm~5S#hYsMkL1@hHBiCJsYUXmoi%kG9d+B)BECV;?A_OQwRKRv!2o#Z zR`|Msv{bjbxt<%%c~curZtR4ZUvl3ZZzYHDi|V@giSLbD_|fFcSGlYuvd+l*fcw#@ zm<2-ea%Gt`2Pm|Hm$gVzDGP^f!W^mQ+gfS`Khh zMQCyRk diff --git a/3rdparty/lib/mips/libnative_camera_r4.2.0.so b/3rdparty/lib/mips/libnative_camera_r4.2.0.so index 33d7745ad8ff2a594e17d7fedc5eaab79e4ecd6b..b148d1621b338d46c08ff857ae4f03e4c6b4818f 100755 GIT binary patch literal 137852 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 literal 71916 zcmeIb4}4TtnKyninLwZ^9cZZ0QhTRN(kY}k2?0_>cOZWnYzk8nT5548A(@c0A(s_xpTuKOCNWp7WgNJm)#jdCqgry_x%WCFP|lDJjCbQboF8E*uh~0C3m* z6fx5!0tLblGlf@NBj(F;i(bMX;D4kvnMsl5XJ(}cEA5{x#O5o6n4!uYfWvcA#*-fn zGR*|ui4=G8z`p_fXF!;VxCZIp6wz_OH<8{A9Iw}qmLh!- z=^WAxz{db{k%CCekbfW2A92s?UyON1=K7@Q4?kkY~7w&(e$_YLSTpi#8fV+{t zjQa~Lz;zhuuaW)(>F-c>JD_#F3;7vH$AI_<(w~sNh4c_`w;;WM`;P(s7vLL6*7X2x zvVkuK+zB`cmw!_U|5t=l`$hZ~T&)NR2l7Cg4^gZ3DhmE4vT( zTeSS&Y4_IcZguk^)VHn{>qfz1l=*R=fmE&0vG`p`i-EfhX%p@vw(|RszZLicNcSLF z*I(P{N|66B3jZD{g!B(c2a&=W-Ho{K1CG}Yqz%Y#QROuXz6Wp}%HE4~9qzvl*oI_X zjleyQ%-4`!MQTUdkJN*-P4RdP_tw>k8>f{4Tn?K5qw@CyhLB$c=mxAqdKve5NKYWG zM7k9?>v}hCUbHecIEs7@Xg>>>4*0(T7b3N(`Uc<%(NWu}0$P(BywN~8y;ptTq8vLjU94fqk&FP$U^ z+*LqqRLI4En}E9w@RLaEZFLG1-Cn?YBp=G1islhjmJBe4=9LPMoQnb8#RXhmzlzO7 zqkZ2pZNiPn_dn9G=H6?L_YI(51>^Q&;$(q-9`e6N)hsN8oLelfSO$NI;K+r%8&T@Z zSTM@r$T~pB@?zxc?=#m)=AXvG-~~Nxko3QVVf7+tNmu!+(Eci|{o!j6<8_#RhV@@t z1mBN9ls=2~pU)NIbdRYI%9jED2T*SDzwrjdahm)eK)GLQe`q26A0|T;__6-$sgSk7 zjN91Wzr%3OLSOV1b3ySgz;L&zzpKTsVkwZP0Q#fNP=DWqfgeYIEcrN2=_&}H3#&?l zft5F#bC>)Vqkb9c&sX(7jm6FhXIYFq<$2qUzG?E$%trq;`H#$j9qcsyIO#tGebs)# zjKP@yKKeU`{uzqjOe{z@bz6X5@bs{b{N=Q(XW zf3pzsX!`M?y&mYp(*IW>e-!dt`Hw>%5pBGSQQnL3u#^(!8*aGaui*oA! zS;*TCc`>ZgKK~o?)ob?k*iAwVY4-XjI7{b2bI;BCk1xe|qW=pNzc*2TK$G_d59Ye2 zzxQB#PHXx-gnFCm%=nh$F$BT-J`Z`+_?^J~EY$e@3-qx{)Bi^B?*sp0)&4c;&!{Hv z4>5lATK$<=2#u%AeHG>3hyE0NF5aIlpx^U&oZs)UX!Q2Q?dK5mIjr)O_YCYQaDRM0 z>_Y#KYwdjq6SoTUJ0SHtN3=k`^O}5hS70pK(0`{n9zVtWDgT1GhEl#iV*U=n-Z@@u z?^^UfqT37FFNQsDR^_*Xuo2^9jmMABzk^!;4#M91dgJ|{zdY`*aB>i9fgFb#;`aAt z=*#!Cxt36#A3>gW$OE&M^4yH^8PojF<}0CJ44#4Vxv;8@ARK{xq$~P8(BE+cd8d&l zzX;?VfxL`Wn7VFk9`MpTU@A zk3$~VvNm3;L7%=qZciUW|3=V147=>#JlMmkho`?QMFn(Yw z$FCRj(e-%Tp0CCH8r9nSF$i-}Zm9O2v5ntt7{7MNQ>MyYvtbXIucuW0pD@3>wf=lJ z9lZ9N=L(eX3h?jM?7I{C(e3}=uEAJ!fF46a`E$XqO5^u}1LIk5o(r&i2kb}pm)jvn zK=XecDEGs@GL(Ef!EcAguOIDaY2(v41Nw$PX#_pT>l+xT5l!EJ#(30g@xY%zKL~x( zJ}J*3v{#Py3RQc?^2GSB5P99+j${6ZG5@m^J>0oC$Ac(ba}j~JVZ8Ntsq1F=2W|dc zg}fj3>jb?U7Vs~CRp|c?K*|%we9_m7-=@MJX!iUW^e=oU-hNe1VtjH0Pyh+eytI{}B3EaLkPF8Lxc={<;eG2(y*;_}go6{@H2zFUtG7 zD`B7Tcbp&ecfIJ?8Te1AUG`@s`g`%A<6|iUBzrPKC=7K$-+j9Ir1^wyq+*i?_3-VJww)ZF4kN>0b@z1x7?-Q6G zeJ#*A=-Iyy?`1N4^mwzShzde|rwU5Wgqt*xdFPdj<>`yA{k81Tlg!;W-j;}x8 zgM0?$o2TUSXJ9RZJ~NT0KDS{0^ldfwjFjh}QSL`M*Eg2`5aV+I^{-a-_d}lJkf#`V zwm$}a=>9Qx31oW;JgsunUjTmswo-p@qWlfWON(YazYP5u(c~Y&_`2?m`|H2Y#oST$ zO!^;SLY&g*%fW|d`@H62$65>fx`6SusjMu&(`-I_nX z2aNUgX(h@BH2JeVS9glwRz9~N&2xHFy31ElQ#aY zcVm8OrQsHE1KC!eb7=VLqWlMKq0#>V^KERvtikd42K>#amT$oP8`1Iy!E{*5e`zN4 zspWggL|tq@3;*?KlEFXfL3Zx7+Ne&;|W! zxfAT%1F8Du+#QS+@t}g25@37uk7xPOIA6ggl^KJEGw){`vkFAUR z|NdGlXSNr$l|O6CAG7gGHRAQzzG0JRqb(m?5T|GR|72^w!p8q?8~yui`9)Yytc&gU z+w_xR)87%pqBhshw{7_$8~=N4^^e=~oi_Rp+W7t0CeKb=`B!cF3EBGdx3==7HhrzP zjZeVV-n};Z&)Vewqpe&7Z!KTHW_5XReQ9Y$NoBBd^_udMpa^aa2WuNz!y*{0*-;&= zYiO!&Z1|fHvZZU+tqrc;uwnJxL68NDD%Woamana-lsS}DYK5#?9SQAdh=8(Kr~L4` zd|y#>Q)}C{P)m73Yb4YZYN?2{ZOL2S+*I09y)CqQdv!x&^_Ip^$#xN(lzK&T)0(!r zx=>5&hEQXux;0d5lHazXx~aCMxuG^MzoNM%5~{s3R1;}#S-Y+xn791C(9YoY>c+NE zFkIcx5{wYLq9W4L(6qI%q#{39Qc{xVt8EU}G;a%6w}eUpw{5Rj9u%#SmYQu)$cNYc zkGU@c_ifGFL&3V{mIta^YD)s!(a61GTWA~6e~~tpTWxHquDMTdHLhx=4H&#b1 z!NJqgxTVRWypj#KRrp{d|8s?{kfRaasWtaM9s`bWZ3u(fOt$w@OnVoK^Zr8ClrQCP zLSt<;)LGKjpfH+x<#u1NDK9@bE=^vZY2tUZh1x=S%k8tq64Da>(#R|Cyj1=r37Xju zs#}9;R-FINWc8T}y;NCE^4i8ga>W!B!BMnSTmEB$CX$!yUAIxNuM_oeBPzCcB6;~Z zpX83t6855{l|{*meV1$<2|Y^A%<9j@OUH-oojFv?U^KIPXN(feG0&&``nGUm-cl@5 z4XyRT?b6lT3~hPBG5~TVP<$4=GjS~C{ZG}SJWbwG)1=F=d^LtzmNzv=8tQhIG&D3| z0aZ&{u(5e-FpSj-i|U8h*=ppi2sgJzimM~ll?~hA-Kw{ROLjDDxNW?j`K@8BcfR0? zwYP`1HMi`c2n_z_3h2Ip>=KBN&=9gK?!W9E39d3ZVj33VD)Lj z{7Rf%N`}0=)<|1bi5lnDtQRB);GO7g_ET!5C${Dam%bIG*>c}SKaL79JB6=`3!FFhDYnx1yyr_{a z1!o$rWN6b?-m<#J>ehN%R_i)wp*7KEPiQoM84b2#V<518LuE;Eu(W)2MOpCn^~K6; zFV;b6>f`iDt$bM>XU{vAMoy&5kY=1dnKb$N57akALTjoUIh8M6s1=DSx~pt$Wl0db zHcsv-)SD;kPOM=Ywfwy5rbxpUtTFJ;moAuX>{hRY_*aBPbYI0+?+O#Mph^)2;MYhKESkM-UatOx5P+K)CaG3->nH1F(+|^+W zbVoAoyBnHpzPln)fJkLKR0E$5!wPP}=3#A3MfKVmY_eBCMV5ksTcEW2O1Lv>dO+@v zCTKKIBQM!Nnumhb?e22bN_8?i1l z0mz;Jw(i`9|E1ltQg*Ozjc0mb2Ri51ou6Ne5s(WcIFI}3rCIqb78&=<565O!5a>|}BElA|> zp+L#4!OF6Yx35{ZdTsfobs;a2MM-ICNzv3wv#lBxMJ4M>E@{QjUttEeT#tiA>#^Fb z+qfQq?wxCkOV*b#IB!yCbdwKR-tu@@RNCCKji*?quNbeRpSWPIZ_)QDdAF>+wWT^- z-%w*7%dDoiH+NB$cP8IM>r*!Icm_Kr^9(fZF2;96J{(m7op3~IwliV=uZZ`kGPEPo zhC|B)k(aHlXltpft_fMCi9v&!bop|2o8db{Y#tnzHdb$KP26%=Q#2p@krpc^g}a#G z`{W92^S^n^s>9*NohtBcKyVlcRLIq2T=^5W>hQ<+-YaCige4xeWfK*x`93TSJg#kv zgn~`bKv2f=<}%WH3)hV>94gLPu`4r=Br8mGYiq;SCJk*DH&2G$R+OGFkV+46FO^rw z$uK?-rT>`1DVniw$)>>i3i_*}^|uE~)>W*oT)Tdqv}P=57jH8^FR*q~Njdg=^j5*U zH{My0pI;G}s@Wv9d{fu*C24Ez6iwybl2B>Gt!tJoUp7^p6$y3dmt>9cRbt`_katUb zeJ2`Q=tvy|EHbQHvLnh*X%cGYDQnmHb;0s}z;5-&lNiuz2;|iLvxdLpm(Q^G>P(-ZhZRSsfmTnWtrX zm8A(KihNlcZ41xc9++6cUN%`3_23*b+iPguDZmRbleA+iQq9<~ac$+<{F_!VvHK{*Legp; z7>-4m=!u9Wt$l7# zQ4^7*oG|q)#z_k#Z{1s1)CsO)TngPn$0_Yd^3?sWMQF#7&b9_vq)E`Ewy#STc@li0 zy~n3~VzgmBDFW|_!n_KW)a;h5eF%`j@`nIO~tcP{YEi$H)8}N&@1us^CHz7iJ z(KdwlY|WSur^XTWP5_4|7&IeHlXsyMlt*{w7%SI~QrbAW^R+_im7{Q<$b=mldNQ#0j=!d=Z`;D|s$I6(NPJ4^@ZFlk!PB za|_5?LUj#z;l?~omv%f+xcGxy^U3T*ZBSZNQ|N&SW`S5c(Wv=Mfe%G7wwGk4IFU`p zbgDVQ(dAp=Y_37R=w3UeaW6OPl#EME1~u6BL_*^zh}{|v)il&KV9i$c4-v<4Q^_^a zLhcRV`Owll+r+j{uPKGc+X+eR1;# z?q7i61SM%R&(^whP8ahdc?k=#TKI39B8V)g!FpmIB}_r7c18>@#zRmGH&s=&x0s5| zl)19vk|N)=mqw+FOPfkiNb(qX5}hO`PNsrMD3fSm63V2CNKQ+aink4P)n0^<$57*= zXHKzrKE7?#aF!kE6+`zkK9unv&!xs0Hu3R(68!QlA^btnc%j_5VjHZnb>{1;Tk&^JA@er41)CumQlJ#~C}_glsuInB1melSB*+Gusv`~f zvnF*o*;241e~FLm{d9!TOmB`V=fsuu{QI3hq)cs^A_4+ZF6kuus7O1^F91 zZ0Cf6BMP2Wa7@8-3TEOr1W2EyAb$ga`2q#~3KlC^reL{(0R<}++@#=U1)~b`xB1Ao zPeJ~60rN)`98{3MAx8YLg2xo(Z{ZPtLctLQPbzpy!8a5fRq(WeXB6abK9J9tg69-G zuiym*`6Jb&<8RgxrYo4CAb&fM_)G<}6y$G&5N{~xQINl_MtrVFa z72KrYW(BJhY*a9;U_`+k3hq&`UBM0oyA?dBV2^@_6zo;-h=PL(4k)U$B*P@64v53<_YoRwLU`paBVy5Z^iHFupRu!tfAlu1xFP0usxJ}70gxew1Q_8 zJgZouf^Lkc>HN4`qIK?M!APdw$hH${{a-iLMw8}YkVgxk<>!lo2)ko5Q=_jq#F;5j&V~OA&hr@x$@8#N!9VJDA50&^Hp|$Gy7=@ni0r zDKCC#yidUl%87ivg2M`WNe_Gv;jR?1iS+mp@m>YfNr!x`f