From 63a5587d0dc2a87e7ba1acb0dae270f147dc6f06 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Thu, 21 Mar 2013 17:00:08 +0400 Subject: [PATCH 01/31] exploring possible bug in optimize_linear_svm --- modules/ml/src/svm.cpp | 4 ++-- modules/ml/test/test_mltests2.cpp | 4 ++++ modules/ml/test/test_save_load.cpp | 28 ++++++++++++++-------------- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/modules/ml/src/svm.cpp b/modules/ml/src/svm.cpp index 3c970f201a..f71730a81c 100644 --- a/modules/ml/src/svm.cpp +++ b/modules/ml/src/svm.cpp @@ -1562,14 +1562,14 @@ void CvSVM::optimize_linear_svm() int j, k, sv_count = df[i].sv_count; for( j = 0; j < sv_count; j++ ) { - const float* src = class_count > 1 ? sv[df[i].sv_index[j]] : sv[j]; + const float* src = class_count > 1 && df[i].sv_index ? sv[df[i].sv_index[j]] : sv[j]; double a = df[i].alpha[j]; for( k = 0; k < var_count; k++ ) dst[k] = (float)(dst[k] + src[k]*a); } df[i].sv_count = 1; df[i].alpha[0] = 1.; - if( class_count > 1 ) + if( class_count > 1 && df[i].sv_index ) df[i].sv_index[0] = i; } diff --git a/modules/ml/test/test_mltests2.cpp b/modules/ml/test/test_mltests2.cpp index 80776b4ced..0e7892c510 100644 --- a/modules/ml/test/test_mltests2.cpp +++ b/modules/ml/test/test_mltests2.cpp @@ -769,7 +769,11 @@ void CV_MLBaseTest::load( const char* filename ) else if( !modelName.compare(CV_KNEAREST) ) knearest->load( filename ); else if( !modelName.compare(CV_SVM) ) + { + delete svm; + svm = new CvSVM; svm->load( filename ); + } else if( !modelName.compare(CV_ANN) ) ann->load( filename ); else if( !modelName.compare(CV_DTREE) ) diff --git a/modules/ml/test/test_save_load.cpp b/modules/ml/test/test_save_load.cpp index 889b98b62b..fde5410ca2 100644 --- a/modules/ml/test/test_save_load.cpp +++ b/modules/ml/test/test_save_load.cpp @@ -64,11 +64,11 @@ int CV_SLMLTest::run_test_case( int testCaseIdx ) if( code == cvtest::TS::OK ) { get_error( testCaseIdx, CV_TEST_ERROR, &test_resps1 ); - fname1 = tempfile(".yml.gz"); + fname1 = tempfile(".yml"); save( fname1.c_str() ); load( fname1.c_str() ); get_error( testCaseIdx, CV_TEST_ERROR, &test_resps2 ); - fname2 = tempfile(".yml.gz"); + fname2 = tempfile(".yml"); save( fname2.c_str() ); } else @@ -84,30 +84,30 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx ) // 1. compare files ifstream f1( fname1.c_str() ), f2( fname2.c_str() ); string s1, s2; - int lineIdx = 0; + int lineIdx = 1; CV_Assert( f1.is_open() && f2.is_open() ); for( ; !f1.eof() && !f2.eof(); lineIdx++ ) { getline( f1, s1 ); getline( f2, s2 ); - if( s1.compare(s2) ) + if( s1.compare(s2) != 0 ) { - ts->printf( cvtest::TS::LOG, "first and second saved files differ in %n-line; first %n line: %s; second %n-line: %s", - lineIdx, lineIdx, s1.c_str(), lineIdx, s2.c_str() ); + ts->printf( cvtest::TS::LOG, + "in test case %d first (%s) and second (%s) saved files differ in %d-th line:\n%s\n\tvs\n%s\n", + testCaseIdx, fname1.c_str(), fname2.c_str(), + lineIdx, s1.empty() ? "" : s1.c_str(), s2.empty() ? "" : s2.c_str() ); code = cvtest::TS::FAIL_INVALID_OUTPUT; + break; } } - if( !f1.eof() || !f2.eof() ) - { - ts->printf( cvtest::TS::LOG, "in test case %d first and second saved files differ in %n-line; first %n line: %s; second %n-line: %s", - testCaseIdx, lineIdx, lineIdx, s1.c_str(), lineIdx, s2.c_str() ); - code = cvtest::TS::FAIL_INVALID_OUTPUT; - } f1.close(); f2.close(); // delete temporary files - remove( fname1.c_str() ); - remove( fname2.c_str() ); + if( code == cvtest::TS::OK ) + { + remove( fname1.c_str() ); + remove( fname2.c_str() ); + } // 2. compare responses CV_Assert( test_resps1.size() == test_resps2.size() ); From 4331f76d188251a4edbf26862b877e9c0a41ce0e Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Thu, 21 Mar 2013 19:17:59 +0400 Subject: [PATCH 02/31] add hack to disable optimization of linear svms; improved precision of optimize_linear_svm; add the relevant test, which however requires some big database (so it's disabled by default) --- modules/ml/src/svm.cpp | 11 ++++++++--- modules/ml/test/test_save_load.cpp | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/modules/ml/src/svm.cpp b/modules/ml/src/svm.cpp index f71730a81c..3905f57b50 100644 --- a/modules/ml/src/svm.cpp +++ b/modules/ml/src/svm.cpp @@ -1551,6 +1551,8 @@ void CvSVM::optimize_linear_svm() return; int var_count = get_var_count(); + cv::AutoBuffer vbuf; + double* v = vbuf; int sample_size = (int)(var_count*sizeof(sv[0][0])); float** new_sv = (float**)cvMemStorageAlloc(storage, df_count*sizeof(new_sv[0])); @@ -1558,15 +1560,17 @@ void CvSVM::optimize_linear_svm() { new_sv[i] = (float*)cvMemStorageAlloc(storage, sample_size); float* dst = new_sv[i]; - memset(dst, 0, sample_size); + memset(v, 0, var_count*sizeof(v[0])); int j, k, sv_count = df[i].sv_count; for( j = 0; j < sv_count; j++ ) { const float* src = class_count > 1 && df[i].sv_index ? sv[df[i].sv_index[j]] : sv[j]; double a = df[i].alpha[j]; for( k = 0; k < var_count; k++ ) - dst[k] = (float)(dst[k] + src[k]*a); + v[k] += src[k]*a; } + for( k = 0; k < var_count; k++ ) + dst[k] = (float)v[k]; df[i].sv_count = 1; df[i].alpha[0] = 1.; if( class_count > 1 && df[i].sv_index ) @@ -2570,7 +2574,8 @@ void CvSVM::read( CvFileStorage* fs, CvFileNode* svm_node ) CV_NEXT_SEQ_ELEM( df_node->data.seq->elem_size, reader ); } - optimize_linear_svm(); + if( cvReadIntByName(fs, svm_node, "optimize_linear", 1) != 0 ) + optimize_linear_svm(); create_kernel(); __END__; diff --git a/modules/ml/test/test_save_load.cpp b/modules/ml/test/test_save_load.cpp index fde5410ca2..6ce54a9edc 100644 --- a/modules/ml/test/test_save_load.cpp +++ b/modules/ml/test/test_save_load.cpp @@ -133,4 +133,32 @@ TEST(ML_Boost, save_load) { CV_SLMLTest test( CV_BOOST ); test.safe_run(); } TEST(ML_RTrees, save_load) { CV_SLMLTest test( CV_RTREES ); test.safe_run(); } TEST(ML_ERTrees, save_load) { CV_SLMLTest test( CV_ERTREES ); test.safe_run(); } + +TEST(DISABLED_ML_SVM, linear_save_load) +{ + CvSVM svm1, svm2, svm3; + svm1.load("SVM45_X_38-1.xml"); + svm2.load("SVM45_X_38-2.xml"); + string tname = tempfile("a.xml"); + svm2.save(tname.c_str()); + svm3.load(tname.c_str()); + + ASSERT_EQ(svm1.get_var_count(), svm2.get_var_count()); + ASSERT_EQ(svm1.get_var_count(), svm3.get_var_count()); + + int m = 10000, n = svm1.get_var_count(); + Mat samples(m, n, CV_32F), r1, r2, r3; + randu(samples, 0., 1.); + + svm1.predict(samples, r1); + svm2.predict(samples, r2); + svm3.predict(samples, r3); + + double eps = 1e-4; + EXPECT_LE(norm(r1, r2, NORM_INF), eps); + EXPECT_LE(norm(r1, r3, NORM_INF), eps); + + remove(tname.c_str()); +} + /* End of file. */ From e01335bf47df2ba82de6b08b875d70c25e90dcf6 Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Fri, 22 Mar 2013 01:53:41 +0400 Subject: [PATCH 03/31] fixed buffer size and restored the use of compressed files in ml's load_save tests. --- modules/ml/src/svm.cpp | 5 +-- modules/ml/test/test_save_load.cpp | 59 ++++++++++++++++++++---------- 2 files changed, 42 insertions(+), 22 deletions(-) diff --git a/modules/ml/src/svm.cpp b/modules/ml/src/svm.cpp index 3905f57b50..9752848b9a 100644 --- a/modules/ml/src/svm.cpp +++ b/modules/ml/src/svm.cpp @@ -1551,14 +1551,13 @@ void CvSVM::optimize_linear_svm() return; int var_count = get_var_count(); - cv::AutoBuffer vbuf; + cv::AutoBuffer vbuf(var_count); double* v = vbuf; - int sample_size = (int)(var_count*sizeof(sv[0][0])); float** new_sv = (float**)cvMemStorageAlloc(storage, df_count*sizeof(new_sv[0])); for( i = 0; i < df_count; i++ ) { - new_sv[i] = (float*)cvMemStorageAlloc(storage, sample_size); + new_sv[i] = (float*)cvMemStorageAlloc(storage, var_count*sizeof(new_sv[i][0])); float* dst = new_sv[i]; memset(v, 0, var_count*sizeof(v[0])); int j, k, sv_count = df[i].sv_count; diff --git a/modules/ml/test/test_save_load.cpp b/modules/ml/test/test_save_load.cpp index 6ce54a9edc..9fd31b9f24 100644 --- a/modules/ml/test/test_save_load.cpp +++ b/modules/ml/test/test_save_load.cpp @@ -64,11 +64,11 @@ int CV_SLMLTest::run_test_case( int testCaseIdx ) if( code == cvtest::TS::OK ) { get_error( testCaseIdx, CV_TEST_ERROR, &test_resps1 ); - fname1 = tempfile(".yml"); + fname1 = tempfile(".yml.gz"); save( fname1.c_str() ); load( fname1.c_str() ); get_error( testCaseIdx, CV_TEST_ERROR, &test_resps2 ); - fname2 = tempfile(".yml"); + fname2 = tempfile(".yml.gz"); save( fname2.c_str() ); } else @@ -82,28 +82,49 @@ int CV_SLMLTest::validate_test_results( int testCaseIdx ) int code = cvtest::TS::OK; // 1. compare files - ifstream f1( fname1.c_str() ), f2( fname2.c_str() ); - string s1, s2; - int lineIdx = 1; - CV_Assert( f1.is_open() && f2.is_open() ); - for( ; !f1.eof() && !f2.eof(); lineIdx++ ) + FILE *fs1 = fopen(fname1.c_str(), "rb"), *fs2 = fopen(fname2.c_str(), "rb"); + size_t sz1 = 0, sz2 = 0; + if( !fs1 || !fs2 ) + code = cvtest::TS::FAIL_MISSING_TEST_DATA; + if( code >= 0 ) { - getline( f1, s1 ); - getline( f2, s2 ); - if( s1.compare(s2) != 0 ) + fseek(fs1, 0, SEEK_END); fseek(fs2, 0, SEEK_END); + sz1 = ftell(fs1); + sz2 = ftell(fs2); + fseek(fs1, 0, SEEK_SET); fseek(fs2, 0, SEEK_SET); + } + + if( sz1 != sz2 ) + code = cvtest::TS::FAIL_INVALID_OUTPUT; + + if( code >= 0 ) + { + const int BUFSZ = 1024; + uchar buf1[BUFSZ], buf2[BUFSZ]; + for( size_t pos = 0; pos < sz1; ) { - ts->printf( cvtest::TS::LOG, - "in test case %d first (%s) and second (%s) saved files differ in %d-th line:\n%s\n\tvs\n%s\n", - testCaseIdx, fname1.c_str(), fname2.c_str(), - lineIdx, s1.empty() ? "" : s1.c_str(), s2.empty() ? "" : s2.c_str() ); - code = cvtest::TS::FAIL_INVALID_OUTPUT; - break; + size_t r1 = fread(buf1, 1, BUFSZ, fs1); + size_t r2 = fread(buf2, 1, BUFSZ, fs2); + if( r1 != r2 || memcmp(buf1, buf2, r1) != 0 ) + { + ts->printf( cvtest::TS::LOG, + "in test case %d first (%s) and second (%s) saved files differ in %d-th kb\n", + testCaseIdx, fname1.c_str(), fname2.c_str(), + (int)pos ); + code = cvtest::TS::FAIL_INVALID_OUTPUT; + break; + } + pos += r1; } } - f1.close(); - f2.close(); + + if(fs1) + fclose(fs1); + if(fs2) + fclose(fs2); + // delete temporary files - if( code == cvtest::TS::OK ) + if( code >= 0 ) { remove( fname1.c_str() ); remove( fname2.c_str() ); From 3ef2e1136f39dfbffedccba2c1a633bcd7171434 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Fri, 22 Mar 2013 10:20:50 +0400 Subject: [PATCH 04/31] fixed nonfree compilation with gpu (perf tests) --- modules/nonfree/perf/perf_gpu.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/nonfree/perf/perf_gpu.cpp b/modules/nonfree/perf/perf_gpu.cpp index c00955c894..e7ce630369 100644 --- a/modules/nonfree/perf/perf_gpu.cpp +++ b/modules/nonfree/perf/perf_gpu.cpp @@ -1,4 +1,5 @@ #include "perf_precomp.hpp" +#include "opencv2/ts/gpu_perf.hpp" using namespace std; using namespace testing; From f0b19d4659045b00c55f849187cd657b21a13e5d Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Thu, 21 Mar 2013 13:31:51 +0400 Subject: [PATCH 05/31] updated license header in whole gpu module --- .../include/opencv2/core/cuda_devptrs.hpp | 2 +- .../core/include/opencv2/core/devmem2d.hpp | 2 +- modules/core/include/opencv2/core/gpumat.hpp | 2 +- .../include/opencv2/core/opengl_interop.hpp | 2 +- .../core/opengl_interop_deprecated.hpp | 2 +- modules/core/src/cuda/matrix_operations.cu | 1 - modules/core/src/gl_core_3_1.cpp | 42 +++++++++++++++ modules/core/src/gl_core_3_1.hpp | 42 +++++++++++++++ .../core/src/opengl_interop_deprecated.cpp | 1 - .../opencv2/gpu/device/border_interpolate.hpp | 2 +- .../gpu/include/opencv2/gpu/device/color.hpp | 2 +- .../opencv2/gpu/device/datamov_utils.hpp | 2 +- .../gpu/device/detail/color_detail.hpp | 2 +- .../include/opencv2/gpu/device/emulation.hpp | 2 +- .../include/opencv2/gpu/device/funcattrib.hpp | 3 +- .../opencv2/gpu/device/simd_functions.hpp | 1 - .../opencv2/gpu/device/warp_reduce.hpp | 5 +- modules/gpu/include/opencv2/gpu/devmem2d.hpp | 2 +- modules/gpu/include/opencv2/gpu/gpu.hpp | 2 +- modules/gpu/include/opencv2/gpu/gpumat.hpp | 2 +- .../include/opencv2/gpu/stream_accessor.hpp | 4 +- modules/gpu/perf/perf_calib3d.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_core.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_denoising.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_features2d.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_filters.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_imgproc.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_labeling.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_main.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_matop.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_objdetect.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_precomp.cpp | 42 +++++++++++++++ modules/gpu/perf/perf_precomp.hpp | 42 +++++++++++++++ modules/gpu/perf/perf_video.cpp | 42 +++++++++++++++ modules/gpu/perf4au/main.cpp | 42 +++++++++++++++ modules/gpu/src/arithm.cpp | 4 +- modules/gpu/src/bilateral_filter.cpp | 2 +- modules/gpu/src/blend.cpp | 4 +- modules/gpu/src/brute_force_matcher.cpp | 4 +- modules/gpu/src/cascadeclassifier.cpp | 4 +- modules/gpu/src/cu_safe_call.cpp | 2 +- modules/gpu/src/cu_safe_call.h | 2 +- modules/gpu/src/cuda/NV12ToARGB.cu | 19 ++----- modules/gpu/src/cuda/bf_knnmatch.cu | 2 +- modules/gpu/src/cuda/bf_match.cu | 2 +- modules/gpu/src/cuda/bf_radius_match.cu | 2 +- modules/gpu/src/cuda/bgfg_gmg.cu | 4 +- modules/gpu/src/cuda/bgfg_mog.cu | 2 +- modules/gpu/src/cuda/bilateral_filter.cu | 5 +- modules/gpu/src/cuda/blend.cu | 4 +- modules/gpu/src/cuda/ccomponetns.cu | 29 +++++----- modules/gpu/src/cuda/column_filter.0.cu | 1 - modules/gpu/src/cuda/column_filter.1.cu | 1 - modules/gpu/src/cuda/column_filter.10.cu | 1 - modules/gpu/src/cuda/column_filter.11.cu | 1 - modules/gpu/src/cuda/column_filter.12.cu | 1 - modules/gpu/src/cuda/column_filter.13.cu | 1 - modules/gpu/src/cuda/column_filter.14.cu | 1 - modules/gpu/src/cuda/column_filter.2.cu | 1 - modules/gpu/src/cuda/column_filter.3.cu | 1 - modules/gpu/src/cuda/column_filter.4.cu | 1 - modules/gpu/src/cuda/column_filter.5.cu | 1 - modules/gpu/src/cuda/column_filter.6.cu | 1 - modules/gpu/src/cuda/column_filter.7.cu | 1 - modules/gpu/src/cuda/column_filter.8.cu | 1 - modules/gpu/src/cuda/column_filter.9.cu | 1 - modules/gpu/src/cuda/column_filter.h | 1 - modules/gpu/src/cuda/copy_make_border.cu | 2 +- modules/gpu/src/cuda/disp_bilateral_filter.cu | 2 +- modules/gpu/src/cuda/fast.cu | 7 +-- modules/gpu/src/cuda/fgd_bgfg.cu | 2 +- modules/gpu/src/cuda/fgd_bgfg_common.hpp | 42 +++++++++++++++ modules/gpu/src/cuda/gftt.cu | 5 -- modules/gpu/src/cuda/global_motion.cu | 3 +- modules/gpu/src/cuda/hist.cu | 3 +- modules/gpu/src/cuda/hough.cu | 2 +- modules/gpu/src/cuda/integral_image.cu | 4 +- modules/gpu/src/cuda/lbp.cu | 2 +- modules/gpu/src/cuda/lbp.hpp | 4 +- modules/gpu/src/cuda/match_template.cu | 2 +- modules/gpu/src/cuda/nlm.cu | 3 +- modules/gpu/src/cuda/optflowbm.cu | 2 +- .../gpu/src/cuda/optical_flow_farneback.cu | 2 +- modules/gpu/src/cuda/orb.cu | 5 -- modules/gpu/src/cuda/pyr_down.cu | 2 +- modules/gpu/src/cuda/pyr_up.cu | 2 +- modules/gpu/src/cuda/pyrlk.cu | 5 -- modules/gpu/src/cuda/resize.cu | 2 +- modules/gpu/src/cuda/rgb_to_yv12.cu | 4 +- modules/gpu/src/cuda/row_filter.0.cu | 1 - modules/gpu/src/cuda/row_filter.1.cu | 1 - modules/gpu/src/cuda/row_filter.10.cu | 1 - modules/gpu/src/cuda/row_filter.11.cu | 1 - modules/gpu/src/cuda/row_filter.12.cu | 1 - modules/gpu/src/cuda/row_filter.13.cu | 1 - modules/gpu/src/cuda/row_filter.14.cu | 1 - modules/gpu/src/cuda/row_filter.2.cu | 1 - modules/gpu/src/cuda/row_filter.3.cu | 1 - modules/gpu/src/cuda/row_filter.4.cu | 1 - modules/gpu/src/cuda/row_filter.5.cu | 1 - modules/gpu/src/cuda/row_filter.6.cu | 1 - modules/gpu/src/cuda/row_filter.7.cu | 1 - modules/gpu/src/cuda/row_filter.8.cu | 1 - modules/gpu/src/cuda/row_filter.9.cu | 1 - modules/gpu/src/cuda/row_filter.h | 1 - modules/gpu/src/cuda/split_merge.cu | 4 +- modules/gpu/src/cuda/stereobm.cu | 2 +- modules/gpu/src/cuda/stereobp.cu | 4 +- modules/gpu/src/cuda/texture_binder.hpp | 2 +- modules/gpu/src/cuda/tvl1flow.cu | 2 +- modules/gpu/src/cuvid_video_source.cpp | 42 +++++++++++++++ modules/gpu/src/cuvid_video_source.h | 2 +- modules/gpu/src/denoising.cpp | 4 +- modules/gpu/src/element_operations.cpp | 4 +- modules/gpu/src/error.cpp | 1 - modules/gpu/src/fast.cpp | 4 +- modules/gpu/src/ffmpeg_video_source.cpp | 2 +- modules/gpu/src/ffmpeg_video_source.h | 2 +- modules/gpu/src/frame_queue.cpp | 2 +- modules/gpu/src/frame_queue.h | 2 +- modules/gpu/src/gftt.cpp | 4 +- modules/gpu/src/global_motion.cpp | 4 +- modules/gpu/src/graphcuts.cpp | 4 +- modules/gpu/src/hog.cpp | 4 +- modules/gpu/src/matrix_reductions.cpp | 4 +- modules/gpu/src/mssegmentation.cpp | 1 - modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu | 7 +-- modules/gpu/src/nvidia/NCVBroxOpticalFlow.hpp | 5 +- .../gpu/src/nvidia/NCVHaarObjectDetection.cu | 5 +- .../gpu/src/nvidia/NCVHaarObjectDetection.hpp | 7 +-- .../gpu/src/nvidia/NPP_staging/NPP_staging.cu | 5 +- .../src/nvidia/NPP_staging/NPP_staging.hpp | 5 +- modules/gpu/src/nvidia/core/NCV.cu | 8 +-- modules/gpu/src/nvidia/core/NCV.hpp | 5 +- modules/gpu/src/nvidia/core/NCVAlg.hpp | 5 +- .../src/nvidia/core/NCVColorConversion.hpp | 5 +- .../src/nvidia/core/NCVPixelOperations.hpp | 5 +- modules/gpu/src/nvidia/core/NCVPyramid.cu | 7 +-- modules/gpu/src/nvidia/core/NCVPyramid.hpp | 6 +-- .../src/nvidia/core/NCVRuntimeTemplates.hpp | 5 +- modules/gpu/src/optical_flow.cpp | 4 +- modules/gpu/src/optical_flow_farneback.cpp | 4 +- modules/gpu/src/orb.cpp | 4 +- modules/gpu/src/precomp.cpp | 7 +-- modules/gpu/src/precomp.hpp | 2 +- modules/gpu/src/pyrlk.cpp | 4 +- modules/gpu/src/speckle_filtering.cpp | 2 +- modules/gpu/src/split_merge.cpp | 4 +- modules/gpu/src/stereobm.cpp | 2 +- modules/gpu/src/stereobp.cpp | 4 +- modules/gpu/src/stereocsbp.cpp | 2 +- modules/gpu/src/thread_wrappers.cpp | 2 +- modules/gpu/src/thread_wrappers.h | 2 +- modules/gpu/src/tvl1flow.cpp | 2 +- modules/gpu/src/video_decoder.cpp | 2 +- modules/gpu/src/video_decoder.h | 2 +- modules/gpu/src/video_parser.cpp | 2 +- modules/gpu/src/video_parser.h | 2 +- modules/gpu/src/video_reader.cpp | 2 +- modules/gpu/test/interpolation.hpp | 7 +-- modules/gpu/test/main.cpp | 7 +-- modules/gpu/test/main_test_nvidia.h | 42 +++++++++++++++ modules/gpu/test/nvidia/NCVAutoTestLister.hpp | 52 ++++++++++++++---- modules/gpu/test/nvidia/NCVTest.hpp | 52 ++++++++++++++---- .../gpu/test/nvidia/NCVTestSourceProvider.hpp | 52 ++++++++++++++---- modules/gpu/test/nvidia/TestCompact.cpp | 53 +++++++++++++++---- modules/gpu/test/nvidia/TestCompact.h | 52 ++++++++++++++---- modules/gpu/test/nvidia/TestDrawRects.cpp | 53 +++++++++++++++---- modules/gpu/test/nvidia/TestDrawRects.h | 52 ++++++++++++++---- .../nvidia/TestHaarCascadeApplication.cpp | 51 ++++++++++++++---- .../test/nvidia/TestHaarCascadeApplication.h | 52 ++++++++++++++---- .../gpu/test/nvidia/TestHaarCascadeLoader.cpp | 53 +++++++++++++++---- .../gpu/test/nvidia/TestHaarCascadeLoader.h | 52 ++++++++++++++---- .../gpu/test/nvidia/TestHypothesesFilter.cpp | 53 +++++++++++++++---- .../gpu/test/nvidia/TestHypothesesFilter.h | 52 ++++++++++++++---- .../gpu/test/nvidia/TestHypothesesGrow.cpp | 53 +++++++++++++++---- modules/gpu/test/nvidia/TestHypothesesGrow.h | 52 ++++++++++++++---- modules/gpu/test/nvidia/TestIntegralImage.cpp | 53 +++++++++++++++---- modules/gpu/test/nvidia/TestIntegralImage.h | 52 ++++++++++++++---- .../test/nvidia/TestIntegralImageSquared.cpp | 53 +++++++++++++++---- .../test/nvidia/TestIntegralImageSquared.h | 52 ++++++++++++++---- modules/gpu/test/nvidia/TestRectStdDev.cpp | 53 +++++++++++++++---- modules/gpu/test/nvidia/TestRectStdDev.h | 52 ++++++++++++++---- modules/gpu/test/nvidia/TestResize.cpp | 53 +++++++++++++++---- modules/gpu/test/nvidia/TestResize.h | 52 ++++++++++++++---- modules/gpu/test/nvidia/TestTranspose.cpp | 53 +++++++++++++++---- modules/gpu/test/nvidia/TestTranspose.h | 52 ++++++++++++++---- modules/gpu/test/nvidia/main_nvidia.cpp | 42 +++++++++++++++ modules/gpu/test/test_bgfg.cpp | 7 +-- modules/gpu/test/test_calib3d.cpp | 7 +-- modules/gpu/test/test_color.cpp | 7 +-- modules/gpu/test/test_copy_make_border.cpp | 7 +-- modules/gpu/test/test_core.cpp | 7 +-- modules/gpu/test/test_denoising.cpp | 7 +-- modules/gpu/test/test_features2d.cpp | 7 +-- modules/gpu/test/test_filters.cpp | 7 +-- modules/gpu/test/test_global_motion.cpp | 7 +-- modules/gpu/test/test_gpumat.cpp | 4 +- modules/gpu/test/test_hough.cpp | 7 +-- modules/gpu/test/test_imgproc.cpp | 7 +-- modules/gpu/test/test_labeling.cpp | 29 +++++----- modules/gpu/test/test_nvidia.cpp | 7 +-- modules/gpu/test/test_objdetect.cpp | 7 +-- modules/gpu/test/test_opengl.cpp | 7 +-- modules/gpu/test/test_optflow.cpp | 7 +-- modules/gpu/test/test_precomp.cpp | 7 +-- modules/gpu/test/test_precomp.hpp | 7 +-- modules/gpu/test/test_pyramids.cpp | 7 +-- modules/gpu/test/test_remap.cpp | 7 +-- modules/gpu/test/test_resize.cpp | 7 +-- modules/gpu/test/test_stream.cpp | 4 +- modules/gpu/test/test_threshold.cpp | 7 +-- modules/gpu/test/test_video.cpp | 7 +-- modules/gpu/test/test_warp_affine.cpp | 7 +-- modules/gpu/test/test_warp_perspective.cpp | 7 +-- .../nonfree/include/opencv2/nonfree/gpu.hpp | 2 +- modules/nonfree/perf/perf_gpu.cpp | 42 +++++++++++++++ modules/nonfree/src/cuda/surf.cu | 5 -- modules/nonfree/src/cuda/vibe.cu | 2 +- modules/nonfree/src/surf_gpu.cpp | 4 +- modules/nonfree/test/test_gpu.cpp | 7 +-- .../include/opencv2/superres/optical_flow.hpp | 2 +- .../include/opencv2/superres/superres.hpp | 2 +- modules/superres/perf/perf_main.cpp | 42 +++++++++++++++ modules/superres/perf/perf_precomp.cpp | 42 +++++++++++++++ modules/superres/perf/perf_precomp.hpp | 42 +++++++++++++++ modules/superres/perf/perf_superres.cpp | 42 +++++++++++++++ modules/superres/src/btv_l1.cpp | 2 +- modules/superres/src/btv_l1_gpu.cpp | 2 +- modules/superres/src/cuda/btv_l1_gpu.cu | 2 +- modules/superres/src/frame_source.cpp | 3 +- modules/superres/src/input_array_utility.cpp | 2 +- modules/superres/src/input_array_utility.hpp | 2 +- modules/superres/src/optical_flow.cpp | 2 +- modules/superres/src/precomp.cpp | 2 +- modules/superres/src/precomp.hpp | 2 +- modules/superres/src/ring_buffer.hpp | 2 +- modules/superres/src/super_resolution.cpp | 2 +- modules/superres/test/test_main.cpp | 42 +++++++++++++++ modules/superres/test/test_precomp.cpp | 42 +++++++++++++++ modules/superres/test/test_precomp.hpp | 42 +++++++++++++++ modules/superres/test/test_superres.cpp | 42 +++++++++++++++ modules/ts/include/opencv2/ts/gpu_perf.hpp | 42 +++++++++++++++ modules/ts/include/opencv2/ts/gpu_test.hpp | 42 +++++++++++++++ modules/ts/src/gpu_perf.cpp | 42 +++++++++++++++ modules/ts/src/gpu_test.cpp | 42 +++++++++++++++ 246 files changed, 2760 insertions(+), 623 deletions(-) diff --git a/modules/core/include/opencv2/core/cuda_devptrs.hpp b/modules/core/include/opencv2/core/cuda_devptrs.hpp index 72a897b489..15340455e2 100644 --- a/modules/core/include/opencv2/core/cuda_devptrs.hpp +++ b/modules/core/include/opencv2/core/cuda_devptrs.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/core/include/opencv2/core/devmem2d.hpp b/modules/core/include/opencv2/core/devmem2d.hpp index fc2d2f2757..18dfcd8acb 100644 --- a/modules/core/include/opencv2/core/devmem2d.hpp +++ b/modules/core/include/opencv2/core/devmem2d.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/core/include/opencv2/core/gpumat.hpp b/modules/core/include/opencv2/core/gpumat.hpp index 66daa96a14..193c9aa70b 100644 --- a/modules/core/include/opencv2/core/gpumat.hpp +++ b/modules/core/include/opencv2/core/gpumat.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/core/include/opencv2/core/opengl_interop.hpp b/modules/core/include/opencv2/core/opengl_interop.hpp index 178a949886..7ecaa8e219 100644 --- a/modules/core/include/opencv2/core/opengl_interop.hpp +++ b/modules/core/include/opencv2/core/opengl_interop.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/core/include/opencv2/core/opengl_interop_deprecated.hpp b/modules/core/include/opencv2/core/opengl_interop_deprecated.hpp index e5b39fb164..5bcc5ad4cf 100644 --- a/modules/core/include/opencv2/core/opengl_interop_deprecated.hpp +++ b/modules/core/include/opencv2/core/opengl_interop_deprecated.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/core/src/cuda/matrix_operations.cu b/modules/core/src/cuda/matrix_operations.cu index 60aa073406..c9b12de104 100644 --- a/modules/core/src/cuda/matrix_operations.cu +++ b/modules/core/src/cuda/matrix_operations.cu @@ -40,7 +40,6 @@ // //M*/ - #include "opencv2/gpu/device/saturate_cast.hpp" #include "opencv2/gpu/device/transform.hpp" #include "opencv2/gpu/device/functional.hpp" diff --git a/modules/core/src/gl_core_3_1.cpp b/modules/core/src/gl_core_3_1.cpp index 3bc74faa19..bd1eb7ddd3 100644 --- a/modules/core/src/gl_core_3_1.cpp +++ b/modules/core/src/gl_core_3_1.cpp @@ -1,3 +1,45 @@ +/*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 #include #include "cvconfig.h" diff --git a/modules/core/src/gl_core_3_1.hpp b/modules/core/src/gl_core_3_1.hpp index 50dbee66c7..f86390169e 100644 --- a/modules/core/src/gl_core_3_1.hpp +++ b/modules/core/src/gl_core_3_1.hpp @@ -1,3 +1,45 @@ +/*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*/ + #ifndef OPENGL_NOLOAD_STYLE_HPP #define OPENGL_NOLOAD_STYLE_HPP diff --git a/modules/core/src/opengl_interop_deprecated.cpp b/modules/core/src/opengl_interop_deprecated.cpp index 0670f57661..7a03924c50 100644 --- a/modules/core/src/opengl_interop_deprecated.cpp +++ b/modules/core/src/opengl_interop_deprecated.cpp @@ -39,7 +39,6 @@ // the use of this software, even if advised of the possibility of such damage. // //M*/ - #include "precomp.hpp" #include "opencv2/core/opengl_interop_deprecated.hpp" #include "opencv2/core/gpumat.hpp" diff --git a/modules/gpu/include/opencv2/gpu/device/border_interpolate.hpp b/modules/gpu/include/opencv2/gpu/device/border_interpolate.hpp index 2343ccab2a..2ec97435eb 100644 --- a/modules/gpu/include/opencv2/gpu/device/border_interpolate.hpp +++ b/modules/gpu/include/opencv2/gpu/device/border_interpolate.hpp @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/include/opencv2/gpu/device/color.hpp b/modules/gpu/include/opencv2/gpu/device/color.hpp index 53d3d6b086..c087d179b8 100644 --- a/modules/gpu/include/opencv2/gpu/device/color.hpp +++ b/modules/gpu/include/opencv2/gpu/device/color.hpp @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/include/opencv2/gpu/device/datamov_utils.hpp b/modules/gpu/include/opencv2/gpu/device/datamov_utils.hpp index e05a22477c..a3f62fba98 100644 --- a/modules/gpu/include/opencv2/gpu/device/datamov_utils.hpp +++ b/modules/gpu/include/opencv2/gpu/device/datamov_utils.hpp @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/include/opencv2/gpu/device/detail/color_detail.hpp b/modules/gpu/include/opencv2/gpu/device/detail/color_detail.hpp index 0d9c08620d..d02027f244 100644 --- a/modules/gpu/include/opencv2/gpu/device/detail/color_detail.hpp +++ b/modules/gpu/include/opencv2/gpu/device/detail/color_detail.hpp @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/include/opencv2/gpu/device/emulation.hpp b/modules/gpu/include/opencv2/gpu/device/emulation.hpp index b6fba230e7..bf47bc5f1e 100644 --- a/modules/gpu/include/opencv2/gpu/device/emulation.hpp +++ b/modules/gpu/include/opencv2/gpu/device/emulation.hpp @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/include/opencv2/gpu/device/funcattrib.hpp b/modules/gpu/include/opencv2/gpu/device/funcattrib.hpp index 05df4d10b4..2ed7980205 100644 --- a/modules/gpu/include/opencv2/gpu/device/funcattrib.hpp +++ b/modules/gpu/include/opencv2/gpu/device/funcattrib.hpp @@ -40,7 +40,6 @@ // //M*/ - #ifndef __OPENCV_GPU_DEVICE_FUNCATTRIB_HPP_ #define __OPENCV_GPU_DEVICE_FUNCATTRIB_HPP_ @@ -69,4 +68,4 @@ namespace cv { namespace gpu { namespace device } }}} // namespace cv { namespace gpu { namespace device -#endif /* __OPENCV_GPU_DEVICE_FUNCATTRIB_HPP_ */ \ No newline at end of file +#endif /* __OPENCV_GPU_DEVICE_FUNCATTRIB_HPP_ */ diff --git a/modules/gpu/include/opencv2/gpu/device/simd_functions.hpp b/modules/gpu/include/opencv2/gpu/device/simd_functions.hpp index 55b1f247ff..b0377e533e 100644 --- a/modules/gpu/include/opencv2/gpu/device/simd_functions.hpp +++ b/modules/gpu/include/opencv2/gpu/device/simd_functions.hpp @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 2010-2013, NVIDIA 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, diff --git a/modules/gpu/include/opencv2/gpu/device/warp_reduce.hpp b/modules/gpu/include/opencv2/gpu/device/warp_reduce.hpp index 7ac85b095d..d4e64c4615 100644 --- a/modules/gpu/include/opencv2/gpu/device/warp_reduce.hpp +++ b/modules/gpu/include/opencv2/gpu/device/warp_reduce.hpp @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -40,7 +40,6 @@ // //M*/ - #ifndef OPENCV_GPU_WARP_REDUCE_HPP__ #define OPENCV_GPU_WARP_REDUCE_HPP__ @@ -66,4 +65,4 @@ namespace cv { namespace gpu { namespace device } }}} // namespace cv { namespace gpu { namespace device { -#endif /* OPENCV_GPU_WARP_REDUCE_HPP__ */ \ No newline at end of file +#endif /* OPENCV_GPU_WARP_REDUCE_HPP__ */ diff --git a/modules/gpu/include/opencv2/gpu/devmem2d.hpp b/modules/gpu/include/opencv2/gpu/devmem2d.hpp index fc2d2f2757..18dfcd8acb 100644 --- a/modules/gpu/include/opencv2/gpu/devmem2d.hpp +++ b/modules/gpu/include/opencv2/gpu/devmem2d.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/gpu/include/opencv2/gpu/gpu.hpp b/modules/gpu/include/opencv2/gpu/gpu.hpp index bb74d1a52d..bd7085a004 100644 --- a/modules/gpu/include/opencv2/gpu/gpu.hpp +++ b/modules/gpu/include/opencv2/gpu/gpu.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/gpu/include/opencv2/gpu/gpumat.hpp b/modules/gpu/include/opencv2/gpu/gpumat.hpp index 0033cbe961..840398b573 100644 --- a/modules/gpu/include/opencv2/gpu/gpumat.hpp +++ b/modules/gpu/include/opencv2/gpu/gpumat.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/gpu/include/opencv2/gpu/stream_accessor.hpp b/modules/gpu/include/opencv2/gpu/stream_accessor.hpp index 6a1a0bddd5..9f4c6ee1e7 100644 --- a/modules/gpu/include/opencv2/gpu/stream_accessor.hpp +++ b/modules/gpu/include/opencv2/gpu/stream_accessor.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. @@ -61,4 +61,4 @@ namespace cv } } -#endif /* __OPENCV_GPU_STREAM_ACCESSOR_HPP__ */ \ No newline at end of file +#endif /* __OPENCV_GPU_STREAM_ACCESSOR_HPP__ */ diff --git a/modules/gpu/perf/perf_calib3d.cpp b/modules/gpu/perf/perf_calib3d.cpp index 8019c0349a..91800649c2 100644 --- a/modules/gpu/perf/perf_calib3d.cpp +++ b/modules/gpu/perf/perf_calib3d.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_core.cpp b/modules/gpu/perf/perf_core.cpp index 70bb8f24f1..3461880379 100644 --- a/modules/gpu/perf/perf_core.cpp +++ b/modules/gpu/perf/perf_core.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_denoising.cpp b/modules/gpu/perf/perf_denoising.cpp index 9701225685..1e33601d60 100644 --- a/modules/gpu/perf/perf_denoising.cpp +++ b/modules/gpu/perf/perf_denoising.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_features2d.cpp b/modules/gpu/perf/perf_features2d.cpp index e5a6ef3c89..feee3a939e 100644 --- a/modules/gpu/perf/perf_features2d.cpp +++ b/modules/gpu/perf/perf_features2d.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_filters.cpp b/modules/gpu/perf/perf_filters.cpp index a343d10570..84d9cc4663 100644 --- a/modules/gpu/perf/perf_filters.cpp +++ b/modules/gpu/perf/perf_filters.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_imgproc.cpp b/modules/gpu/perf/perf_imgproc.cpp index 84cb0e200f..9f4d673594 100644 --- a/modules/gpu/perf/perf_imgproc.cpp +++ b/modules/gpu/perf/perf_imgproc.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_labeling.cpp b/modules/gpu/perf/perf_labeling.cpp index cbc9ff0a2f..0484da9d59 100644 --- a/modules/gpu/perf/perf_labeling.cpp +++ b/modules/gpu/perf/perf_labeling.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_main.cpp b/modules/gpu/perf/perf_main.cpp index 07c1b519cc..a7ac1ccce8 100644 --- a/modules/gpu/perf/perf_main.cpp +++ b/modules/gpu/perf/perf_main.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace perf; diff --git a/modules/gpu/perf/perf_matop.cpp b/modules/gpu/perf/perf_matop.cpp index f2803f0f2c..f80ba1b087 100644 --- a/modules/gpu/perf/perf_matop.cpp +++ b/modules/gpu/perf/perf_matop.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_objdetect.cpp b/modules/gpu/perf/perf_objdetect.cpp index 4f8e56853f..1516d6b99b 100644 --- a/modules/gpu/perf/perf_objdetect.cpp +++ b/modules/gpu/perf/perf_objdetect.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf/perf_precomp.cpp b/modules/gpu/perf/perf_precomp.cpp index 8552ac3d42..81f16e8f14 100644 --- a/modules/gpu/perf/perf_precomp.cpp +++ b/modules/gpu/perf/perf_precomp.cpp @@ -1 +1,43 @@ +/*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 "perf_precomp.hpp" diff --git a/modules/gpu/perf/perf_precomp.hpp b/modules/gpu/perf/perf_precomp.hpp index c1edaf4642..5e31c4cdef 100644 --- a/modules/gpu/perf/perf_precomp.hpp +++ b/modules/gpu/perf/perf_precomp.hpp @@ -1,3 +1,45 @@ +/*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*/ + #ifdef __GNUC__ # pragma GCC diagnostic ignored "-Wmissing-declarations" # if defined __clang__ || defined __APPLE__ diff --git a/modules/gpu/perf/perf_video.cpp b/modules/gpu/perf/perf_video.cpp index b998ff95fe..a3df2193e3 100644 --- a/modules/gpu/perf/perf_video.cpp +++ b/modules/gpu/perf/perf_video.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/gpu/perf4au/main.cpp b/modules/gpu/perf4au/main.cpp index f13349ecdd..68c00dbafe 100644 --- a/modules/gpu/perf4au/main.cpp +++ b/modules/gpu/perf4au/main.cpp @@ -1,3 +1,45 @@ +/*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 #ifdef HAVE_CVCONFIG_H #include "cvconfig.h" diff --git a/modules/gpu/src/arithm.cpp b/modules/gpu/src/arithm.cpp index 573f7c574a..53b6aea0c5 100644 --- a/modules/gpu/src/arithm.cpp +++ b/modules/gpu/src/arithm.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/bilateral_filter.cpp b/modules/gpu/src/bilateral_filter.cpp index b93526cb5b..5f65d0b08f 100644 --- a/modules/gpu/src/bilateral_filter.cpp +++ b/modules/gpu/src/bilateral_filter.cpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/gpu/src/blend.cpp b/modules/gpu/src/blend.cpp index 2ca7da85a3..0225cec19d 100644 --- a/modules/gpu/src/blend.cpp +++ b/modules/gpu/src/blend.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/brute_force_matcher.cpp b/modules/gpu/src/brute_force_matcher.cpp index 5643c8bee7..5da22e156b 100644 --- a/modules/gpu/src/brute_force_matcher.cpp +++ b/modules/gpu/src/brute_force_matcher.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cascadeclassifier.cpp b/modules/gpu/src/cascadeclassifier.cpp index 3603933979..814a96bc0a 100644 --- a/modules/gpu/src/cascadeclassifier.cpp +++ b/modules/gpu/src/cascadeclassifier.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cu_safe_call.cpp b/modules/gpu/src/cu_safe_call.cpp index 7218873dff..1385e3bb91 100644 --- a/modules/gpu/src/cu_safe_call.cpp +++ b/modules/gpu/src/cu_safe_call.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/cu_safe_call.h b/modules/gpu/src/cu_safe_call.h index 6f93adc760..49cf696968 100644 --- a/modules/gpu/src/cu_safe_call.h +++ b/modules/gpu/src/cu_safe_call.h @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/cuda/NV12ToARGB.cu b/modules/gpu/src/cuda/NV12ToARGB.cu index 8ad6cfdfae..99aeba6fd8 100644 --- a/modules/gpu/src/cuda/NV12ToARGB.cu +++ b/modules/gpu/src/cuda/NV12ToARGB.cu @@ -41,23 +41,12 @@ //M*/ /* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * Please refer to the NVIDIA end user license agreement (EULA) associated - * with this source code for terms and conditions that govern your use of - * this software. Any use, reproduction, disclosure, or distribution of - * this software and related documentation outside the terms of the EULA - * is strictly prohibited. + * NV12ToARGB color space conversion CUDA kernel * + * This sample uses CUDA to perform a simple NV12 (YUV 4:2:0 planar) + * source and converts to output in ARGB format */ -/* - NV12ToARGB color space conversion CUDA kernel - - This sample uses CUDA to perform a simple NV12 (YUV 4:2:0 planar) - source and converts to output in ARGB format -*/ - #if !defined CUDA_DISABLER #include "opencv2/gpu/device/common.hpp" @@ -209,4 +198,4 @@ namespace cv { namespace gpu { namespace device { } }}} -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/bf_knnmatch.cu b/modules/gpu/src/cuda/bf_knnmatch.cu index 49bc1dfcd2..66e37d088a 100644 --- a/modules/gpu/src/cuda/bf_knnmatch.cu +++ b/modules/gpu/src/cuda/bf_knnmatch.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/bf_match.cu b/modules/gpu/src/cuda/bf_match.cu index 5e64e31bd9..f7bdcdc0f1 100644 --- a/modules/gpu/src/cuda/bf_match.cu +++ b/modules/gpu/src/cuda/bf_match.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/bf_radius_match.cu b/modules/gpu/src/cuda/bf_radius_match.cu index 19ee94e331..44cd2b55f9 100644 --- a/modules/gpu/src/cuda/bf_radius_match.cu +++ b/modules/gpu/src/cuda/bf_radius_match.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/bgfg_gmg.cu b/modules/gpu/src/cuda/bgfg_gmg.cu index 8e2fd3b38b..f0f78c9331 100644 --- a/modules/gpu/src/cuda/bgfg_gmg.cu +++ b/modules/gpu/src/cuda/bgfg_gmg.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -255,4 +255,4 @@ namespace cv { namespace gpu { namespace device { }}} -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/bgfg_mog.cu b/modules/gpu/src/cuda/bgfg_mog.cu index d99ffc498a..89ad5ff0b5 100644 --- a/modules/gpu/src/cuda/bgfg_mog.cu +++ b/modules/gpu/src/cuda/bgfg_mog.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/bilateral_filter.cu b/modules/gpu/src/cuda/bilateral_filter.cu index 0f1d8537ef..15e72a8b75 100644 --- a/modules/gpu/src/cuda/bilateral_filter.cu +++ b/modules/gpu/src/cuda/bilateral_filter.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, @@ -29,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -198,4 +197,4 @@ OCV_INSTANTIATE_BILATERAL_FILTER(float3) OCV_INSTANTIATE_BILATERAL_FILTER(float4) -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/blend.cu b/modules/gpu/src/cuda/blend.cu index 614ccd2964..6e93fa61a1 100644 --- a/modules/gpu/src/cuda/blend.cu +++ b/modules/gpu/src/cuda/blend.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -118,4 +118,4 @@ namespace cv { namespace gpu { namespace device }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/ccomponetns.cu b/modules/gpu/src/cuda/ccomponetns.cu index 0533522bed..7f3d4ae338 100644 --- a/modules/gpu/src/cuda/ccomponetns.cu +++ b/modules/gpu/src/cuda/ccomponetns.cu @@ -1,31 +1,31 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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. +// 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 +// License Agreement +// For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2008-2011, Willow Garage Inc., 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: // -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. +// * 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. +// * 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 @@ -37,6 +37,7 @@ // 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 CUDA_DISABLER diff --git a/modules/gpu/src/cuda/column_filter.0.cu b/modules/gpu/src/cuda/column_filter.0.cu index c35c6ee64d..339fb80707 100644 --- a/modules/gpu/src/cuda/column_filter.0.cu +++ b/modules/gpu/src/cuda/column_filter.0.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.1.cu b/modules/gpu/src/cuda/column_filter.1.cu index 9a2d6a0427..53914a2159 100644 --- a/modules/gpu/src/cuda/column_filter.1.cu +++ b/modules/gpu/src/cuda/column_filter.1.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.10.cu b/modules/gpu/src/cuda/column_filter.10.cu index 41e35bc1c6..b71e25207e 100644 --- a/modules/gpu/src/cuda/column_filter.10.cu +++ b/modules/gpu/src/cuda/column_filter.10.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.11.cu b/modules/gpu/src/cuda/column_filter.11.cu index 981208a68b..ccfbf8e773 100644 --- a/modules/gpu/src/cuda/column_filter.11.cu +++ b/modules/gpu/src/cuda/column_filter.11.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.12.cu b/modules/gpu/src/cuda/column_filter.12.cu index 13d2e60023..a38f93b531 100644 --- a/modules/gpu/src/cuda/column_filter.12.cu +++ b/modules/gpu/src/cuda/column_filter.12.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.13.cu b/modules/gpu/src/cuda/column_filter.13.cu index 09f6484af4..40eec7a83f 100644 --- a/modules/gpu/src/cuda/column_filter.13.cu +++ b/modules/gpu/src/cuda/column_filter.13.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.14.cu b/modules/gpu/src/cuda/column_filter.14.cu index 901ab03011..08151ac6d0 100644 --- a/modules/gpu/src/cuda/column_filter.14.cu +++ b/modules/gpu/src/cuda/column_filter.14.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.2.cu b/modules/gpu/src/cuda/column_filter.2.cu index 05ee01c763..a615944cb9 100644 --- a/modules/gpu/src/cuda/column_filter.2.cu +++ b/modules/gpu/src/cuda/column_filter.2.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.3.cu b/modules/gpu/src/cuda/column_filter.3.cu index 1bf49219f9..7304565b96 100644 --- a/modules/gpu/src/cuda/column_filter.3.cu +++ b/modules/gpu/src/cuda/column_filter.3.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.4.cu b/modules/gpu/src/cuda/column_filter.4.cu index bec7a085a0..8c9db6985b 100644 --- a/modules/gpu/src/cuda/column_filter.4.cu +++ b/modules/gpu/src/cuda/column_filter.4.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.5.cu b/modules/gpu/src/cuda/column_filter.5.cu index 8194ee39aa..a192660306 100644 --- a/modules/gpu/src/cuda/column_filter.5.cu +++ b/modules/gpu/src/cuda/column_filter.5.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.6.cu b/modules/gpu/src/cuda/column_filter.6.cu index d8fc49be68..f4f7c4ffb9 100644 --- a/modules/gpu/src/cuda/column_filter.6.cu +++ b/modules/gpu/src/cuda/column_filter.6.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.7.cu b/modules/gpu/src/cuda/column_filter.7.cu index 534bd821ef..9f94bed9d9 100644 --- a/modules/gpu/src/cuda/column_filter.7.cu +++ b/modules/gpu/src/cuda/column_filter.7.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.8.cu b/modules/gpu/src/cuda/column_filter.8.cu index 38e70e772e..0a63a1dd43 100644 --- a/modules/gpu/src/cuda/column_filter.8.cu +++ b/modules/gpu/src/cuda/column_filter.8.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.9.cu b/modules/gpu/src/cuda/column_filter.9.cu index 5b58345820..758d9289d9 100644 --- a/modules/gpu/src/cuda/column_filter.9.cu +++ b/modules/gpu/src/cuda/column_filter.9.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/column_filter.h b/modules/gpu/src/cuda/column_filter.h index 52b9103393..46e3583153 100644 --- a/modules/gpu/src/cuda/column_filter.h +++ b/modules/gpu/src/cuda/column_filter.h @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/copy_make_border.cu b/modules/gpu/src/cuda/copy_make_border.cu index d9898d75ed..5553810ebd 100644 --- a/modules/gpu/src/cuda/copy_make_border.cu +++ b/modules/gpu/src/cuda/copy_make_border.cu @@ -128,4 +128,4 @@ namespace cv { namespace gpu { namespace device } // namespace imgproc }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/disp_bilateral_filter.cu b/modules/gpu/src/cuda/disp_bilateral_filter.cu index 56b39eaa7d..8750af8e65 100644 --- a/modules/gpu/src/cuda/disp_bilateral_filter.cu +++ b/modules/gpu/src/cuda/disp_bilateral_filter.cu @@ -220,4 +220,4 @@ namespace cv { namespace gpu { namespace device } // namespace bilateral_filter }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/fast.cu b/modules/gpu/src/cuda/fast.cu index 831cb92b60..9bf1f7ad93 100644 --- a/modules/gpu/src/cuda/fast.cu +++ b/modules/gpu/src/cuda/fast.cu @@ -38,11 +38,6 @@ // 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. // -// Copyright (c) 2010, Paul Furgale, Chi Hay Tong -// -// The original code was written by Paul Furgale and Chi Hay Tong -// and later optimized and prepared for integration into OpenCV by Itseez. -// //M*/ #if !defined CUDA_DISABLER @@ -387,4 +382,4 @@ namespace cv { namespace gpu { namespace device }}} -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/fgd_bgfg.cu b/modules/gpu/src/cuda/fgd_bgfg.cu index a14da0f854..9ecf890e91 100644 --- a/modules/gpu/src/cuda/fgd_bgfg.cu +++ b/modules/gpu/src/cuda/fgd_bgfg.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/fgd_bgfg_common.hpp b/modules/gpu/src/cuda/fgd_bgfg_common.hpp index 986952e439..a8fda7bb68 100644 --- a/modules/gpu/src/cuda/fgd_bgfg_common.hpp +++ b/modules/gpu/src/cuda/fgd_bgfg_common.hpp @@ -1,3 +1,45 @@ +/*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*/ + #ifndef __FGD_BGFG_COMMON_HPP__ #define __FGD_BGFG_COMMON_HPP__ diff --git a/modules/gpu/src/cuda/gftt.cu b/modules/gpu/src/cuda/gftt.cu index cae217e394..b5c3edb2d2 100644 --- a/modules/gpu/src/cuda/gftt.cu +++ b/modules/gpu/src/cuda/gftt.cu @@ -38,11 +38,6 @@ // 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. // -// Copyright (c) 2010, Paul Furgale, Chi Hay Tong -// -// The original code was written by Paul Furgale and Chi Hay Tong -// and later optimized and prepared for integration into OpenCV by Itseez. -// //M*/ #if !defined CUDA_DISABLER diff --git a/modules/gpu/src/cuda/global_motion.cu b/modules/gpu/src/cuda/global_motion.cu index b62ca2c9fd..bad6fd5a22 100644 --- a/modules/gpu/src/cuda/global_motion.cu +++ b/modules/gpu/src/cuda/global_motion.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, @@ -29,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/hist.cu b/modules/gpu/src/cuda/hist.cu index 9dd14182be..8b8a1e8c63 100644 --- a/modules/gpu/src/cuda/hist.cu +++ b/modules/gpu/src/cuda/hist.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, @@ -29,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/hough.cu b/modules/gpu/src/cuda/hough.cu index 695a47def4..faec89b95c 100644 --- a/modules/gpu/src/cuda/hough.cu +++ b/modules/gpu/src/cuda/hough.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/integral_image.cu b/modules/gpu/src/cuda/integral_image.cu index 09187fd259..7dbc820f0e 100644 --- a/modules/gpu/src/cuda/integral_image.cu +++ b/modules/gpu/src/cuda/integral_image.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -387,4 +387,4 @@ namespace cv { namespace gpu { namespace device } }}} -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/lbp.cu b/modules/gpu/src/cuda/lbp.cu index a09aa1e79b..06e7303353 100644 --- a/modules/gpu/src/cuda/lbp.cu +++ b/modules/gpu/src/cuda/lbp.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/lbp.hpp b/modules/gpu/src/cuda/lbp.hpp index 0c8a03e334..0f32444eeb 100644 --- a/modules/gpu/src/cuda/lbp.hpp +++ b/modules/gpu/src/cuda/lbp.hpp @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -109,4 +109,4 @@ namespace lbp { } } }// namespaces -#endif \ No newline at end of file +#endif diff --git a/modules/gpu/src/cuda/match_template.cu b/modules/gpu/src/cuda/match_template.cu index 71afea2126..98c4549a5c 100644 --- a/modules/gpu/src/cuda/match_template.cu +++ b/modules/gpu/src/cuda/match_template.cu @@ -913,4 +913,4 @@ namespace cv { namespace gpu { namespace device }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/nlm.cu b/modules/gpu/src/cuda/nlm.cu index cd3f0b5c3a..922cba7e5a 100644 --- a/modules/gpu/src/cuda/nlm.cu +++ b/modules/gpu/src/cuda/nlm.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, @@ -29,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/optflowbm.cu b/modules/gpu/src/cuda/optflowbm.cu index baf8dfb362..774b68d003 100644 --- a/modules/gpu/src/cuda/optflowbm.cu +++ b/modules/gpu/src/cuda/optflowbm.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/optical_flow_farneback.cu b/modules/gpu/src/cuda/optical_flow_farneback.cu index 5bbca34f18..e2f2698175 100644 --- a/modules/gpu/src/cuda/optical_flow_farneback.cu +++ b/modules/gpu/src/cuda/optical_flow_farneback.cu @@ -645,4 +645,4 @@ namespace cv { namespace gpu { namespace device { namespace optflow_farneback }}}} // namespace cv { namespace gpu { namespace device { namespace optflow_farneback -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/orb.cu b/modules/gpu/src/cuda/orb.cu index 95706dfa39..723bf28ffb 100644 --- a/modules/gpu/src/cuda/orb.cu +++ b/modules/gpu/src/cuda/orb.cu @@ -38,11 +38,6 @@ // 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. // -// Copyright (c) 2010, Paul Furgale, Chi Hay Tong -// -// The original code was written by Paul Furgale and Chi Hay Tong -// and later optimized and prepared for integration into OpenCV by Itseez. -// //M*/ #if !defined CUDA_DISABLER diff --git a/modules/gpu/src/cuda/pyr_down.cu b/modules/gpu/src/cuda/pyr_down.cu index 35c24e4b8a..e6ef64721e 100644 --- a/modules/gpu/src/cuda/pyr_down.cu +++ b/modules/gpu/src/cuda/pyr_down.cu @@ -225,4 +225,4 @@ namespace cv { namespace gpu { namespace device }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/pyr_up.cu b/modules/gpu/src/cuda/pyr_up.cu index 5966b03642..b14d124e7c 100644 --- a/modules/gpu/src/cuda/pyr_up.cu +++ b/modules/gpu/src/cuda/pyr_up.cu @@ -193,4 +193,4 @@ namespace cv { namespace gpu { namespace device } // namespace imgproc }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/pyrlk.cu b/modules/gpu/src/cuda/pyrlk.cu index 8d746143c8..8ef728b03b 100644 --- a/modules/gpu/src/cuda/pyrlk.cu +++ b/modules/gpu/src/cuda/pyrlk.cu @@ -38,11 +38,6 @@ // 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. // -// Copyright (c) 2010, Paul Furgale, Chi Hay Tong -// -// The original code was written by Paul Furgale and Chi Hay Tong -// and later optimized and prepared for integration into OpenCV by Itseez. -// //M*/ #if !defined CUDA_DISABLER diff --git a/modules/gpu/src/cuda/resize.cu b/modules/gpu/src/cuda/resize.cu index 85d8e3fea5..e720297678 100644 --- a/modules/gpu/src/cuda/resize.cu +++ b/modules/gpu/src/cuda/resize.cu @@ -299,4 +299,4 @@ namespace cv { namespace gpu { namespace device }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/rgb_to_yv12.cu b/modules/gpu/src/cuda/rgb_to_yv12.cu index 5fd0217dc9..e38368ab80 100644 --- a/modules/gpu/src/cuda/rgb_to_yv12.cu +++ b/modules/gpu/src/cuda/rgb_to_yv12.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -172,4 +172,4 @@ namespace cv { namespace gpu { namespace device } }}} -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/row_filter.0.cu b/modules/gpu/src/cuda/row_filter.0.cu index a1a8f36cad..a4b4239844 100644 --- a/modules/gpu/src/cuda/row_filter.0.cu +++ b/modules/gpu/src/cuda/row_filter.0.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.1.cu b/modules/gpu/src/cuda/row_filter.1.cu index ab2248e1b2..ac4724f8c1 100644 --- a/modules/gpu/src/cuda/row_filter.1.cu +++ b/modules/gpu/src/cuda/row_filter.1.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.10.cu b/modules/gpu/src/cuda/row_filter.10.cu index 4509fe4a72..7d93ee31ac 100644 --- a/modules/gpu/src/cuda/row_filter.10.cu +++ b/modules/gpu/src/cuda/row_filter.10.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.11.cu b/modules/gpu/src/cuda/row_filter.11.cu index 839b56c7c0..31bccc48b6 100644 --- a/modules/gpu/src/cuda/row_filter.11.cu +++ b/modules/gpu/src/cuda/row_filter.11.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.12.cu b/modules/gpu/src/cuda/row_filter.12.cu index c4879dbe4c..7be543f6b2 100644 --- a/modules/gpu/src/cuda/row_filter.12.cu +++ b/modules/gpu/src/cuda/row_filter.12.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.13.cu b/modules/gpu/src/cuda/row_filter.13.cu index c5da957a58..bd700b1bb2 100644 --- a/modules/gpu/src/cuda/row_filter.13.cu +++ b/modules/gpu/src/cuda/row_filter.13.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.14.cu b/modules/gpu/src/cuda/row_filter.14.cu index d8ccb9a2ed..97df2f128a 100644 --- a/modules/gpu/src/cuda/row_filter.14.cu +++ b/modules/gpu/src/cuda/row_filter.14.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.2.cu b/modules/gpu/src/cuda/row_filter.2.cu index 5aa2e2b80a..d630b6fc52 100644 --- a/modules/gpu/src/cuda/row_filter.2.cu +++ b/modules/gpu/src/cuda/row_filter.2.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.3.cu b/modules/gpu/src/cuda/row_filter.3.cu index 9d131a959d..fe84666954 100644 --- a/modules/gpu/src/cuda/row_filter.3.cu +++ b/modules/gpu/src/cuda/row_filter.3.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.4.cu b/modules/gpu/src/cuda/row_filter.4.cu index 0aae534ce7..050f7af04e 100644 --- a/modules/gpu/src/cuda/row_filter.4.cu +++ b/modules/gpu/src/cuda/row_filter.4.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.5.cu b/modules/gpu/src/cuda/row_filter.5.cu index dd1f2be135..975aea4a10 100644 --- a/modules/gpu/src/cuda/row_filter.5.cu +++ b/modules/gpu/src/cuda/row_filter.5.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.6.cu b/modules/gpu/src/cuda/row_filter.6.cu index 548069d363..d5894452b1 100644 --- a/modules/gpu/src/cuda/row_filter.6.cu +++ b/modules/gpu/src/cuda/row_filter.6.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.7.cu b/modules/gpu/src/cuda/row_filter.7.cu index 8c5c09ed93..ac3fcc14b2 100644 --- a/modules/gpu/src/cuda/row_filter.7.cu +++ b/modules/gpu/src/cuda/row_filter.7.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.8.cu b/modules/gpu/src/cuda/row_filter.8.cu index 77e4ed63f6..b899e87a7a 100644 --- a/modules/gpu/src/cuda/row_filter.8.cu +++ b/modules/gpu/src/cuda/row_filter.8.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.9.cu b/modules/gpu/src/cuda/row_filter.9.cu index 954944b007..516dd8fe7c 100644 --- a/modules/gpu/src/cuda/row_filter.9.cu +++ b/modules/gpu/src/cuda/row_filter.9.cu @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/row_filter.h b/modules/gpu/src/cuda/row_filter.h index f2da684cc1..933f900293 100644 --- a/modules/gpu/src/cuda/row_filter.h +++ b/modules/gpu/src/cuda/row_filter.h @@ -12,7 +12,6 @@ // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. // Copyright (C) 2009, Willow Garage Inc., all rights reserved. -// Copyright (C) 1993-2011, NVIDIA 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, diff --git a/modules/gpu/src/cuda/split_merge.cu b/modules/gpu/src/cuda/split_merge.cu index 834b283f0c..885671e7c5 100644 --- a/modules/gpu/src/cuda/split_merge.cu +++ b/modules/gpu/src/cuda/split_merge.cu @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuda/stereobm.cu b/modules/gpu/src/cuda/stereobm.cu index 44ad0abd88..ad256357b8 100644 --- a/modules/gpu/src/cuda/stereobm.cu +++ b/modules/gpu/src/cuda/stereobm.cu @@ -537,4 +537,4 @@ namespace cv { namespace gpu { namespace device }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/stereobp.cu b/modules/gpu/src/cuda/stereobp.cu index 18d3ae7979..05a19b4199 100644 --- a/modules/gpu/src/cuda/stereobp.cu +++ b/modules/gpu/src/cuda/stereobp.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 @@ -535,4 +535,4 @@ namespace cv { namespace gpu { namespace device } // namespace stereobp }}} // namespace cv { namespace gpu { namespace device -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/cuda/texture_binder.hpp b/modules/gpu/src/cuda/texture_binder.hpp index 391eb9a190..801a6d2702 100644 --- a/modules/gpu/src/cuda/texture_binder.hpp +++ b/modules/gpu/src/cuda/texture_binder.hpp @@ -89,4 +89,4 @@ namespace cv } } -#endif /* OPENCV_GPU_TEXTURE_BINDER_HPP_*/ \ No newline at end of file +#endif /* OPENCV_GPU_TEXTURE_BINDER_HPP_*/ diff --git a/modules/gpu/src/cuda/tvl1flow.cu b/modules/gpu/src/cuda/tvl1flow.cu index 27694ad269..a2b934bf75 100644 --- a/modules/gpu/src/cuda/tvl1flow.cu +++ b/modules/gpu/src/cuda/tvl1flow.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/cuvid_video_source.cpp b/modules/gpu/src/cuvid_video_source.cpp index 7d45b8fee9..0bad589dcf 100644 --- a/modules/gpu/src/cuvid_video_source.cpp +++ b/modules/gpu/src/cuvid_video_source.cpp @@ -1,3 +1,45 @@ +/*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 "cuvid_video_source.h" #include "cu_safe_call.h" diff --git a/modules/gpu/src/cuvid_video_source.h b/modules/gpu/src/cuvid_video_source.h index 1c4c0e5e00..00ca821414 100644 --- a/modules/gpu/src/cuvid_video_source.h +++ b/modules/gpu/src/cuvid_video_source.h @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/denoising.cpp b/modules/gpu/src/denoising.cpp index 74c1a56686..995b809d3e 100644 --- a/modules/gpu/src/denoising.cpp +++ b/modules/gpu/src/denoising.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/element_operations.cpp b/modules/gpu/src/element_operations.cpp index 2c83967edd..afce5bbc7f 100644 --- a/modules/gpu/src/element_operations.cpp +++ b/modules/gpu/src/element_operations.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/error.cpp b/modules/gpu/src/error.cpp index 53b21cb8d2..c155aa83bf 100644 --- a/modules/gpu/src/error.cpp +++ b/modules/gpu/src/error.cpp @@ -39,7 +39,6 @@ // the use of this software, even if advised of the possibility of such damage. // //M*/ - #include "precomp.hpp" using namespace cv; diff --git a/modules/gpu/src/fast.cpp b/modules/gpu/src/fast.cpp index f8b3b98871..a24a69962b 100644 --- a/modules/gpu/src/fast.cpp +++ b/modules/gpu/src/fast.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/ffmpeg_video_source.cpp b/modules/gpu/src/ffmpeg_video_source.cpp index bd3d70058a..1e115d8b16 100644 --- a/modules/gpu/src/ffmpeg_video_source.cpp +++ b/modules/gpu/src/ffmpeg_video_source.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/ffmpeg_video_source.h b/modules/gpu/src/ffmpeg_video_source.h index 41bf0cfd0e..9fee1e37fa 100644 --- a/modules/gpu/src/ffmpeg_video_source.h +++ b/modules/gpu/src/ffmpeg_video_source.h @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/frame_queue.cpp b/modules/gpu/src/frame_queue.cpp index 0d93918732..a8b9cff0bf 100644 --- a/modules/gpu/src/frame_queue.cpp +++ b/modules/gpu/src/frame_queue.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/frame_queue.h b/modules/gpu/src/frame_queue.h index 00c44a4015..e408b0dd06 100644 --- a/modules/gpu/src/frame_queue.h +++ b/modules/gpu/src/frame_queue.h @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/gftt.cpp b/modules/gpu/src/gftt.cpp index 6bb73de750..b09378d277 100644 --- a/modules/gpu/src/gftt.cpp +++ b/modules/gpu/src/gftt.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/global_motion.cpp b/modules/gpu/src/global_motion.cpp index 7531c9327c..54c3c0c7ea 100644 --- a/modules/gpu/src/global_motion.cpp +++ b/modules/gpu/src/global_motion.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/graphcuts.cpp b/modules/gpu/src/graphcuts.cpp index 49230e65a9..b8c0d4ff9f 100644 --- a/modules/gpu/src/graphcuts.cpp +++ b/modules/gpu/src/graphcuts.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/hog.cpp b/modules/gpu/src/hog.cpp index 640993f957..b7274d79c2 100644 --- a/modules/gpu/src/hog.cpp +++ b/modules/gpu/src/hog.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/matrix_reductions.cpp b/modules/gpu/src/matrix_reductions.cpp index 67e65fc585..761abb525f 100644 --- a/modules/gpu/src/matrix_reductions.cpp +++ b/modules/gpu/src/matrix_reductions.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/mssegmentation.cpp b/modules/gpu/src/mssegmentation.cpp index 65b05b7c74..730664318b 100644 --- a/modules/gpu/src/mssegmentation.cpp +++ b/modules/gpu/src/mssegmentation.cpp @@ -39,7 +39,6 @@ // the use of this software, even if advised of the possibility of such damage. // //M*/ - #include "precomp.hpp" #if !defined HAVE_CUDA || defined(CUDA_DISABLER) diff --git a/modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu b/modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu index 5d1b46c448..c4a270afdd 100644 --- a/modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu +++ b/modules/gpu/src/nvidia/NCVBroxOpticalFlow.cu @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, @@ -1163,4 +1164,4 @@ NCVStatus NCVBroxOpticalFlow(const NCVBroxOpticalFlowDescriptor desc, return NCV_SUCCESS; } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/nvidia/NCVBroxOpticalFlow.hpp b/modules/gpu/src/nvidia/NCVBroxOpticalFlow.hpp index dde2c41b52..139f7bea8c 100644 --- a/modules/gpu/src/nvidia/NCVBroxOpticalFlow.hpp +++ b/modules/gpu/src/nvidia/NCVBroxOpticalFlow.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/NCVHaarObjectDetection.cu b/modules/gpu/src/nvidia/NCVHaarObjectDetection.cu index fb057ae79d..a91ef4abe9 100644 --- a/modules/gpu/src/nvidia/NCVHaarObjectDetection.cu +++ b/modules/gpu/src/nvidia/NCVHaarObjectDetection.cu @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp b/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp index 9f29206f06..8436630d73 100644 --- a/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp +++ b/modules/gpu/src/nvidia/NCVHaarObjectDetection.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, @@ -458,4 +459,4 @@ NCV_EXPORTS NCVStatus ncvHaarStoreNVBIN_host(const std::string &filename, -#endif // _ncvhaarobjectdetection_hpp_ \ No newline at end of file +#endif // _ncvhaarobjectdetection_hpp_ diff --git a/modules/gpu/src/nvidia/NPP_staging/NPP_staging.cu b/modules/gpu/src/nvidia/NPP_staging/NPP_staging.cu index f4ec9aace6..525feb68b7 100644 --- a/modules/gpu/src/nvidia/NPP_staging/NPP_staging.cu +++ b/modules/gpu/src/nvidia/NPP_staging/NPP_staging.cu @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/NPP_staging/NPP_staging.hpp b/modules/gpu/src/nvidia/NPP_staging/NPP_staging.hpp index 54c9ff5b92..073448e17c 100644 --- a/modules/gpu/src/nvidia/NPP_staging/NPP_staging.hpp +++ b/modules/gpu/src/nvidia/NPP_staging/NPP_staging.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/core/NCV.cu b/modules/gpu/src/nvidia/core/NCV.cu index 77e59cc5c1..63ff7f9591 100644 --- a/modules/gpu/src/nvidia/core/NCV.cu +++ b/modules/gpu/src/nvidia/core/NCV.cu @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, @@ -39,7 +40,6 @@ // //M*/ - #include #include #include @@ -906,4 +906,4 @@ NCVStatus ncvDrawRects_32u_device(Ncv32u *d_dst, return drawRectsWrapperDevice(d_dst, dstStride, dstWidth, dstHeight, d_rects, numRects, color, cuStream); } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/nvidia/core/NCV.hpp b/modules/gpu/src/nvidia/core/NCV.hpp index 703cb827b9..0394dba186 100644 --- a/modules/gpu/src/nvidia/core/NCV.hpp +++ b/modules/gpu/src/nvidia/core/NCV.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/core/NCVAlg.hpp b/modules/gpu/src/nvidia/core/NCVAlg.hpp index a1614720cc..3a0a282204 100644 --- a/modules/gpu/src/nvidia/core/NCVAlg.hpp +++ b/modules/gpu/src/nvidia/core/NCVAlg.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/core/NCVColorConversion.hpp b/modules/gpu/src/nvidia/core/NCVColorConversion.hpp index f208cf06f6..c1293f2b34 100644 --- a/modules/gpu/src/nvidia/core/NCVColorConversion.hpp +++ b/modules/gpu/src/nvidia/core/NCVColorConversion.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp b/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp index de78cf9deb..ec2f16ebb7 100644 --- a/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp +++ b/modules/gpu/src/nvidia/core/NCVPixelOperations.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/nvidia/core/NCVPyramid.cu b/modules/gpu/src/nvidia/core/NCVPyramid.cu index a3d8954786..3cb3a33f45 100644 --- a/modules/gpu/src/nvidia/core/NCVPyramid.cu +++ b/modules/gpu/src/nvidia/core/NCVPyramid.cu @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, @@ -602,4 +603,4 @@ template class NCVImagePyramid; #endif //_WIN32 -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/src/nvidia/core/NCVPyramid.hpp b/modules/gpu/src/nvidia/core/NCVPyramid.hpp index 8660ab24ea..183428afa6 100644 --- a/modules/gpu/src/nvidia/core/NCVPyramid.hpp +++ b/modules/gpu/src/nvidia/core/NCVPyramid.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, @@ -39,7 +40,6 @@ // //M*/ - #ifndef _ncvpyramid_hpp_ #define _ncvpyramid_hpp_ diff --git a/modules/gpu/src/nvidia/core/NCVRuntimeTemplates.hpp b/modules/gpu/src/nvidia/core/NCVRuntimeTemplates.hpp index 7b248a8324..33f001991b 100644 --- a/modules/gpu/src/nvidia/core/NCVRuntimeTemplates.hpp +++ b/modules/gpu/src/nvidia/core/NCVRuntimeTemplates.hpp @@ -1,6 +1,6 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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, @@ -10,7 +10,8 @@ // License Agreement // For Open Source Computer Vision Library // -// Copyright (C) 2009-2010, NVIDIA Corporation, all rights reserved. +// 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, diff --git a/modules/gpu/src/optical_flow.cpp b/modules/gpu/src/optical_flow.cpp index 41862809a8..afe4a148f9 100644 --- a/modules/gpu/src/optical_flow.cpp +++ b/modules/gpu/src/optical_flow.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/optical_flow_farneback.cpp b/modules/gpu/src/optical_flow_farneback.cpp index 91056a67a4..666dbf4f79 100644 --- a/modules/gpu/src/optical_flow_farneback.cpp +++ b/modules/gpu/src/optical_flow_farneback.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/orb.cpp b/modules/gpu/src/orb.cpp index 2e315a73d2..af224a5351 100644 --- a/modules/gpu/src/orb.cpp +++ b/modules/gpu/src/orb.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/precomp.cpp b/modules/gpu/src/precomp.cpp index 8e0d0db19f..c955cfceb3 100644 --- a/modules/gpu/src/precomp.cpp +++ b/modules/gpu/src/precomp.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/src/precomp.hpp b/modules/gpu/src/precomp.hpp index 7c53185107..f219089321 100644 --- a/modules/gpu/src/precomp.hpp +++ b/modules/gpu/src/precomp.hpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/pyrlk.cpp b/modules/gpu/src/pyrlk.cpp index ffc035c022..b6c925a111 100644 --- a/modules/gpu/src/pyrlk.cpp +++ b/modules/gpu/src/pyrlk.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/speckle_filtering.cpp b/modules/gpu/src/speckle_filtering.cpp index 4125434d67..0b97a20f5f 100644 --- a/modules/gpu/src/speckle_filtering.cpp +++ b/modules/gpu/src/speckle_filtering.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/split_merge.cpp b/modules/gpu/src/split_merge.cpp index 434c6e85cf..357749292f 100644 --- a/modules/gpu/src/split_merge.cpp +++ b/modules/gpu/src/split_merge.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/stereobm.cpp b/modules/gpu/src/stereobm.cpp index 43a5af17d7..e633bf0ad4 100644 --- a/modules/gpu/src/stereobm.cpp +++ b/modules/gpu/src/stereobm.cpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/gpu/src/stereobp.cpp b/modules/gpu/src/stereobp.cpp index 0e63cef0cb..1677f33446 100644 --- a/modules/gpu/src/stereobp.cpp +++ b/modules/gpu/src/stereobp.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/src/stereocsbp.cpp b/modules/gpu/src/stereocsbp.cpp index dd95832142..18077c04bc 100644 --- a/modules/gpu/src/stereocsbp.cpp +++ b/modules/gpu/src/stereocsbp.cpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/gpu/src/thread_wrappers.cpp b/modules/gpu/src/thread_wrappers.cpp index f8099aca91..e8ee19e54f 100644 --- a/modules/gpu/src/thread_wrappers.cpp +++ b/modules/gpu/src/thread_wrappers.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/thread_wrappers.h b/modules/gpu/src/thread_wrappers.h index 78e675216c..da811737d8 100644 --- a/modules/gpu/src/thread_wrappers.h +++ b/modules/gpu/src/thread_wrappers.h @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/tvl1flow.cpp b/modules/gpu/src/tvl1flow.cpp index a598a9ecf0..a16345ae09 100644 --- a/modules/gpu/src/tvl1flow.cpp +++ b/modules/gpu/src/tvl1flow.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/video_decoder.cpp b/modules/gpu/src/video_decoder.cpp index c1e8f86a4c..fe897895d6 100644 --- a/modules/gpu/src/video_decoder.cpp +++ b/modules/gpu/src/video_decoder.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/video_decoder.h b/modules/gpu/src/video_decoder.h index 634643b889..81bbef0e36 100644 --- a/modules/gpu/src/video_decoder.h +++ b/modules/gpu/src/video_decoder.h @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/video_parser.cpp b/modules/gpu/src/video_parser.cpp index 70187fcb2f..f20da8e9b5 100644 --- a/modules/gpu/src/video_parser.cpp +++ b/modules/gpu/src/video_parser.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/video_parser.h b/modules/gpu/src/video_parser.h index 44a53710bf..15700664b3 100644 --- a/modules/gpu/src/video_parser.h +++ b/modules/gpu/src/video_parser.h @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/src/video_reader.cpp b/modules/gpu/src/video_reader.cpp index 3224902c6d..79ba4089c5 100644 --- a/modules/gpu/src/video_reader.cpp +++ b/modules/gpu/src/video_reader.cpp @@ -7,7 +7,7 @@ // copy or use the software. // // -// License Agreement +// License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. diff --git a/modules/gpu/test/interpolation.hpp b/modules/gpu/test/interpolation.hpp index 8e723c5c08..3494e691d7 100644 --- a/modules/gpu/test/interpolation.hpp +++ b/modules/gpu/test/interpolation.hpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/main.cpp b/modules/gpu/test/main.cpp index fbd24c50d8..01a29618b0 100644 --- a/modules/gpu/test/main.cpp +++ b/modules/gpu/test/main.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/main_test_nvidia.h b/modules/gpu/test/main_test_nvidia.h index 173cbdbce1..9a3ae1e06a 100644 --- a/modules/gpu/test/main_test_nvidia.h +++ b/modules/gpu/test/main_test_nvidia.h @@ -1,3 +1,45 @@ +/*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*/ + #ifndef __main_test_nvidia_h__ #define __main_test_nvidia_h__ diff --git a/modules/gpu/test/nvidia/NCVAutoTestLister.hpp b/modules/gpu/test/nvidia/NCVAutoTestLister.hpp index 48ad754940..6ac5bc0cf6 100644 --- a/modules/gpu/test/nvidia/NCVAutoTestLister.hpp +++ b/modules/gpu/test/nvidia/NCVAutoTestLister.hpp @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _ncvautotestlister_hpp_ #define _ncvautotestlister_hpp_ diff --git a/modules/gpu/test/nvidia/NCVTest.hpp b/modules/gpu/test/nvidia/NCVTest.hpp index d2289eea02..22958e565d 100644 --- a/modules/gpu/test/nvidia/NCVTest.hpp +++ b/modules/gpu/test/nvidia/NCVTest.hpp @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _ncvtest_hpp_ #define _ncvtest_hpp_ diff --git a/modules/gpu/test/nvidia/NCVTestSourceProvider.hpp b/modules/gpu/test/nvidia/NCVTestSourceProvider.hpp index 0413fa563c..67b778abc6 100644 --- a/modules/gpu/test/nvidia/NCVTestSourceProvider.hpp +++ b/modules/gpu/test/nvidia/NCVTestSourceProvider.hpp @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _ncvtestsourceprovider_hpp_ #define _ncvtestsourceprovider_hpp_ diff --git a/modules/gpu/test/nvidia/TestCompact.cpp b/modules/gpu/test/nvidia/TestCompact.cpp index 273b56b501..9154101079 100644 --- a/modules/gpu/test/nvidia/TestCompact.cpp +++ b/modules/gpu/test/nvidia/TestCompact.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -130,4 +161,4 @@ bool TestCompact::deinit() return true; } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestCompact.h b/modules/gpu/test/nvidia/TestCompact.h index 8bb178428e..256cdf4cf9 100644 --- a/modules/gpu/test/nvidia/TestCompact.h +++ b/modules/gpu/test/nvidia/TestCompact.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testhypothesescompact_h_ #define _testhypothesescompact_h_ diff --git a/modules/gpu/test/nvidia/TestDrawRects.cpp b/modules/gpu/test/nvidia/TestDrawRects.cpp index 1525772fcd..3da458694a 100644 --- a/modules/gpu/test/nvidia/TestDrawRects.cpp +++ b/modules/gpu/test/nvidia/TestDrawRects.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -165,4 +196,4 @@ bool TestDrawRects::deinit() template class TestDrawRects; template class TestDrawRects; -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestDrawRects.h b/modules/gpu/test/nvidia/TestDrawRects.h index 79aa1b51bf..b64c133d50 100644 --- a/modules/gpu/test/nvidia/TestDrawRects.h +++ b/modules/gpu/test/nvidia/TestDrawRects.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testdrawrects_h_ #define _testdrawrects_h_ diff --git a/modules/gpu/test/nvidia/TestHaarCascadeApplication.cpp b/modules/gpu/test/nvidia/TestHaarCascadeApplication.cpp index 4867189606..01a9637b8d 100644 --- a/modules/gpu/test/nvidia/TestHaarCascadeApplication.cpp +++ b/modules/gpu/test/nvidia/TestHaarCascadeApplication.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER diff --git a/modules/gpu/test/nvidia/TestHaarCascadeApplication.h b/modules/gpu/test/nvidia/TestHaarCascadeApplication.h index efc25cb591..eaa4371745 100644 --- a/modules/gpu/test/nvidia/TestHaarCascadeApplication.h +++ b/modules/gpu/test/nvidia/TestHaarCascadeApplication.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testhaarcascadeapplication_h_ #define _testhaarcascadeapplication_h_ diff --git a/modules/gpu/test/nvidia/TestHaarCascadeLoader.cpp b/modules/gpu/test/nvidia/TestHaarCascadeLoader.cpp index 099596de0c..42552295d2 100644 --- a/modules/gpu/test/nvidia/TestHaarCascadeLoader.cpp +++ b/modules/gpu/test/nvidia/TestHaarCascadeLoader.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -124,4 +155,4 @@ bool TestHaarCascadeLoader::deinit() return true; } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestHaarCascadeLoader.h b/modules/gpu/test/nvidia/TestHaarCascadeLoader.h index 44054d3484..86c6324635 100644 --- a/modules/gpu/test/nvidia/TestHaarCascadeLoader.h +++ b/modules/gpu/test/nvidia/TestHaarCascadeLoader.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testhaarcascadeloader_h_ #define _testhaarcascadeloader_h_ diff --git a/modules/gpu/test/nvidia/TestHypothesesFilter.cpp b/modules/gpu/test/nvidia/TestHypothesesFilter.cpp index 7899cd98c1..f71a5f72d0 100644 --- a/modules/gpu/test/nvidia/TestHypothesesFilter.cpp +++ b/modules/gpu/test/nvidia/TestHypothesesFilter.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -177,4 +208,4 @@ bool TestHypothesesFilter::deinit() return true; } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestHypothesesFilter.h b/modules/gpu/test/nvidia/TestHypothesesFilter.h index 2084b3bd4b..f190785fe7 100644 --- a/modules/gpu/test/nvidia/TestHypothesesFilter.h +++ b/modules/gpu/test/nvidia/TestHypothesesFilter.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testhypothesesfilter_h_ #define _testhypothesesfilter_h_ diff --git a/modules/gpu/test/nvidia/TestHypothesesGrow.cpp b/modules/gpu/test/nvidia/TestHypothesesGrow.cpp index 685c50056f..5cb81ddf49 100644 --- a/modules/gpu/test/nvidia/TestHypothesesGrow.cpp +++ b/modules/gpu/test/nvidia/TestHypothesesGrow.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -135,4 +166,4 @@ bool TestHypothesesGrow::deinit() return true; } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestHypothesesGrow.h b/modules/gpu/test/nvidia/TestHypothesesGrow.h index d2f2fdaace..51e879f697 100644 --- a/modules/gpu/test/nvidia/TestHypothesesGrow.h +++ b/modules/gpu/test/nvidia/TestHypothesesGrow.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testhypothesesgrow_h_ #define _testhypothesesgrow_h_ diff --git a/modules/gpu/test/nvidia/TestIntegralImage.cpp b/modules/gpu/test/nvidia/TestIntegralImage.cpp index 4944e14f99..a0820a8216 100644 --- a/modules/gpu/test/nvidia/TestIntegralImage.cpp +++ b/modules/gpu/test/nvidia/TestIntegralImage.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -186,4 +217,4 @@ bool TestIntegralImage::deinit() template class TestIntegralImage; template class TestIntegralImage; -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestIntegralImage.h b/modules/gpu/test/nvidia/TestIntegralImage.h index 4dba575fe9..c4f58ba146 100644 --- a/modules/gpu/test/nvidia/TestIntegralImage.h +++ b/modules/gpu/test/nvidia/TestIntegralImage.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testintegralimage_h_ #define _testintegralimage_h_ diff --git a/modules/gpu/test/nvidia/TestIntegralImageSquared.cpp b/modules/gpu/test/nvidia/TestIntegralImageSquared.cpp index 6366fc4ce2..4f4e45d406 100644 --- a/modules/gpu/test/nvidia/TestIntegralImageSquared.cpp +++ b/modules/gpu/test/nvidia/TestIntegralImageSquared.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -118,4 +149,4 @@ bool TestIntegralImageSquared::deinit() return true; } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestIntegralImageSquared.h b/modules/gpu/test/nvidia/TestIntegralImageSquared.h index 8d20d732db..20e5ca8df3 100644 --- a/modules/gpu/test/nvidia/TestIntegralImageSquared.h +++ b/modules/gpu/test/nvidia/TestIntegralImageSquared.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testintegralimagesquared_h_ #define _testintegralimagesquared_h_ diff --git a/modules/gpu/test/nvidia/TestRectStdDev.cpp b/modules/gpu/test/nvidia/TestRectStdDev.cpp index 3a31b0d0c0..c019b0ee3c 100644 --- a/modules/gpu/test/nvidia/TestRectStdDev.cpp +++ b/modules/gpu/test/nvidia/TestRectStdDev.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -181,4 +212,4 @@ bool TestRectStdDev::deinit() return true; } -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestRectStdDev.h b/modules/gpu/test/nvidia/TestRectStdDev.h index d1f2e759e4..e22fbe87c7 100644 --- a/modules/gpu/test/nvidia/TestRectStdDev.h +++ b/modules/gpu/test/nvidia/TestRectStdDev.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testrectstddev_h_ #define _testrectstddev_h_ diff --git a/modules/gpu/test/nvidia/TestResize.cpp b/modules/gpu/test/nvidia/TestResize.cpp index cb68a18e68..83443c88b8 100644 --- a/modules/gpu/test/nvidia/TestResize.cpp +++ b/modules/gpu/test/nvidia/TestResize.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -162,4 +193,4 @@ bool TestResize::deinit() template class TestResize; template class TestResize; -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestResize.h b/modules/gpu/test/nvidia/TestResize.h index ee6eb617e8..b2b28a83ff 100644 --- a/modules/gpu/test/nvidia/TestResize.h +++ b/modules/gpu/test/nvidia/TestResize.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testresize_h_ #define _testresize_h_ diff --git a/modules/gpu/test/nvidia/TestTranspose.cpp b/modules/gpu/test/nvidia/TestTranspose.cpp index 74e96b1338..5f71da4f8f 100644 --- a/modules/gpu/test/nvidia/TestTranspose.cpp +++ b/modules/gpu/test/nvidia/TestTranspose.cpp @@ -1,13 +1,44 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ #if !defined CUDA_DISABLER @@ -149,4 +180,4 @@ bool TestTranspose::deinit() template class TestTranspose; template class TestTranspose; -#endif /* CUDA_DISABLER */ \ No newline at end of file +#endif /* CUDA_DISABLER */ diff --git a/modules/gpu/test/nvidia/TestTranspose.h b/modules/gpu/test/nvidia/TestTranspose.h index 2f8ccf41c2..c83306fd1c 100644 --- a/modules/gpu/test/nvidia/TestTranspose.h +++ b/modules/gpu/test/nvidia/TestTranspose.h @@ -1,13 +1,45 @@ -/* - * Copyright 1993-2010 NVIDIA Corporation. All rights reserved. - * - * NVIDIA Corporation and its licensors retain all intellectual - * property and proprietary rights in and to this software and - * related documentation and any modifications thereto. - * Any use, reproduction, disclosure, or distribution of this - * software and related documentation without an express license - * agreement from NVIDIA Corporation is strictly prohibited. - */ +/*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*/ + #ifndef _testtranspose_h_ #define _testtranspose_h_ diff --git a/modules/gpu/test/nvidia/main_nvidia.cpp b/modules/gpu/test/nvidia/main_nvidia.cpp index 86839a4421..07083151ce 100644 --- a/modules/gpu/test/nvidia/main_nvidia.cpp +++ b/modules/gpu/test/nvidia/main_nvidia.cpp @@ -1,3 +1,45 @@ +/*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*/ + #if defined _MSC_VER && _MSC_VER >= 1200 # pragma warning (disable : 4408 4201 4100) #endif diff --git a/modules/gpu/test/test_bgfg.cpp b/modules/gpu/test/test_bgfg.cpp index 9847fcfab7..0ab89842d6 100644 --- a/modules/gpu/test/test_bgfg.cpp +++ b/modules/gpu/test/test_bgfg.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_calib3d.cpp b/modules/gpu/test/test_calib3d.cpp index 5a83662e6e..5de3d34df1 100644 --- a/modules/gpu/test/test_calib3d.cpp +++ b/modules/gpu/test/test_calib3d.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_color.cpp b/modules/gpu/test/test_color.cpp index 112a749c61..4bd53c9194 100644 --- a/modules/gpu/test/test_color.cpp +++ b/modules/gpu/test/test_color.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_copy_make_border.cpp b/modules/gpu/test/test_copy_make_border.cpp index 99c565b38a..24a75c0235 100644 --- a/modules/gpu/test/test_copy_make_border.cpp +++ b/modules/gpu/test/test_copy_make_border.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_core.cpp b/modules/gpu/test/test_core.cpp index af86efc8ba..d02c3c2686 100644 --- a/modules/gpu/test/test_core.cpp +++ b/modules/gpu/test/test_core.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_denoising.cpp b/modules/gpu/test/test_denoising.cpp index df84817f84..e480cf4680 100644 --- a/modules/gpu/test/test_denoising.cpp +++ b/modules/gpu/test/test_denoising.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_features2d.cpp b/modules/gpu/test/test_features2d.cpp index 01741d8c6f..a7d80f98d8 100644 --- a/modules/gpu/test/test_features2d.cpp +++ b/modules/gpu/test/test_features2d.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_filters.cpp b/modules/gpu/test/test_filters.cpp index b854da07ae..f1fd3814f3 100644 --- a/modules/gpu/test/test_filters.cpp +++ b/modules/gpu/test/test_filters.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_global_motion.cpp b/modules/gpu/test/test_global_motion.cpp index 48fc428cee..a156f93107 100644 --- a/modules/gpu/test/test_global_motion.cpp +++ b/modules/gpu/test/test_global_motion.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_gpumat.cpp b/modules/gpu/test/test_gpumat.cpp index a5c38da4f4..c7a0cabcbc 100644 --- a/modules/gpu/test/test_gpumat.cpp +++ b/modules/gpu/test/test_gpumat.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/test/test_hough.cpp b/modules/gpu/test/test_hough.cpp index e4d5ad6cf5..f876a7a2b0 100644 --- a/modules/gpu/test/test_hough.cpp +++ b/modules/gpu/test/test_hough.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_imgproc.cpp b/modules/gpu/test/test_imgproc.cpp index ca64edf178..3341737415 100644 --- a/modules/gpu/test/test_imgproc.cpp +++ b/modules/gpu/test/test_imgproc.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_labeling.cpp b/modules/gpu/test/test_labeling.cpp index b4fd08a26f..2e85cc3d05 100644 --- a/modules/gpu/test/test_labeling.cpp +++ b/modules/gpu/test/test_labeling.cpp @@ -1,31 +1,31 @@ /*M/////////////////////////////////////////////////////////////////////////////////////// // -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. +// 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. +// 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 +// License Agreement +// For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2008-2011, Willow Garage Inc., 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: // -// * Redistributions of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. +// * Redistribution's of source code must retain the above copyright notice, +// this list of conditions and the following disclaimer. // -// * Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. +// * 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. +// * 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 @@ -37,6 +37,7 @@ // and on any theory of liability, whether in contract, strict liability, // or tort (including negligence or otherwise) arising in any way out of // the use of this software, even if advised of the possibility of such damage. +// //M*/ #include "test_precomp.hpp" diff --git a/modules/gpu/test/test_nvidia.cpp b/modules/gpu/test/test_nvidia.cpp index 53ed8c2235..d713b41bdb 100644 --- a/modules/gpu/test/test_nvidia.cpp +++ b/modules/gpu/test/test_nvidia.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_objdetect.cpp b/modules/gpu/test/test_objdetect.cpp index cc66d6a313..aaeaa54e66 100644 --- a/modules/gpu/test/test_objdetect.cpp +++ b/modules/gpu/test/test_objdetect.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_opengl.cpp b/modules/gpu/test/test_opengl.cpp index c6aa945ac9..8c0f64a937 100644 --- a/modules/gpu/test/test_opengl.cpp +++ b/modules/gpu/test/test_opengl.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_optflow.cpp b/modules/gpu/test/test_optflow.cpp index ee60a432f4..595e46cbb5 100644 --- a/modules/gpu/test/test_optflow.cpp +++ b/modules/gpu/test/test_optflow.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_precomp.cpp b/modules/gpu/test/test_precomp.cpp index 8121ae405b..0fb6521809 100644 --- a/modules/gpu/test/test_precomp.cpp +++ b/modules/gpu/test/test_precomp.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_precomp.hpp b/modules/gpu/test/test_precomp.hpp index 9be9863ca8..11a71e452c 100644 --- a/modules/gpu/test/test_precomp.hpp +++ b/modules/gpu/test/test_precomp.hpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_pyramids.cpp b/modules/gpu/test/test_pyramids.cpp index 43665966ec..6b0540fc10 100644 --- a/modules/gpu/test/test_pyramids.cpp +++ b/modules/gpu/test/test_pyramids.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_remap.cpp b/modules/gpu/test/test_remap.cpp index 13c8a59b7b..eb4b9ece85 100644 --- a/modules/gpu/test/test_remap.cpp +++ b/modules/gpu/test/test_remap.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_resize.cpp b/modules/gpu/test/test_resize.cpp index 729dcc3208..593c891e6a 100644 --- a/modules/gpu/test/test_resize.cpp +++ b/modules/gpu/test/test_resize.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_stream.cpp b/modules/gpu/test/test_stream.cpp index 1ac8ae8bd4..a86d8ff619 100644 --- a/modules/gpu/test/test_stream.cpp +++ b/modules/gpu/test/test_stream.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/gpu/test/test_threshold.cpp b/modules/gpu/test/test_threshold.cpp index e56975e873..25a7a476a9 100644 --- a/modules/gpu/test/test_threshold.cpp +++ b/modules/gpu/test/test_threshold.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_video.cpp b/modules/gpu/test/test_video.cpp index b9502814a1..f28cd3cf4a 100644 --- a/modules/gpu/test/test_video.cpp +++ b/modules/gpu/test/test_video.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_warp_affine.cpp b/modules/gpu/test/test_warp_affine.cpp index 892c5b7c62..43bf0f6d9e 100644 --- a/modules/gpu/test/test_warp_affine.cpp +++ b/modules/gpu/test/test_warp_affine.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/gpu/test/test_warp_perspective.cpp b/modules/gpu/test/test_warp_perspective.cpp index d421d94fc2..d225e58b66 100644 --- a/modules/gpu/test/test_warp_perspective.cpp +++ b/modules/gpu/test/test_warp_perspective.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/nonfree/include/opencv2/nonfree/gpu.hpp b/modules/nonfree/include/opencv2/nonfree/gpu.hpp index 911022669d..c8a24e01ec 100644 --- a/modules/nonfree/include/opencv2/nonfree/gpu.hpp +++ b/modules/nonfree/include/opencv2/nonfree/gpu.hpp @@ -22,7 +22,7 @@ // // * 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. +// 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. diff --git a/modules/nonfree/perf/perf_gpu.cpp b/modules/nonfree/perf/perf_gpu.cpp index c00955c894..c4115f0b26 100644 --- a/modules/nonfree/perf/perf_gpu.cpp +++ b/modules/nonfree/perf/perf_gpu.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/nonfree/src/cuda/surf.cu b/modules/nonfree/src/cuda/surf.cu index b82e2c3863..3f34cc745e 100644 --- a/modules/nonfree/src/cuda/surf.cu +++ b/modules/nonfree/src/cuda/surf.cu @@ -38,11 +38,6 @@ // 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. // -// Copyright (c) 2010, Paul Furgale, Chi Hay Tong -// -// The original code was written by Paul Furgale and Chi Hay Tong -// and later optimized and prepared for integration into OpenCV by Itseez. -// //M*/ #if !defined CUDA_DISABLER diff --git a/modules/nonfree/src/cuda/vibe.cu b/modules/nonfree/src/cuda/vibe.cu index ff489eeab9..6d4653f2a6 100644 --- a/modules/nonfree/src/cuda/vibe.cu +++ b/modules/nonfree/src/cuda/vibe.cu @@ -28,7 +28,7 @@ // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and -// any express or bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/nonfree/src/surf_gpu.cpp b/modules/nonfree/src/surf_gpu.cpp index dec9c0d2dc..eabbd78b4c 100644 --- a/modules/nonfree/src/surf_gpu.cpp +++ b/modules/nonfree/src/surf_gpu.cpp @@ -22,13 +22,13 @@ // // * 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. +// 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 bpied warranties, including, but not limited to, the bpied +// 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 diff --git a/modules/nonfree/test/test_gpu.cpp b/modules/nonfree/test/test_gpu.cpp index 2993cf5676..ece82f316e 100644 --- a/modules/nonfree/test/test_gpu.cpp +++ b/modules/nonfree/test/test_gpu.cpp @@ -7,10 +7,11 @@ // 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) 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, @@ -23,7 +24,7 @@ // 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 +// * 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 diff --git a/modules/superres/include/opencv2/superres/optical_flow.hpp b/modules/superres/include/opencv2/superres/optical_flow.hpp index bb344fc92f..7a0ed833f4 100644 --- a/modules/superres/include/opencv2/superres/optical_flow.hpp +++ b/modules/superres/include/opencv2/superres/optical_flow.hpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/include/opencv2/superres/superres.hpp b/modules/superres/include/opencv2/superres/superres.hpp index e3e7a1e8dc..1245c122a6 100644 --- a/modules/superres/include/opencv2/superres/superres.hpp +++ b/modules/superres/include/opencv2/superres/superres.hpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/perf/perf_main.cpp b/modules/superres/perf/perf_main.cpp index 80575d89f0..adc69e6e8b 100644 --- a/modules/superres/perf/perf_main.cpp +++ b/modules/superres/perf/perf_main.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace perf; diff --git a/modules/superres/perf/perf_precomp.cpp b/modules/superres/perf/perf_precomp.cpp index 8552ac3d42..81f16e8f14 100644 --- a/modules/superres/perf/perf_precomp.cpp +++ b/modules/superres/perf/perf_precomp.cpp @@ -1 +1,43 @@ +/*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 "perf_precomp.hpp" diff --git a/modules/superres/perf/perf_precomp.hpp b/modules/superres/perf/perf_precomp.hpp index 8232a26edb..85b6c11f7e 100644 --- a/modules/superres/perf/perf_precomp.hpp +++ b/modules/superres/perf/perf_precomp.hpp @@ -1,3 +1,45 @@ +/*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*/ + #ifdef __GNUC__ # pragma GCC diagnostic ignored "-Wmissing-declarations" # if defined __clang__ || defined __APPLE__ diff --git a/modules/superres/perf/perf_superres.cpp b/modules/superres/perf/perf_superres.cpp index eec01a7853..8651b55325 100644 --- a/modules/superres/perf/perf_superres.cpp +++ b/modules/superres/perf/perf_superres.cpp @@ -1,3 +1,45 @@ +/*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 "perf_precomp.hpp" using namespace std; diff --git a/modules/superres/src/btv_l1.cpp b/modules/superres/src/btv_l1.cpp index 71c68365d0..0d96a9d17f 100644 --- a/modules/superres/src/btv_l1.cpp +++ b/modules/superres/src/btv_l1.cpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/btv_l1_gpu.cpp b/modules/superres/src/btv_l1_gpu.cpp index 4f7b4f15a4..b93bcfd577 100644 --- a/modules/superres/src/btv_l1_gpu.cpp +++ b/modules/superres/src/btv_l1_gpu.cpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/cuda/btv_l1_gpu.cu b/modules/superres/src/cuda/btv_l1_gpu.cu index 772e11d4fe..b27671aa0d 100644 --- a/modules/superres/src/cuda/btv_l1_gpu.cu +++ b/modules/superres/src/cuda/btv_l1_gpu.cu @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/frame_source.cpp b/modules/superres/src/frame_source.cpp index b22d0d03c1..052141616d 100644 --- a/modules/superres/src/frame_source.cpp +++ b/modules/superres/src/frame_source.cpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, @@ -39,7 +39,6 @@ // the use of this software, even if advised of the possibility of such damage. // //M*/ - #include "precomp.hpp" using namespace std; diff --git a/modules/superres/src/input_array_utility.cpp b/modules/superres/src/input_array_utility.cpp index 8d905bf2d3..5a6682526a 100644 --- a/modules/superres/src/input_array_utility.cpp +++ b/modules/superres/src/input_array_utility.cpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/input_array_utility.hpp b/modules/superres/src/input_array_utility.hpp index 790d6216b0..975783dc6f 100644 --- a/modules/superres/src/input_array_utility.hpp +++ b/modules/superres/src/input_array_utility.hpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/optical_flow.cpp b/modules/superres/src/optical_flow.cpp index 8c8454c8a2..12642175d2 100644 --- a/modules/superres/src/optical_flow.cpp +++ b/modules/superres/src/optical_flow.cpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/precomp.cpp b/modules/superres/src/precomp.cpp index 111385282e..3c01a2596d 100644 --- a/modules/superres/src/precomp.cpp +++ b/modules/superres/src/precomp.cpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/precomp.hpp b/modules/superres/src/precomp.hpp index 2b4d0d9d64..82b591b3c2 100644 --- a/modules/superres/src/precomp.hpp +++ b/modules/superres/src/precomp.hpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/ring_buffer.hpp b/modules/superres/src/ring_buffer.hpp index 3c51d7a26d..a0c0c04b5e 100644 --- a/modules/superres/src/ring_buffer.hpp +++ b/modules/superres/src/ring_buffer.hpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/src/super_resolution.cpp b/modules/superres/src/super_resolution.cpp index 73a2147ef0..23836e1b75 100644 --- a/modules/superres/src/super_resolution.cpp +++ b/modules/superres/src/super_resolution.cpp @@ -11,7 +11,7 @@ // For Open Source Computer Vision Library // // Copyright (C) 2000-2008, Intel Corporation, all rights reserved. -// Copyright (C) 2009-2011, Willow Garage Inc., 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, diff --git a/modules/superres/test/test_main.cpp b/modules/superres/test/test_main.cpp index 146e262850..b1998b9320 100644 --- a/modules/superres/test/test_main.cpp +++ b/modules/superres/test/test_main.cpp @@ -1,3 +1,45 @@ +/*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 "test_precomp.hpp" CV_TEST_MAIN("superres") diff --git a/modules/superres/test/test_precomp.cpp b/modules/superres/test/test_precomp.cpp index 5956e13e3e..0fb6521809 100644 --- a/modules/superres/test/test_precomp.cpp +++ b/modules/superres/test/test_precomp.cpp @@ -1 +1,43 @@ +/*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 "test_precomp.hpp" diff --git a/modules/superres/test/test_precomp.hpp b/modules/superres/test/test_precomp.hpp index 84c0a76ad2..0371c34a91 100644 --- a/modules/superres/test/test_precomp.hpp +++ b/modules/superres/test/test_precomp.hpp @@ -1,3 +1,45 @@ +/*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*/ + #ifdef __GNUC__ # pragma GCC diagnostic ignored "-Wmissing-declarations" # if defined __clang__ || defined __APPLE__ diff --git a/modules/superres/test/test_superres.cpp b/modules/superres/test/test_superres.cpp index 44d6a7a2a0..b4a546c621 100644 --- a/modules/superres/test/test_superres.cpp +++ b/modules/superres/test/test_superres.cpp @@ -1,3 +1,45 @@ +/*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 "test_precomp.hpp" class AllignedFrameSource : public cv::superres::FrameSource diff --git a/modules/ts/include/opencv2/ts/gpu_perf.hpp b/modules/ts/include/opencv2/ts/gpu_perf.hpp index 9fcf85db9a..93caf02702 100644 --- a/modules/ts/include/opencv2/ts/gpu_perf.hpp +++ b/modules/ts/include/opencv2/ts/gpu_perf.hpp @@ -1,3 +1,45 @@ +/*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*/ + #ifndef __OPENCV_GPU_PERF_UTILITY_HPP__ #define __OPENCV_GPU_PERF_UTILITY_HPP__ diff --git a/modules/ts/include/opencv2/ts/gpu_test.hpp b/modules/ts/include/opencv2/ts/gpu_test.hpp index 4743c3d585..7f9082509f 100644 --- a/modules/ts/include/opencv2/ts/gpu_test.hpp +++ b/modules/ts/include/opencv2/ts/gpu_test.hpp @@ -1,3 +1,45 @@ +/*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*/ + #ifndef __OPENCV_GPU_TEST_UTILITY_HPP__ #define __OPENCV_GPU_TEST_UTILITY_HPP__ diff --git a/modules/ts/src/gpu_perf.cpp b/modules/ts/src/gpu_perf.cpp index a81dd13385..1a18d96015 100644 --- a/modules/ts/src/gpu_perf.cpp +++ b/modules/ts/src/gpu_perf.cpp @@ -1,3 +1,45 @@ +/*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/ts/gpu_perf.hpp" #include "opencv2/core/gpumat.hpp" diff --git a/modules/ts/src/gpu_test.cpp b/modules/ts/src/gpu_test.cpp index 2ac9467b44..6f839c341c 100644 --- a/modules/ts/src/gpu_test.cpp +++ b/modules/ts/src/gpu_test.cpp @@ -1,3 +1,45 @@ +/*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/ts/gpu_test.hpp" #include From 38693ef37c39b7327cbc06eb80782ee31e968c8d Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Fri, 22 Mar 2013 15:10:54 +0400 Subject: [PATCH 06/31] fixed http://code.opencv.org/issues/2899 --- modules/core/include/opencv2/core/operations.hpp | 3 +++ modules/core/test/test_io.cpp | 13 ++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/operations.hpp b/modules/core/include/opencv2/core/operations.hpp index 1ee96bb09f..1170fc4074 100644 --- a/modules/core/include/opencv2/core/operations.hpp +++ b/modules/core/include/opencv2/core/operations.hpp @@ -2917,6 +2917,9 @@ CV_EXPORTS FileStorage& operator << (FileStorage& fs, const string& str); static inline FileStorage& operator << (FileStorage& fs, const char* str) { return (fs << string(str)); } +static inline FileStorage& operator << (FileStorage& fs, char* value) +{ return (fs << string(value)); } + inline FileNode::FileNode() : fs(0), node(0) {} inline FileNode::FileNode(const CvFileStorage* _fs, const CvFileNode* _node) : fs(_fs), node(_node) {} diff --git a/modules/core/test/test_io.cpp b/modules/core/test/test_io.cpp index 6b55eb2bb1..33eb78da55 100644 --- a/modules/core/test/test_io.cpp +++ b/modules/core/test/test_io.cpp @@ -447,10 +447,21 @@ protected: catch(...) { ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH); - } + } } }; TEST(Core_InputOutput, huge) { CV_BigMatrixIOTest test; test.safe_run(); } */ +TEST(Core_InputOutput, FileStorage) +{ + std::string file = cv::tempfile(".xml"); + cv::FileStorage f(file, cv::FileStorage::WRITE); + + char arr[66]; + sprintf(arr, "sprintf is hell %d", 666); + EXPECT_NO_THROW(f << arr); +} + + From a4815cf359006d33768857a2e6702c8f92c644ed Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Fri, 22 Mar 2013 15:12:55 +0400 Subject: [PATCH 07/31] removed extra whitespaces --- modules/core/test/test_io.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/modules/core/test/test_io.cpp b/modules/core/test/test_io.cpp index 33eb78da55..bf976cf543 100644 --- a/modules/core/test/test_io.cpp +++ b/modules/core/test/test_io.cpp @@ -447,7 +447,7 @@ protected: catch(...) { ts->set_failed_test_info(cvtest::TS::FAIL_MISMATCH); - } + } } }; @@ -463,5 +463,3 @@ TEST(Core_InputOutput, FileStorage) sprintf(arr, "sprintf is hell %d", 666); EXPECT_NO_THROW(f << arr); } - - From 2be7d9b4d50e313ece9de13997daa60ca2ffdd8b Mon Sep 17 00:00:00 2001 From: Vadim Pisarevsky Date: Sun, 24 Mar 2013 23:48:35 +0400 Subject: [PATCH 08/31] added tutorial by Wolf Kienzle on using "image watch" plugin for ms visual studio --- .../images/visual_studio_image_watch.png | Bin 0 -> 18597 bytes .../table_of_content_introduction.rst | 16 ++ .../images/breakpoint.png | Bin 0 -> 4125 bytes .../images/edges_zoom.png | Bin 0 -> 20677 bytes .../images/help_button.jpg | Bin 0 -> 60094 bytes .../images/input_zoom.png | Bin 0 -> 22421 bytes .../images/toolwindow.jpg | Bin 0 -> 123051 bytes .../images/viewer.jpg | Bin 0 -> 80268 bytes .../images/viewer_context_menu.png | Bin 0 -> 30009 bytes .../images/visual_studio_image_watch.png | Bin 0 -> 18597 bytes .../images/vs_locals.png | Bin 0 -> 4865 bytes .../windows_visual_studio_image_watch.rst | 144 ++++++++++++++++++ 12 files changed, 160 insertions(+) create mode 100755 doc/tutorials/introduction/table_of_content_introduction/images/visual_studio_image_watch.png create mode 100755 doc/tutorials/introduction/windows_visual_studio_image_watch/images/breakpoint.png create mode 100755 doc/tutorials/introduction/windows_visual_studio_image_watch/images/edges_zoom.png create mode 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/help_button.jpg create mode 100755 doc/tutorials/introduction/windows_visual_studio_image_watch/images/input_zoom.png create mode 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/toolwindow.jpg create mode 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/images/viewer.jpg create mode 100755 doc/tutorials/introduction/windows_visual_studio_image_watch/images/viewer_context_menu.png create mode 100755 doc/tutorials/introduction/windows_visual_studio_image_watch/images/visual_studio_image_watch.png create mode 100755 doc/tutorials/introduction/windows_visual_studio_image_watch/images/vs_locals.png create mode 100644 doc/tutorials/introduction/windows_visual_studio_image_watch/windows_visual_studio_image_watch.rst diff --git a/doc/tutorials/introduction/table_of_content_introduction/images/visual_studio_image_watch.png b/doc/tutorials/introduction/table_of_content_introduction/images/visual_studio_image_watch.png new file mode 100755 index 0000000000000000000000000000000000000000..e693344df85b3a486630b43e8c779686ad1b4fa0 GIT binary patch literal 18597 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 OpenCV 2.4 + + *Author:* Wolf Kienzle + + You will learn how to visualize OpenCV matrices and images within Visual Studio 2012. + + =========== ====================================================== + + .. |WinVSVis| image:: images/visual_studio_image_watch.png + :height: 90pt + :width: 90pt + * **Desktop Java** .. tabularcolumns:: m{100pt} m{300pt} @@ -278,6 +293,7 @@ world of the OpenCV. ../linux_eclipse/linux_eclipse ../windows_install/windows_install ../windows_visual_studio_Opencv/windows_visual_studio_Opencv + ../windows_visual_studio_image_watch/windows_visual_studio_image_watch ../desktop_java/java_dev_intro ../android_binary_package/android_dev_intro ../android_binary_package/O4A_SDK diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/breakpoint.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/breakpoint.png new file mode 100755 index 0000000000000000000000000000000000000000..2597a8deb854fc6a596836fdbcc0e58a31933ab5 GIT binary patch literal 4125 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 auy1uR+xl!3HTBQW-p10wqR#B<{r>}jHf)ao literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/edges_zoom.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/edges_zoom.png new file mode 100755 index 0000000000000000000000000000000000000000..8c76959988eb6a97b884d7a3903f77169ce69e56 GIT binary patch literal 20677 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 Y-FlxCCbw<8_755%A03KabpCVfFIq!_B>(^b literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/input_zoom.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/input_zoom.png new file mode 100755 index 0000000000000000000000000000000000000000..d4e2df7fb0efcb89c3bc5418840ca804ee1aba88 GIT binary patch literal 22421 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

    _eMoaBYG@Z9UQV}X4-{} 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/viewer.jpg b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/viewer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..95f4b81a58394c5e2787636e17ea013d0e949bb7 GIT binary patch literal 80268 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 #`@*GB!Ur6QQQ$Wu1C~2+(($Qn&)u> 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 literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/images/visual_studio_image_watch.png b/doc/tutorials/introduction/windows_visual_studio_image_watch/images/visual_studio_image_watch.png new file mode 100755 index 0000000000000000000000000000000000000000..e693344df85b3a486630b43e8c779686ad1b4fa0 GIT binary patch literal 18597 zcmV)cK&ZcoP)%xKL7v#8FWQhbW?9;ba!ELWdKcSV{&hEZ)S8L zPiAImV`YEsHE{p{NFqr@K~#8N?VSZ!R>}Uy*?V`_!fsJPKtj3{Py`E91lzR`yAiRl z5L;KU8|?1xUc0-y1B((RKmXsnfQzoRd)NK%-RnHh_c`ax%$ak}eCJm)=e)1hqsLEp z_~`K$Xy@px_X%#Bb&0J1fsSM zVVy@8?jBS54Vj@+naiglL`Gf_edRonTZXet|0k{OIOkeUfYw^ zoi|8+B? zTiDzI?-@g(KPB(1+7AcXD^r8Xnw=Ch6rh&ieht zF5k8s^zXp#2F*Az|DcFSEVrhQPkWkqetm+! zrN1yeUCV0Sid=t_KuU75;MzBW|4}I^p1UKfvC`U(HKj|l%FN&!!TN{M~IrgfXR z_IC2(zbAb~f+O(TxRW|_&hkv+-n}O-;y-^a-Or@XL@75uJ~4?mf+S6VnnF@iGRcpw zQfb~{uEZp0$`X=4O<8i{8xmsfb7<#&?!BGqQTYiZscXD`&FeSuq|ap}Cnaj~6W>Vw zYdKf0sZvUc$Dw=xbRduI+0!b_Tm<{ z0qaTYsXS*JmBO|${M>UsB{yfo8e?W!5?vh+7TkRCw&U0Nm81QHi8M4eLBFUG!P{Xq(w;!N*d@=xyK?R<*dg?!}04J#4UBP#K%nR-I zh4l<5X=qISUJH1xxk?h}mIa`rQ=M&hV>LN{xAavBZo2U_r>|Y0{?e0dy83_}hY#R? z>Lt8*$htdG(mj%*AJc69ZnnM9%)~;(4Qekr#;w=CXa4X!O>Mjwd-m~Lf>*Y&z{t5P zSCUeAv#k^P?Yi+?nmiZQ218v-!mmiB*GH+R>&(>4Q9L;`ffmiXr_O^XKICUV-(Tm! zBac(ZqZX^LzyI9H+}b^f+TMX2dy+O?^*2jjjo|3}*J-`w9QR&5CwS3LRyTciMCR3WB4Ft~o*tf*f#64kbnzv4!%a=CSGA|jE_zm%KL`B7Z)>rud zN?(oOr?)QCa?=^^WiX&uj~}4MmdhMIcZ?bfPqORY3wE72jNOD^*qtW9#759%{#FK_ zeaNwU&$t;a4oqsv2T~&U&K%^x_As1_*wA6tY7U*eg1WmUjdba}DvjVPlPO$opoZX6 z6B|>rLnwRq?PJrlK+3l2&%;-uh0iUbv`tyYt=Pxr@$J#hYr%*e_cT`_?j}KAc6be# z!#+9hv}RRIrDV=7?LscCVuT!hsLA=erLRVC?DGg#TzW)ghS2os{oBmAB#uyg3=0pQ zAYjvR!j4{L-o=MpfAwp{7x!;4c-v9Bu0Jl0Q&d`Keki?S{g5{JG;K}?zfQFA^`TSm z={yi3&n+3r+VihdRrJ$C44bx{SUET|trfO56=~eGDLw(CxhyV0YD(bbiZS^5G^1Ou zg>2fto^9u!rj?1gzP6G69eioh#D{^>R=O<5UfV$Bd|FfeNNm*Y{XY5I5{Ck!lR>Hdldb*^fJFRML)XA z@uQcB{{MQ2lq4SAyugje?@o!vKVCyKOCNT;{IFN?)d`M!xSO(CT9og*<4#S$4AN$l$c%{eJD zdgI@`At|kaB(=hmkW6yoYoem>5$J76yZPsdl5?VBUZu`)|5+&|g*S0Ayu5dT1N+Vr znRXBAUSB6BlMow4oZL&|>sVsr;x+fHS%H#gN{Uy{5heA~pIr4xoaR0wqvbw-&6bCH zLv)nnOMkq1XQ?!aS23#o3nsQJPm5{k@pc@0MmEQz(>!9{V>em)U9Eb(d6W2c369!7 zmP(Fh80%ZnW!mAl5`1oc0Ihm;rlqqRr3?(HAH0lba+8k_&!S7G+BC1=jlG#MmL9D* z^i;@=I7*)eHQ1(kgEol+)BR{P@jS7|#^P*eO2J&((hD8nN)(KuF<7-c}DHLueqP}loS`q{*_Z0KXD>s zhR^ydoUAC;`q#sA(61``-26^h8B}4z18L{(ddijdVExrto*$n>rQ$mD+IU+Y;u#a` zRiN$UL&QBhLN`xWHfd%9lh`w%4K;@DNmENv3~%N};M%*Iqfe&<&aatFJ6~UX)6u*+ z;fG$Nm47@XN36!8SY!62y^#`oER?*3$}nT+ZW`I-rSsy=1XMC(+*ui@t6P!dUk3Ev zbWbjMf?Bx@2)_*%$NJ#be^u%i3=x~CY*mpJmm*1daD)wqP7|Z@6VBsX#ffnTp7Q$2 z2CBNbu>OwHNr{AaDo?YisS^D9_Fh`luf+D-?}~5qwF6v9a}*M;uKx=NPJYhfPId4a zvhyv$r@~s$K4cx5rT^%|{M4W;8?Hq2c;7_YcO1w)O~n+BOl*Zu$3;XuKS~d;3T#dz zc<-dPcn$j{mEgFC1UGUaV97;w^qG{vg$?2Ow`)hcbhK~JoTG2&D?geNZ!Q#qoA8UM zW0j(hhM;dcfIHDU@vQ8_rb`FuQo)kR=i&a!)|mRt*VH2=lH;paa5?G)VLlbHDN~g? z_3QD|Pu0-NRE*$#N&*u&Fnb6;)vH7OI@K^T^<>tGr`*~!5YK9p&`g*nMlrFi3%+S8 zI{NA=yj`lW^*w?~e8Qep%UH5>Da+?h{wpLnlGXn8sX20A+Oe8VYDvq1OL(pZX5>NY z)$N={@Fd!_>BB9}5RYMre{~uKZzl5DVf?C=XPf3pXm}jl=Nr?mc^TqKFO&FE@2YLm1jGtQKND+V z1oyTNro2mE?kPqSBN*A#krvZWX$X$FzK&XMRoJ4D?(`JNFSEumYwH#6-Mi2I6YIVv z!6`hxaDa^~=gG*nz^wKFR&UzFL+Q(tlN-`7a6Zq}y}jH^wQ4O{eJP5F!(sAp-b`7x zj#ab9Qln{Owq1Wia@0lIS1Lt=0SnnUV=z{FI(QA=m!_g)*%(wCtD0R|yk-rXcb(+r zpEz%rocNLxTUWDUYG-n1u_t)hYWAJJOXT5^Mm>*J&c-leoFIH)f@(624*wD<*WLzz_CJJ{Cdj zo%PhSbRuy28din0!?1`h&8MBv5KP=1de?QN`;tqk$C?z)fmtC;T6LVuS1zz)-uSOc za59%RPNh$`9`p$cW?=t70{f2UbYwEm&TM4E-iySkJ9~4Fl`FS${docrM`z+~YfTIP zo^cn=-#~>149;Z{~h=AKTAn( z?z3p1KizuuVepUv1a|Mvgk?vFdvcm-(|7Sa?lwyouHtgUJ+>_f=eTH@=*t@k+jTXq zg?H19^%Lpct-IW70Nn;J~$}V`$Z;A9w%M zIOiXn-n?L%k3D7jt>e{42KC>H;D{6R=-2mWZhf8R|CuS_0znm8v;9T73;S;RTM_&% z{rTw~f*(A5!~;2g@Hip^pytf49OB`*dnCQM#l!uFP!=jVA%ckATe!7+1vi&2=ka~@D+M1o z|9zxB#D~j%57OFE>HV_g*H4MqzK19wT0?NetJfrKT1|A$fAc1r7BlsV&~>l}bEa2e z+=z)px|AYj>v~>9#c=Qc%LYeYW7f1;ocya_Fi&~I{UH@uRDT@Nn@2F$xGHyJBuI%^ z#d=*g_J@w*)S!-RaBs!sFL*C2?!I7mX_7p9LUa`I(Xk}I_h8BKB7o9Xe6;jcLbCMTYZ9MbWPjbt9N%(H%A!e(O?`t@ ztyaZHKjp=VGt%#Ggy0u1N#3@eKpj0!>~!JzB`027a3bN7BV2YQ88dnQ z`~~;!{|*UGc*(w{-LN#Y!p7Q)at+35UW8AIy~Bjo6|gn8!OGZQqhhvkHq0t=Uk?m33tsaQV_pAtjmzbGovn zf<3FsRNRys)7N8#g9{s6DzKyT z1fu1}UT+`Dh6>IsE9%OL9oL0mv8~BsV|!=S=E5EqxROfjTU>YK)p-ZJ8&>4{&D*~# zOnS1ZD_PB|aOkOYlk{S;rY95FF}MXToo4Vt{eIEwv$Qocqu<6`L>!z#s}|k4qMA>* z!^lp}8L&akG0Vd~+edBp+N`=6o!ZvB;`p1CbpIfux>uu0i%_m-Tric6UOc7=Zk_>b zd-%r{<@*FDy|~DMy5+fiGl@Ihz1X`k_2-|GE=^;dOGlnWCut-sYE@^}c37%ec+vb& zifFi)os-zoX$-H_ZKmAkc!SCu+jLW`!(&ePn6Z8QVa*qjsr8keRr`-P+M*8U4nIrH zPoJJu<;hW8@cD^@Yt9S7&twE0*i9c(E3WQ$hC5~8wh((&aLtjZlV$MhR+Skh#fgiF z=I*^ORnaMI?&U<|uv2NrX({ZHHS&sHIPV(sRG+MXpkt)Fnclp_` zCBYhkB|X@QS0!&2Uikddo=Q6dEci}K9L02v^)ONJ)0hK1uw81N`FCfCnEk?J+kw+{~L(yYHlBWJrk*IoGHG2iGbaEU~Wo#&znb z5bC*D)4X~)=|~apb!CY;??{)f?o8Fw<)x)Au`#itqQ8{jBsK&%QK|nX&B%S5L^20e zcc=NBbmAkKQpbW$v(EGA;3S$f?Uwoh*z2qG^J&DuO=$!_+(mVlsw}wt{`Wy2POqLn z;qt~HtgStnFV0Uo&G9iWcyMVRRV?l3xB4crAD#gEY*GYoFFT0Tg~ntemj|%4LLe{W zZgSAA0*5!9A?EgNqHo{f)g$q9()^6bg{@iTJ4f_bdWz%W*tV>1J&9)$l19rpF?SyF zCN5E|)NZy{_u$6$58R|8xKVXZ?p7c3y`NrkzG*`aZN8D}ML&KSMck=lJS%O)3oR`s z7A?%MDOKs(tqPM179^%bQQ~ghBvKLlJ5+SkiCI*$G^O?Enam6iXWr_g#3m~Bh zhE*9cX$BMew#KElA7>vY5_^3u747ZlHX@A4{hCoAmpQ>3Z=^Psc%RUQr772PAk$}r zvu4lv)WwQVrX=p|os4Ty8;0+?{?0&)eZHMW7FM*FyqOGN&3ti6e6)h~dY+tEzLcxe zda$8t11=s@E>|M=r*&n0lb&2(w2*7_=W=7~*|)#Smv~MbHHR`B4qw2vxvO|4&d2LZ z>qT-KaCXWpP5mp2w-EJQ`Z)0gH~ZCQZL^+Snm?Z_^H=iZhWe#DNuq{t2RCGO)9zfF zyMS9;k889-)c$o`n>UdiHdbutGW^$xjtKGIV$Pf-a%3<^4Dv8GTUHjDmf*F22VPx1 z&&$`ZHT8b)RAtn~HH;WKgrP%*5E8b7NX;7&$z0tqkC8)%GGydT&OAz2Sc%-&w~~>= zhA=&BEBj9!;ONa?7vqy29Ad_p;hMH)u02Z3X9-SC2{$&f?7+2mHHoC;s7tJocroS^ zZ|r<5rNrIl)|_da9X*;eqWvD+${4G+BOAeFqr%57rhjA`6gfl;f z@%T~dul&8fyqgPSf7aALHGUD#9;f~KU*a?FFP+4hkPuFfp3eP?Pv1UAO5{y$&60LT zjpowg-H89n^Ubs5p2l!t+B7as7@J|LQiyvjUUFPg5^19UFu4v^8}E zzn9=|>HjyqyV&qBZ5#2Fhfkl&_L*ji^8LAJMQ}nw(l`7U;9Y{h0E%EW7yal_@P`Thmi{}^*CROL4aaZY=R#E4Y*9iS2W~vzn)=NCFHXr3XIQ)QEU*9i zOaH&8uSam~6Ix7PO8K-vJo@$p?8Ypn*SSxx1|_|G%%r2Yco6^Y4Ag&;-fZhi4x8>g z{1e}{{BKELkKpJhblUa{&1awDzQniNk6k8c@dkRO|I%GbGOrU7i4!}a>Gzb>U%HFA zdl`>;hdC7$uPIaCEq#s_wc7OR)hpuO9~6nNHTjWSdQ#M-KabK0PKr;hulauGwcJOV zmQnX4`Ks*QpZQNA@l9&}tGKv#z9~vhR<r}*JN7W;+!Gd^zDf9& z-Sj^v1WU*7I((FR3wPi?eLFpl+$Ab8k-Y~GP;J&GY$tEPbHPq(%-Kcgg%_XvrMu@> zH`A(0Da{H~2|FLQT}l15yToUg7}&^A@@=p#S%55d{fST$@zM7f(Ws0j-?&(AGUq5r z%S81~7IGb)paNy`c+MjqX(jCE`hcP6m6(RLYcME=D ztNNuob^Pomb(S3G_UqIYBZZF(#|s9PGotswNX?SpgXKSA;26ZylqkaMn&LJ4CJ9L* zoyP~F>lVaw5wlaF-k7(UBf^@*n-f!UX+Drh$$z|W8WpOw<%Tqr{N^P=o~E=5I|1>L zjHqou&2h)&p^{Qpb>7}kGLKKMWAMP4TuJ+#ufJQ;(x{!^i8xVHpT()9K26QR{_TLMNC!EX8=gT269&NrF_)@jEds`m~5KlslG zo(84D!0#Z;KLFJv&rVLz>@eaW@(y7^kpOIz2(|6JT z2_?t9(UARq14<=ZOa>EC(TW%wA;VfpoorQm)@kI}s{Qoiv^uJ8#(mY6<{W|L6xbL8 zOSeeAl&QAgzxFqL9={=2tM@~+0w27K9{126{hHDrAh?vA8*mslpM&Z`^q8AM%4N9v z3?96IWxJuo81NT0zUnG$y$-jd;LKSlE5x}kgDnrC=RB!57J|;m`BHb$H8elc5-lVj zIFTyRYB0Qi{crd*enarT`aDV{IU{=B$6(Bd308Kp?x@(h zfB)Lw@Ok_x1osgMJ17$8EfPFa2wk~Lq)poNSPqAT$Zm3;-!YLyk>I*=4drq7zXa>| zi2W8Ddr&03zYGXnk@TS#VYd+MAu4)_5Ik>_Tu09NrlS8Cz8b*}LSnU*a99Wqkn=hV z!RPKkeUZc>Qg5M1`f{P`oo8dAmz>w(5ZsFsl`E=xxTy4t zkD!g@I|#AiqS8-_#~dWK{Nx)rFZQ{r+{^SQ(yplNfuh#G+2B8hcL|mbEIcxXLL;N! z#qcO`rV>9GDp?4r4L1r2+n|D|)sB0iyQpS6*)K14HCW=~nzA2oL?l%RTP5VK6fy@% zSfvJ(iL_B=y*O2(n%9YxkCy?^O^#iqtfr{v*-|%59JO@s`~B;G!>92M!3t%>q4^L# z76)s>Bq3R~q3mQSk!WKfRFx?LOUkkSc<8OvxJYAlIW8==R@q@im*8;)HVa` zCr4{wH#tV^?yFQxlKn}Nmj-(|ww@S^#e`_A<=AFYl!Q@HsrA%(3Yv2S6QiX}py~)z zU7NJ_HRq-0rS02FzOANBbxtbmr@h8W?mOdiWPIrVCA=kAje14q{u38De&#&KPG8XA z^tJoU3u@0`hujQz(IL334t<@9(yO!%0d_jHveKo#nF(Ij4pb;x69+SQ%ICDDg0=-N z+Ge<9HOHf{Bh~FH<6vNeL4HFD=O}_zc03 z%h&H{?*F)gJdfMVM2(~Np-%WG<2MAKJbj*v=g)BA+*u8--MYid{yv1*XfeKgRzjV! zFw`L{!PeR6Yn6=vv#fM5$$^h?emsg9P*&T7%36lFeWy$L?}}6L2LmbDuDB&-3Rz*5&x8^(01UDeprp1AdRYpg^J8xE{Gd(d z@4nakzQ*?gZLNQytMzYevlpOTDI4rcT4G#8pS(ZjqD$M3+`W5CbN?3=eZ$x#`zYbMxtKTBJFps*ak2 z*W8o3&Yv(Ke?zbu@#iHFJ$LS$2A6N#Wo1xvLL9UhTOlXo-Lf;V`SdZ)Z-jB45*X$#O2I7o$fA`+kcmRyX$!&Hl=?n5 zE{4`PmU6&U&s4NSVf;J#bNkNix6h!SCnLeCbM0nAgS8UUNqEBc`jTfZ z*D)3Uq3#+8+#zKWYHAi={zH;KOYkKjczv)hlby7fSRuPWn{h7L2yxENaA$1>*k_}s zNb*m`^HM&Go)Bz6g&*{&_-_MhNDnyg|YN2H3J=h`ju1i^SAzVrM`5&pjQ6;RLWe8ir?$v@uNO9iaOw|XHJvTVPY%97`QDA=VOm18Yq3i`3@T#VD^K7Ddf55$QL|TO8v8y6B1xHp*E{h%QQ= z?{ks=yBwJ3(#KKP9y1v<`o&9CdSK+`Ba22UeUt|9x_yU6Oux(gt z7F5z=evMqrtd@uA9{HH;UXXEaxfoeC8-vS;Bs*%;+9)?3*^5ynvmWl^D7h6ag-s3} z>J-)^q^>0kdRVb0xHM~q*s@}%1AQ8q<51iH^Fqd0OI`CqMpz5X^B7>IV?kLnN6Hx6 zU|!S+qufHev}ICAAKiRK$(tn?1+wI&NS6E*&Q^fpBH;$&j1|gRoUWa^bL-B>30AKd zH4-&=G8&GGR4(2p9Vz50`)Dv4DhZ*xrPF;ysuWq~X{uUD{=%m)PE@#3^U8MC5S1Es zTn2%t*`h+$6xnZ~)UcE*)vP9cTJ3~MGMF~VwZ@7B+sU=oi1hZ6`ehfv%G*My5Wnz> zkStsEE>#&BfR}}2cTw&C$y+jCMDUK`Em-9K9ZPHHW`3;#%&eiq3~zm=R@Y@*r2_oy zl8Zr3+G2}y(x|Ww-q{TC%wj~tjxE(-KrR zE{17dJt0sBTODIc8`@x@BlcM&+Qr5Zx6)3OwJD8*u_aa|j4{!Z0bp24ymc!aEv>PZ zef_+}Ff1w(Z(>7!nL=V6vCX^E2sT$8 zCHZF3M~#1hGeSn~8L4e3I18D}?!qi-tN&@(A_UhH0@bxNra)}zG9j+3Na*;>Fj;J_ zwP=FsqO#9Cf^(vh7wnS0mqD{a2puK^Mxzl#UEjJ1RYl6bF2UFDvU9i(%RIDLUOOjC zgyea3jhJ26obcMlOsQc&XvKUCcFIm~hwOB=$VJm)g=i$C^|CC<0zYf^&8W(OdG**7 zTA9UtESc?ZNLa_>jA&Q@A4ffG#739Ou7ibm+D3)N?g}jQOt3W)XUtT>Ala4_550K) zVid_$2xEO?T+5cFimMBiU0f(@R~j>YGmLaiDIn_GuS2&_I$7y&j;Mu_;vwKC_VB_* z@DSChR<7P5Sk6%|HTWMDi5GI)i<70KI^DyykT$HuAyX3hNF=nONSwygmU0_$q=re` z>kfdC)SV~gieP&g6m#TygGAML5u&G`fB`ai7F~kjLa^e)QV6~&^*z2m!ME8tsx=F1 zWMXcEg3M@8jHy0WOl(<}am`CJ%EyL5wGHW8O_u<-!nAkFPiwn;4Dcw-ngP}vn&-v7 z*>zYqtQ_;Y7&5!P9@ASDXL{R`Oz_diuVN9(85&b6ZwX3dFGSJo1u2@dAbRou6P2upEtFG2rrbrukH*MSUI+xQk@IPq3jJcNJT>TqLuxbhhd%rOH)*sdj9H%o3tz*NDUR^qQz_k=|0$ zuCnv$ZIxrM;aQ{%ASsWGhv#C$N1uiBLU4IGw~*XNkQ}c+FGPzCo+bl8SImUBICc`g zQ&|SxSGB>HuiRwK)Ii3zF=1jiM zb74BQ@%tpf%0Y4#N%IzBs)*`Tf4H?q?4){yNJ(E^@v!$vp09MYo~YQ};z3UrHCj<5 zua>CN>LQt%7XbxULgq*zW`RhlvY~UOUM0y>q^JcNR~Zx)Bo(jOpdbwCu9 zwR2K1Zyt1t? zm#E(=B6*e~nN~t@4RNv-2wC;SR@%z|SR%w+mb#av?iC4NHtbIwBpQ1yYIgfAQMD3g zIm!NB+3%#nC?Q$ZQO=oa(?Hq}74ilOp;mJJdV59XM@V~u)zY4Nal&u`OqA{Kh~S-ThO=^f71m6t#p)?FSvARvl@mQ#KEad4qpLA@ctyenlw)QeJ8`0H zII^%7d%_yBuAe=tyXvyGhb}7u?O52|ky#y$nclJplYNUazIky%niQv@T>%RGn1!7G z%1Uk_HFqW@#kt7&V-5}SYUiSG;oOuk$&HasPK+FKU}%>eU5gwPEtQkvr3#>LQ5++4 zHC0&%zfPi}Z+}`vtIk&{T6w|>>iBJ$kfO>ok|X(Q#!Gq9>2=jW$k>j`Q$(l<3{@{< zTj@}CUrDoiwNGcb~tM%Rc8IP+N_`A&ALg| zSu>#;tHxJj*=P?Ij403C0S>Gi;mE;xb@(N`HtT}ySm|%X@=kgz>r{-D-HgTIGGaz6 z9i}xa$P^)WLQ8$d`j()BYhiS=YLnx;%;fq$tB{)`jo@r#&z6m1CABdxn*+-VIk2dh z9rFs>lycR^*f~4;_SzJ&%0?mc>=ZP~MV5kDXxF7ZcW&SLB*Cha)i&LhzK@LgYCj_~ z)=MvcKkq|$|NQjh&*l9m_$G=t_rKhRATukR~8I$ zWa$7a_DrwF{<%$9H^7EfUG-TNV9N52dMs&Igcbh!Eb%vBR@-8Pi<1@B)_^Ik4H?s{ z2tBJ7#JWfca%IvZ*N^$g@q@N(vy|eC))`~l~K11;T2)>Nq)k9c2rX1_Xixf|&B5-H**ov$Ob!ExO zax5C?z{XJyLT)WK%kfHoJyvxyVs#HImI=X2+v^CyhOF#v%0hp!!EN=K-bRnf;$($1 zEk8isuU<#iQGB$ z$&)8DCGE2axr$&R*IgvHnh;z)2W33-;!w4ata{67-m9r-cmo%Ij{}4KO@1) zz9}b317+_dFTGs-6nFls!#12?}ZgMB~s&zVg}? z)XI`t!7@|#qRy4_^fI*&@kdGiB7*m=9ma+U71%hrx<*Z}6NgI?ynJ*emP&lPd5jB( z7Byv4NM)A$36UMesp@Jb`-VcUzDTbLOGJ_vcPzmoA$z_!TT}fU8P&K1gKOp|$h#n2 zU2{@dKRC8GC#QPNw_M&*lTMvsDEirIL=jmfm&XJl0TO{6c580}T5H-uC z-Z`7QPvTaoGhX6hKM8dzNocf3t}#Qx9TiWj^A)*cF2jV)sWV@v#VfxkbuOgg+*N2c z4@!#nzDGi-OA?PS+5N{!{xX8s3>JdR3&9?2nB>8_iSA;PtFU5>5IVFpJ104Dcv%zH z4=u;i4h31(K}X276sa{4lwg^ku?CAe8L+5xNmdN4$-*)I3~gphP}N-YsgfJNGFfpg zo=f6h9keq`Je)nVgh83GsgM2HB4 zy^{D>2rMP}>YcMOH(>vn)GsX8L`gU#v2S&Wp@nPi-+^v&j){^+A$qxlL2HFH4;dhy z5*qb61Xm-aJ-MeE5^g!j^`_j1O%hwTm6-g%3m72R$~eLDrT9V#9wfwyq)v5bqhS4n z%B&F^yj0oSAy(|4Ri2}(Te4+bby3Os;#d_ILJe6aWG?Mw#1e%LC0W?PfW_TySUb4` zD`tfZIVdRJbB?UpD407FC5$rRAZodM%{)}9UtC~_Tm2H0 zZ=i=uJzboHCl(HMVDJwk+#r%kn-ISQXlW<&%1`VEjPF_VcH&Pi1;m)2Dl-{P;TL!6v5W zaC0H}<4%@F)d^vBM0%U-fz79&rjV#?rIJuL>DY}*HSQD%T`DU49*h&|vKDfF55Zod z74`|4BQ}b}iWHCABm~QVTBHb;w$&_^nh$TX4UP(-esYc?RN3%ua!+f-bOcJ-7CE=E z3_W6g+qY??ciCDTVTwQn0nck^Yae@l8dEJx4k zI`~!7pR6ct`fntHp-l z4y^2@&&nQ#tm;{c)qNcVPLgNGvH&v{i=(x)w=>JfwqxG7AjWoY%CIKo2gK@Jnuy!er5 z2ibmzVD&zh;~Kdiky>B5H+9|K7o}}+;7q0MKV3yDg10Uk!h)aOST?=}%LR)@yEA`; zD~kq~X6qOWewiT-*a&-8_qSkmkTn~Jy0U4wH|qy`vM$)2Wj$ocxv14g#?WK;`x#s#)xMA!O+^sGxj3ondy@{ujm_Y~FG;JlRcDollXC8*fIP`0|% zXktXm&QA0Vs>$e(mP{GbhUpVJFk@0@rj2gKhEQ{|ancOrd{fZ|2ZYoxkveN3 zOnvs+KaJpnvfoFpXC&uW-6ASm>}kXsvHM%4ztaeADg+-9li(+WDuSIwy06_8M^J2X z5h)K4EplGezjD(4bb>Emy~X@#eF$!EB}9~CMz9<6hL&gXNN1J}v18jf2lg$f$wu+0 zR|eU#qMr?`1~{`S$W0_zLaAP5S=7~n#Xam;I>=K9ZpO6UK1}J=oC$#~nLMB)Q%CkA zq<S|rwG=`-5L)7!)q~VXf?+4FT<*ZgEXsPA0${LLOC(rkHJ|{nd?Qhs;?ePDP6P?tpdM4AtsOEs;7BL9nMm_R^%Z8CiZ+vTM@qXVBox~zgG_zc*GdN5mxOWe9vENaQR(cUcSBcV~CC5w7ku}GY% z1^!md^D}2&XH({PF_wKp=Js@8QD{e&iXEOawhuGM^(AafZy~n>U7FRVW5dc+vM))F z%$doS;|FvtvtUzEo0?6H7&xdt;S<|4N4)T9qZ%+?2HV&m7sdpY7h+ur?d!;}?s5;a z`*Y=E1PhccttN!_l~5&E&|z6>zLHQi$>1y<+*TZ-IbaFTNev~OQIijL8lJoluS+!))s5M}f-$?9tHPHrYNzzyLs|xX&Ys=uV6SCV#dyQofX}-%6xQc_< ze684ar9tF;TUAfW1BCdXU8(n{q&MSa$(Q1@1Yf;+gUMloXzf=Szg~4|<5!L5tt;Zw z(4H2a1_X%>oH59o`2#(e-_48#UCjk$SkS|j`2pgHbueLOTSI2HE5^J|C0WqTTH@#C ztOy&xqKSQ&J-#=i`!*xc*Om4)ENSa$ig#H93gyhs58r)HzJfpCUEhR|5sjHKwmH*A z)?~`i>OyW6A+$UpeakVbk1Id-c4A~NCkFY8IhZ*>G|xu}PJ3|Wkt!Rkpx!~&tQ@65 z5vXRCH19CWIdAtf)KQ+edbcaRjr4L&zO<)VT}nGQJ%-kl3wcTnYbGwz@>D$)vb|GJ z%1zVSRxc2w*ZsZtJi%9P5I$=toy39Z-mg9Zee2S>M=jcR@uX4Ha@4PAgl~ls^sH;l z=;o$OYi-HY7AAzZF&A>}32S4*tairC?r6$fKMUq{FT=utHJRC`ItxbnvT$N|Ms%)B zpZcW;tYbnK&*C&JUjn@XdB`kkx`L~;JKTq`&?bx@Y8(e(vwZa3ObOziJHWUX~@Z2aA*SbqQ8#RjE+5P@%%7jAiK|nC4yS_safie1Vg7 zol&EQ;$Fp`nx2j{tnWh0=2ht2wJIG%ZMW}MmBv2KRJAQc!&2GlStbhuoPK1Gix6EY zGoxzeWs*|e;)REG5NYlt=x8n^8xr2pjIgeDgozUtCeGL-k@OKi6(p!uJ|+fvF>8Da zCJ(L3YyS*j<_kcv+=L`uFYa}J~B8o$A8j&eF&c=SWOr# zS~!vZ1AOS&>nED~y3weCE6qiU{kn^)4y;MruAbEOvY=Y2+|)GBLo3_d1lVSxhy9QA zcgfC(8ij;p1192_4vwVZEy}q^G+`Zh3+O$`IJT6!XJ+bLHB{ zUwl_kZ#=45DfJT(dV-Qdl8Q-9Bu`T=(EJ>Q^o@c>+N8{2e5%B%NsQCNqk4CFz+!1f z@)S{~LYn%M@+Yrhyo6$EFsN5^)ircws|Yuib~i|TJVyqJ`pF6<<>~kJXXCR3U%YsQ zty`BebIu4tC8TN9wmQ{3Y^mk#BsSTTE`i>(3Gk#|U3=Wk^HSY3H!W;()6FI`J?%2l zMFwmWodIF(O_(fpIjpNO3nsNDY;4O^$qlX~ z9&=?uRZ-8Lg!Hc_4pmixySfwX?<%A!R1lPBfS*0RS{pETTCdL%TuRL>t$~HtVW*I! z)@%nKm)KZ{Q(=;+#J_DM#vT3(4BeahA(*Wo>`7g~_*zo@1rmIPwQB)R2(kAU z5IVXyefzbeWvd!^*L0?K&GO=K)e;HzrbU-3)UIt!CG&h#Hp)p;>s z*DQ`zUw4M}@}R$;2YvnA3F_j?0ROUra-y2c3gKnx-N}x5;R8PDMXL#k>LNWm9>9_l z(&0jGMzz7JMikvtg? zYW`Y%wDz;u-yI^wN`mbr&qr)^d&%1Z8yjukaqUTK=7A=qGIxQ)cBu>FL1K1 zF=66xajq)Rv~hKT7rrgMY2sU%4*udv_pFXj2Uk2jO(<`io3i@acve0(n2SkUhR zoDyQZM3VJIWva=J(&8K)dJat`uc45jh*Lkv=CMSiT^uI$RbV~Yca*%EBK?P@Zh#z* zyOjDxLc?964bDIVX=jT__aq^>gqVW1hf`m4e;{`G@G+<;*IFv)hD#gjZIG`;uEJ*t zzH#Fgg9i4bVtF%a)~rDNx*l}u(g436-gNHiN!uRPXw;@0RjU|ctCthA{8@1^)TXXY zE;=~oq_;~p27BgYbp3oxX;Fe1eiqF1D<#B=YHm}6869*bHZH|%fAOR{=}O2{lv$yk z%$(YbF@x$eqL-VfWH$+a+!z$#qLI=8LS~Skqimf;n#&L@Wy1&6W8~0=^y^WY`LlvP zF2MpL>GZ)u-eHkecTug%zN!z&Y(+AAi8|dSQaf16mI`5N0bZ%kbP|-kRO`ly;3Gm} z7ip{IAy{!4PTZ06B;QHe*%k#MYQ0$`_OLiz>PO#(%QZKOI#)}ItK{6->qUBn?2NN$ ze>Of(@XcEc=--_RE|%1(U5Q4GTqO>!NsplVbm{F)OMi)jo7mxEUzDPGa*!ueR!s9{ z5oy+@ww-v?HHtF6qaEP^5(5W1voP45IXxYi*QcduMcZGYY)85Cj?Jmfmd zM1`*w8?Q9O$3m$;179S;g9rDbin|5A&E4r3;Dvv0L7$qm@8L zM-~orVv*)6346x$H)ZSyaj-&uV*Hqvj2qR0k-^@K98iN%L+UU-v?=39H zqfH^&*3U|9H!VgFY0mWBDv?aJ#HXa(Pb71=43=`T?;xst;XU!L7eXbm?d!#c z-;{x|R|Y`146I6W{f(aSb zRUy}d)&Z5N*U|-Zn-b*E&Q7N9v-0D=v+~2gvylCV%vco4OsDF3nHg-!nn|u~n(o2Y z+4b2v$A`63YO`{DbyiNP!zvBDSv9$e99Jd0zb%0ca^vq)hyaoB-o0!YIKY_^gUS** z#F?Li?HCqlB=)y3f$bzD^VO!Ekn2+;D;|zoj0pY=!3wgkmIgJir7EaSPAf})l{USe z3UxG}a7rCjU#V1$s+N7VK%iEIR9k8}PeYU{6D^_6QT0@N>94?QK2wqNm1u!l)J!_x7}6)rfMe2`Mco!>UnEEE!_X zyxuxY>X4IRKV_qH`5&lMNDHUpS~RMnEt08Ci~2v}-|Pp1+iDTiQj31RTJ&n9Mc2Ao zbnw=qxw{s1oV0M%)e>i{9#8Mze)|mSc`Ch6a2hoBRUu4A=Ng zeum?(fwu&!1BdA;4Bq&dky{=yVsk1&w?C)#)XjJfoJQTB7g1}(Txtvnr^rSN9JYedyCOCBKT?B-IESZbI`sVx_^0C?f)&(T z2kO;M<20y!Gs(9S$H7u;kJ>6&i=D9*`{N*iyb3Qq234+pXvB7|oG0}yyBgMQE+qf*Z$SL3LRbD8kj=OgDjVZ#54 zCs3(TnJ|GyBhVO8)l-CbOahJL)elFFz*HQDiiE}ys00iZ@uLzb6iQrNTyh$nN~1oi z>ZZ~-R0fU8V5Bt7Q5l?M7M#rD(g+wD0Y{_aK76dEmC*BE!goD|v9GPYySr!fd(Y^%ZiJC<-$%awW4PLnEUz!z0r}!w6H~ho%RIrs_xFfx*ci2m=Tc{RlrM`Vjh=41_*}@m>VRcn?DF zSa!$C?_ zy2dH}!};g;hl7~9*ErqF%RiTv5LOlu77^Gi1QvT?VR?Rj8HTy@^GkE{OE7D8ZVr)b z7-rATF3up#EKbj`khrt6tf^_%)YQTx!X(1{1j58T^B;5L%(?OL*|G6iHk&<;3|?Lt zN6NAUuW>k=o11?)ob`>3#YNV{!~_h(o~}dZkVP**Fh6@0g%WD~*LYG72}vVH$xsuQ zQ2QX?(CeNdJ}9e8ULiqOkt?|~zP^{de4-Y0gHb5qOdMq75I(S&O^T8=k!%_5sYoy^ zz9b+Kt-2j|Z%-rshP=rWqWP-hxg(bDDpNK2Jr$2bV)^jj&C6oU?iI*ejChO?4Mlg; zhKf{L+HR#;9A4exf9#i2#W5ez`&iyu)B5Y?`ck0pb-(L=H5+sm{f&0_y3!~HH8v_0%=b6QJ38Loll+=&*yuOs zyzk`rw#p971GM3(ZS|z^pEz-#J5X)UK1atz?lqVF=TwIHPq2@?)q1xkD|ZvpP}C9O zfmorN1urh0^hG~@BC~zt{jXb-N^Reaxmx-};+nFiVWa(-OvrMh)d-nKo%!;`i|n28 zMbX4ddO1+g`Kp1kKsmvjl-*9=><@9u%uK%o#hAm_H=Av5wy1yT$V!o5V@~DwysDf?uj3wQFA| zBUS@gC65XB^gRDg=*lst(n)AAhA0OnC^J)?iDlxUofG7wZfet>zX z{839BaWl}$8h)${;vbS+Dz0Q2HD(2^lP-EMNe4zBduf4sqMX_pQk41zXXQ^`uIHEj zK6Hk-aJ1pSx+4|sY2v_ree1xVzwgV3X&Lj#Q&8YY#GyNAigcyx$*N;5OLBU}0u3S8 zG!4QltoKN*%QmX!w5MgJj0K&R(o(E_ndj|Y4)o7@CBTx>ou88q5pZD6xgbaO@8FrsN6%BXTyQS~N*iTen zsRG8mRXwi;s-}ird14_4EPpZ!Nb@m_D@`0u1HpnJ(wFjcPAq6BR1C0HMzVB3?F<$R z{?!3NKe*_@eddj8GhzS~mx6vvx@0VB^oF^eW(cZRdSJm9X01n^sY$mRL;wgn2we#G zv;|Fhgh22Zq~`7xhpy0%xVt|&IbGl;`?FyDh5&C=13f${ID|N+&${)^BvM-$AH@!G zc7Cr`qAcBP=3Jwx`|W_=_0=2OSkt#% zGV~_48ny`3(}MA0ul2**^$Y59HPlGwYj&FW?>w^>PI9SwD*=3$5q^326+P%!S;S}q zb6)As`5T00sa}NykQqIn8Goa2T%kckv)sl*qBJXOW%Slqm|ykDuC`dS1D9pQ%3NOK zmGQkVz7sY4(@=E}u*5tINR;UE>4Qs$9Xqeq!0&dc@J->B$aiP`={NHpU15e z?g)dZ6fb<6tk=>e>{foI%(i?;+|=u7h?ff}bg$O;MypcO`R54%*%zdI%m?IB1ivj7b`{Id8^scVc>#<^h0?7Q?Uc5{tYLF_Kg0aL7Z?QIB68Brm zgS`9!%ZO)X<{5@yN%aHd#j^xUK9K)U*9=%S2AdV^_lqMPebJAp{z#*p-ahsWsQc^k zvG>#Bv1ioyc(TzzU6AZ%FC)6b3BVE-oXRwWF4gME_4w5namsv_yViMyf|h^fD4#h> zL~rJvh&9vs$k<1$oR-o9%>D{5n#c0zXOObcX@aH$rB(`cKPs23QyVIG^GmeUX*ukY z1?3)92yr)(WveuPsmt{Q)fWi~+#h;+<`9L*YDwYRWtUYLHPZUlNg076o+`df<$|m! z;{!G2m6x_-m#zy{MD_)F6&EE(=h&#QxS3m@RplJ>a~wpl-GjAwu6 z{@1VfYf%yxlio+~6lw9Wc`lLh`C`Cg@Kk5>wf}~tE6RqGV|U($mLD-b4sL|1TtA>@ zxOAbNu)a7DRhPRiXDTDp7b%W?QXy26boZ}-MUl0W>71cLAR+M2t4k&zpR`?ZXstw) zMUg?FH!Lj_6tX(N2lTnlC^5S|_y7yccx8AzaCm*8TjT5Y0V4$-m}+m^b>{i+E`3m>YN4~dS4eohYDYa;z|;P9>E4kG!?@D^ulV1 z=Stl-8D2?MVqNy-)%KC8LR0LEVd{kMJejf38Vr_CazBUgo`Sen2UyUC98WzbfnlCh!T)#_)Df>S6&oG4ptTJObK=f zOVQ_xD(0Em#?n4Sq%YpHGmd}zwrQ^B=@}O5yCWoLl|3Nf)4cqV>nG?wZ@l95Mf)zNuxX~V!3A}(i%oZ}?_uR0_@~T9Z_at|PXmwVnX|D-<F_U-aK7!xJeu2PT@g3YE12i`l z^CmWsd%_8HEUurgdVSm`cN&cObfen0m84;JQWms6aTuTVG_`EUVV#cMzpjaoI9R=j z`>Mge_rHK$18QeZ{s#h?=DFGXFx6KVo&1J=NQeYCO9I3@%if0+oa}2&Lx|X4mh*EU zvSoB0zqd#GNrvPD^iN|;>#sW2a8aeaIW6Yq{l|q zo#)fKsp%`7hR(arZqARp8cD)xerGvJi8H^HDtMLK_c0g@bu|jwQraNr(>1X3MAsv{ z@~IO8zBg)caXCiT@ok4zqgn>Fnm63|rJr?P3i;{&dsuK)ntbEdG-19c)T5P$dFSx? z3YpSU2=tA5K{=VG2woUSw}i}_EWJS&^(vx`_LuR87}k-(u3>7?=oKAfe(}m6rH%Nr z9pMJ6L!aL%krWETcDe){SepD(Q{JKd~08clIx$!n;26bltT+7v|3-Vx2{T14RIKs5|8PU4WW( zb!<7=Q&^*NOhU8PEvoX}5el(@EUDiAeA2$EH>-OU`VHI+F%t*0>@>GoC6%1;HsM|E zTFbe7+?>*VQ~fNBT80ve$vr}3AEz{~5zlE*G+Y*pT(Rehkd0j^$%0>@(#Y1wY{J@p^Pt;5BO%rzAo;Ye+uO83W-5yrVHMAmrm62eRmrU zK2X`?;Q#YIcdbB{qK~Ps)eUqAQjXi7BNZVf8?xs=HvsBn`k*=;tah{q?;ELR^Xy@ASJQK2#M_x*7L)aR-UkI3y$_Uh>7 zJ%bu4d%H_sW}9!%5&rYY+9O}SBQ`ES!^ri4GM>#=ew`Sj+w4;wUV0s?Wpd5 zCCKRacFh#moa0Zccuhm`L|NOzDZw(uB}S4-PHhr51d7-$A@&RQ)U4OdqGaNvitnjJ z&Ce%B<{QmV=iG6qF#+IhQ5^I za;ejmIh;ln-FM`CD+Z$W!$a?E2`d*nmN3j9ylGf#c=M`l!b!iqs)R{}i`|npsou2*s!&}9doN{9! zDCrJZV3&ME!AW0DJdBOP015vBsKnaR3{2u|>MAESlWqFYl1W3p?-P*67aS-19!Z}P z!D?~S^zypEn*B_F_#&h1Njj;o;1ag^0%Bxs{xd$$z?J-L)p+UuSW^z1-;@eV$jrZ; zG$}IvDAw<>0T$2{1uy&xr6k1d(Kea>sUY3A4_|ZUEy=8reU+DLr4J_L>OH=~1j-_G z0V5~_dUej^e|PIc&Y}Rc9WXko0~~Tf&g1{rZBPGqbT?{*d0e(#nE2>Nw?zKrQ8*K8 KsN|GK%>Mwr@tD{E literal 0 HcmV?d00001 diff --git a/doc/tutorials/introduction/windows_visual_studio_image_watch/windows_visual_studio_image_watch.rst b/doc/tutorials/introduction/windows_visual_studio_image_watch/windows_visual_studio_image_watch.rst new file mode 100644 index 0000000000..7b201b977f --- /dev/null +++ b/doc/tutorials/introduction/windows_visual_studio_image_watch/windows_visual_studio_image_watch.rst @@ -0,0 +1,144 @@ +.. _Windows_Visual_Studio_Image_Watch: + +Image Watch: viewing in-memory images in the Visual Studio debugger +******************************************************************* + +Image Watch is a plug-in for Microsoft Visual Studio that lets you to visualize in-memory images (*cv::Mat* or *IplImage\_* objects, for example) while debugging an application. This can be helpful for tracking down bugs, or for simply understanding what a given piece of code is doing. + +Prerequisites +============= + +This tutorial assumes that you have the following available: + +#. Visual Studio 2012 Professional (or better) with Update 1 installed. Update 1 can be downloaded `here `_. + +#. An OpenCV installation on your Windows machine (Tutorial: :ref:`Windows_Installation`). + +#. Ability to create and build OpenCV projects in Visual Studio (Tutorial: :ref:`Windows_Visual_Studio_How_To`). + +Installation +============ + +`Download `_ the Image Watch installer. The installer comes in a single file with extension .vsix (*Visual Studio Extension*). To launch it, simply double-click on the .vsix file in Windows Explorer. When the installer has finished, make sure to restart Visual Studio to complete the installation. + +Example +======= + +Image Watch works with any existing project that uses OpenCV image objects (for example, *cv::Mat*). In this example, we use a minimal test program that loads an image from a file and runs an edge detector. To build the program, create a console application project in Visual Studio, name it "image-watch-demo", and insert the source code below. + +.. code-block:: c++ + + // Test application for the Visual Studio Image Watch Debugger extension + + #include // std::cout + #include // cv::Mat + #include // cv::imread() + #include // cv::Canny() + + using namespace std; + using namespace cv; + + void help() + { + cout + << "----------------------------------------------------" << endl + << "This is a test program for the Image Watch Debugger " << endl + << "plug-in for Visual Studio. The program loads an " << endl + << "image from a file and runs the Canny edge detector. " << endl + << "No output is displayed or written to disk." + << endl + << "Usage:" << endl + << "image-watch-demo inputimage" << endl + << "----------------------------------------------------" << endl + << endl; + } + + int main(int argc, char *argv[]) + { + help(); + + if (argc != 2) + { + cout << "Wrong number of parameters" << endl; + return -1; + } + + cout << "Loading input image: " << argv[1] << endl; + Mat input; + input = imread(argv[1], CV_LOAD_IMAGE_COLOR); + + cout << "Detecting edges in input image" << endl; + Mat edges; + Canny(input, edges, 10, 100); + + return 0; + } + +Make sure your active solution configuration (:menuselection:`Build --> Configuration Manager`) is set to a debug build (usually called "Debug"). This should disable compiler optimizations so that viewing variables in the debugger can work reliably. + +Build your solution (:menuselection:`Build --> Build Solution`, or press *F7*). + +Now set a breakpoint on the source line that says + +.. code-block:: c++ + + Mat edges; + +To set the breakpoint, right-click on the source line and select :menuselection:`Breakpoints --> Insert Breakpoint` from the context menu. + +Launch the program in the debugger (:menuselection:`Debug --> Start Debugging`, or hit *F5*). When the breakpoint is hit, the program is paused and Visual Studio displays a yellow instruction pointer at the breakpoint: + +.. image:: images/breakpoint.png + +Now you can inspect the state of you program. For example, you can bring up the *Locals* window (:menuselection:`Debug --> Windows --> Locals`), which will show the names and values of the variables in the current scope: + +.. image:: images/vs_locals.png + +Note that the built-in *Locals* window will display text only. This is where the Image Watch plug-in comes in. Image Watch is like another *Locals* window, but with an image viewer built into it. To bring up Image Watch, select :menuselection:`View --> Other Windows --> Image Watch`. Like Visual Studio's *Locals* window, Image Watch can dock to the Visual Studio IDE. Also, Visual Studio will remember whether you had Image Watch open, and where it was located between debugging sessions. This means you only have to do this once--the next time you start debugging, Image Watch will be back where you left it. Here's what the docked Image Watch window looks like at our breakpoint: + +.. image:: images/toolwindow.jpg + :height: 320pt + +The radio button at the top left (*Locals/Watch*) selects what is shown in the *Image List* below: *Locals* lists all OpenCV image objects in the current scope (this list is automatically populated). *Watch* shows image expressions that have been pinned for continuous inspection (not described here, see `Image Watch documentation `_ for details). The image list shows basic information such as width, height, number of channels, and, if available, a thumbnail. In our example, the image list contains our two local image variables, *input* and *edges*. + +If an image has a thumbnail, left-clicking on that image will select it for detailed viewing in the *Image Viewer* on the right. The viewer lets you pan (drag mouse) and zoom (mouse wheel). It also displays the pixel coordinate and value at the current mouse position. + +.. image:: images/viewer.jpg + :height: 160pt + +Note that the second image in the list, *edges*, is shown as "invalid". This indicates that some data members of this image object have corrupt or invalid values (for example, a negative image width). This is expected at this point in the program, since the C++ constructor for *edges* has not run yet, and so its members have undefined values (in debug mode they are usually filled with "0xCD" bytes). + +From here you can single-step through your code (:menuselection:`Debug->Step Over`, or press *F10*) and watch the pixels change: if you step once, over the *Mat edges;* statement, the *edges* image will change from "invalid" to "empty", which means that it is now in a valid state (default constructed), even though it has not been initialized yet (using *cv::Mat::create()*, for example). If you make one more step over the *cv::Canny()* call, you will see a thumbnail of the edge image appear in the image list. + +Now assume you want to do a visual sanity check of the *cv::Canny()* implementation. Bring the *edges* image into the viewer by selecting it in the *Image List* and zoom into a region with a clearly defined edge: + +.. image:: images/edges_zoom.png + :height: 160pt + +Right-click on the *Image Viewer* to bring up the view context menu and enable :menuselection:`Link Views` (a check box next to the menu item indicates whether the option is enabled). + +.. image:: images/viewer_context_menu.png + :height: 120pt + +The :menuselection:`Link Views` feature keeps the view region fixed when flipping between images of the same size. To see how this works, select the input image from the image list--you should now see the corresponding zoomed-in region in the input image: + +.. image:: images/input_zoom.png + :height: 160pt + +You may also switch back and forth between viewing input and edges with your up/down cursor keys. That way you can easily verify that the detected edges line up nicely with the data in the input image. + +More ... +==================== + +Image watch has a number of more advanced features, such as + +#. pinning images to a *Watch* list for inspection across scopes or between debugging sessions + +#. clamping, thresholding, or diff'ing images directly inside the Watch window + +#. comparing an in-memory image against a reference image from a file + +Please refer to the online `Image Watch Documentation `_ for details--you also can get to the documentation page by clicking on the *Help* link in the Image Watch window: + +.. image:: images/help_button.jpg + :height: 80pt From 7fa01e3fcc9eaac70871e7f3cff52bdb1a1b1544 Mon Sep 17 00:00:00 2001 From: Anatoly Baksheev Date: Sun, 24 Mar 2013 20:07:55 +0400 Subject: [PATCH 09/31] enabled png and jpeg for iOS --- CMakeLists.txt | 4 ++-- cmake/OpenCVFindLibsGrfmt.cmake | 4 ++-- ios/build_framework.py | 6 +++--- modules/world/CMakeLists.txt | 29 +++++++++++++++++++++++++++++ 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 351273e888..e3c8259a1e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -124,11 +124,11 @@ OCV_OPTION(WITH_GTK "Include GTK support" ON OCV_OPTION(WITH_IMAGEIO "ImageIO support for OS X" OFF IF APPLE) OCV_OPTION(WITH_IPP "Include Intel IPP support" OFF IF (MSVC OR X86 OR X86_64) ) OCV_OPTION(WITH_JASPER "Include JPEG2K support" ON IF (NOT IOS) ) -OCV_OPTION(WITH_JPEG "Include JPEG support" ON IF (NOT IOS) ) +OCV_OPTION(WITH_JPEG "Include JPEG support" ON) OCV_OPTION(WITH_OPENEXR "Include ILM support via OpenEXR" ON IF (NOT IOS) ) OCV_OPTION(WITH_OPENGL "Include OpenGL support" OFF IF (NOT ANDROID AND NOT APPLE) ) OCV_OPTION(WITH_OPENNI "Include OpenNI support" OFF IF (NOT ANDROID AND NOT IOS) ) -OCV_OPTION(WITH_PNG "Include PNG support" ON IF (NOT IOS) ) +OCV_OPTION(WITH_PNG "Include PNG support" ON) OCV_OPTION(WITH_PVAPI "Include Prosilica GigE support" ON IF (NOT ANDROID AND NOT IOS) ) OCV_OPTION(WITH_GIGEAPI "Include Smartek GigE support" ON IF (NOT ANDROID AND NOT IOS) ) OCV_OPTION(WITH_QT "Build with Qt Backend support" OFF IF (NOT ANDROID AND NOT IOS) ) diff --git a/cmake/OpenCVFindLibsGrfmt.cmake b/cmake/OpenCVFindLibsGrfmt.cmake index 5988169919..08af604ae9 100644 --- a/cmake/OpenCVFindLibsGrfmt.cmake +++ b/cmake/OpenCVFindLibsGrfmt.cmake @@ -67,7 +67,7 @@ if(NOT TIFF_VERSION_STRING AND TIFF_INCLUDE_DIR) endif() # --- libjpeg (optional) --- -if(WITH_JPEG) +if(WITH_JPEG AND NOT IOS) if(BUILD_JPEG) ocv_clear_vars(JPEG_FOUND) else() @@ -110,7 +110,7 @@ if(NOT JASPER_VERSION_STRING) endif() # --- libpng (optional, should be searched after zlib) --- -if(WITH_PNG) +if(WITH_PNG AND NOT IOS) if(BUILD_PNG) ocv_clear_vars(PNG_FOUND) else() diff --git a/ios/build_framework.py b/ios/build_framework.py index 3f0e85f725..ceef4b71d7 100755 --- a/ios/build_framework.py +++ b/ios/build_framework.py @@ -103,10 +103,10 @@ def put_framework_together(srcroot, dstroot): # TODO ... # make symbolic links - os.symlink(dstdir + "/Headers", "Headers") - os.symlink(dstdir + "/Resources", "Resources") - os.symlink(dstdir + "/opencv2", "opencv2") os.symlink("A", "Versions/Current") + os.symlink("Versions/Current/Headers", "Headers") + os.symlink("Versions/Current/Resources", "Resources") + os.symlink("Versions/Current/opencv2", "opencv2") def build_framework(srcroot, dstroot): diff --git a/modules/world/CMakeLists.txt b/modules/world/CMakeLists.txt index a75037cfc7..23901bf62a 100644 --- a/modules/world/CMakeLists.txt +++ b/modules/world/CMakeLists.txt @@ -80,6 +80,35 @@ foreach(m ${OPENCV_MODULE_${the_module}_DEPS}) endforeach() endforeach() + +macro(ios_include_3party_libs) + foreach(l ${ARGN}) + add_dependencies(${the_module} ${l}) + string(REGEX REPLACE "" "${l}" objpath1 "${CMAKE_BINARY_DIR}/3rdparty/${l}/${objpath0}") + file(GLOB sources ${CMAKE_SOURCE_DIR}/3rdparty/${l}/*.c) + foreach(srcname ${sources}) + if(IS_ABSOLUTE "${srcname}") + file(RELATIVE_PATH srcname "${CMAKE_SOURCE_DIR}/3rdparty/${l}" "${srcname}") + endif() + + string(REPLACE ".." "__" srcname "${srcname}") + get_filename_component(srcname_we ${srcname} NAME_WE) + string(REGEX REPLACE "${srcname_we}" objpath2 "${objpath1}") + string(REGEX REPLACE "${srcname}" objpath3 "${objpath2}") + + list(APPEND objlist "\"${objpath3}\"") + endforeach() # (srcname ${sources}) + endforeach() +endmacro() + +if(IOS AND WITH_PNG) + ios_include_3party_libs(zlib libpng) +endif() + +if(IOS AND WITH_JPEG) + ios_include_3party_libs(libjpeg) +endif() + string(REPLACE ";" " " objlist "${objlist}") if(have_cfg) From 5810a73d30dfdda9455769a81346a84c52c39423 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Mon, 25 Mar 2013 15:38:43 +0400 Subject: [PATCH 10/31] CPU implementation of CLAHE --- .../include/opencv2/imgproc/imgproc.hpp | 15 + modules/imgproc/perf/perf_histogram.cpp | 22 ++ modules/imgproc/src/histogram.cpp | 309 +++++++++++++++++- 3 files changed, 338 insertions(+), 8 deletions(-) diff --git a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp index 5d6633087e..223ee32770 100644 --- a/modules/imgproc/include/opencv2/imgproc/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc/imgproc.hpp @@ -759,6 +759,21 @@ CV_EXPORTS double compareHist( const SparseMat& H1, const SparseMat& H2, int met //! normalizes the grayscale image brightness and contrast by normalizing its histogram CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst ); +class CV_EXPORTS CLAHE : public Algorithm +{ +public: + virtual void apply(InputArray src, OutputArray dst) = 0; + + virtual void setClipLimit(double clipLimit) = 0; + virtual double getClipLimit() const = 0; + + virtual void setTilesGridSize(Size tileGridSize) = 0; + virtual Size getTilesGridSize() const = 0; + + virtual void collectGarbage() = 0; +}; +CV_EXPORTS Ptr createCLAHE(double clipLimit = 40.0, Size tileGridSize = Size(8, 8)); + CV_EXPORTS float EMD( InputArray signature1, InputArray signature2, int distType, InputArray cost=noArray(), float* lowerBound=0, OutputArray flow=noArray() ); diff --git a/modules/imgproc/perf/perf_histogram.cpp b/modules/imgproc/perf/perf_histogram.cpp index 3b320633ae..92db3be34a 100644 --- a/modules/imgproc/perf/perf_histogram.cpp +++ b/modules/imgproc/perf/perf_histogram.cpp @@ -115,3 +115,25 @@ PERF_TEST_P(MatSize, equalizeHist, SANITY_CHECK(destination); } + +typedef tr1::tuple Sz_ClipLimit_t; +typedef TestBaseWithParam Sz_ClipLimit; + +PERF_TEST_P(Sz_ClipLimit, CLAHE, + testing::Combine(testing::Values(::perf::szVGA, ::perf::sz720p, ::perf::sz1080p), + testing::Values(0.0, 40.0)) + ) +{ + const Size size = get<0>(GetParam()); + const double clipLimit = get<1>(GetParam()); + + Mat src(size, CV_8UC1); + declare.in(src, WARMUP_RNG); + + Ptr clahe = createCLAHE(clipLimit); + Mat dst; + + TEST_CYCLE() clahe->apply(src, dst); + + SANITY_CHECK(dst); +} diff --git a/modules/imgproc/src/histogram.cpp b/modules/imgproc/src/histogram.cpp index 61509d3445..22dd9beb1f 100644 --- a/modules/imgproc/src/histogram.cpp +++ b/modules/imgproc/src/histogram.cpp @@ -2604,7 +2604,7 @@ cvCopyHist( const CvHistogram* src, CvHistogram** _dst ) int size1[CV_MAX_DIM]; bool is_sparse = CV_IS_SPARSE_MAT(src->bins); int dims1 = cvGetDims( src->bins, size1 ); - + if( dst && (is_sparse == CV_IS_SPARSE_MAT(dst->bins))) { int size2[CV_MAX_DIM]; @@ -2613,14 +2613,14 @@ cvCopyHist( const CvHistogram* src, CvHistogram** _dst ) if( dims1 == dims2 ) { int i; - + for( i = 0; i < dims1; i++ ) { if( size1[i] != size2[i] ) break; } - - eq = (i == dims1); + + eq = (i == dims1); } } @@ -2635,19 +2635,19 @@ cvCopyHist( const CvHistogram* src, CvHistogram** _dst ) { float* ranges[CV_MAX_DIM]; float** thresh = 0; - + if( CV_IS_UNIFORM_HIST( src )) { for( int i = 0; i < dims1; i++ ) ranges[i] = (float*)src->thresh[i]; - + thresh = ranges; } else { thresh = src->thresh2; } - + cvSetHistBinRanges( dst, thresh, CV_IS_UNIFORM_HIST(src)); } @@ -3188,6 +3188,300 @@ void cv::equalizeHist( InputArray _src, OutputArray _dst ) lutBody(heightRange); } +// ---------------------------------------------------------------------- +// CLAHE + +namespace +{ + class CLAHE_CalcLut_Body : public cv::ParallelLoopBody + { + public: + CLAHE_CalcLut_Body(const cv::Mat& src, cv::Mat& lut, cv::Size tileSize, int tilesX, int tilesY, int clipLimit, float lutScale) : + src_(src), lut_(lut), tileSize_(tileSize), tilesX_(tilesX), tilesY_(tilesY), clipLimit_(clipLimit), lutScale_(lutScale) + { + } + + void operator ()(const cv::Range& range) const; + + private: + cv::Mat src_; + mutable cv::Mat lut_; + + cv::Size tileSize_; + int tilesX_; + int tilesY_; + int clipLimit_; + float lutScale_; + }; + + void CLAHE_CalcLut_Body::operator ()(const cv::Range& range) const + { + const int histSize = 256; + + uchar* tileLut = lut_.ptr(range.start); + const size_t lut_step = lut_.step; + + for (int k = range.start; k < range.end; ++k, tileLut += lut_step) + { + const int ty = k / tilesX_; + const int tx = k % tilesX_; + + // retrieve tile submatrix + + cv::Rect tileROI; + tileROI.x = tx * tileSize_.width; + tileROI.y = ty * tileSize_.height; + tileROI.width = tileSize_.width; + tileROI.height = tileSize_.height; + + const cv::Mat tile = src_(tileROI); + + // calc histogram + + int tileHist[histSize] = {0, }; + + int height = tileROI.height; + const size_t sstep = tile.step; + for (const uchar* ptr = tile.ptr(0); height--; ptr += sstep) + { + int x = 0; + for (; x <= tileROI.width - 4; x += 4) + { + int t0 = ptr[x], t1 = ptr[x+1]; + tileHist[t0]++; tileHist[t1]++; + t0 = ptr[x+2]; t1 = ptr[x+3]; + tileHist[t0]++; tileHist[t1]++; + } + + for (; x < tileROI.width; ++x) + tileHist[ptr[x]]++; + } + + // clip histogram + + if (clipLimit_ > 0) + { + // how many pixels were clipped + int clipped = 0; + for (int i = 0; i < histSize; ++i) + { + if (tileHist[i] > clipLimit_) + { + clipped += tileHist[i] - clipLimit_; + tileHist[i] = clipLimit_; + } + } + + // redistribute clipped pixels + int redistBatch = clipped / histSize; + int residual = clipped - redistBatch * histSize; + + for (int i = 0; i < histSize; ++i) + tileHist[i] += redistBatch; + + for (int i = 0; i < residual; ++i) + tileHist[i]++; + } + + // calc Lut + + int sum = 0; + for (int i = 0; i < histSize; ++i) + { + sum += tileHist[i]; + tileLut[i] = cv::saturate_cast(sum * lutScale_); + } + } + } + + class CLAHE_Interpolation_Body : public cv::ParallelLoopBody + { + public: + CLAHE_Interpolation_Body(const cv::Mat& src, cv::Mat& dst, const cv::Mat& lut, cv::Size tileSize, int tilesX, int tilesY) : + src_(src), dst_(dst), lut_(lut), tileSize_(tileSize), tilesX_(tilesX), tilesY_(tilesY) + { + } + + void operator ()(const cv::Range& range) const; + + private: + cv::Mat src_; + mutable cv::Mat dst_; + cv::Mat lut_; + + cv::Size tileSize_; + int tilesX_; + int tilesY_; + }; + + void CLAHE_Interpolation_Body::operator ()(const cv::Range& range) const + { + const size_t lut_step = lut_.step; + + for (int y = range.start; y < range.end; ++y) + { + const uchar* srcRow = src_.ptr(y); + uchar* dstRow = dst_.ptr(y); + + const float tyf = (static_cast(y) / tileSize_.height) - 0.5f; + + int ty1 = cvFloor(tyf); + int ty2 = ty1 + 1; + + const float ya = tyf - ty1; + + ty1 = std::max(ty1, 0); + ty2 = std::min(ty2, tilesY_ - 1); + + const uchar* lutPlane1 = lut_.ptr(ty1 * tilesX_); + const uchar* lutPlane2 = lut_.ptr(ty2 * tilesX_); + + for (int x = 0; x < src_.cols; ++x) + { + const float txf = (static_cast(x) / tileSize_.width) - 0.5f; + + int tx1 = cvFloor(txf); + int tx2 = tx1 + 1; + + const float xa = txf - tx1; + + tx1 = std::max(tx1, 0); + tx2 = std::min(tx2, tilesX_ - 1); + + const int srcVal = srcRow[x]; + + const size_t ind1 = tx1 * lut_step + srcVal; + const size_t ind2 = tx2 * lut_step + srcVal; + + float res = 0; + + res += lutPlane1[ind1] * ((1.0f - xa) * (1.0f - ya)); + res += lutPlane1[ind2] * ((xa) * (1.0f - ya)); + res += lutPlane2[ind1] * ((1.0f - xa) * (ya)); + res += lutPlane2[ind2] * ((xa) * (ya)); + + dstRow[x] = cv::saturate_cast(res); + } + } + } + + class CLAHE_Impl : public cv::CLAHE + { + public: + CLAHE_Impl(double clipLimit = 40.0, int tilesX = 8, int tilesY = 8); + + cv::AlgorithmInfo* info() const; + + void apply(cv::InputArray src, cv::OutputArray dst); + + void setClipLimit(double clipLimit); + double getClipLimit() const; + + void setTilesGridSize(cv::Size tileGridSize); + cv::Size getTilesGridSize() const; + + void collectGarbage(); + + private: + double clipLimit_; + int tilesX_; + int tilesY_; + + cv::Mat srcExt_; + cv::Mat lut_; + }; + + CLAHE_Impl::CLAHE_Impl(double clipLimit, int tilesX, int tilesY) : + clipLimit_(clipLimit), tilesX_(tilesX), tilesY_(tilesY) + { + } + + CV_INIT_ALGORITHM(CLAHE_Impl, "CLAHE", + obj.info()->addParam(obj, "clipLimit", obj.clipLimit_); + obj.info()->addParam(obj, "tilesX", obj.tilesX_); + obj.info()->addParam(obj, "tilesY", obj.tilesY_)) + + void CLAHE_Impl::apply(cv::InputArray _src, cv::OutputArray _dst) + { + cv::Mat src = _src.getMat(); + + CV_Assert( src.type() == CV_8UC1 ); + + _dst.create( src.size(), src.type() ); + cv::Mat dst = _dst.getMat(); + + const int histSize = 256; + + lut_.create(tilesX_ * tilesY_, histSize, CV_8UC1); + + cv::Size tileSize; + cv::Mat srcForLut; + + if (src.cols % tilesX_ == 0 && src.rows % tilesY_ == 0) + { + tileSize = cv::Size(src.cols / tilesX_, src.rows / tilesY_); + srcForLut = src; + } + else + { + cv::copyMakeBorder(src, srcExt_, 0, tilesY_ - (src.rows % tilesY_), 0, tilesX_ - (src.cols % tilesX_), cv::BORDER_REFLECT_101); + + tileSize = cv::Size(srcExt_.cols / tilesX_, srcExt_.rows / tilesY_); + srcForLut = srcExt_; + } + + const int tileSizeTotal = tileSize.area(); + const float lutScale = static_cast(histSize - 1) / tileSizeTotal; + + int clipLimit = 0; + if (clipLimit_ > 0.0) + { + clipLimit = static_cast(clipLimit_ * tileSizeTotal / histSize); + clipLimit = std::max(clipLimit, 1); + } + + CLAHE_CalcLut_Body calcLutBody(srcForLut, lut_, tileSize, tilesX_, tilesY_, clipLimit, lutScale); + cv::parallel_for_(cv::Range(0, tilesX_ * tilesY_), calcLutBody); + + CLAHE_Interpolation_Body interpolationBody(src, dst, lut_, tileSize, tilesX_, tilesY_); + cv::parallel_for_(cv::Range(0, src.rows), interpolationBody); + } + + void CLAHE_Impl::setClipLimit(double clipLimit) + { + clipLimit_ = clipLimit; + } + + double CLAHE_Impl::getClipLimit() const + { + return clipLimit_; + } + + void CLAHE_Impl::setTilesGridSize(cv::Size tileGridSize) + { + tilesX_ = tileGridSize.width; + tilesY_ = tileGridSize.height; + } + + cv::Size CLAHE_Impl::getTilesGridSize() const + { + return cv::Size(tilesX_, tilesY_); + } + + void CLAHE_Impl::collectGarbage() + { + srcExt_.release(); + lut_.release(); + } +} + +cv::Ptr cv::createCLAHE(double clipLimit, cv::Size tileGridSize) +{ + return new CLAHE_Impl(clipLimit, tileGridSize.width, tileGridSize.height); +} + +// ---------------------------------------------------------------------- + /* Implementation of RTTI and Generic Functions for CvHistogram */ #define CV_TYPE_NAME_HIST "opencv-hist" @@ -3339,4 +3633,3 @@ CvType hist_type( CV_TYPE_NAME_HIST, icvIsHist, (CvReleaseFunc)cvReleaseHist, icvReadHist, icvWriteHist, (CvCloneFunc)icvCloneHist ); /* End of file. */ - From 4d23e2c8c995c94019e1aecf481bd57a7b40680d Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Mon, 25 Mar 2013 15:39:07 +0400 Subject: [PATCH 11/31] GPU implementation of CLAHE --- .../gpu/include/opencv2/gpu/device/scan.hpp | 81 +++++++- modules/gpu/include/opencv2/gpu/gpu.hpp | 8 + modules/gpu/perf/perf_imgproc.cpp | 33 ++++ modules/gpu/src/cuda/clahe.cu | 186 ++++++++++++++++++ modules/gpu/src/imgproc.cpp | 133 +++++++++++++ modules/gpu/test/test_imgproc.cpp | 44 +++++ 6 files changed, 484 insertions(+), 1 deletion(-) create mode 100644 modules/gpu/src/cuda/clahe.cu diff --git a/modules/gpu/include/opencv2/gpu/device/scan.hpp b/modules/gpu/include/opencv2/gpu/device/scan.hpp index f6dc6937fb..3d8da16f84 100644 --- a/modules/gpu/include/opencv2/gpu/device/scan.hpp +++ b/modules/gpu/include/opencv2/gpu/device/scan.hpp @@ -43,7 +43,10 @@ #ifndef __OPENCV_GPU_SCAN_HPP__ #define __OPENCV_GPU_SCAN_HPP__ -#include "common.hpp" +#include "opencv2/gpu/device/common.hpp" +#include "opencv2/gpu/device/utility.hpp" +#include "opencv2/gpu/device/warp.hpp" +#include "opencv2/gpu/device/warp_shuffle.hpp" namespace cv { namespace gpu { namespace device { @@ -166,6 +169,82 @@ namespace cv { namespace gpu { namespace device static const int warp_log = 5; static const int warp_mask = 31; }; + + template + __device__ T warpScanInclusive(T idata, volatile T* s_Data, unsigned int tid) + { + #if __CUDA_ARCH__ >= 300 + const unsigned int laneId = cv::gpu::device::Warp::laneId(); + + // scan on shuffl functions + #pragma unroll + for (int i = 1; i <= (OPENCV_GPU_WARP_SIZE / 2); i *= 2) + { + const T n = cv::gpu::device::shfl_up(idata, i); + if (laneId >= i) + idata += n; + } + + return idata; + #else + unsigned int pos = 2 * tid - (tid & (OPENCV_GPU_WARP_SIZE - 1)); + s_Data[pos] = 0; + pos += OPENCV_GPU_WARP_SIZE; + s_Data[pos] = idata; + + s_Data[pos] += s_Data[pos - 1]; + s_Data[pos] += s_Data[pos - 2]; + s_Data[pos] += s_Data[pos - 4]; + s_Data[pos] += s_Data[pos - 8]; + s_Data[pos] += s_Data[pos - 16]; + + return s_Data[pos]; + #endif + } + + template + __device__ __forceinline__ T warpScanExclusive(T idata, volatile T* s_Data, unsigned int tid) + { + return warpScanInclusive(idata, s_Data, tid) - idata; + } + + template + __device__ T blockScanInclusive(T idata, volatile T* s_Data, unsigned int tid) + { + if (tiNumScanThreads > OPENCV_GPU_WARP_SIZE) + { + //Bottom-level inclusive warp scan + T warpResult = warpScanInclusive(idata, s_Data, tid); + + //Save top elements of each warp for exclusive warp scan + //sync to wait for warp scans to complete (because s_Data is being overwritten) + __syncthreads(); + if ((tid & (OPENCV_GPU_WARP_SIZE - 1)) == (OPENCV_GPU_WARP_SIZE - 1)) + { + s_Data[tid >> OPENCV_GPU_LOG_WARP_SIZE] = warpResult; + } + + //wait for warp scans to complete + __syncthreads(); + + if (tid < (tiNumScanThreads / OPENCV_GPU_WARP_SIZE) ) + { + //grab top warp elements + T val = s_Data[tid]; + //calculate exclusive scan and write back to shared memory + s_Data[tid] = warpScanExclusive(val, s_Data, tid); + } + + //return updated warp scans with exclusive scan results + __syncthreads(); + + return warpResult + s_Data[tid >> OPENCV_GPU_LOG_WARP_SIZE]; + } + else + { + return warpScanInclusive(idata, s_Data, tid); + } + } }}} #endif // __OPENCV_GPU_SCAN_HPP__ diff --git a/modules/gpu/include/opencv2/gpu/gpu.hpp b/modules/gpu/include/opencv2/gpu/gpu.hpp index bd7085a004..e2fc99b90f 100644 --- a/modules/gpu/include/opencv2/gpu/gpu.hpp +++ b/modules/gpu/include/opencv2/gpu/gpu.hpp @@ -1062,6 +1062,14 @@ CV_EXPORTS void equalizeHist(const GpuMat& src, GpuMat& dst, Stream& stream = St CV_EXPORTS void equalizeHist(const GpuMat& src, GpuMat& dst, GpuMat& hist, Stream& stream = Stream::Null()); CV_EXPORTS void equalizeHist(const GpuMat& src, GpuMat& dst, GpuMat& hist, GpuMat& buf, Stream& stream = Stream::Null()); +class CV_EXPORTS CLAHE : public cv::CLAHE +{ +public: + using cv::CLAHE::apply; + virtual void apply(InputArray src, OutputArray dst, Stream& stream) = 0; +}; +CV_EXPORTS Ptr createCLAHE(double clipLimit = 40.0, Size tileGridSize = Size(8, 8)); + //////////////////////////////// StereoBM_GPU //////////////////////////////// class CV_EXPORTS StereoBM_GPU diff --git a/modules/gpu/perf/perf_imgproc.cpp b/modules/gpu/perf/perf_imgproc.cpp index 9f4d673594..eff2bfcf2e 100644 --- a/modules/gpu/perf/perf_imgproc.cpp +++ b/modules/gpu/perf/perf_imgproc.cpp @@ -600,6 +600,39 @@ PERF_TEST_P(Sz, ImgProc_EqualizeHist, } } +DEF_PARAM_TEST(Sz_ClipLimit, cv::Size, double); + +PERF_TEST_P(Sz_ClipLimit, ImgProc_CLAHE, + Combine(GPU_TYPICAL_MAT_SIZES, + Values(0.0, 40.0))) +{ + const cv::Size size = GET_PARAM(0); + const double clipLimit = GET_PARAM(1); + + cv::Mat src(size, CV_8UC1); + declare.in(src, WARMUP_RNG); + + if (PERF_RUN_GPU()) + { + cv::Ptr clahe = cv::gpu::createCLAHE(clipLimit); + cv::gpu::GpuMat d_src(src); + cv::gpu::GpuMat dst; + + TEST_CYCLE() clahe->apply(d_src, dst); + + GPU_SANITY_CHECK(dst); + } + else + { + cv::Ptr clahe = cv::createCLAHE(clipLimit); + cv::Mat dst; + + TEST_CYCLE() clahe->apply(src, dst); + + CPU_SANITY_CHECK(dst); + } +} + ////////////////////////////////////////////////////////////////////// // ColumnSum diff --git a/modules/gpu/src/cuda/clahe.cu b/modules/gpu/src/cuda/clahe.cu new file mode 100644 index 0000000000..a0c30d5826 --- /dev/null +++ b/modules/gpu/src/cuda/clahe.cu @@ -0,0 +1,186 @@ +/*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*/ + +#if !defined CUDA_DISABLER + +#include "opencv2/gpu/device/common.hpp" +#include "opencv2/gpu/device/functional.hpp" +#include "opencv2/gpu/device/emulation.hpp" +#include "opencv2/gpu/device/scan.hpp" +#include "opencv2/gpu/device/reduce.hpp" +#include "opencv2/gpu/device/saturate_cast.hpp" + +using namespace cv::gpu; +using namespace cv::gpu::device; + +namespace clahe +{ + __global__ void calcLutKernel(const PtrStepb src, PtrStepb lut, + const int2 tileSize, const int tilesX, + const int clipLimit, const float lutScale) + { + __shared__ int smem[512]; + + const int tx = blockIdx.x; + const int ty = blockIdx.y; + const unsigned int tid = threadIdx.y * blockDim.x + threadIdx.x; + + smem[tid] = 0; + __syncthreads(); + + for (int i = threadIdx.y; i < tileSize.y; i += blockDim.y) + { + const uchar* srcPtr = src.ptr(ty * tileSize.y + i) + tx * tileSize.x; + for (int j = threadIdx.x; j < tileSize.x; j += blockDim.x) + { + const int data = srcPtr[j]; + Emulation::smem::atomicAdd(&smem[data], 1); + } + } + + __syncthreads(); + + int tHistVal = smem[tid]; + + __syncthreads(); + + if (clipLimit > 0) + { + // clip histogram bar + + int clipped = 0; + if (tHistVal > clipLimit) + { + clipped = tHistVal - clipLimit; + tHistVal = clipLimit; + } + + // find number of overall clipped samples + + reduce<256>(smem, clipped, tid, plus()); + + // broadcast evaluated value + + __shared__ int totalClipped; + + if (tid == 0) + totalClipped = clipped; + __syncthreads(); + + // redistribute clipped samples evenly + + int redistBatch = totalClipped / 256; + tHistVal += redistBatch; + + int residual = totalClipped - redistBatch * 256; + if (tid < residual) + ++tHistVal; + } + + const int lutVal = blockScanInclusive<256>(tHistVal, smem, tid); + + lut(ty * tilesX + tx, tid) = saturate_cast(__float2int_rn(lutScale * lutVal)); + } + + void calcLut(PtrStepSzb src, PtrStepb lut, int tilesX, int tilesY, int2 tileSize, int clipLimit, float lutScale, cudaStream_t stream) + { + const dim3 block(32, 8); + const dim3 grid(tilesX, tilesY); + + calcLutKernel<<>>(src, lut, tileSize, tilesX, clipLimit, lutScale); + + cudaSafeCall( cudaGetLastError() ); + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } + + __global__ void tranformKernel(const PtrStepSzb src, PtrStepb dst, const PtrStepb lut, const int2 tileSize, const int tilesX, const int tilesY) + { + const int x = blockIdx.x * blockDim.x + threadIdx.x; + const int y = blockIdx.y * blockDim.y + threadIdx.y; + + if (x >= src.cols || y >= src.rows) + return; + + const float tyf = (static_cast(y) / tileSize.y) - 0.5f; + int ty1 = __float2int_rd(tyf); + int ty2 = ty1 + 1; + const float ya = tyf - ty1; + ty1 = ::max(ty1, 0); + ty2 = ::min(ty2, tilesY - 1); + + const float txf = (static_cast(x) / tileSize.x) - 0.5f; + int tx1 = __float2int_rd(txf); + int tx2 = tx1 + 1; + const float xa = txf - tx1; + tx1 = ::max(tx1, 0); + tx2 = ::min(tx2, tilesX - 1); + + const int srcVal = src(y, x); + + float res = 0; + + res += lut(ty1 * tilesX + tx1, srcVal) * ((1.0f - xa) * (1.0f - ya)); + res += lut(ty1 * tilesX + tx2, srcVal) * ((xa) * (1.0f - ya)); + res += lut(ty2 * tilesX + tx1, srcVal) * ((1.0f - xa) * (ya)); + res += lut(ty2 * tilesX + tx2, srcVal) * ((xa) * (ya)); + + dst(y, x) = saturate_cast(res); + } + + void transform(PtrStepSzb src, PtrStepSzb dst, PtrStepb lut, int tilesX, int tilesY, int2 tileSize, cudaStream_t stream) + { + const dim3 block(32, 8); + const dim3 grid(divUp(src.cols, block.x), divUp(src.rows, block.y)); + + cudaSafeCall( cudaFuncSetCacheConfig(tranformKernel, cudaFuncCachePreferL1) ); + + tranformKernel<<>>(src, dst, lut, tileSize, tilesX, tilesY); + cudaSafeCall( cudaGetLastError() ); + + if (stream == 0) + cudaSafeCall( cudaDeviceSynchronize() ); + } +} + +#endif // CUDA_DISABLER diff --git a/modules/gpu/src/imgproc.cpp b/modules/gpu/src/imgproc.cpp index d9ca46844e..97c7c766c0 100644 --- a/modules/gpu/src/imgproc.cpp +++ b/modules/gpu/src/imgproc.cpp @@ -96,6 +96,7 @@ void cv::gpu::Canny(const GpuMat&, const GpuMat&, GpuMat&, double, double, bool) void cv::gpu::Canny(const GpuMat&, const GpuMat&, CannyBuf&, GpuMat&, double, double, bool) { throw_nogpu(); } void cv::gpu::CannyBuf::create(const Size&, int) { throw_nogpu(); } void cv::gpu::CannyBuf::release() { throw_nogpu(); } +cv::Ptr cv::gpu::createCLAHE(double, cv::Size) { throw_nogpu(); return cv::Ptr(); } #else /* !defined (HAVE_CUDA) */ @@ -1559,4 +1560,136 @@ void cv::gpu::Canny(const GpuMat& dx, const GpuMat& dy, CannyBuf& buf, GpuMat& d CannyCaller(dx, dy, buf, dst, static_cast(low_thresh), static_cast(high_thresh)); } +//////////////////////////////////////////////////////////////////////// +// CLAHE + +namespace clahe +{ + void calcLut(PtrStepSzb src, PtrStepb lut, int tilesX, int tilesY, int2 tileSize, int clipLimit, float lutScale, cudaStream_t stream); + void transform(PtrStepSzb src, PtrStepSzb dst, PtrStepb lut, int tilesX, int tilesY, int2 tileSize, cudaStream_t stream); +} + +namespace +{ + class CLAHE_Impl : public cv::gpu::CLAHE + { + public: + CLAHE_Impl(double clipLimit = 40.0, int tilesX = 8, int tilesY = 8); + + cv::AlgorithmInfo* info() const; + + void apply(cv::InputArray src, cv::OutputArray dst); + void apply(InputArray src, OutputArray dst, Stream& stream); + + void setClipLimit(double clipLimit); + double getClipLimit() const; + + void setTilesGridSize(cv::Size tileGridSize); + cv::Size getTilesGridSize() const; + + void collectGarbage(); + + private: + double clipLimit_; + int tilesX_; + int tilesY_; + + GpuMat srcExt_; + GpuMat lut_; + }; + + CLAHE_Impl::CLAHE_Impl(double clipLimit, int tilesX, int tilesY) : + clipLimit_(clipLimit), tilesX_(tilesX), tilesY_(tilesY) + { + } + + CV_INIT_ALGORITHM(CLAHE_Impl, "CLAHE_GPU", + obj.info()->addParam(obj, "clipLimit", obj.clipLimit_); + obj.info()->addParam(obj, "tilesX", obj.tilesX_); + obj.info()->addParam(obj, "tilesY", obj.tilesY_)) + + void CLAHE_Impl::apply(cv::InputArray _src, cv::OutputArray _dst) + { + apply(_src, _dst, Stream::Null()); + } + + void CLAHE_Impl::apply(InputArray _src, OutputArray _dst, Stream& s) + { + GpuMat src = _src.getGpuMat(); + + CV_Assert( src.type() == CV_8UC1 ); + + _dst.create( src.size(), src.type() ); + GpuMat dst = _dst.getGpuMat(); + + const int histSize = 256; + + ensureSizeIsEnough(tilesX_ * tilesY_, histSize, CV_8UC1, lut_); + + cudaStream_t stream = StreamAccessor::getStream(s); + + cv::Size tileSize; + GpuMat srcForLut; + + if (src.cols % tilesX_ == 0 && src.rows % tilesY_ == 0) + { + tileSize = cv::Size(src.cols / tilesX_, src.rows / tilesY_); + srcForLut = src; + } + else + { + cv::gpu::copyMakeBorder(src, srcExt_, 0, tilesY_ - (src.rows % tilesY_), 0, tilesX_ - (src.cols % tilesX_), cv::BORDER_REFLECT_101, cv::Scalar(), s); + + tileSize = cv::Size(srcExt_.cols / tilesX_, srcExt_.rows / tilesY_); + srcForLut = srcExt_; + } + + const int tileSizeTotal = tileSize.area(); + const float lutScale = static_cast(histSize - 1) / tileSizeTotal; + + int clipLimit = 0; + if (clipLimit_ > 0.0) + { + clipLimit = static_cast(clipLimit_ * tileSizeTotal / histSize); + clipLimit = std::max(clipLimit, 1); + } + + clahe::calcLut(srcForLut, lut_, tilesX_, tilesY_, make_int2(tileSize.width, tileSize.height), clipLimit, lutScale, stream); + + clahe::transform(src, dst, lut_, tilesX_, tilesY_, make_int2(tileSize.width, tileSize.height), stream); + } + + void CLAHE_Impl::setClipLimit(double clipLimit) + { + clipLimit_ = clipLimit; + } + + double CLAHE_Impl::getClipLimit() const + { + return clipLimit_; + } + + void CLAHE_Impl::setTilesGridSize(cv::Size tileGridSize) + { + tilesX_ = tileGridSize.width; + tilesY_ = tileGridSize.height; + } + + cv::Size CLAHE_Impl::getTilesGridSize() const + { + return cv::Size(tilesX_, tilesY_); + } + + void CLAHE_Impl::collectGarbage() + { + srcExt_.release(); + lut_.release(); + } +} + +cv::Ptr cv::gpu::createCLAHE(double clipLimit, cv::Size tileGridSize) +{ + return new CLAHE_Impl(clipLimit, tileGridSize.width, tileGridSize.height); +} + #endif /* !defined (HAVE_CUDA) */ diff --git a/modules/gpu/test/test_imgproc.cpp b/modules/gpu/test/test_imgproc.cpp index 3341737415..925ca9d7ef 100644 --- a/modules/gpu/test/test_imgproc.cpp +++ b/modules/gpu/test/test_imgproc.cpp @@ -217,6 +217,50 @@ INSTANTIATE_TEST_CASE_P(GPU_ImgProc, EqualizeHist, testing::Combine( ALL_DEVICES, DIFFERENT_SIZES)); +/////////////////////////////////////////////////////////////////////////////////////////////////////// +// CLAHE + +namespace +{ + IMPLEMENT_PARAM_CLASS(ClipLimit, double) +} + +PARAM_TEST_CASE(CLAHE, cv::gpu::DeviceInfo, cv::Size, ClipLimit) +{ + cv::gpu::DeviceInfo devInfo; + cv::Size size; + double clipLimit; + + virtual void SetUp() + { + devInfo = GET_PARAM(0); + size = GET_PARAM(1); + clipLimit = GET_PARAM(2); + + cv::gpu::setDevice(devInfo.deviceID()); + } +}; + +GPU_TEST_P(CLAHE, Accuracy) +{ + cv::Mat src = randomMat(size, CV_8UC1); + + cv::Ptr clahe = cv::gpu::createCLAHE(clipLimit); + cv::gpu::GpuMat dst; + clahe->apply(loadMat(src), dst); + + cv::Ptr clahe_gold = cv::createCLAHE(clipLimit); + cv::Mat dst_gold; + clahe_gold->apply(src, dst_gold); + + ASSERT_MAT_NEAR(dst_gold, dst, 1.0); +} + +INSTANTIATE_TEST_CASE_P(GPU_ImgProc, CLAHE, testing::Combine( + ALL_DEVICES, + DIFFERENT_SIZES, + testing::Values(0.0, 40.0))); + //////////////////////////////////////////////////////////////////////// // ColumnSum From f282498b1d4b3a93f306c7d8da9c0dc547949156 Mon Sep 17 00:00:00 2001 From: Andrey Kamaev Date: Mon, 25 Mar 2013 21:57:53 +0400 Subject: [PATCH 12/31] Drop outdated targets and fix solution folders --- cmake/OpenCVExtraTargets.cmake | 54 ++------------------------------ cmake/OpenCVModule.cmake | 3 -- modules/java/test/CMakeLists.txt | 4 +++ samples/cpp/CMakeLists.txt | 6 ++-- 4 files changed, 10 insertions(+), 57 deletions(-) diff --git a/cmake/OpenCVExtraTargets.cmake b/cmake/OpenCVExtraTargets.cmake index 936e3a2635..b4d339155a 100644 --- a/cmake/OpenCVExtraTargets.cmake +++ b/cmake/OpenCVExtraTargets.cmake @@ -13,57 +13,7 @@ endif() # ---------------------------------------------------------------------------- -# Source package, for "make package_source" -# ---------------------------------------------------------------------------- -if(BUILD_PACKAGE) - set(TARBALL_NAME "${CMAKE_PROJECT_NAME}-${OPENCV_VERSION}") - if (NOT WIN32) - if(APPLE) - set(TAR_CMD gnutar) - else() - set(TAR_CMD tar) - endif() - set(TAR_TRANSFORM "\"s,^,${TARBALL_NAME}/,\"") - add_custom_target(package_source - #TODO: maybe we should not remove dll's - COMMAND ${TAR_CMD} --transform ${TAR_TRANSFORM} -cjpf ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.tar.bz2 --exclude=".svn" --exclude=".git" --exclude="*.pyc" --exclude="*.vcproj" --exclude="*/lib/*" --exclude="*.dll" ./ - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - else() - add_custom_target(package_source - COMMAND zip -9 -r ${CMAKE_CURRENT_BINARY_DIR}/${TARBALL_NAME}.zip . -x '*/.svn/*' '*/.git/*' '*.vcproj' '*.pyc' - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - endif() - if(ENABLE_SOLUTION_FOLDERS) - set_target_properties(package_source PROPERTIES FOLDER "extra") - endif() -endif() - - -# ---------------------------------------------------------------------------- -# performance tests, for "make perf" -# ---------------------------------------------------------------------------- -if(BUILD_PERF_TESTS AND PYTHON_EXECUTABLE) - if(CMAKE_VERSION VERSION_GREATER "2.8.2") - add_custom_target(perf - ${PYTHON_EXECUTABLE} "${OpenCV_SOURCE_DIR}/modules/ts/misc/run.py" --configuration $ "${CMAKE_BINARY_DIR}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - DEPENDS "${OpenCV_SOURCE_DIR}/modules/ts/misc/run.py" - ) - else() - add_custom_target(perf - ${PYTHON_EXECUTABLE} "${OpenCV_SOURCE_DIR}/modules/ts/misc/run.py" "${CMAKE_BINARY_DIR}" - WORKING_DIRECTORY "${CMAKE_BINARY_DIR}" - DEPENDS "${OpenCV_SOURCE_DIR}/modules/ts/misc/run.py" - ) - endif() - if(ENABLE_SOLUTION_FOLDERS) - set_target_properties(perf PROPERTIES FOLDER "extra") - endif() -endif() - - -# ---------------------------------------------------------------------------- -# spefial targets to build all OpenCV modules +# target building all OpenCV modules # ---------------------------------------------------------------------------- add_custom_target(opencv_modules) if(ENABLE_SOLUTION_FOLDERS) @@ -72,7 +22,7 @@ endif() # ---------------------------------------------------------------------------- -# spefial targets to build all tests +# targets building all tests # ---------------------------------------------------------------------------- if(BUILD_TESTS) add_custom_target(opencv_tests) diff --git a/cmake/OpenCVModule.cmake b/cmake/OpenCVModule.cmake index abb0393956..90b4863405 100644 --- a/cmake/OpenCVModule.cmake +++ b/cmake/OpenCVModule.cmake @@ -635,9 +635,6 @@ function(ocv_add_perf_tests) ocv_add_precompiled_headers(${the_target}) - if (PYTHON_EXECUTABLE) - add_dependencies(perf ${the_target}) - endif() else(OCV_DEPENDENCIES_FOUND) # TODO: warn about unsatisfied dependencies endif(OCV_DEPENDENCIES_FOUND) diff --git a/modules/java/test/CMakeLists.txt b/modules/java/test/CMakeLists.txt index 8f3021991d..122aae22a0 100644 --- a/modules/java/test/CMakeLists.txt +++ b/modules/java/test/CMakeLists.txt @@ -75,3 +75,7 @@ add_custom_command(OUTPUT "${opencv_test_java_bin_dir}/build/jar/opencv-test.jar add_custom_target(${PROJECT_NAME} ALL SOURCES "${opencv_test_java_bin_dir}/build/jar/opencv-test.jar") add_dependencies(${PROJECT_NAME} ${the_module}) + +if(ENABLE_SOLUTION_FOLDERS) + set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "tests accuracy") +endif() diff --git a/samples/cpp/CMakeLists.txt b/samples/cpp/CMakeLists.txt index f69382ac66..ac61ec359e 100644 --- a/samples/cpp/CMakeLists.txt +++ b/samples/cpp/CMakeLists.txt @@ -32,9 +32,11 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND) if("${srcs}" MATCHES "tutorial_code") set(sample_kind tutorial) set(sample_KIND TUTORIAL) + set(sample_folder "samples//tutorials") else() set(sample_kind example) set(sample_KIND EXAMPLE) + set(sample_folder "samples//cpp") endif() set(the_target "${sample_kind}_${name}") @@ -50,7 +52,7 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND) PROJECT_LABEL "(${sample_KIND}) ${name}") if(ENABLE_SOLUTION_FOLDERS) - set_target_properties(${the_target} PROPERTIES FOLDER "${sample_kind}s//cpp") + set_target_properties(${the_target} PROPERTIES FOLDER "${sample_folder}") endif() if(WIN32) @@ -58,7 +60,7 @@ if(BUILD_EXAMPLES AND OCV_DEPENDENCIES_FOUND) set_target_properties(${the_target} PROPERTIES LINK_FLAGS "/NODEFAULTLIB:atlthunk.lib /NODEFAULTLIB:atlsd.lib /DEBUG") endif() install(TARGETS ${the_target} - RUNTIME DESTINATION "${sample_kind}s/cpp" COMPONENT main) + RUNTIME DESTINATION "${sample_folder}" COMPONENT main) endif() ENDMACRO() From 7e495a1d6639ccfb3c260b6157ede4042767d63a Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 26 Mar 2013 11:48:14 +0800 Subject: [PATCH 13/31] fix amdFft and amdBlas path --- cmake/OpenCVDetectOpenCL.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/OpenCVDetectOpenCL.cmake b/cmake/OpenCVDetectOpenCL.cmake index 76f76ebc12..eafecd93cc 100644 --- a/cmake/OpenCVDetectOpenCL.cmake +++ b/cmake/OpenCVDetectOpenCL.cmake @@ -43,7 +43,7 @@ if(OPENCL_FOUND) set(OPENCL_LIBRARIES ${OPENCL_LIBRARY}) if (X86_64) - set(CLAMD_POSSIBLE_LIB_SUFFIXES lib32/import) + set(CLAMD_POSSIBLE_LIB_SUFFIXES lib64/import) elseif (X86) set(CLAMD_POSSIBLE_LIB_SUFFIXES lib32/import) endif() From f7b40cdc63ec3e9f8631ac73fab8d4e2b98e8913 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 26 Mar 2013 11:51:02 +0800 Subject: [PATCH 14/31] Add a macro to call additional barrier function on the fly --- modules/nonfree/src/opencl/surf.cl | 226 +++++++++++++++++++------ modules/nonfree/src/surf.ocl.cpp | 2 +- modules/nonfree/test/test_surf.ocl.cpp | 7 +- 3 files changed, 180 insertions(+), 55 deletions(-) diff --git a/modules/nonfree/src/opencl/surf.cl b/modules/nonfree/src/opencl/surf.cl index e917864d73..140a4d746c 100644 --- a/modules/nonfree/src/opencl/surf.cl +++ b/modules/nonfree/src/opencl/surf.cl @@ -747,21 +747,42 @@ void reduce_32_sum(volatile __local float * data, volatile float* partial_reduc #define op(A, B) (*A)+(B) data[tid] = *partial_reduction; barrier(CLK_LOCAL_MEM_FENCE); - +#ifndef WAVE_SIZE +#define WAVE_SIZE 1 +#endif if (tid < 16) + { data[tid] = *partial_reduction = op(partial_reduction, data[tid + 16]); +#if WAVE_SIZE < 16 + } barrier(CLK_LOCAL_MEM_FENCE); if (tid < 8) + { +#endif data[tid] = *partial_reduction = op(partial_reduction, data[tid + 8 ]); +#if WAVE_SIZE < 8 + } barrier(CLK_LOCAL_MEM_FENCE); if (tid < 4) + { +#endif data[tid] = *partial_reduction = op(partial_reduction, data[tid + 4 ]); +#if WAVE_SIZE < 4 + } barrier(CLK_LOCAL_MEM_FENCE); if (tid < 2) + { +#endif data[tid] = *partial_reduction = op(partial_reduction, data[tid + 2 ]); +#if WAVE_SIZE < 2 + } barrier(CLK_LOCAL_MEM_FENCE); if (tid < 1) + { +#endif data[tid] = *partial_reduction = op(partial_reduction, data[tid + 1 ]); + } +#undef WAVE_SIZE #undef op } @@ -1087,44 +1108,67 @@ void reduce_sum25( int tid ) { +#ifndef WAVE_SIZE +#define WAVE_SIZE 1 +#endif // first step is to reduce from 25 to 16 - if (tid < 9) // use 9 threads + if (tid < 9) { sdata1[tid] += sdata1[tid + 16]; sdata2[tid] += sdata2[tid + 16]; sdata3[tid] += sdata3[tid + 16]; sdata4[tid] += sdata4[tid + 16]; +#if WAVE_SIZE < 16 } - - // sum (reduce) from 16 to 1 (unrolled - aligned to a half-warp) + barrier(CLK_LOCAL_MEM_FENCE); if (tid < 8) { +#endif sdata1[tid] += sdata1[tid + 8]; - sdata1[tid] += sdata1[tid + 4]; - sdata1[tid] += sdata1[tid + 2]; - sdata1[tid] += sdata1[tid + 1]; sdata2[tid] += sdata2[tid + 8]; - sdata2[tid] += sdata2[tid + 4]; - sdata2[tid] += sdata2[tid + 2]; - sdata2[tid] += sdata2[tid + 1]; sdata3[tid] += sdata3[tid + 8]; - sdata3[tid] += sdata3[tid + 4]; - sdata3[tid] += sdata3[tid + 2]; - sdata3[tid] += sdata3[tid + 1]; sdata4[tid] += sdata4[tid + 8]; +#if WAVE_SIZE < 8 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 4) + { +#endif + sdata1[tid] += sdata1[tid + 4]; + sdata2[tid] += sdata2[tid + 4]; + sdata3[tid] += sdata3[tid + 4]; sdata4[tid] += sdata4[tid + 4]; +#if WAVE_SIZE < 4 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 2) + { +#endif + sdata1[tid] += sdata1[tid + 2]; + sdata2[tid] += sdata2[tid + 2]; + sdata3[tid] += sdata3[tid + 2]; sdata4[tid] += sdata4[tid + 2]; +#if WAVE_SIZE < 2 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 1) + { +#endif + sdata1[tid] += sdata1[tid + 1]; + sdata2[tid] += sdata2[tid + 1]; + sdata3[tid] += sdata3[tid + 1]; sdata4[tid] += sdata4[tid + 1]; } +#undef WAVE_SIZE } __kernel void compute_descriptors64( IMAGE_INT8 imgTex, - volatile __global float * descriptors, + __global float * descriptors, __global const float * keypoints, int descriptors_step, int keypoints_step, @@ -1158,14 +1202,13 @@ __kernel sdyabs[tid] = fabs(sdy[tid]); // |dy| array } barrier(CLK_LOCAL_MEM_FENCE); - if (tid < 25) - { + reduce_sum25(sdx, sdy, sdxabs, sdyabs, tid); - } + barrier(CLK_LOCAL_MEM_FENCE); if (tid < 25) { - volatile __global float* descriptors_block = descriptors + descriptors_step * get_group_id(0) + (get_group_id(1) << 2); + __global float* descriptors_block = descriptors + descriptors_step * get_group_id(0) + (get_group_id(1) << 2); // write dx, dy, |dx|, |dy| if (tid == 0) @@ -1180,7 +1223,7 @@ __kernel __kernel void compute_descriptors128( IMAGE_INT8 imgTex, - __global volatile float * descriptors, + __global float * descriptors, __global float * keypoints, int descriptors_step, int keypoints_step, @@ -1229,13 +1272,15 @@ __kernel sd2[tid] = sdx[tid]; sdabs2[tid] = fabs(sdx[tid]); } - //barrier(CLK_LOCAL_MEM_FENCE); + } + barrier(CLK_LOCAL_MEM_FENCE); reduce_sum25(sd1, sd2, sdabs1, sdabs2, tid); - //barrier(CLK_LOCAL_MEM_FENCE); - - volatile __global float* descriptors_block = descriptors + descriptors_step * get_group_id(0) + (get_group_id(1) << 3); + barrier(CLK_LOCAL_MEM_FENCE); + __global float* descriptors_block = descriptors + descriptors_step * get_group_id(0) + (get_group_id(1) << 3); + if (tid < 25) + { // write dx (dy >= 0), |dx| (dy >= 0), dx (dy < 0), |dx| (dy < 0) if (tid == 0) { @@ -1259,11 +1304,14 @@ __kernel sd2[tid] = sdy[tid]; sdabs2[tid] = fabs(sdy[tid]); } - //barrier(CLK_LOCAL_MEM_FENCE); + } + barrier(CLK_LOCAL_MEM_FENCE); reduce_sum25(sd1, sd2, sdabs1, sdabs2, tid); - //barrier(CLK_LOCAL_MEM_FENCE); + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 25) + { // write dy (dx >= 0), |dy| (dx >= 0), dy (dx < 0), |dy| (dx < 0) if (tid == 0) { @@ -1274,6 +1322,103 @@ __kernel } } } +void reduce_sum128(volatile __local float* smem, int tid) +{ +#ifndef WAVE_SIZE +#define WAVE_SIZE 1 +#endif + if (tid < 64) + { + smem[tid] += smem[tid + 64]; +#if WAVE_SIZE < 64 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 32) + { +#endif + smem[tid] += smem[tid + 32]; +#if WAVE_SIZE < 32 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 16) + { +#endif + smem[tid] += smem[tid + 16]; +#if WAVE_SIZE < 16 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 8) + { +#endif + smem[tid] += smem[tid + 8]; +#if WAVE_SIZE < 8 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 4) + { +#endif + smem[tid] += smem[tid + 4]; +#if WAVE_SIZE < 4 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 2) + { +#endif + smem[tid] += smem[tid + 2]; +#if WAVE_SIZE < 2 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 1) + { +#endif + smem[tid] += smem[tid + 1]; + } +} +void reduce_sum64(volatile __local float* smem, int tid) +{ +#ifndef WAVE_SIZE +#define WAVE_SIZE 1 +#endif + if (tid < 32) + { + smem[tid] += smem[tid + 32]; +#if WAVE_SIZE < 32 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 16) + { +#endif + smem[tid] += smem[tid + 16]; +#if WAVE_SIZE < 16 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 8) + { +#endif + smem[tid] += smem[tid + 8]; +#if WAVE_SIZE < 8 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 4) + { +#endif + smem[tid] += smem[tid + 4]; +#if WAVE_SIZE < 4 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 2) + { +#endif + smem[tid] += smem[tid + 2]; +#if WAVE_SIZE < 2 + } + barrier(CLK_LOCAL_MEM_FENCE); + if (tid < 1) + { +#endif + smem[tid] += smem[tid + 1]; + } +} __kernel void normalize_descriptors128(__global float * descriptors, int descriptors_step) @@ -1288,22 +1433,10 @@ __kernel sqDesc[get_local_id(0)] = lookup * lookup; barrier(CLK_LOCAL_MEM_FENCE); - if (get_local_id(0) < 64) - sqDesc[get_local_id(0)] += sqDesc[get_local_id(0) + 64]; + reduce_sum128(sqDesc, get_local_id(0)); barrier(CLK_LOCAL_MEM_FENCE); - // reduction to get total - if (get_local_id(0) < 32) - { - volatile __local float* smem = sqDesc; - - smem[get_local_id(0)] += smem[get_local_id(0) + 32]; - smem[get_local_id(0)] += smem[get_local_id(0) + 16]; - smem[get_local_id(0)] += smem[get_local_id(0) + 8]; - smem[get_local_id(0)] += smem[get_local_id(0) + 4]; - smem[get_local_id(0)] += smem[get_local_id(0) + 2]; - smem[get_local_id(0)] += smem[get_local_id(0) + 1]; - } + // compute length (square root) volatile __local float len; @@ -1329,18 +1462,9 @@ __kernel sqDesc[get_local_id(0)] = lookup * lookup; barrier(CLK_LOCAL_MEM_FENCE); - // reduction to get total - if (get_local_id(0) < 32) - { - volatile __local float* smem = sqDesc; - - smem[get_local_id(0)] += smem[get_local_id(0) + 32]; - smem[get_local_id(0)] += smem[get_local_id(0) + 16]; - smem[get_local_id(0)] += smem[get_local_id(0) + 8]; - smem[get_local_id(0)] += smem[get_local_id(0) + 4]; - smem[get_local_id(0)] += smem[get_local_id(0) + 2]; - smem[get_local_id(0)] += smem[get_local_id(0) + 1]; - } + + reduce_sum64(sqDesc, get_local_id(0)); + barrier(CLK_LOCAL_MEM_FENCE); // compute length (square root) volatile __local float len; diff --git a/modules/nonfree/src/surf.ocl.cpp b/modules/nonfree/src/surf.ocl.cpp index d8336b9387..b72d132d64 100644 --- a/modules/nonfree/src/surf.ocl.cpp +++ b/modules/nonfree/src/surf.ocl.cpp @@ -75,7 +75,7 @@ namespace cv } -static inline int divUp(size_t total, size_t grain) +static inline size_t divUp(size_t total, size_t grain) { return (total + grain - 1) / grain; } diff --git a/modules/nonfree/test/test_surf.ocl.cpp b/modules/nonfree/test/test_surf.ocl.cpp index 76ed37de45..0d09cc8b93 100644 --- a/modules/nonfree/test/test_surf.ocl.cpp +++ b/modules/nonfree/test/test_surf.ocl.cpp @@ -144,9 +144,10 @@ PARAM_TEST_CASE(SURF, HessianThreshold, Octaves, OctaveLayers, Extended, Upright } }; -TEST_P(SURF, DISABLED_Detector) +TEST_P(SURF, Detector) { - cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE); + // the data path should be opencv/samples + cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); cv::ocl::SURF_OCL surf; @@ -179,7 +180,7 @@ TEST_P(SURF, DISABLED_Detector) TEST_P(SURF, DISABLED_Descriptor) { - cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE); + cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); cv::ocl::SURF_OCL surf; From f428d1874a008110e0d0cf0ae547064bedebca3a Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 26 Mar 2013 12:01:01 +0800 Subject: [PATCH 15/31] discard comments in kernels.cpp --- cmake/cl2cpp.cmake | 1 + 1 file changed, 1 insertion(+) diff --git a/cmake/cl2cpp.cmake b/cmake/cl2cpp.cmake index ca17c61b43..4f18e9e643 100644 --- a/cmake/cl2cpp.cmake +++ b/cmake/cl2cpp.cmake @@ -18,6 +18,7 @@ foreach(cl ${cl_list}) string(REPLACE "\t" " " lines "${lines}") string(REGEX REPLACE "/\\*([^*]/|\\*[^/]|[^*/])*\\*/" "" lines "${lines}") # multiline comments + string(REGEX REPLACE "/\\*([^\n])*\\*/" "" lines "${lines}") # single-line comments string(REGEX REPLACE "[ ]*//[^\n]*\n" "\n" lines "${lines}") # single-line comments string(REGEX REPLACE "\n[ ]*(\n[ ]*)*" "\n" lines "${lines}") # empty lines & leading whitespace string(REGEX REPLACE "^\n" "" lines "${lines}") # leading new line From 2c06e59a69aeaa1a76d0ebd419ec88c77e484feb Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 26 Mar 2013 13:05:01 +0800 Subject: [PATCH 16/31] fix some mismatch --- modules/ocl/src/moments.cpp | 54 +--- modules/ocl/src/opencl/moments.cl | 473 +++++++++++++----------------- modules/ocl/src/opencl/pyr_up.cl | 452 +++++++++++++--------------- 3 files changed, 438 insertions(+), 541 deletions(-) diff --git a/modules/ocl/src/moments.cpp b/modules/ocl/src/moments.cpp index 285041ddda..9679a7bab4 100644 --- a/modules/ocl/src/moments.cpp +++ b/modules/ocl/src/moments.cpp @@ -106,7 +106,7 @@ static void icvContourMoments( CvSeq* contour, CvMoments* mom ) bool is_float = CV_SEQ_ELTYPE(contour) == CV_32FC2; - if (!cv::ocl::Context::getContext()->supportsFeature(Context::CL_DOUBLE) && is_float) + if (!cv::ocl::Context::getContext()->impl->double_support && is_float) { CV_Error(CV_StsUnsupportedFormat, "Moments - double is not supported by your GPU!"); } @@ -143,10 +143,10 @@ static void icvContourMoments( CvSeq* contour, CvMoments* mom ) args.push_back( make_pair( sizeof(cl_int) , (void *)&dst_step )); openCLExecuteKernel(dst_a.clCxt, &moments, "icvContourMoments", globalThreads, localThreads, args, -1, -1); - + cv::Mat dst(dst_a); a00 = a10 = a01 = a20 = a11 = a02 = a30 = a21 = a12 = a03 = 0.0; - if (!cv::ocl::Context::getContext()->supportsFeature(Context::CL_DOUBLE)) + if (!cv::ocl::Context::getContext()->impl->double_support) { for (int i = 0; i < contour->total; ++i) { @@ -161,7 +161,7 @@ static void icvContourMoments( CvSeq* contour, CvMoments* mom ) a12 += dst.at(8, i); a03 += dst.at(9, i); } - } + } else { a00 = cv::sum(dst.row(0))[0]; @@ -277,16 +277,7 @@ static void ocl_cvMoments( const void* array, CvMoments* mom, int binary ) blocky = size.height/TILE_SIZE; else blocky = size.height/TILE_SIZE + 1; - cv::ocl::oclMat dst_m00(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m10(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m01(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m20(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m11(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m02(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m30(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m21(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m12(blocky, blockx, CV_64FC1); - cv::ocl::oclMat dst_m03(blocky, blockx, CV_64FC1); + cv::ocl::oclMat dst_m(blocky * 10, blockx, CV_64FC1); cl_mem sum = openCLCreateBuffer(src.clCxt,CL_MEM_READ_WRITE,10*sizeof(double)); int tile_width = std::min(size.width,TILE_SIZE); int tile_height = std::min(size.height,TILE_SIZE); @@ -299,25 +290,17 @@ static void ocl_cvMoments( const void* array, CvMoments* mom, int binary ) args.push_back( make_pair( sizeof(cl_int) , (void *)&src.step )); args.push_back( make_pair( sizeof(cl_int) , (void *)&tileSize.width )); args.push_back( make_pair( sizeof(cl_int) , (void *)&tileSize.height )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m00.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m10.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m01.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m20.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m11.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m02.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m30.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m21.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m12.data )); - args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m03.data )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&dst_m00.cols )); - args.push_back( make_pair( sizeof(cl_int) , (void *)&dst_m00.step )); + args.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m.data )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&dst_m.cols )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&dst_m.step )); + args.push_back( make_pair( sizeof(cl_int) , (void *)&blocky )); args.push_back( make_pair( sizeof(cl_int) , (void *)&type )); args.push_back( make_pair( sizeof(cl_int) , (void *)&depth )); args.push_back( make_pair( sizeof(cl_int) , (void *)&cn )); args.push_back( make_pair( sizeof(cl_int) , (void *)&coi )); args.push_back( make_pair( sizeof(cl_int) , (void *)&binary )); args.push_back( make_pair( sizeof(cl_int) , (void *)&TILE_SIZE )); - openCLExecuteKernel(dst_m00.clCxt, &moments, "CvMoments", globalThreads, localThreads, args, -1, depth); + openCLExecuteKernel(dst_m.clCxt, &moments, "CvMoments", globalThreads, localThreads, args, -1, depth); size_t localThreadss[3] = { 128, 1, 1}; size_t globalThreadss[3] = { 128, 1, 1}; @@ -327,20 +310,12 @@ static void ocl_cvMoments( const void* array, CvMoments* mom, int binary ) args_sum.push_back( make_pair( sizeof(cl_int) , (void *)&tile_width )); args_sum.push_back( make_pair( sizeof(cl_int) , (void *)&TILE_SIZE )); args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&sum )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m00.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m10.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m01.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m20.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m11.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m02.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m30.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m21.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m12.data )); - args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m03.data )); - openCLExecuteKernel(dst_m00.clCxt, &moments, "dst_sum", globalThreadss, localThreadss, args_sum, -1, -1); + args_sum.push_back( make_pair( sizeof(cl_mem) , (void *)&dst_m.data )); + args_sum.push_back( make_pair( sizeof(cl_int) , (void *)&dst_m.step )); + openCLExecuteKernel(dst_m.clCxt, &moments, "dst_sum", globalThreadss, localThreadss, args_sum, -1, -1); double* dstsum = new double[10]; memset(dstsum,0,10*sizeof(double)); - openCLReadBuffer(dst_m00.clCxt,sum,(void *)dstsum,10*sizeof(double)); + openCLReadBuffer(dst_m.clCxt,sum,(void *)dstsum,10*sizeof(double)); mom->m00 = dstsum[0]; mom->m10 = dstsum[1]; mom->m01 = dstsum[2]; @@ -351,6 +326,7 @@ static void ocl_cvMoments( const void* array, CvMoments* mom, int binary ) mom->m21 = dstsum[7]; mom->m12 = dstsum[8]; mom->m03 = dstsum[9]; + delete [] dstsum; icvCompleteMomentState( mom ); } diff --git a/modules/ocl/src/opencl/moments.cl b/modules/ocl/src/opencl/moments.cl index 399ff32076..f8d6024e9f 100644 --- a/modules/ocl/src/opencl/moments.cl +++ b/modules/ocl/src/opencl/moments.cl @@ -6,25 +6,27 @@ #pragma OPENCL EXTENSION cl_amd_fp64:enable #endif typedef double T; +typedef double F; +typedef double4 F4; +#define convert_F4 convert_double4 #else -typedef float double; -typedef float4 double4; +typedef float F; +typedef float4 F4; typedef long T; -#define convert_double4 convert_float4 +#define convert_F4 convert_float4 #endif -//#pragma OPENCL EXTENSION cl_amd_printf:enable -//#if defined (DOUBLE_SUPPORT) -#define DST_ROW_A00 0 -#define DST_ROW_A10 1 -#define DST_ROW_A01 2 -#define DST_ROW_A20 3 -#define DST_ROW_A11 4 -#define DST_ROW_A02 5 -#define DST_ROW_A30 6 -#define DST_ROW_A21 7 -#define DST_ROW_A12 8 -#define DST_ROW_A03 9 + +#define DST_ROW_00 0 +#define DST_ROW_10 1 +#define DST_ROW_01 2 +#define DST_ROW_20 3 +#define DST_ROW_11 4 +#define DST_ROW_02 5 +#define DST_ROW_30 6 +#define DST_ROW_21 7 +#define DST_ROW_12 8 +#define DST_ROW_03 9 __kernel void icvContourMoments(int contour_total, __global float* reader_oclmat_data, @@ -60,36 +62,76 @@ __kernel void icvContourMoments(int contour_total, yii_1 = yi_1 + yi; dst_step /= sizeof(T); - *( dst_a + DST_ROW_A00 * dst_step + idx) = dxy; - *( dst_a + DST_ROW_A10 * dst_step + idx) = dxy * xii_1; - *( dst_a + DST_ROW_A01 * dst_step + idx) = dxy * yii_1; - *( dst_a + DST_ROW_A20 * dst_step + idx) = dxy * (xi_1 * xii_1 + xi2); - *( dst_a + DST_ROW_A11 * dst_step + idx) = dxy * (xi_1 * (yii_1 + yi_1) + xi * (yii_1 + yi)); - *( dst_a + DST_ROW_A02 * dst_step + idx) = dxy * (yi_1 * yii_1 + yi2); - *( dst_a + DST_ROW_A30 * dst_step + idx) = dxy * xii_1 * (xi_12 + xi2); - *( dst_a + DST_ROW_A03 * dst_step + idx) = dxy * yii_1 * (yi_12 + yi2); - *( dst_a + DST_ROW_A21 * dst_step + idx) = + *( dst_a + DST_ROW_00 * dst_step + idx) = dxy; + *( dst_a + DST_ROW_10 * dst_step + idx) = dxy * xii_1; + *( dst_a + DST_ROW_01 * dst_step + idx) = dxy * yii_1; + *( dst_a + DST_ROW_20 * dst_step + idx) = dxy * (xi_1 * xii_1 + xi2); + *( dst_a + DST_ROW_11 * dst_step + idx) = dxy * (xi_1 * (yii_1 + yi_1) + xi * (yii_1 + yi)); + *( dst_a + DST_ROW_02 * dst_step + idx) = dxy * (yi_1 * yii_1 + yi2); + *( dst_a + DST_ROW_30 * dst_step + idx) = dxy * xii_1 * (xi_12 + xi2); + *( dst_a + DST_ROW_03 * dst_step + idx) = dxy * yii_1 * (yi_12 + yi2); + *( dst_a + DST_ROW_21 * dst_step + idx) = dxy * (xi_12 * (3 * yi_1 + yi) + 2 * xi * xi_1 * yii_1 + xi2 * (yi_1 + 3 * yi)); - *( dst_a + DST_ROW_A12 * dst_step + idx) = + *( dst_a + DST_ROW_12 * dst_step + idx) = dxy * (yi_12 * (3 * xi_1 + xi) + 2 * yi * yi_1 * xii_1 + yi2 * (xi_1 + 3 * xi)); } -//#endif -//#if defined (DOUBLE_SUPPORT) +__kernel void dst_sum(int src_rows, int src_cols, int tile_height, int tile_width, int TILE_SIZE, + __global F* sum, __global F* dst_m, int dst_step) +{ + int gidy = get_global_id(0); + int gidx = get_global_id(1); + int block_y = src_rows/tile_height; + int block_x = src_cols/tile_width; + int block_num; + + if(src_rows > TILE_SIZE && src_rows % TILE_SIZE != 0) + block_y ++; + if(src_cols > TILE_SIZE && src_cols % TILE_SIZE != 0) + block_x ++; + block_num = block_y * block_x; + __local F dst_sum[10][128]; + if(gidy<128-block_num) + for(int i=0; i<10; i++) + dst_sum[i][gidy+block_num]=0; + barrier(CLK_LOCAL_MEM_FENCE); + + dst_step /= sizeof(F); + if(gidy0; lsize>>=1) + { + if(gidy TILE_SIZE && src_rows % TILE_SIZE != 0) - block_y ++; - if(src_cols > TILE_SIZE && src_cols % TILE_SIZE != 0) - block_x ++; - block_num = block_y * block_x; - __local double dst_sum[10][128]; - if(gidy<128-block_num) - for(int i=0; i<10; i++) - dst_sum[i][gidy+block_num]=0; - barrier(CLK_LOCAL_MEM_FENCE); - if(gidy0; lsize>>=1) - { - if(gidy= TILE_SIZE/2&&lidy > bheight-1&&lidy < tileSize_height) { - m[9][lidy-bheight] = ((double)py) * sy; // m03 - m[8][lidy-bheight] = ((double)x1.s0) * sy; // m12 - m[7][lidy-bheight] = ((double)x2.s0) * lidy; // m21 + m[9][lidy-bheight] = ((F)py) * sy; // m03 + m[8][lidy-bheight] = ((F)x1.s0) * sy; // m12 + m[7][lidy-bheight] = ((F)x2.s0) * lidy; // m21 m[6][lidy-bheight] = x3.s0; // m30 m[5][lidy-bheight] = x0.s0 * sy; // m02 m[4][lidy-bheight] = x1.s0 * lidy; // m11 @@ -714,11 +672,12 @@ __kernel void CvMoments_D5( __global float* src_data, int src_rows, int src_cols m[1][lidy-bheight] = x1.s0; // m10 m[0][lidy-bheight] = x0.s0; // m00 } + else if(lidy < bheight) { - lm[9] = ((double)py) * sy; // m03 - lm[8] = ((double)x1.s0) * sy; // m12 - lm[7] = ((double)x2.s0) * lidy; // m21 + lm[9] = ((F)py) * sy; // m03 + lm[8] = ((F)x1.s0) * sy; // m12 + lm[7] = ((F)x2.s0) * lidy; // m21 lm[6] = x3.s0; // m30 lm[5] = x0.s0 * sy; // m02 lm[4] = x1.s0 * lidy; // m11 @@ -741,69 +700,59 @@ __kernel void CvMoments_D5( __global float* src_data, int src_rows, int src_cols } if(lidy == 0&&lidx == 0) { - for(int mt = 0; mt < 10; mt++ ) - mom[mt] = (double)lm[mt]; - + for( int mt = 0; mt < 10; mt++ ) + mom[mt] = (F)lm[mt]; if(binary) { - double s = 1./255; + F s = 1./255; for( int mt = 0; mt < 10; mt++ ) mom[mt] *= s; } - double xm = x * mom[0], ym = y * mom[0]; + F xm = x * mom[0], ym = y * mom[0]; // accumulate moments computed in each tile + dst_step /= sizeof(F); // + m00 ( = m00' ) - dst_m00[wgidy*dst_cols+wgidx]= mom[0]; + *(dst_m + mad24(DST_ROW_00 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[0]; // + m10 ( = m10' + x*m00' ) - dst_m10[wgidy*dst_cols+wgidx] = mom[1] + xm; + *(dst_m + mad24(DST_ROW_10 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[1] + xm; // + m01 ( = m01' + y*m00' ) - dst_m01[wgidy*dst_cols+wgidx] = mom[2] + ym; + *(dst_m + mad24(DST_ROW_01 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[2] + ym; // + m20 ( = m20' + 2*x*m10' + x*x*m00' ) - dst_m20[wgidy*dst_cols+wgidx] = mom[3] + x * (mom[1] * 2 + xm); + *(dst_m + mad24(DST_ROW_20 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[3] + x * (mom[1] * 2 + xm); // + m11 ( = m11' + x*m01' + y*m10' + x*y*m00' ) - dst_m11[wgidy*dst_cols+wgidx] = mom[4] + x * (mom[2] + ym) + y * mom[1]; + *(dst_m + mad24(DST_ROW_11 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[4] + x * (mom[2] + ym) + y * mom[1]; // + m02 ( = m02' + 2*y*m01' + y*y*m00' ) - dst_m02[wgidy*dst_cols+wgidx]= mom[5] + y * (mom[2] * 2 + ym); + *(dst_m + mad24(DST_ROW_02 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[5] + y * (mom[2] * 2 + ym); // + m30 ( = m30' + 3*x*m20' + 3*x*x*m10' + x*x*x*m00' ) - dst_m30[wgidy*dst_cols+wgidx]= mom[6] + x * (3. * mom[3] + x * (3. * mom[1] + xm)); + *(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)); // + m21 ( = m21' + x*(2*m11' + 2*y*m10' + x*m01' + x*y*m00') + y*m20') - dst_m21[wgidy*dst_cols+wgidx] = mom[7] + x * (2 * (mom[4] + y * mom[1]) + x * (mom[2] + ym)) + y * mom[3]; + *(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]; // + m12 ( = m12' + y*(2*m11' + 2*x*m01' + y*m10' + x*y*m00') + x*m02') - dst_m12[wgidy*dst_cols+wgidx] = mom[8] + y * (2 * (mom[4] + x * mom[2]) + y * (mom[1] + xm)) + x * mom[5]; + *(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]; // + m03 ( = m03' + 3*y*m02' + 3*y*y*m01' + y*y*y*m00' ) - dst_m03[wgidy*dst_cols+wgidx]= mom[9] + y * (3. * mom[5] + y * (3. * mom[2] + ym)); - }*/ + *(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)); + } } -//#endif -//#if defined (DOUBLE_SUPPORT) -__kernel void CvMoments_D6(__global double* src_data, int src_rows, int src_cols, int src_step, int tileSize_width, int tileSize_height, - __global double* dst_m00, - __global double* dst_m10, - __global double* dst_m01, - __global double* dst_m20, - __global double* dst_m11, - __global double* dst_m02, - __global double* dst_m30, - __global double* dst_m21, - __global double* dst_m12, - __global double* dst_m03, - int dst_cols, int dst_step, + +__kernel void CvMoments_D6(__global F* src_data, int src_rows, int src_cols, int src_step, int tileSize_width, int tileSize_height, + __global F* dst_m, + int dst_cols, int dst_step, int blocky, int type, int depth, int cn, int coi, int binary, const int TILE_SIZE) { - double tmp_coi[4]; // get the coi data - double4 tmp[64]; + F tmp_coi[4]; // get the coi data + F4 tmp[64]; int VLEN_D = 4; // length of vetor int gidy = get_global_id(0); int gidx = get_global_id(1); @@ -820,39 +769,39 @@ __kernel void CvMoments_D6(__global double* src_data, int src_rows, int src_col if(tileSize_width < TILE_SIZE) for(int i = tileSize_width; i < rstep; i++ ) - *((__global double*)src_data+(y+lidy)*src_step/8+x+i) = 0; + *((__global F*)src_data+(y+lidy)*src_step/8+x+i) = 0; if( coi > 0 ) for(int i=0; i < tileSize_width; i+=VLEN_D) { for(int j=0; j<4; j++) tmp_coi[j] = *(src_data+(y+lidy)*src_step/8+(x+i+j)*kcn+coi-1); - tmp[i/VLEN_D] = (double4)(tmp_coi[0],tmp_coi[1],tmp_coi[2],tmp_coi[3]); + tmp[i/VLEN_D] = (F4)(tmp_coi[0],tmp_coi[1],tmp_coi[2],tmp_coi[3]); } else for(int i=0; i < tileSize_width; i+=VLEN_D) - tmp[i/VLEN_D] = (double4)(*(src_data+(y+lidy)*src_step/8+x+i),*(src_data+(y+lidy)*src_step/8+x+i+1),*(src_data+(y+lidy)*src_step/8+x+i+2),*(src_data+(y+lidy)*src_step/8+x+i+3)); - double4 zero = (double4)(0); - double4 full = (double4)(255); + tmp[i/VLEN_D] = (F4)(*(src_data+(y+lidy)*src_step/8+x+i),*(src_data+(y+lidy)*src_step/8+x+i+1),*(src_data+(y+lidy)*src_step/8+x+i+2),*(src_data+(y+lidy)*src_step/8+x+i+3)); + F4 zero = (F4)(0); + F4 full = (F4)(255); if( binary ) for(int i=0; i < tileSize_width; i+=VLEN_D) tmp[i/VLEN_D] = (tmp[i/VLEN_D]!=zero)?full:zero; - double mom[10]; - __local double m[10][128]; + F mom[10]; + __local F m[10][128]; if(lidy == 0) for(int i=0; i<10; i++) for(int j=0; j<128; j++) m[i][j]=0; barrier(CLK_LOCAL_MEM_FENCE); - double lm[10] = {0}; - double4 x0 = (double4)(0); - double4 x1 = (double4)(0); - double4 x2 = (double4)(0); - double4 x3 = (double4)(0); + F lm[10] = {0}; + F4 x0 = (F4)(0); + F4 x1 = (F4)(0); + F4 x2 = (F4)(0); + F4 x3 = (F4)(0); for( int xt = 0 ; xt < tileSize_width; xt+=VLEN_D ) { - double4 v_xt = (double4)(xt, xt+1, xt+2, xt+3); - double4 p = tmp[xt/VLEN_D]; - double4 xp = v_xt * p, xxp = xp * v_xt; + F4 v_xt = (F4)(xt, xt+1, xt+2, xt+3); + F4 p = tmp[xt/VLEN_D]; + F4 xp = v_xt * p, xxp = xp * v_xt; x0 += p; x1 += xp; x2 += xxp; @@ -863,13 +812,13 @@ __kernel void CvMoments_D6(__global double* src_data, int src_rows, int src_col x2.s0 += x2.s1 + x2.s2 + x2.s3; x3.s0 += x3.s1 + x3.s2 + x3.s3; - double py = lidy * x0.s0, sy = lidy*lidy; + F py = lidy * x0.s0, sy = lidy*lidy; int bheight = min(tileSize_height, TILE_SIZE/2); if(bheight >= TILE_SIZE/2&&lidy > bheight-1&&lidy < tileSize_height) { - m[9][lidy-bheight] = ((double)py) * sy; // m03 - m[8][lidy-bheight] = ((double)x1.s0) * sy; // m12 - m[7][lidy-bheight] = ((double)x2.s0) * lidy; // m21 + m[9][lidy-bheight] = ((F)py) * sy; // m03 + m[8][lidy-bheight] = ((F)x1.s0) * sy; // m12 + m[7][lidy-bheight] = ((F)x2.s0) * lidy; // m21 m[6][lidy-bheight] = x3.s0; // m30 m[5][lidy-bheight] = x0.s0 * sy; // m02 m[4][lidy-bheight] = x1.s0 * lidy; // m11 @@ -881,9 +830,9 @@ __kernel void CvMoments_D6(__global double* src_data, int src_rows, int src_col else if(lidy < bheight) { - lm[9] = ((double)py) * sy; // m03 - lm[8] = ((double)x1.s0) * sy; // m12 - lm[7] = ((double)x2.s0) * lidy; // m21 + lm[9] = ((F)py) * sy; // m03 + lm[8] = ((F)x1.s0) * sy; // m12 + lm[7] = ((F)x2.s0) * lidy; // m21 lm[6] = x3.s0; // m30 lm[5] = x0.s0 * sy; // m02 lm[4] = x1.s0 * lidy; // m11 @@ -907,47 +856,47 @@ __kernel void CvMoments_D6(__global double* src_data, int src_rows, int src_col if(lidy == 0&&lidx == 0) { for( int mt = 0; mt < 10; mt++ ) - mom[mt] = (double)lm[mt]; + mom[mt] = (F)lm[mt]; if(binary) { - double s = 1./255; + F s = 1./255; for( int mt = 0; mt < 10; mt++ ) mom[mt] *= s; } - double xm = x * mom[0], ym = y * mom[0]; + F xm = x * mom[0], ym = y * mom[0]; // accumulate moments computed in each tile + dst_step /= sizeof(F); // + m00 ( = m00' ) - dst_m00[wgidy*dst_cols+wgidx] = mom[0]; + *(dst_m + mad24(DST_ROW_00 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[0]; // + m10 ( = m10' + x*m00' ) - dst_m10[wgidy*dst_cols+wgidx] = mom[1] + xm; + *(dst_m + mad24(DST_ROW_10 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[1] + xm; // + m01 ( = m01' + y*m00' ) - dst_m01[wgidy*dst_cols+wgidx] = mom[2] + ym; + *(dst_m + mad24(DST_ROW_01 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[2] + ym; // + m20 ( = m20' + 2*x*m10' + x*x*m00' ) - dst_m20[wgidy*dst_cols+wgidx] = mom[3] + x * (mom[1] * 2 + xm); + *(dst_m + mad24(DST_ROW_20 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[3] + x * (mom[1] * 2 + xm); // + m11 ( = m11' + x*m01' + y*m10' + x*y*m00' ) - dst_m11[wgidy*dst_cols+wgidx] = mom[4] + x * (mom[2] + ym) + y * mom[1]; + *(dst_m + mad24(DST_ROW_11 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[4] + x * (mom[2] + ym) + y * mom[1]; // + m02 ( = m02' + 2*y*m01' + y*y*m00' ) - dst_m02[wgidy*dst_cols+wgidx] = mom[5] + y * (mom[2] * 2 + ym); + *(dst_m + mad24(DST_ROW_02 * blocky, dst_step, mad24(wgidy, dst_cols, wgidx))) = mom[5] + y * (mom[2] * 2 + ym); // + m30 ( = m30' + 3*x*m20' + 3*x*x*m10' + x*x*x*m00' ) - dst_m30[wgidy*dst_cols+wgidx] = mom[6] + x * (3. * mom[3] + x * (3. * mom[1] + xm)); + *(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)); // + m21 ( = m21' + x*(2*m11' + 2*y*m10' + x*m01' + x*y*m00') + y*m20') - dst_m21[wgidy*dst_cols+wgidx] = mom[7] + x * (2 * (mom[4] + y * mom[1]) + x * (mom[2] + ym)) + y * mom[3]; + *(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]; // + m12 ( = m12' + y*(2*m11' + 2*x*m01' + y*m10' + x*y*m00') + x*m02') - dst_m12[wgidy*dst_cols+wgidx] = mom[8] + y * (2 * (mom[4] + x * mom[2]) + y * (mom[1] + xm)) + x * mom[5]; + *(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]; // + m03 ( = m03' + 3*y*m02' + 3*y*y*m01' + y*y*y*m00' ) - dst_m03[wgidy*dst_cols+wgidx] = mom[9] + y * (3. * mom[5] + y * (3. * mom[2] + ym)); + *(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)); } -} -//#endif +} \ No newline at end of file diff --git a/modules/ocl/src/opencl/pyr_up.cl b/modules/ocl/src/opencl/pyr_up.cl index d603ad6bce..0b7f0c9025 100644 --- a/modules/ocl/src/opencl/pyr_up.cl +++ b/modules/ocl/src/opencl/pyr_up.cl @@ -16,6 +16,8 @@ // // @Authors // Zhang Chunpeng chunpeng@multicorewareinc.com +// Dachuan Zhao, dachuan@multicorewareinc.com +// Yao Wang, yao@multicorewareinc.com // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: @@ -53,20 +55,22 @@ uchar get_valid_uchar(uchar data) ////////////////////////// CV_8UC1 ////////////////////////////////// /////////////////////////////////////////////////////////////////////// __kernel void pyrUp_C1_D0(__global uchar* src,__global uchar* dst, - int srcRows,int dstRows,int srcCols,int dstCols, - int srcOffset,int dstOffset,int srcStep,int dstStep) + int srcRows,int dstRows,int srcCols,int dstCols, + int srcOffset,int dstOffset,int srcStep,int dstStep) { const int x = get_global_id(0); const int y = get_global_id(1); - __local float s_srcPatch[10][10]; __local float s_dstPatch[20][16]; + const int tidx = get_local_id(0); + const int tidy = get_local_id(1); + const int lsizex = get_local_size(0); + const int lsizey = get_local_size(1); - - if( get_local_id(0) < 10 && get_local_id(1) < 10 ) + if( tidx < 10 && tidy < 10 ) { - int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1; - int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1; + int srcx = mad24((int)get_group_id(0), (lsizex>>1), tidx) - 1; + int srcy = mad24((int)get_group_id(1), (lsizey>>1), tidy) - 1; srcx = abs(srcx); srcx = min(srcCols - 1,srcx); @@ -74,25 +78,24 @@ __kernel void pyrUp_C1_D0(__global uchar* src,__global uchar* dst, srcy = abs(srcy); srcy = min(srcRows -1 ,srcy); - s_srcPatch[get_local_id(1)][get_local_id(0)] = (float)(src[srcx + srcy * srcStep]); + s_srcPatch[tidy][tidx] = (float)(src[srcx + srcy * srcStep]); } barrier(CLK_LOCAL_MEM_FENCE); float sum = 0; - const int evenFlag = (int)((get_local_id(0) & 1) == 0); - const int oddFlag = (int)((get_local_id(0) & 1) != 0); - const bool eveny = ((get_local_id(1) & 1) == 0); - const int tidx = get_local_id(0); + const int evenFlag = (int)((tidx & 1) == 0); + const int oddFlag = (int)((tidx & 1) != 0); + const bool eveny = ((tidy & 1) == 0); if(eveny) { - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]; - sum = sum + (evenFlag * 0.375f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]; - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]; + sum = (evenFlag * 0.0625f) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * 0.375f ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 2) >> 1)]; } s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum; @@ -103,42 +106,40 @@ __kernel void pyrUp_C1_D0(__global uchar* src,__global uchar* dst, if (eveny) { - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx - 1) >> 1)]; - sum = sum + (evenFlag * 0.375f ) * s_srcPatch[0][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)]; - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx + 2) >> 1)]; - } + sum = (evenFlag * 0.0625f) * s_srcPatch[lsizey - 16][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 16][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * 0.375f ) * s_srcPatch[lsizey - 16][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 16][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[lsizey - 16][1 + ((tidx + 2) >> 1)]; + } - s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; - } + s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; + } - if (get_local_id(1) > 13) - { + if (get_local_id(1) > 13) + { sum = 0; if (eveny) { - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx - 1) >> 1)]; - sum = sum + (evenFlag * 0.375f ) * s_srcPatch[9][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx + 1) >> 1)]; + sum = (evenFlag * 0.0625f) * s_srcPatch[lsizey - 7][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 7][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * 0.375f ) * s_srcPatch[lsizey - 7][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 7][1 + ((tidx + 1) >> 1)]; sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx + 2) >> 1)]; } - s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum; - } + s_dstPatch[4 + tidy][tidx] = sum; + } barrier(CLK_LOCAL_MEM_FENCE); sum = 0; - const int tidy = get_local_id(1); - - sum = sum + 0.0625f * s_dstPatch[2 + tidy - 2][get_local_id(0)]; - sum = sum + 0.25f * s_dstPatch[2 + tidy - 1][get_local_id(0)]; - sum = sum + 0.375f * s_dstPatch[2 + tidy ][get_local_id(0)]; - sum = sum + 0.25f * s_dstPatch[2 + tidy + 1][get_local_id(0)]; - sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][get_local_id(0)]; + sum = 0.0625f * s_dstPatch[2 + tidy - 2][tidx]; + sum = sum + 0.25f * s_dstPatch[2 + tidy - 1][tidx]; + sum = sum + 0.375f * s_dstPatch[2 + tidy ][tidx]; + sum = sum + 0.25f * s_dstPatch[2 + tidy + 1][tidx]; + sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][tidx]; if ((x < dstCols) && (y < dstRows)) dst[x + y * dstStep] = (float)(4.0f * sum); @@ -149,8 +150,8 @@ __kernel void pyrUp_C1_D0(__global uchar* src,__global uchar* dst, ////////////////////////// CV_16UC1 ///////////////////////////////// /////////////////////////////////////////////////////////////////////// __kernel void pyrUp_C1_D2(__global ushort* src,__global ushort* dst, - int srcRows,int dstRows,int srcCols,int dstCols, - int srcOffset,int dstOffset,int srcStep,int dstStep) + int srcRows,int dstRows,int srcCols,int dstCols, + int srcOffset,int dstOffset,int srcStep,int dstStep) { const int x = get_global_id(0); const int y = get_global_id(1); @@ -210,13 +211,13 @@ __kernel void pyrUp_C1_D2(__global ushort* src,__global ushort* dst, sum = sum + (evenFlag * 0.375f ) * s_srcPatch[0][1 + ((tidx ) >> 1)]; sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)]; sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx + 2) >> 1)]; - } + } - s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; - } + s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; + } - if (get_local_id(1) > 13) - { + if (get_local_id(1) > 13) + { sum = 0; if (eveny) @@ -228,7 +229,7 @@ __kernel void pyrUp_C1_D2(__global ushort* src,__global ushort* dst, sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx + 2) >> 1)]; } s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum; - } + } barrier(CLK_LOCAL_MEM_FENCE); @@ -251,12 +252,15 @@ __kernel void pyrUp_C1_D2(__global ushort* src,__global ushort* dst, ////////////////////////// CV_32FC1 ///////////////////////////////// /////////////////////////////////////////////////////////////////////// __kernel void pyrUp_C1_D5(__global float* src,__global float* dst, - int srcRows,int dstRows,int srcCols,int dstCols, - int srcOffset,int dstOffset,int srcStep,int dstStep) + int srcRows,int dstRows,int srcCols,int dstCols, + int srcOffset,int dstOffset,int srcStep,int dstStep) { const int x = get_global_id(0); const int y = get_global_id(1); - + const int tidx = get_local_id(0); + const int tidy = get_local_id(1); + const int lsizex = get_local_size(0); + const int lsizey = get_local_size(1); __local float s_srcPatch[10][10]; __local float s_dstPatch[20][16]; @@ -266,10 +270,10 @@ __kernel void pyrUp_C1_D5(__global float* src,__global float* dst, dstStep = dstStep >> 2; - if( get_local_id(0) < 10 && get_local_id(1) < 10 ) + if( tidx < 10 && tidy < 10 ) { - int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1; - int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1; + int srcx = mad24((int)get_group_id(0), lsizex>>1, tidx) - 1; + int srcy = mad24((int)get_group_id(1), lsizey>>1, tidy) - 1; srcx = abs(srcx); srcx = min(srcCols - 1,srcx); @@ -277,71 +281,67 @@ __kernel void pyrUp_C1_D5(__global float* src,__global float* dst, srcy = abs(srcy); srcy = min(srcRows -1 ,srcy); - s_srcPatch[get_local_id(1)][get_local_id(0)] = (float)(src[srcx + srcy * srcStep]); + s_srcPatch[tidy][tidx] = (float)(src[srcx + srcy * srcStep]); } barrier(CLK_LOCAL_MEM_FENCE); float sum = 0; - const int evenFlag = (int)((get_local_id(0) & 1) == 0); - const int oddFlag = (int)((get_local_id(0) & 1) != 0); - const bool eveny = ((get_local_id(1) & 1) == 0); - const int tidx = get_local_id(0); + const int evenFlag = (int)((tidx & 1) == 0); + const int oddFlag = (int)((tidx & 1) != 0); + const bool eveny = ((tidy & 1) == 0); + if(eveny) { - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]; - sum = sum + (evenFlag * 0.375f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]; - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]; + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * 0.375f ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 2) >> 1)]; } - s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum; + s_dstPatch[2 + tidy][tidx] = sum; - if (get_local_id(1) < 2) + if (tidy < 2) { sum = 0; if (eveny) { - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx - 1) >> 1)]; - sum = sum + (evenFlag * 0.375f ) * s_srcPatch[0][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[0][1 + ((tidx + 1) >> 1)]; - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[0][1 + ((tidx + 2) >> 1)]; - } + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[lsizey - 16][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 16][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * 0.375f ) * s_srcPatch[lsizey - 16][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 16][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[lsizey - 16][1 + ((tidx + 2) >> 1)]; + } - s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; - } + s_dstPatch[tidy][tidx] = sum; + } - if (get_local_id(1) > 13) - { + if (tidy > 13) + { sum = 0; if (eveny) { - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx - 2) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx - 1) >> 1)]; - sum = sum + (evenFlag * 0.375f ) * s_srcPatch[9][1 + ((tidx ) >> 1)]; - sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[9][1 + ((tidx + 1) >> 1)]; - sum = sum + (evenFlag * 0.0625f) * s_srcPatch[9][1 + ((tidx + 2) >> 1)]; + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[lsizey - 7][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 7][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * 0.375f ) * s_srcPatch[lsizey - 7][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * 0.25f ) * s_srcPatch[lsizey - 7][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * 0.0625f) * s_srcPatch[lsizey - 7][1 + ((tidx + 2) >> 1)]; } - s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum; - } + s_dstPatch[4 + tidy][tidx] = sum; + } barrier(CLK_LOCAL_MEM_FENCE); - sum = 0; - - const int tidy = get_local_id(1); - - sum = sum + 0.0625f * s_dstPatch[2 + tidy - 2][get_local_id(0)]; - sum = sum + 0.25f * s_dstPatch[2 + tidy - 1][get_local_id(0)]; - sum = sum + 0.375f * s_dstPatch[2 + tidy ][get_local_id(0)]; - sum = sum + 0.25f * s_dstPatch[2 + tidy + 1][get_local_id(0)]; - sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][get_local_id(0)]; + sum = 0.0625f * s_dstPatch[2 + tidy - 2][tidx]; + sum = sum + 0.25f * s_dstPatch[2 + tidy - 1][tidx]; + sum = sum + 0.375f * s_dstPatch[2 + tidy ][tidx]; + sum = sum + 0.25f * s_dstPatch[2 + tidy + 1][tidx]; + sum = sum + 0.0625f * s_dstPatch[2 + tidy + 2][tidx]; if ((x < dstCols) && (y < dstRows)) dst[x + y * dstStep] = (float)(4.0f * sum); @@ -376,37 +376,16 @@ uchar4 convert_float4_to_uchar4(float4 data) return u4Data; } -float4 int_x_float4(int leftOpr,float4 rightOpr) -{ - float4 result = {0,0,0,0}; - - result.x = rightOpr.x * leftOpr; - result.y = rightOpr.y * leftOpr; - result.z = rightOpr.z * leftOpr; - result.w = rightOpr.w * leftOpr; - - return result; -} - -float4 float4_x_float4(float4 leftOpr,float4 rightOpr) -{ - float4 result; - - result.x = leftOpr.x * rightOpr.x; - result.y = leftOpr.y * rightOpr.y; - result.z = leftOpr.z * rightOpr.z; - result.w = leftOpr.w * rightOpr.w; - - return result; -} - __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) + int srcRows,int dstRows,int srcCols,int dstCols, + int srcOffset,int dstOffset,int srcStep,int dstStep) { const int x = get_global_id(0); const int y = get_global_id(1); - + const int tidx = get_local_id(0); + const int tidy = get_local_id(1); + const int lsizex = get_local_size(0); + const int lsizey = get_local_size(1); __local float4 s_srcPatch[10][10]; __local float4 s_dstPatch[20][16]; @@ -416,10 +395,10 @@ __kernel void pyrUp_C4_D0(__global uchar4* src,__global uchar4* dst, dstStep >>= 2; - if( get_local_id(0) < 10 && get_local_id(1) < 10 ) + if( tidx < 10 && tidy < 10 ) { - int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1; - int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1; + int srcx = mad24((int)get_group_id(0), lsizex>>1, tidx) - 1; + int srcy = mad24((int)get_group_id(1), lsizey>>1, tidy) - 1; srcx = abs(srcx); srcx = min(srcCols - 1,srcx); @@ -427,17 +406,16 @@ __kernel void pyrUp_C4_D0(__global uchar4* src,__global uchar4* dst, srcy = abs(srcy); srcy = min(srcRows -1 ,srcy); - s_srcPatch[get_local_id(1)][get_local_id(0)] = covert_uchar4_to_float4(src[srcx + srcy * srcStep]); + s_srcPatch[tidy][tidx] = covert_uchar4_to_float4(src[srcx + srcy * srcStep]); } barrier(CLK_LOCAL_MEM_FENCE); float4 sum = (float4)(0,0,0,0); - const int evenFlag = (int)((get_local_id(0) & 1) == 0); - const int oddFlag = (int)((get_local_id(0) & 1) != 0); - const bool eveny = ((get_local_id(1) & 1) == 0); - const int tidx = get_local_id(0); + const int evenFlag = (int)((tidx & 1) == 0); + const int oddFlag = (int)((tidx & 1) != 0); + const bool eveny = ((tidy & 1) == 0); float4 co1 = (float4)(0.375f, 0.375f, 0.375f, 0.375f); float4 co2 = (float4)(0.25f, 0.25f, 0.25f, 0.25f); @@ -446,63 +424,59 @@ __kernel void pyrUp_C4_D0(__global uchar4* src,__global uchar4* dst, if(eveny) { - sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( evenFlag, co1 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]); + sum = sum + ( evenFlag * co3) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * co2 ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 1) >> 1)]; + sum = sum + ( evenFlag * co1) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * co2 ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 1) >> 1)]; + sum = sum + ( evenFlag * co3) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 2) >> 1)]; } - s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum; + s_dstPatch[2 + tidy][tidx] = sum; - if (get_local_id(1) < 2) + if (tidy < 2) { sum = 0; if (eveny) { - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co1 ) , s_srcPatch[0][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx + 2) >> 1)]); - } - - s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; - } - - if (get_local_id(1) > 13) - { + 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)]; + } + + s_dstPatch[tidy][tidx] = sum; + } + + if (tidy > 13) + { sum = 0; if (eveny) { - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co1) , s_srcPatch[9][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx + 2) >> 1)]); + sum = sum + (evenFlag * co3) * s_srcPatch[lsizey-7][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * co2) * s_srcPatch[lsizey-7][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * co1) * s_srcPatch[lsizey-7][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * co2) * s_srcPatch[lsizey-7][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * co3) * s_srcPatch[lsizey-7][1 + ((tidx + 2) >> 1)]; } - s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum; - } + s_dstPatch[4 + tidy][tidx] = sum; + } barrier(CLK_LOCAL_MEM_FENCE); - sum = 0; - - const int tidy = get_local_id(1); - - sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy - 2][get_local_id(0)]); - sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy - 1][get_local_id(0)]); - sum = sum + float4_x_float4(co1 , s_dstPatch[2 + tidy ][get_local_id(0)]); - sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy + 1][get_local_id(0)]); - sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy + 2][get_local_id(0)]); + sum = co3 * s_dstPatch[2 + tidy - 2][tidx]; + sum = sum + co2 * s_dstPatch[2 + tidy - 1][tidx]; + sum = sum + co1 * s_dstPatch[2 + tidy ][tidx]; + sum = sum + co2 * s_dstPatch[2 + tidy + 1][tidx]; + sum = sum + co3 * s_dstPatch[2 + tidy + 2][tidx]; if ((x < dstCols) && (y < dstRows)) { - dst[x + y * dstStep] = convert_float4_to_uchar4(int_x_float4(4.0f,sum)); + dst[x + y * dstStep] = convert_float4_to_uchar4(4.0f * sum); } } /////////////////////////////////////////////////////////////////////// @@ -535,8 +509,8 @@ ushort4 convert_float4_to_ushort4(float4 data) __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) + int srcRows,int dstRows,int srcCols,int dstCols, + int srcOffset,int dstOffset,int srcStep,int dstStep) { const int x = get_global_id(0); const int y = get_global_id(1); @@ -580,11 +554,11 @@ __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, if(eveny) { - sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( evenFlag, co1 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]); + sum = sum + ( evenFlag* co3 ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * co2 ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]; + sum = sum + ( evenFlag* co1 ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * co2 ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]; + sum = sum + ( evenFlag* co3 ) * s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]; } @@ -596,31 +570,31 @@ __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, if (eveny) { - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co1 ) , s_srcPatch[0][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx + 2) >> 1)]); - } - - s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; - } - - if (get_local_id(1) > 13) - { + 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)]; + } + + s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; + } + + if (get_local_id(1) > 13) + { sum = 0; if (eveny) { - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co1) , s_srcPatch[9][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx + 2) >> 1)]); + sum = sum + (evenFlag * co3) * s_srcPatch[9][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * co2) * s_srcPatch[9][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * co1) * s_srcPatch[9][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * co2) * s_srcPatch[9][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * co3) * s_srcPatch[9][1 + ((tidx + 2) >> 1)]; } s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum; - } + } barrier(CLK_LOCAL_MEM_FENCE); @@ -628,15 +602,15 @@ __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, const int tidy = get_local_id(1); - sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy - 2][get_local_id(0)]); - sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy - 1][get_local_id(0)]); - sum = sum + float4_x_float4(co1 , s_dstPatch[2 + tidy ][get_local_id(0)]); - sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy + 1][get_local_id(0)]); - sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy + 2][get_local_id(0)]); + sum = sum + co3 * s_dstPatch[2 + tidy - 2][get_local_id(0)]; + sum = sum + co2 * s_dstPatch[2 + tidy - 1][get_local_id(0)]; + sum = sum + co1 * s_dstPatch[2 + tidy ][get_local_id(0)]; + sum = sum + co2 * s_dstPatch[2 + tidy + 1][get_local_id(0)]; + sum = sum + co3 * s_dstPatch[2 + tidy + 2][get_local_id(0)]; if ((x < dstCols) && (y < dstRows)) { - dst[x + y * dstStep] = convert_float4_to_ushort4(int_x_float4(4.0f,sum)); + dst[x + y * dstStep] = convert_float4_to_ushort4(4.0f * sum); } } @@ -644,12 +618,15 @@ __kernel void pyrUp_C4_D2(__global ushort4* src,__global ushort4* dst, ////////////////////////// CV_32FC4 ////////////////////////////////// /////////////////////////////////////////////////////////////////////// __kernel void pyrUp_C4_D5(__global float4* src,__global float4* dst, - int srcRows,int dstRows,int srcCols,int dstCols, - int srcOffset,int dstOffset,int srcStep,int dstStep) + int srcRows,int dstRows,int srcCols,int dstCols, + int srcOffset,int dstOffset,int srcStep,int dstStep) { const int x = get_global_id(0); const int y = get_global_id(1); - + const int tidx = get_local_id(0); + const int tidy = get_local_id(1); + const int lsizex = get_local_size(0); + const int lsizey = get_local_size(1); __local float4 s_srcPatch[10][10]; __local float4 s_dstPatch[20][16]; @@ -659,10 +636,10 @@ __kernel void pyrUp_C4_D5(__global float4* src,__global float4* dst, dstStep >>= 4; - if( get_local_id(0) < 10 && get_local_id(1) < 10 ) + if( tidx < 10 && tidy < 10 ) { - int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + get_local_id(0)) - 1; - int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + get_local_id(1)) - 1; + int srcx = (int)(get_group_id(0) * get_local_size(0) / 2 + tidx) - 1; + int srcy = (int)(get_group_id(1) * get_local_size(1) / 2 + tidy) - 1; srcx = abs(srcx); srcx = min(srcCols - 1,srcx); @@ -670,17 +647,16 @@ __kernel void pyrUp_C4_D5(__global float4* src,__global float4* dst, srcy = abs(srcy); srcy = min(srcRows -1 ,srcy); - s_srcPatch[get_local_id(1)][get_local_id(0)] = (float4)(src[srcx + srcy * srcStep]); + s_srcPatch[tidy][tidx] = (float4)(src[srcx + srcy * srcStep]); } barrier(CLK_LOCAL_MEM_FENCE); float4 sum = (float4)(0,0,0,0); - const int evenFlag = (int)((get_local_id(0) & 1) == 0); - const int oddFlag = (int)((get_local_id(0) & 1) != 0); - const bool eveny = ((get_local_id(1) & 1) == 0); - const int tidx = get_local_id(0); + const int evenFlag = (int)((tidx & 1) == 0); + const int oddFlag = (int)((tidx & 1) != 0); + const bool eveny = ((tidy & 1) == 0); float4 co1 = (float4)(0.375f, 0.375f, 0.375f, 0.375f); float4 co2 = (float4)(0.25f, 0.25f, 0.25f, 0.25f); @@ -689,59 +665,55 @@ __kernel void pyrUp_C4_D5(__global float4* src,__global float4* dst, if(eveny) { - sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( evenFlag, co1 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( evenFlag, co3 ) , s_srcPatch[1 + (get_local_id(1) >> 1)][1 + ((tidx + 2) >> 1)]); + sum = sum + ( evenFlag* co3 ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * co2 ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx - 1) >> 1)]; + sum = sum + ( evenFlag* co1 ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * co2 ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 1) >> 1)]; + sum = sum + ( evenFlag* co3 ) * s_srcPatch[1 + (tidy >> 1)][1 + ((tidx + 2) >> 1)]; } - s_dstPatch[2 + get_local_id(1)][get_local_id(0)] = sum; + s_dstPatch[2 + tidy][tidx] = sum; - if (get_local_id(1) < 2) + if (tidy < 2) { sum = 0; if (eveny) { - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co1 ) , s_srcPatch[0][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2 ) , s_srcPatch[0][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[0][1 + ((tidx + 2) >> 1)]); - } - - s_dstPatch[get_local_id(1)][get_local_id(0)] = sum; - } - - if (get_local_id(1) > 13) - { + 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)]; + } + + s_dstPatch[tidy][tidx] = sum; + } + + if (tidy > 13) + { sum = 0; if (eveny) { - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx - 2) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx - 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co1) , s_srcPatch[9][1 + ((tidx ) >> 1)]); - sum = sum + float4_x_float4(int_x_float4( oddFlag , co2) , s_srcPatch[9][1 + ((tidx + 1) >> 1)]); - sum = sum + float4_x_float4(int_x_float4(evenFlag , co3) , s_srcPatch[9][1 + ((tidx + 2) >> 1)]); + sum = sum + (evenFlag * co3) * s_srcPatch[lsizey-7][1 + ((tidx - 2) >> 1)]; + sum = sum + ( oddFlag * co2) * s_srcPatch[lsizey-7][1 + ((tidx - 1) >> 1)]; + sum = sum + (evenFlag * co1) * s_srcPatch[lsizey-7][1 + ((tidx ) >> 1)]; + sum = sum + ( oddFlag * co2) * s_srcPatch[lsizey-7][1 + ((tidx + 1) >> 1)]; + sum = sum + (evenFlag * co3) * s_srcPatch[lsizey-7][1 + ((tidx + 2) >> 1)]; } - s_dstPatch[4 + get_local_id(1)][get_local_id(0)] = sum; - } + s_dstPatch[4 + tidy][tidx] = sum; + } barrier(CLK_LOCAL_MEM_FENCE); - sum = 0; - - const int tidy = get_local_id(1); - - sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy - 2][get_local_id(0)]); - sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy - 1][get_local_id(0)]); - sum = sum + float4_x_float4(co1 , s_dstPatch[2 + tidy ][get_local_id(0)]); - sum = sum + float4_x_float4(co2 , s_dstPatch[2 + tidy + 1][get_local_id(0)]); - sum = sum + float4_x_float4(co3 , s_dstPatch[2 + tidy + 2][get_local_id(0)]); + sum = co3 * s_dstPatch[2 + tidy - 2][tidx]; + sum = sum + co2 * s_dstPatch[2 + tidy - 1][tidx]; + sum = sum + co1 * s_dstPatch[2 + tidy ][tidx]; + sum = sum + co2 * s_dstPatch[2 + tidy + 1][tidx]; + sum = sum + co3 * s_dstPatch[2 + tidy + 2][tidx]; if ((x < dstCols) && (y < dstRows)) { From ad6aae45838a5a05068956860dac3e41035b9dd8 Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 26 Mar 2013 13:41:13 +0800 Subject: [PATCH 17/31] more fix of mismatch functions on CPU OCL --- modules/ocl/src/brute_force_matcher.cpp | 692 +++--------------- modules/ocl/src/haar.cpp | 4 +- modules/ocl/src/moments.cpp | 6 +- modules/ocl/src/opencl/brute_force_match.cl | 315 +++----- modules/ocl/src/opencl/haarobjectdetect.cl | 8 + modules/ocl/test/test_brute_force_matcher.cpp | 4 +- 6 files changed, 231 insertions(+), 798 deletions(-) diff --git a/modules/ocl/src/brute_force_matcher.cpp b/modules/ocl/src/brute_force_matcher.cpp index 818f3c18f3..e61a9f6330 100644 --- a/modules/ocl/src/brute_force_matcher.cpp +++ b/modules/ocl/src/brute_force_matcher.cpp @@ -44,6 +44,7 @@ //M*/ #include "precomp.hpp" + #include #include #include @@ -60,10 +61,11 @@ namespace cv } } -template < int BLOCK_SIZE, int MAX_DESC_LEN, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE, int MAX_DESC_LEN/*, typename Mask*/ > void matchUnrolledCached(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, const oclMat &trainIdx, const oclMat &distance, int distType) { + assert(query.type() == CV_32F); cv::ocl::Context *ctx = query.clCxt; size_t globalSize[] = {(query.rows + BLOCK_SIZE - 1) / BLOCK_SIZE * BLOCK_SIZE, BLOCK_SIZE, 1}; size_t localSize[] = {BLOCK_SIZE, BLOCK_SIZE, 1}; @@ -91,20 +93,21 @@ void matchUnrolledCached(const oclMat &query, const oclMat &train, const oclMat std::string kernelName = "BruteForceMatch_UnrollMatch"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } -template < int BLOCK_SIZE, int MAX_DESC_LEN, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE, int MAX_DESC_LEN/*, typename Mask*/ > void matchUnrolledCached(const oclMat /*query*/, const oclMat * /*trains*/, int /*n*/, const oclMat /*mask*/, const oclMat &/*bestTrainIdx*/, const oclMat & /*bestImgIdx*/, const oclMat & /*bestDistance*/, int /*distType*/) { } -template < int BLOCK_SIZE, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE/*, typename Mask*/ > void match(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, const oclMat &trainIdx, const oclMat &distance, int distType) { + assert(query.type() == CV_32F); cv::ocl::Context *ctx = query.clCxt; size_t globalSize[] = {(query.rows + BLOCK_SIZE - 1) / BLOCK_SIZE * BLOCK_SIZE, BLOCK_SIZE, 1}; size_t localSize[] = {BLOCK_SIZE, BLOCK_SIZE, 1}; @@ -130,21 +133,22 @@ void match(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, std::string kernelName = "BruteForceMatch_Match"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } -template < int BLOCK_SIZE, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE/*, typename Mask*/ > void match(const oclMat /*query*/, const oclMat * /*trains*/, int /*n*/, const oclMat /*mask*/, const oclMat &/*bestTrainIdx*/, const oclMat & /*bestImgIdx*/, const oclMat & /*bestDistance*/, int /*distType*/) { } //radius_matchUnrolledCached -template < int BLOCK_SIZE, int MAX_DESC_LEN, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE, int MAX_DESC_LEN/*, typename Mask*/ > void matchUnrolledCached(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &/*mask*/, const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches, int distType) { + assert(query.type() == CV_32F); cv::ocl::Context *ctx = query.clCxt; size_t globalSize[] = {(train.rows + BLOCK_SIZE - 1) / BLOCK_SIZE * BLOCK_SIZE, (query.rows + BLOCK_SIZE - 1) / BLOCK_SIZE * BLOCK_SIZE, 1}; size_t localSize[] = {BLOCK_SIZE, BLOCK_SIZE, 1}; @@ -176,15 +180,16 @@ void matchUnrolledCached(const oclMat &query, const oclMat &train, float maxDist std::string kernelName = "BruteForceMatch_RadiusUnrollMatch"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } //radius_match -template < int BLOCK_SIZE, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE/*, typename Mask*/ > void radius_match(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &/*mask*/, const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches, int distType) { + assert(query.type() == CV_32F); cv::ocl::Context *ctx = query.clCxt; size_t globalSize[] = {(train.rows + BLOCK_SIZE - 1) / BLOCK_SIZE * BLOCK_SIZE, (query.rows + BLOCK_SIZE - 1) / BLOCK_SIZE * BLOCK_SIZE, 1}; size_t localSize[] = {BLOCK_SIZE, BLOCK_SIZE, 1}; @@ -214,263 +219,70 @@ void radius_match(const oclMat &query, const oclMat &train, float maxDistance, c std::string kernelName = "BruteForceMatch_RadiusMatch"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); - //float *dis = (float *)clEnqueueMapBuffer(ctx->impl->clCmdQueue, (cl_mem)distance.data, CL_TRUE, CL_MAP_READ, 0, 8, 0, NULL, NULL, NULL); - //printf("%f, %f\n", dis[0], dis[1]); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } -// with mask -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat &train, const oclMat &mask, +static void matchDispatcher(const oclMat &query, const oclMat &train, const oclMat &mask, const oclMat &trainIdx, const oclMat &distance, int distType) { + const oclMat zeroMask; + const oclMat &tempMask = mask.data ? mask : zeroMask; if (query.cols <= 64) { - matchUnrolledCached<16, 64, T>(query, train, mask, trainIdx, distance, distType); - } - else if (query.cols <= 128) - { - matchUnrolledCached<16, 128, T>(query, train, mask, trainIdx, distance, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, train, mask, trainIdx, distance, stream); - } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, train, mask, trainIdx, distance, stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, train, mask, trainIdx, distance, stream); - }*/ - else - { - match<16, T>(query, train, mask, trainIdx, distance, distType); - } -} - -// without mask -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat &train, const oclMat &trainIdx, const oclMat &distance, int distType) -{ - oclMat mask; - if (query.cols <= 64) - { - matchUnrolledCached<16, 64, T>(query, train, mask, trainIdx, distance, distType); + matchUnrolledCached<16, 64>(query, train, tempMask, trainIdx, distance, distType); } else if (query.cols <= 128) { - matchUnrolledCached<16, 128, T>(query, train, mask, trainIdx, distance, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance); - } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance); + matchUnrolledCached<16, 128>(query, train, tempMask, trainIdx, distance, distType); } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance); - }*/ else { - match<16, T>(query, train, mask, trainIdx, distance, distType); + match<16>(query, train, tempMask, trainIdx, distance, distType); } } -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat *trains, int n, const oclMat &mask, +static void matchDispatcher(const oclMat &query, const oclMat *trains, int n, const oclMat &mask, const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, int distType) { + const oclMat zeroMask; + const oclMat &tempMask = mask.data ? mask : zeroMask; if (query.cols <= 64) { - matchUnrolledCached<16, 64, T>(query, trains, n, mask, trainIdx, imgIdx, distance, distType); + matchUnrolledCached<16, 64>(query, trains, n, tempMask, trainIdx, imgIdx, distance, distType); } else if (query.cols <= 128) { - matchUnrolledCached<16, 128, T>(query, trains, n, mask, trainIdx, imgIdx, distance, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance, stream); + matchUnrolledCached<16, 128>(query, trains, n, tempMask, trainIdx, imgIdx, distance, distType); } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance, stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance, stream); - }*/ else { - match<16, T>(query, trains, n, mask, trainIdx, imgIdx, distance, distType); - } -} - -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat *trains, int n, const oclMat &trainIdx, - const oclMat &imgIdx, const oclMat &distance, int distType) -{ - oclMat mask; - if (query.cols <= 64) - { - matchUnrolledCached<16, 64, T>(query, trains, n, mask, trainIdx, imgIdx, distance, distType); - } - else if (query.cols <= 128) - { - matchUnrolledCached<16, 128, T>(query, trains, n, mask, trainIdx, imgIdx, distance, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance, stream); - } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance, stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, trains, n, mask, trainIdx, imgIdx, distance, stream); - }*/ - else - { - match<16, T>(query, trains, n, mask, trainIdx, imgIdx, distance, distType); + match<16>(query, trains, n, tempMask, trainIdx, imgIdx, distance, distType); } } //radius matchDispatcher -// with mask -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &mask, +static void matchDispatcher(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &mask, const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches, int distType) { + const oclMat zeroMask; + const oclMat &tempMask = mask.data ? mask : zeroMask; if (query.cols <= 64) { - matchUnrolledCached<16, 64, T>(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); + matchUnrolledCached<16, 64>(query, train, maxDistance, tempMask, trainIdx, distance, nMatches, distType); } else if (query.cols <= 128) { - matchUnrolledCached<16, 128, T>(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, train, maxDistance, mask, trainIdx, distance, nMatches, stream); + matchUnrolledCached<16, 128>(query, train, maxDistance, tempMask, trainIdx, distance, nMatches, distType); } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, train, maxDistance, mask, trainIdx, distance, nMatches, stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, train, maxDistance, mask, trainIdx, distance, nMatches, stream); - }*/ - else - { - radius_match<16, T>(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - } -} - -// without mask -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &trainIdx, - const oclMat &distance, const oclMat &nMatches, int distType) -{ - oclMat mask; - if (query.cols <= 64) - { - matchUnrolledCached<16, 64, T>(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - } - else if (query.cols <= 128) - { - matchUnrolledCached<16, 128, T>(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, train, maxDistance, mask, trainIdx, distance, nMatches, stream); - } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, train, maxDistance, mask, trainIdx, distance, nMatches, stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, train, maxDistance, mask, trainIdx, distance, nMatches, stream); - }*/ else { - radius_match<16, T>(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - } -} - -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat &train, int n, float maxDistance, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches, int distType) -{ - if (query.cols <= 64) - { - matchUnrolledCached<16, 64, T>(query, train, n, maxDistance, mask, trainIdx, distance, nMatches, distType); - } - else if (query.cols <= 128) - { - matchUnrolledCached<16, 128, T>(query, train, n, maxDistance, mask, trainIdx, distance, nMatches, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, trains, n, maxDistance, masks, trainIdx, imgIdx, distance, nMatches, stream); - } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, trains, n, maxDistance, masks, trainIdx, imgIdx, distance, nMatches, stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, trains, n, maxDistance, masks, trainIdx, imgIdx, distance, nMatches, stream); - }*/ - else - { - match<16, T>(query, train, n, maxDistance, mask, trainIdx, distance, nMatches, distType); - } -} - -// without mask -template < typename T/*, typename Mask*/ > -void matchDispatcher(const oclMat &query, const oclMat &train, int n, float maxDistance, const oclMat &trainIdx, - const oclMat &distance, const oclMat &nMatches, int distType) -{ - oclMat mask; - if (query.cols <= 64) - { - matchUnrolledCached<16, 64, T>(query, train, n, maxDistance, mask, trainIdx, distance, nMatches, distType); - } - else if (query.cols <= 128) - { - matchUnrolledCached<16, 128, T>(query, train, n, maxDistance, mask, trainIdx, distance, nMatches, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, trains, n, maxDistance, masks, trainIdx, imgIdx, distance, nMatches, stream); - } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, trains, n, maxDistance, masks, trainIdx, imgIdx, distance, nMatches, stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, trains, n, maxDistance, masks, trainIdx, imgIdx, distance, nMatches, stream); - }*/ - else - { - match<16, T>(query, train, n, maxDistance, mask, trainIdx, distance, nMatches, distType); + radius_match<16>(query, train, maxDistance, tempMask, trainIdx, distance, nMatches, distType); } } //knn match Dispatcher -template < int BLOCK_SIZE, int MAX_DESC_LEN, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE, int MAX_DESC_LEN/*, typename Mask*/ > void knn_matchUnrolledCached(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, const oclMat &trainIdx, const oclMat &distance, int distType) { @@ -501,11 +313,11 @@ void knn_matchUnrolledCached(const oclMat &query, const oclMat &train, const ocl std::string kernelName = "BruteForceMatch_knnUnrollMatch"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } -template < int BLOCK_SIZE, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE/*, typename Mask*/ > void knn_match(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, const oclMat &trainIdx, const oclMat &distance, int distType) { @@ -534,11 +346,11 @@ void knn_match(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, std::string kernelName = "BruteForceMatch_knnMatch"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } -template < int BLOCK_SIZE, int MAX_DESC_LEN, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE, int MAX_DESC_LEN/*, typename Mask*/ > void calcDistanceUnrolled(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, const oclMat &allDist, int distType) { cv::ocl::Context *ctx = query.clCxt; @@ -567,11 +379,11 @@ void calcDistanceUnrolled(const oclMat &query, const oclMat &train, const oclMat std::string kernelName = "BruteForceMatch_calcDistanceUnrolled"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } -template < int BLOCK_SIZE, typename T/*, typename Mask*/ > +template < int BLOCK_SIZE/*, typename Mask*/ > void calcDistance(const oclMat &query, const oclMat &train, const oclMat &/*mask*/, const oclMat &allDist, int distType) { cv::ocl::Context *ctx = query.clCxt; @@ -598,69 +410,43 @@ void calcDistance(const oclMat &query, const oclMat &train, const oclMat &/*mask std::string kernelName = "BruteForceMatch_calcDistance"; - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, query.depth()); } } /////////////////////////////////////////////////////////////////////////////// // Calc Distance dispatcher -template < typename T/*, typename Mask*/ > -void calcDistanceDispatcher(const oclMat &query, const oclMat &train, const oclMat &mask, +static void calcDistanceDispatcher(const oclMat &query, const oclMat &train, const oclMat &mask, const oclMat &allDist, int distType) { if (query.cols <= 64) { - calcDistanceUnrolled<16, 64, T>(query, train, mask, allDist, distType); + calcDistanceUnrolled<16, 64>(query, train, mask, allDist, distType); } else if (query.cols <= 128) { - calcDistanceUnrolled<16, 128, T>(query, train, mask, allDist, distType); + calcDistanceUnrolled<16, 128>(query, train, mask, allDist, distType); } - /*else if (query.cols <= 256) - { - calcDistanceUnrolled<16, 256, Dist>(query, train, mask, allDist, stream); - } - else if (query.cols <= 512) - { - calcDistanceUnrolled<16, 512, Dist>(query, train, mask, allDist, stream); - } - else if (query.cols <= 1024) - { - calcDistanceUnrolled<16, 1024, Dist>(query, train, mask, allDist, stream); - }*/ else { - calcDistance<16, T>(query, train, mask, allDist, distType); + calcDistance<16>(query, train, mask, allDist, distType); } } -template < typename T/*, typename Mask*/ > -void match2Dispatcher(const oclMat &query, const oclMat &train, const oclMat &mask, +static void match2Dispatcher(const oclMat &query, const oclMat &train, const oclMat &mask, const oclMat &trainIdx, const oclMat &distance, int distType) { if (query.cols <= 64) { - knn_matchUnrolledCached<16, 64, T>(query, train, mask, trainIdx, distance, distType); + knn_matchUnrolledCached<16, 64>(query, train, mask, trainIdx, distance, distType); } else if (query.cols <= 128) { - knn_matchUnrolledCached<16, 128, T>(query, train, mask, trainIdx, distance, distType); - } - /*else if (query.cols <= 256) - { - matchUnrolled<16, 256, Dist>(query, train, mask, static_cast< DevMem2D_ >(trainIdx), static_cast< DevMem2D_ > (distance), stream); + knn_matchUnrolledCached<16, 128>(query, train, mask, trainIdx, distance, distType); } - else if (query.cols <= 512) - { - matchUnrolled<16, 512, Dist>(query, train, mask, static_cast< DevMem2D_ >(trainIdx), static_cast< DevMem2D_ > (distance), stream); - } - else if (query.cols <= 1024) - { - matchUnrolled<16, 1024, Dist>(query, train, mask, static_cast< DevMem2D_ >(trainIdx), static_cast< DevMem2D_ > (distance), stream); - }*/ else { - knn_match<16, T>(query, train, mask, trainIdx, distance, distType); + knn_match<16>(query, train, mask, trainIdx, distance, distType); } } @@ -686,7 +472,7 @@ void findKnnMatch(int k, const oclMat &trainIdx, const oclMat &distance, const o //args.push_back( make_pair( sizeof(cl_int), (void *)&train.cols )); //args.push_back( make_pair( sizeof(cl_int), (void *)&query.step )); - openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, -1, -1); + openCLExecuteKernel(ctx, &brute_force_match, kernelName, globalSize, localSize, args, trainIdx.depth(), -1); } } @@ -695,206 +481,22 @@ static void findKnnMatchDispatcher(int k, const oclMat &trainIdx, const oclMat & findKnnMatch<256>(k, trainIdx, distance, allDist, distType); } -//with mask -template < typename T/*, typename Mask*/ > -void kmatchDispatcher(const oclMat &query, const oclMat &train, int k, const oclMat &mask, +static void kmatchDispatcher(const oclMat &query, const oclMat &train, int k, const oclMat &mask, const oclMat &trainIdx, const oclMat &distance, const oclMat &allDist, int distType) { + const oclMat zeroMask; + const oclMat &tempMask = mask.data ? mask : zeroMask; if (k == 2) { - match2Dispatcher(query, train, mask, trainIdx, distance, distType); + match2Dispatcher(query, train, tempMask, trainIdx, distance, distType); } else { - calcDistanceDispatcher(query, train, mask, allDist, distType); + calcDistanceDispatcher(query, train, tempMask, allDist, distType); findKnnMatchDispatcher(k, trainIdx, distance, allDist, distType); } } -//without mask -template < typename T/*, typename Mask*/ > -void kmatchDispatcher(const oclMat &query, const oclMat &train, int k, - const oclMat &trainIdx, const oclMat &distance, const oclMat &allDist, int distType) -{ - oclMat mask; - if (k == 2) - { - match2Dispatcher(query, train, mask, trainIdx, distance, distType); - } - else - { - calcDistanceDispatcher(query, train, mask, allDist, distType); - findKnnMatchDispatcher(k, trainIdx, distance, allDist, distType); - } -} - - - -template -void ocl_matchL1_gpu(const oclMat &query, const oclMat &train, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance) -{ - int distType = 0; - if (mask.data) - { - matchDispatcher(query, train, mask, trainIdx, distance, distType); - } - else - { - matchDispatcher< T >(query, train, trainIdx, distance, distType); - } -} - -template -void ocl_matchL1_gpu(const oclMat &query, const oclMat &trains, const oclMat &masks, - const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance) -{ - int distType = 0; - - if (masks.data) - { - matchDispatcher(query, (const oclMat *)trains.ptr(), trains.cols, masks, trainIdx, imgIdx, distance, distType); - } - else - { - matchDispatcher(query, (const oclMat *)trains.ptr(), trains.cols, trainIdx, imgIdx, distance, distType); - } -} - -template -void ocl_matchL2_gpu(const oclMat &query, const oclMat &train, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance) -{ - int distType = 1; - if (mask.data) - { - matchDispatcher(query, train, mask, trainIdx, distance, distType); - } - else - { - matchDispatcher(query, train, trainIdx, distance, distType); - } -} - -template -void ocl_matchL2_gpu(const oclMat &query, const oclMat &trains, const oclMat &masks, - const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance) -{ - int distType = 1; - if (masks.data) - { - matchDispatcher(query, (const oclMat *)trains.ptr(), trains.cols, masks, trainIdx, imgIdx, distance, distType); - } - else - { - matchDispatcher(query, (const oclMat *)trains.ptr(), trains.cols, trainIdx, imgIdx, distance, distType); - } -} - -template -void ocl_matchHamming_gpu(const oclMat &query, const oclMat &train, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance) -{ - int distType = 2; - if (mask.data) - { - matchDispatcher(query, train, mask, trainIdx, distance, distType); - } - else - { - matchDispatcher< T >(query, train, trainIdx, distance, distType); - } -} - -template -void ocl_matchHamming_gpu(const oclMat &query, const oclMat &trains, const oclMat &masks, - const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance) -{ - int distType = 2; - if (masks.data) - { - matchDispatcher(query, (const oclMat *)trains.ptr(), trains.cols, masks, trainIdx, imgIdx, distance, distType); - } - else - { - matchDispatcher(query, (const oclMat *)trains.ptr(), trains.cols, trainIdx, imgIdx, distance, distType); - } -} - -// knn caller -template -void ocl_matchL1_gpu(const oclMat &query, const oclMat &train, int k, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance, const oclMat &allDist) -{ - int distType = 0; - - if (mask.data) - kmatchDispatcher(query, train, k, mask, trainIdx, distance, allDist, distType); - else - kmatchDispatcher(query, train, k, trainIdx, distance, allDist, distType); -} - -template -void ocl_matchL2_gpu(const oclMat &query, const oclMat &train, int k, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance, const oclMat &allDist) -{ - int distType = 1; - - if (mask.data) - kmatchDispatcher(query, train, k, mask, trainIdx, distance, allDist, distType); - else - kmatchDispatcher(query, train, k, trainIdx, distance, allDist, distType); -} - -template -void ocl_matchHamming_gpu(const oclMat &query, const oclMat &train, int k, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance, const oclMat &allDist) -{ - int distType = 2; - - if (mask.data) - kmatchDispatcher(query, train, k, mask, trainIdx, distance, allDist, distType); - else - kmatchDispatcher(query, train, k, trainIdx, distance, allDist, distType); -} - -//radius caller -template -void ocl_matchL1_gpu(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches) -{ - int distType = 0; - - if (mask.data) - matchDispatcher(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - else - matchDispatcher(query, train, maxDistance, trainIdx, distance, nMatches, distType); -} - -template -void ocl_matchL2_gpu(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches) -{ - int distType = 1; - - if (mask.data) - matchDispatcher(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - else - matchDispatcher(query, train, maxDistance, trainIdx, distance, nMatches, distType); -} - -template -void ocl_matchHamming_gpu(const oclMat &query, const oclMat &train, float maxDistance, const oclMat &mask, - const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches) -{ - int distType = 2; - - if (mask.data) - matchDispatcher(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); - else - matchDispatcher(query, train, maxDistance, trainIdx, distance, nMatches, distType); -} - cv::ocl::BruteForceMatcher_OCL_base::BruteForceMatcher_OCL_base(DistType distType_) : distType(distType_) { } @@ -929,38 +531,28 @@ void cv::ocl::BruteForceMatcher_OCL_base::matchSingle(const oclMat &query, const { if (query.empty() || train.empty()) return; + + // match1 doesn't support signed char type, match2 only support float, hamming support uchar, ushort and int + int callType = query.depth(); + char cvFuncName[] = "singleMatch"; + if (callType != 5) + CV_ERROR(CV_UNSUPPORTED_FORMAT_ERR, "BruteForceMatch OpenCL only support float type query!\n"); - typedef void (*caller_t)(const oclMat & query, const oclMat & train, const oclMat & mask, - const oclMat & trainIdx, const oclMat & distance); - - static const caller_t callers[3][6] = + if ((distType == 0 && callType == 1 ) || (distType == 1 && callType != 5) || (distType == 2 && (callType != 0 + || callType != 2 || callType != 4))) { - { - ocl_matchL1_gpu, 0/*ocl_matchL1_gpu*/, - ocl_matchL1_gpu, ocl_matchL1_gpu, - ocl_matchL1_gpu, ocl_matchL1_gpu - }, - { - 0/*ocl_matchL2_gpu*/, 0/*ocl_matchL2_gpu*/, - 0/*ocl_matchL2_gpu*/, 0/*ocl_matchL2_gpu*/, - 0/*ocl_matchL2_gpu*/, ocl_matchL2_gpu - }, - { - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/ - } - }; + CV_ERROR(CV_UNSUPPORTED_DEPTH_ERR, "BruteForceMatch OpenCL only support float type query!\n"); + } CV_Assert(query.channels() == 1 && query.depth() < CV_64F); CV_Assert(train.cols == query.cols && train.type() == query.type()); - const int nQuery = query.rows; - trainIdx.create(1, nQuery, CV_32S); - distance.create(1, nQuery, CV_32F); + trainIdx.create(1, query.rows, CV_32S); + distance.create(1, query.rows, CV_32F); - caller_t func = callers[distType][query.depth()]; - func(query, train, mask, trainIdx, distance); + matchDispatcher(query, train, mask, trainIdx, distance, distType); +exit: + return; } void cv::ocl::BruteForceMatcher_OCL_base::matchDownload(const oclMat &trainIdx, const oclMat &distance, vector &matches) @@ -1062,40 +654,27 @@ void cv::ocl::BruteForceMatcher_OCL_base::matchCollection(const oclMat &query, c 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); + // match1 doesn't support signed char type, match2 only support float, hamming support uchar, ushort and int + int callType = query.depth(); + char cvFuncName[] = "matchCollection"; + if (callType != 5) + CV_ERROR(CV_UNSUPPORTED_FORMAT_ERR, "BruteForceMatch OpenCL only support float type query!\n"); - static const caller_t callers[3][6] = + if ((distType == 0 && callType == 1 ) || (distType == 1 && callType != 5) || (distType == 2 && (callType != 0 + || callType != 2 || callType != 4))) { - { - ocl_matchL1_gpu, 0/*matchL1_gpu*/, - ocl_matchL1_gpu, ocl_matchL1_gpu, - ocl_matchL1_gpu, ocl_matchL1_gpu - }, - { - 0/*matchL2_gpu*/, 0/*matchL2_gpu*/, - 0/*matchL2_gpu*/, 0/*matchL2_gpu*/, - 0/*matchL2_gpu*/, ocl_matchL2_gpu - }, - { - ocl_matchHamming_gpu, 0/*matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*matchHamming_gpu*/ - } - }; + CV_ERROR(CV_UNSUPPORTED_DEPTH_ERR, "BruteForceMatch OpenCL only support float type query!\n"); + } CV_Assert(query.channels() == 1 && query.depth() < CV_64F); - const int nQuery = query.rows; - - trainIdx.create(1, nQuery, CV_32S); - imgIdx.create(1, nQuery, CV_32S); - distance.create(1, nQuery, CV_32F); - - caller_t func = callers[distType][query.depth()]; - CV_Assert(func != 0); + trainIdx.create(1, query.rows, CV_32S); + imgIdx.create(1, query.rows, CV_32S); + distance.create(1, query.rows, CV_32F); - func(query, trainCollection, masks, trainIdx, imgIdx, distance); + matchDispatcher(query, (const oclMat *)trainCollection.ptr(), trainCollection.cols, masks, trainIdx, imgIdx, distance, distType); +exit: + return; } void cv::ocl::BruteForceMatcher_OCL_base::matchDownload(const oclMat &trainIdx, const oclMat &imgIdx, const oclMat &distance, vector &matches) @@ -1164,52 +743,39 @@ void cv::ocl::BruteForceMatcher_OCL_base::knnMatchSingle(const oclMat &query, co if (query.empty() || train.empty()) return; - typedef void (*caller_t)(const oclMat & query, const oclMat & train, int k, const oclMat & mask, - const oclMat & trainIdx, const oclMat & distance, const oclMat & allDist); + // match1 doesn't support signed char type, match2 only support float, hamming support uchar, ushort and int + int callType = query.depth(); - static const caller_t callers[3][6] = + char cvFuncName[] = "knnMatchSingle"; + if (callType != 5) + CV_ERROR(CV_UNSUPPORTED_FORMAT_ERR, "BruteForceMatch OpenCL only support float type query!\n"); + + if ((distType == 0 && callType == 1 ) || (distType == 1 && callType != 5) || (distType == 2 && (callType != 0 + || callType != 2 || callType != 4))) { - { - ocl_matchL1_gpu, 0/*ocl_matchL1_gpu*/, - ocl_matchL1_gpu, ocl_matchL1_gpu, - ocl_matchL1_gpu, ocl_matchL1_gpu - }, - { - 0/*ocl_matchL2_gpu*/, 0/*ocl_matchL2_gpu*/, - 0/*ocl_matchL2_gpu*/, 0/*ocl_matchL2_gpu*/, - 0/*ocl_matchL2_gpu*/, ocl_matchL2_gpu - }, - { - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/ - } - }; + CV_ERROR(CV_UNSUPPORTED_DEPTH_ERR, "BruteForceMatch OpenCL only support float type query!\n"); + } CV_Assert(query.channels() == 1 && query.depth() < CV_64F); CV_Assert(train.type() == query.type() && train.cols == query.cols); - const int nQuery = query.rows; - const int nTrain = train.rows; - if (k == 2) { - trainIdx.create(1, nQuery, CV_32SC2); - distance.create(1, nQuery, CV_32FC2); + trainIdx.create(1, query.rows, CV_32SC2); + distance.create(1, query.rows, CV_32FC2); } else { - trainIdx.create(nQuery, k, CV_32S); - distance.create(nQuery, k, CV_32F); - allDist.create(nQuery, nTrain, CV_32FC1); + trainIdx.create(query.rows, k, CV_32S); + distance.create(query.rows, k, CV_32F); + allDist.create(query.rows, train.rows, CV_32FC1); } trainIdx.setTo(Scalar::all(-1)); - caller_t func = callers[distType][query.depth()]; - CV_Assert(func != 0); - - func(query, train, k, mask, trainIdx, distance, allDist); + kmatchDispatcher(query, train, k, mask, trainIdx, distance, allDist, distType); +exit: + return; } void cv::ocl::BruteForceMatcher_OCL_base::knnMatchDownload(const oclMat &trainIdx, const oclMat &distance, vector< vector > &matches, bool compactResult) @@ -1394,8 +960,6 @@ namespace void cv::ocl::BruteForceMatcher_OCL_base::knnMatch(const oclMat &query, vector< vector > &matches, int k, const vector &masks, bool compactResult) { - - if (k == 2) { oclMat trainCollection; @@ -1455,50 +1019,34 @@ void cv::ocl::BruteForceMatcher_OCL_base::radiusMatchSingle(const oclMat &query, if (query.empty() || train.empty()) return; - typedef void (*caller_t)(const oclMat & query, const oclMat & train, float maxDistance, const oclMat & mask, - const oclMat & trainIdx, const oclMat & distance, const oclMat & nMatches); + // match1 doesn't support signed char type, match2 only support float, hamming support uchar, ushort and int + int callType = query.depth(); + char cvFuncName[] = "radiusMatchSingle"; + if (callType != 5) + CV_ERROR(CV_UNSUPPORTED_FORMAT_ERR, "BruteForceMatch OpenCL only support float type query!\n"); - //#if 0 - static const caller_t callers[3][6] = + if ((distType == 0 && callType == 1 ) || (distType == 1 && callType != 5) || (distType == 2 && (callType != 0 + || callType != 2 || callType != 4))) { - { - ocl_matchL1_gpu, 0/*ocl_matchL1_gpu*/, - ocl_matchL1_gpu, ocl_matchL1_gpu, - ocl_matchL1_gpu, ocl_matchL1_gpu - }, - { - 0/*ocl_matchL2_gpu*/, 0/*ocl_matchL2_gpu*/, - 0/*ocl_matchL2_gpu*/, 0/*ocl_matchL2_gpu*/, - 0/*ocl_matchL2_gpu*/, ocl_matchL2_gpu - }, - { - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/, - ocl_matchHamming_gpu, 0/*ocl_matchHamming_gpu*/ - } - }; - //#endif - - const int nQuery = query.rows; - const int nTrain = train.rows; + CV_ERROR(CV_UNSUPPORTED_DEPTH_ERR, "BruteForceMatch OpenCL only support float type query!\n"); + } CV_Assert(query.channels() == 1 && query.depth() < CV_64F); CV_Assert(train.type() == query.type() && train.cols == query.cols); - CV_Assert(trainIdx.empty() || (trainIdx.rows == nQuery && trainIdx.size() == distance.size())); + CV_Assert(trainIdx.empty() || (trainIdx.rows == query.rows && trainIdx.size() == distance.size())); - nMatches.create(1, nQuery, CV_32SC1); + nMatches.create(1, query.rows, CV_32SC1); if (trainIdx.empty()) { - trainIdx.create(nQuery, std::max((nTrain / 100), 10), CV_32SC1); - distance.create(nQuery, std::max((nTrain / 100), 10), CV_32FC1); + trainIdx.create(query.rows, std::max((train.rows/ 100), 10), CV_32SC1); + distance.create(query.rows, std::max((train.rows/ 100), 10), CV_32FC1); } nMatches.setTo(Scalar::all(0)); - caller_t func = callers[distType][query.depth()]; - //CV_Assert(func != 0); - //func(query, train, maxDistance, mask, trainIdx, distance, nMatches, cc, StreamAccessor::getStream(stream)); - func(query, train, maxDistance, mask, trainIdx, distance, nMatches); + matchDispatcher(query, train, maxDistance, mask, trainIdx, distance, nMatches, distType); +exit: + return; } void cv::ocl::BruteForceMatcher_OCL_base::radiusMatchDownload(const oclMat &trainIdx, const oclMat &distance, const oclMat &nMatches, @@ -1697,5 +1245,3 @@ void cv::ocl::BruteForceMatcher_OCL_base::radiusMatch(const oclMat &query, vecto radiusMatchCollection(query, trainIdx, imgIdx, distance, nMatches, maxDistance, masks); radiusMatchDownload(trainIdx, imgIdx, distance, nMatches, matches, compactResult); } - - diff --git a/modules/ocl/src/haar.cpp b/modules/ocl/src/haar.cpp index 4e0f5b85d3..1c727f01f9 100644 --- a/modules/ocl/src/haar.cpp +++ b/modules/ocl/src/haar.cpp @@ -953,8 +953,8 @@ CvSeq *cv::ocl::OclCascadeClassifier::oclHaarDetectObjects( oclMat &gimg, CvMemS //int flag = 0; oclMat gimg1(gimg.rows, gimg.cols, CV_8UC1); - oclMat gsum(totalheight, gimg.cols + 1, CV_32SC1); - oclMat gsqsum(totalheight, gimg.cols + 1, CV_32FC1); + oclMat gsum(totalheight + 4, gimg.cols + 1, CV_32SC1); + oclMat gsqsum(totalheight + 4, gimg.cols + 1, CV_32FC1); //cl_mem cascadebuffer; cl_mem stagebuffer; diff --git a/modules/ocl/src/moments.cpp b/modules/ocl/src/moments.cpp index 9679a7bab4..8028ca5c7c 100644 --- a/modules/ocl/src/moments.cpp +++ b/modules/ocl/src/moments.cpp @@ -106,7 +106,7 @@ static void icvContourMoments( CvSeq* contour, CvMoments* mom ) bool is_float = CV_SEQ_ELTYPE(contour) == CV_32FC2; - if (!cv::ocl::Context::getContext()->impl->double_support && is_float) + if (!cv::ocl::Context::getContext()->supportsFeature(Context::CL_DOUBLE) && is_float) { CV_Error(CV_StsUnsupportedFormat, "Moments - double is not supported by your GPU!"); } @@ -146,7 +146,7 @@ static void icvContourMoments( CvSeq* contour, CvMoments* mom ) cv::Mat dst(dst_a); a00 = a10 = a01 = a20 = a11 = a02 = a30 = a21 = a12 = a03 = 0.0; - if (!cv::ocl::Context::getContext()->impl->double_support) + if (!cv::ocl::Context::getContext()->supportsFeature(Context::CL_DOUBLE)) { for (int i = 0; i < contour->total; ++i) { @@ -161,7 +161,7 @@ static void icvContourMoments( CvSeq* contour, CvMoments* mom ) a12 += dst.at(8, i); a03 += dst.at(9, i); } - } + } else { a00 = cv::sum(dst.row(0))[0]; diff --git a/modules/ocl/src/opencl/brute_force_match.cl b/modules/ocl/src/opencl/brute_force_match.cl index 0730ac5ac7..e76fb1d21e 100644 --- a/modules/ocl/src/opencl/brute_force_match.cl +++ b/modules/ocl/src/opencl/brute_force_match.cl @@ -5,19 +5,93 @@ int bit1Count(float x) { int c = 0; int ix = (int)x; - for (int i = 0 ; i < 32 ; i++) { c += ix & 0x1; ix >>= 1; } - return (float)c; } + +float reduce_block(__local float *s_query, + __local float *s_train, + int block_size, + int lidx, + int lidy, + int distType + ) +{ + /* there are threee types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to + sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ + float result = 0; + switch(distType) + { + case 0: + for (int j = 0 ; j < block_size ; j++) + { + result += fabs(s_query[lidy * block_size + j] - s_train[j * block_size + lidx]); + } + break; + case 1: + for (int j = 0 ; j < block_size ; j++) + { + float qr = s_query[lidy * block_size + j] - s_train[j * block_size + lidx]; + result += qr * qr; + } + break; + case 2: + for (int j = 0 ; j < block_size ; j++) + { + result += bit1Count((uint)s_query[lidy * block_size + j] ^ (uint)s_train[(uint)j * block_size + lidx]); + } + break; + } + return result; +} + +float reduce_multi_block(__local float *s_query, + __local float *s_train, + int max_desc_len, + int block_size, + int block_index, + int lidx, + int lidy, + int distType + ) +{ + /* there are threee types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to + sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ + float result = 0; + switch(distType) + { + case 0: + for (int j = 0 ; j < block_size ; j++) + { + result += fabs(s_query[lidy * max_desc_len + block_index * block_size + j] - s_train[j * block_size + lidx]); + } + break; + case 1: + for (int j = 0 ; j < block_size ; j++) + { + float qr = s_query[lidy * max_desc_len + block_index * block_size + j] - s_train[j * block_size + lidx]; + result += qr * qr; + } + break; + case 2: + for (int j = 0 ; j < block_size ; j++) + { + //result += popcount((uint)s_query[lidy * max_desc_len + block_index * block_size + j] ^ (uint)s_train[j * block_size + lidx]); + result += bit1Count((uint)s_query[lidy * max_desc_len + block_index * block_size + j] ^ (uint)s_train[j * block_size + lidx]); + } + break; + } + return result; +} + /* 2dim launch, global size: dim0 is (query rows + block_size - 1) / block_size * block_size, dim1 is block_size local size: dim0 is block_size, dim1 is block_size. */ -__kernel void BruteForceMatch_UnrollMatch( +__kernel void BruteForceMatch_UnrollMatch_D5( __global float *query, __global float *train, //__global float *mask, @@ -42,7 +116,6 @@ __kernel void BruteForceMatch_UnrollMatch( __local float *s_train = sharebuffer + block_size * max_desc_len; int queryIdx = groupidx * block_size + lidy; - // load the query into local memory. for (int i = 0 ; i < max_desc_len / block_size; i ++) { @@ -55,11 +128,9 @@ __kernel void BruteForceMatch_UnrollMatch( // loopUnrolledCached to find the best trainIdx and best distance. volatile int imgIdx = 0; - for (int t = 0 ; t < (train_rows + block_size - 1) / block_size ; t++) { float result = 0; - for (int i = 0 ; i < max_desc_len / block_size ; i++) { //load a block_size * block_size block into local train. @@ -69,38 +140,7 @@ __kernel void BruteForceMatch_UnrollMatch( //synchronize to make sure each elem for reduceIteration in share memory is written already. barrier(CLK_LOCAL_MEM_FENCE); - /* there are threee types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to - sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ - - switch (distType) - { - case 0: - - for (int j = 0 ; j < block_size ; j++) - { - result += fabs(s_query[lidy * max_desc_len + i * block_size + j] - s_train[j * block_size + lidx]); - } - - break; - case 1: - - for (int j = 0 ; j < block_size ; j++) - { - float qr = s_query[lidy * max_desc_len + i * block_size + j] - s_train[j * block_size + lidx]; - result += qr * qr; - } - - break; - case 2: - - for (int j = 0 ; j < block_size ; j++) - { - //result += popcount((uint)s_query[lidy * max_desc_len + i * block_size + j] ^ (uint)s_train[j * block_size + lidx]); - result += bit1Count((uint)s_query[lidy * max_desc_len + i * block_size + j] ^(uint)s_train[j * block_size + lidx]); - } - - break; - } + result += reduce_multi_block(s_query, s_train, max_desc_len, block_size, i, lidx, lidy, distType); barrier(CLK_LOCAL_MEM_FENCE); } @@ -116,8 +156,8 @@ __kernel void BruteForceMatch_UnrollMatch( } barrier(CLK_LOCAL_MEM_FENCE); - __local float *s_distance = (__local float *)(sharebuffer); - __local int *s_trainIdx = (__local int *)(sharebuffer + block_size * block_size); + __local float *s_distance = (__local float*)(sharebuffer); + __local int* s_trainIdx = (__local int *)(sharebuffer + block_size * block_size); //find BestMatch s_distance += lidy * block_size; @@ -144,7 +184,7 @@ __kernel void BruteForceMatch_UnrollMatch( } } -__kernel void BruteForceMatch_Match( +__kernel void BruteForceMatch_Match_D5( __global float *query, __global float *train, //__global float *mask, @@ -177,7 +217,6 @@ __kernel void BruteForceMatch_Match( { //Dist dist; float result = 0; - for (int i = 0 ; i < (query_cols + block_size - 1) / block_size ; i++) { const int loadx = lidx + i * block_size; @@ -193,38 +232,7 @@ __kernel void BruteForceMatch_Match( barrier(CLK_LOCAL_MEM_FENCE); - /* there are threee types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to - sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ - - switch (distType) - { - case 0: - - for (int j = 0 ; j < block_size ; j++) - { - result += fabs(s_query[lidy * block_size + j] - s_train[j * block_size + lidx]); - } - - break; - case 1: - - for (int j = 0 ; j < block_size ; j++) - { - float qr = s_query[lidy * block_size + j] - s_train[j * block_size + lidx]; - result += qr * qr; - } - - break; - case 2: - - for (int j = 0 ; j < block_size ; j++) - { - //result += popcount((uint)s_query[lidy * block_size + j] ^ (uint)s_train[j * block_size + lidx]); - result += bit1Count((uint)s_query[lidy * block_size + j] ^(uint)s_train[(uint)j * block_size + lidx]); - } - - break; - } + result += reduce_block(s_query, s_train, block_size, lidx, lidy, distType); barrier(CLK_LOCAL_MEM_FENCE); } @@ -270,7 +278,7 @@ __kernel void BruteForceMatch_Match( } //radius_unrollmatch -__kernel void BruteForceMatch_RadiusUnrollMatch( +__kernel void BruteForceMatch_RadiusUnrollMatch_D5( __global float *query, __global float *train, float maxDistance, @@ -303,7 +311,6 @@ __kernel void BruteForceMatch_RadiusUnrollMatch( __local float *s_train = sharebuffer + block_size * block_size; float result = 0; - for (int i = 0 ; i < max_desc_len / block_size ; ++i) { //load a block_size * block_size block into local train. @@ -315,37 +322,7 @@ __kernel void BruteForceMatch_RadiusUnrollMatch( //synchronize to make sure each elem for reduceIteration in share memory is written already. barrier(CLK_LOCAL_MEM_FENCE); - /* there are three types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to - sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ - - switch (distType) - { - case 0: - - for (int j = 0 ; j < block_size ; ++j) - { - result += fabs(s_query[lidy * block_size + j] - s_train[j * block_size + lidx]); - } - - break; - case 1: - - for (int j = 0 ; j < block_size ; ++j) - { - float qr = s_query[lidy * block_size + j] - s_train[j * block_size + lidx]; - result += qr * qr; - } - - break; - case 2: - - for (int j = 0 ; j < block_size ; ++j) - { - result += bit1Count((uint)s_query[lidy * block_size + j] ^(uint)s_train[j * block_size + lidx]); - } - - break; - } + result += reduce_block(s_query, s_train, block_size, lidx, lidy, distType); barrier(CLK_LOCAL_MEM_FENCE); } @@ -354,7 +331,7 @@ __kernel void BruteForceMatch_RadiusUnrollMatch( { unsigned int ind = atom_inc(nMatches + queryIdx/*, (unsigned int) -1*/); - if (ind < bestTrainIdx_cols) + if(ind < bestTrainIdx_cols) { //bestImgIdx = imgIdx; bestTrainIdx[queryIdx * (ostep / sizeof(int)) + ind] = trainIdx; @@ -364,7 +341,7 @@ __kernel void BruteForceMatch_RadiusUnrollMatch( } //radius_match -__kernel void BruteForceMatch_RadiusMatch( +__kernel void BruteForceMatch_RadiusMatch_D5( __global float *query, __global float *train, float maxDistance, @@ -396,7 +373,6 @@ __kernel void BruteForceMatch_RadiusMatch( __local float *s_train = sharebuffer + block_size * block_size; float result = 0; - for (int i = 0 ; i < (query_cols + block_size - 1) / block_size ; ++i) { //load a block_size * block_size block into local train. @@ -408,46 +384,16 @@ __kernel void BruteForceMatch_RadiusMatch( //synchronize to make sure each elem for reduceIteration in share memory is written already. barrier(CLK_LOCAL_MEM_FENCE); - /* there are three types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to - sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ - - switch (distType) - { - case 0: - - for (int j = 0 ; j < block_size ; ++j) - { - result += fabs(s_query[lidy * block_size + j] - s_train[j * block_size + lidx]); - } - - break; - case 1: - - for (int j = 0 ; j < block_size ; ++j) - { - float qr = s_query[lidy * block_size + j] - s_train[j * block_size + lidx]; - result += qr * qr; - } - - break; - case 2: - - for (int j = 0 ; j < block_size ; ++j) - { - result += bit1Count((uint)s_query[lidy * block_size + j] ^(uint)s_train[j * block_size + lidx]); - } - - break; - } + result += reduce_block(s_query, s_train, block_size, lidx, lidy, distType); barrier(CLK_LOCAL_MEM_FENCE); } if (queryIdx < query_rows && trainIdx < train_rows && result < maxDistance/* && mask(queryIdx, trainIdx)*/) { - unsigned int ind = atom_inc(nMatches + queryIdx/*, (unsigned int) -1*/); + unsigned int ind = atom_inc(nMatches + queryIdx); - if (ind < bestTrainIdx_cols) + if(ind < bestTrainIdx_cols) { //bestImgIdx = imgIdx; bestTrainIdx[queryIdx * (ostep / sizeof(int)) + ind] = trainIdx; @@ -457,7 +403,7 @@ __kernel void BruteForceMatch_RadiusMatch( } -__kernel void BruteForceMatch_knnUnrollMatch( +__kernel void BruteForceMatch_knnUnrollMatch_D5( __global float *query, __global float *train, //__global float *mask, @@ -496,11 +442,9 @@ __kernel void BruteForceMatch_knnUnrollMatch( //loopUnrolledCached volatile int imgIdx = 0; - for (int t = 0 ; t < (train_rows + block_size - 1) / block_size ; t++) { float result = 0; - for (int i = 0 ; i < max_desc_len / block_size ; i++) { const int loadX = lidx + i * block_size; @@ -511,38 +455,7 @@ __kernel void BruteForceMatch_knnUnrollMatch( //synchronize to make sure each elem for reduceIteration in share memory is written already. barrier(CLK_LOCAL_MEM_FENCE); - /* there are threee types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to - sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ - - switch (distType) - { - case 0: - - for (int j = 0 ; j < block_size ; j++) - { - result += fabs(s_query[lidy * max_desc_len + i * block_size + j] - s_train[j * block_size + lidx]); - } - - break; - case 1: - - for (int j = 0 ; j < block_size ; j++) - { - float qr = s_query[lidy * max_desc_len + i * block_size + j] - s_train[j * block_size + lidx]; - result += qr * qr; - } - - break; - case 2: - - for (int j = 0 ; j < block_size ; j++) - { - //result += popcount((uint)s_query[lidy * max_desc_len + i * block_size + j] ^ (uint)s_train[j * block_size + lidx]); - result += bit1Count((uint)s_query[lidy * max_desc_len + i * block_size + j] ^(uint)s_train[j * block_size + lidx]); - } - - break; - } + result += reduce_multi_block(s_query, s_train, max_desc_len, block_size, i, lidx, lidy, distType); barrier(CLK_LOCAL_MEM_FENCE); } @@ -589,7 +502,6 @@ __kernel void BruteForceMatch_knnUnrollMatch( for (int i = 0 ; i < block_size ; i++) { float val = s_distance[i]; - if (val < bestDistance1) { bestDistance2 = bestDistance1; @@ -640,7 +552,7 @@ __kernel void BruteForceMatch_knnUnrollMatch( } } -__kernel void BruteForceMatch_knnMatch( +__kernel void BruteForceMatch_knnMatch_D5( __global float *query, __global float *train, //__global float *mask, @@ -673,8 +585,7 @@ __kernel void BruteForceMatch_knnMatch( for (int t = 0 ; t < (train_rows + block_size - 1) / block_size ; t++) { float result = 0.0f; - - for (int i = 0 ; i < (query_cols + block_size - 1) / block_size ; i++) + for (int i = 0 ; i < (query_cols + block_size -1) / block_size ; i++) { const int loadx = lidx + i * block_size; //load query and train into local memory @@ -689,38 +600,7 @@ __kernel void BruteForceMatch_knnMatch( barrier(CLK_LOCAL_MEM_FENCE); - /* there are threee types in the reducer. the first is L1Dist, which to sum the abs(v1, v2), the second is L2Dist, which to - sum the (v1 - v2) * (v1 - v2), the third is humming, which to popc(v1 ^ v2), popc is to count the bits are set to 1*/ - - switch (distType) - { - case 0: - - for (int j = 0 ; j < block_size ; j++) - { - result += fabs(s_query[lidy * block_size + j] - s_train[j * block_size + lidx]); - } - - break; - case 1: - - for (int j = 0 ; j < block_size ; j++) - { - float qr = s_query[lidy * block_size + j] - s_train[j * block_size + lidx]; - result += qr * qr; - } - - break; - case 2: - - for (int j = 0 ; j < block_size ; j++) - { - //result += popcount((uint)s_query[lidy * block_size + j] ^ (uint)s_train[j * block_size + lidx]); - result += bit1Count((uint)s_query[lidy * block_size + j] ^(uint)s_train[(uint)j * block_size + lidx]); - } - - break; - } + result += reduce_block(s_query, s_train, block_size, lidx, lidy, distType); barrier(CLK_LOCAL_MEM_FENCE); } @@ -767,7 +647,6 @@ __kernel void BruteForceMatch_knnMatch( for (int i = 0 ; i < block_size ; i++) { float val = s_distance[i]; - if (val < bestDistance1) { bestDistance2 = bestDistance1; @@ -818,7 +697,7 @@ __kernel void BruteForceMatch_knnMatch( } } -kernel void BruteForceMatch_calcDistanceUnrolled( +kernel void BruteForceMatch_calcDistanceUnrolled_D5( __global float *query, __global float *train, //__global float *mask, @@ -836,7 +715,7 @@ kernel void BruteForceMatch_calcDistanceUnrolled( /* Todo */ } -kernel void BruteForceMatch_calcDistance( +kernel void BruteForceMatch_calcDistance_D5( __global float *query, __global float *train, //__global float *mask, @@ -853,7 +732,7 @@ kernel void BruteForceMatch_calcDistance( /* Todo */ } -kernel void BruteForceMatch_findBestMatch( +kernel void BruteForceMatch_findBestMatch_D5( __global float *allDist, __global int *bestTrainIdx, __global float *bestDistance, diff --git a/modules/ocl/src/opencl/haarobjectdetect.cl b/modules/ocl/src/opencl/haarobjectdetect.cl index 2fa0906b41..9e468b07f5 100644 --- a/modules/ocl/src/opencl/haarobjectdetect.cl +++ b/modules/ocl/src/opencl/haarobjectdetect.cl @@ -211,10 +211,14 @@ __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; @@ -559,3 +563,7 @@ if(result) } } */ + + + + diff --git a/modules/ocl/test/test_brute_force_matcher.cpp b/modules/ocl/test/test_brute_force_matcher.cpp index bdf1f8a4af..424781fe0a 100644 --- a/modules/ocl/test/test_brute_force_matcher.cpp +++ b/modules/ocl/test/test_brute_force_matcher.cpp @@ -110,7 +110,7 @@ namespace } }; - TEST_P(BruteForceMatcher, DISABLED_Match_Single) + TEST_P(BruteForceMatcher, Match_Single) { cv::ocl::BruteForceMatcher_OCL_base matcher(distType); @@ -130,7 +130,7 @@ namespace ASSERT_EQ(0, badCount); } - TEST_P(BruteForceMatcher, DISABLED_KnnMatch_2_Single) + TEST_P(BruteForceMatcher, KnnMatch_2_Single) { const int knn = 2; From f36db3a037cae9f495bb7ca0fc0d17a4ba0726fb Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 26 Mar 2013 14:10:29 +0800 Subject: [PATCH 18/31] more fix of mismatch --- modules/ocl/src/match_template.cpp | 142 ++++++++++++++------- modules/ocl/src/opencl/match_template.cl | 153 ++++++++++++++--------- modules/ocl/test/test_match_template.cpp | 10 +- 3 files changed, 196 insertions(+), 109 deletions(-) diff --git a/modules/ocl/src/match_template.cpp b/modules/ocl/src/match_template.cpp index ab867d4d31..1f76d633dc 100644 --- a/modules/ocl/src/match_template.cpp +++ b/modules/ocl/src/match_template.cpp @@ -71,6 +71,9 @@ namespace cv void matchTemplate_SQDIFF_NORMED( const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf); + void convolve_32F( + const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf); + void matchTemplate_CCORR( const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf); @@ -90,41 +93,65 @@ namespace cv void matchTemplateNaive_CCORR( const oclMat &image, const oclMat &templ, oclMat &result, int cn); + void extractFirstChannel_32F( + const oclMat &image, oclMat &result); + // Evaluates optimal template's area threshold. If // template's area is less than the threshold, we use naive match // template version, otherwise FFT-based (if available) - static int getTemplateThreshold(int method, int depth) + static bool useNaive(int , int , Size ) { - switch (method) - { - case CV_TM_CCORR: - if (depth == CV_32F) return 250; - if (depth == CV_8U) return 300; - break; - case CV_TM_SQDIFF: - if (depth == CV_32F) return 0x7fffffff; // do naive SQDIFF for CV_32F - if (depth == CV_8U) return 300; - break; - } - CV_Error(CV_StsBadArg, "getTemplateThreshold: unsupported match template mode"); - return 0; + // FIXME! + // always use naive until convolve is imported + return true; } ////////////////////////////////////////////////////////////////////// // SQDIFF void matchTemplate_SQDIFF( - const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &) + const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf & buf) { result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F); - if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth())) + if (useNaive(CV_TM_SQDIFF, image.depth(), templ.size())) { matchTemplateNaive_SQDIFF(image, templ, result, image.oclchannels()); return; } else { - // TODO - CV_Error(CV_StsBadArg, "Not supported yet for this size template"); + buf.image_sqsums.resize(1); + + // TODO, add double support for ocl::integral + // use CPU integral temporarily + Mat sums, sqsums; + cv::integral(Mat(image.reshape(1)), sums, sqsums); + buf.image_sqsums[0] = sqsums; + + unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; + matchTemplate_CCORR(image, templ, result, buf); + + //port CUDA's matchTemplatePrepared_SQDIFF_8U + Context *clCxt = image.clCxt; + string kernelName = "matchTemplate_Prepared_SQDIFF"; + vector< pair > args; + + args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data)); + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data)); + args.push_back( make_pair( sizeof(cl_ulong), (void *)&templ_sqsum)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.rows)); + args.push_back( make_pair( sizeof(cl_int), (void *)&templ.cols)); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {16, 16, 1}; + + const char * build_opt = image.oclchannels() == 4 ? "-D CN4" : ""; + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U, build_opt); } } @@ -134,7 +161,6 @@ namespace cv matchTemplate_CCORR(image, templ, result, buf); buf.image_sums.resize(1); - integral(image.reshape(1), buf.image_sums[0]); unsigned long long templ_sqsum = (unsigned long long)sqrSum(templ.reshape(1))[0]; @@ -156,7 +182,7 @@ namespace cv args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; + size_t localThreads[3] = {16, 16, 1}; openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U); } @@ -191,33 +217,39 @@ namespace cv args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; + size_t localThreads[3] = {16, 16, 1}; openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.oclchannels(), image.depth()); } ////////////////////////////////////////////////////////////////////// // CCORR + void convolve_32F( + const oclMat &, const oclMat &, oclMat &, MatchTemplateBuf &) + { + CV_Error(-1, "convolve is not fully implemented yet"); + } + void matchTemplate_CCORR( const oclMat &image, const oclMat &templ, oclMat &result, MatchTemplateBuf &buf) { result.create(image.rows - templ.rows + 1, image.cols - templ.cols + 1, CV_32F); - if (templ.size().area() < getTemplateThreshold(CV_TM_SQDIFF, image.depth())) + if (useNaive(CV_TM_CCORR, image.depth(), templ.size())) { matchTemplateNaive_CCORR(image, templ, result, image.oclchannels()); return; } else { - CV_Error(CV_StsBadArg, "Not supported yet for this size template"); if(image.depth() == CV_8U && templ.depth() == CV_8U) { image.convertTo(buf.imagef, CV_32F); templ.convertTo(buf.templf, CV_32F); + convolve_32F(buf.imagef, buf.templf, result, buf); + } + else + { + convolve_32F(image, templ, result, buf); } - CV_Assert(image.oclchannels() == 1); - oclMat o_result(image.size(), CV_MAKETYPE(CV_32F, image.oclchannels())); - filter2D(buf.imagef, o_result, CV_32F, buf.templf, Point(0, 0)); - result = o_result(Rect(0, 0, image.rows - templ.rows + 1, image.cols - templ.cols + 1)); } } @@ -249,7 +281,7 @@ namespace cv args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; + size_t localThreads[3] = {16, 16, 1}; openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, 1, CV_8U); } @@ -284,7 +316,7 @@ namespace cv args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; + size_t localThreads[3] = {16, 16, 1}; openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.oclchannels(), image.depth()); } ////////////////////////////////////////////////////////////////////// @@ -301,7 +333,7 @@ namespace cv kernelName = "matchTemplate_Prepared_CCOFF"; size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; + size_t localThreads[3] = {16, 16, 1}; vector< pair > args; args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) ); @@ -313,22 +345,22 @@ namespace cv args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) ); args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + Vec4f templ_sum = Vec4f::all(0); // to be continued in the following section if(image.oclchannels() == 1) { buf.image_sums.resize(1); integral(image, buf.image_sums[0]); - float templ_sum = 0; - templ_sum = (float)sum(templ)[0] / templ.size().area(); + templ_sum[0] = (float)sum(templ)[0] / templ.size().area(); args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].step) ); - args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum) ); + args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[0]) ); } else { - Vec4f templ_sum = Vec4f::all(0); + split(image, buf.images); templ_sum = sum(templ) / templ.size().area(); buf.image_sums.resize(buf.images.size()); @@ -374,7 +406,7 @@ namespace cv kernelName = "matchTemplate_Prepared_CCOFF_NORMED"; size_t globalThreads[3] = {result.cols, result.rows, 1}; - size_t localThreads[3] = {32, 8, 1}; + size_t localThreads[3] = {16, 16, 1}; vector< pair > args; args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) ); @@ -387,20 +419,22 @@ namespace cv args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); args.push_back( make_pair( sizeof(cl_float), (void *)&scale) ); + + Vec4f templ_sum = Vec4f::all(0); + Vec4f templ_sqsum = Vec4f::all(0); // to be continued in the following section if(image.oclchannels() == 1) { buf.image_sums.resize(1); buf.image_sqsums.resize(1); integral(image, buf.image_sums[0], buf.image_sqsums[0]); - float templ_sum = 0; - float templ_sqsum = 0; - templ_sum = (float)sum(templ)[0]; - templ_sqsum = sqrSum(templ)[0]; + templ_sum[0] = (float)sum(templ)[0]; - templ_sqsum -= scale * templ_sum * templ_sum; - templ_sum *= scale; + templ_sqsum[0] = sqrSum(templ)[0]; + + templ_sqsum[0] -= scale * templ_sum[0] * templ_sum[0]; + templ_sum[0] *= scale; args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sums[0].data) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sums[0].offset) ); @@ -408,13 +442,11 @@ namespace cv args.push_back( make_pair( sizeof(cl_mem), (void *)&buf.image_sqsums[0].data) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].offset) ); args.push_back( make_pair( sizeof(cl_int), (void *)&buf.image_sqsums[0].step) ); - args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum) ); - args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sqsum) ); + args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sum[0]) ); + args.push_back( make_pair( sizeof(cl_float), (void *)&templ_sqsum[0]) ); } else { - Vec4f templ_sum = Vec4f::all(0); - Vec4f templ_sqsum = Vec4f::all(0); split(image, buf.images); templ_sum = sum(templ); @@ -465,7 +497,27 @@ namespace cv } openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, image.oclchannels(), image.depth()); } + void extractFirstChannel_32F(const oclMat &image, oclMat &result) + { + Context *clCxt = image.clCxt; + string kernelName; + + kernelName = "extractFirstChannel"; + size_t globalThreads[3] = {result.cols, result.rows, 1}; + size_t localThreads[3] = {16, 16, 1}; + vector< pair > args; + args.push_back( make_pair( sizeof(cl_mem), (void *)&image.data) ); + args.push_back( make_pair( sizeof(cl_mem), (void *)&result.data) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.rows) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.cols) ); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.offset)); + args.push_back( make_pair( sizeof(cl_int), (void *)&image.step)); + args.push_back( make_pair( sizeof(cl_int), (void *)&result.step)); + + openCLExecuteKernel(clCxt, &match_template, kernelName, globalThreads, localThreads, args, -1, -1); + } }/*ocl*/ } /*cv*/ diff --git a/modules/ocl/src/opencl/match_template.cl b/modules/ocl/src/opencl/match_template.cl index 3133e62371..857f891c38 100644 --- a/modules/ocl/src/opencl/match_template.cl +++ b/modules/ocl/src/opencl/match_template.cl @@ -45,22 +45,28 @@ #pragma OPENCL EXTENSION cl_amd_printf : enable -#if defined (__ATI__) -#pragma OPENCL EXTENSION cl_amd_fp64:enable +#if defined (DOUBLE_SUPPORT) -#elif defined (__NVIDIA__) +#ifdef cl_khr_fp64 #pragma OPENCL EXTENSION cl_khr_fp64:enable +#elif defined (cl_amd_fp64) +#pragma OPENCL EXTENSION cl_amd_fp64:enable #endif -#if !defined(USE_SQR_INTEGRAL) && (defined (__ATI__) || defined (__NVIDIA__)) #define TYPE_IMAGE_SQSUM double #else -#define TYPE_IMAGE_SQSUM ulong +#define TYPE_IMAGE_SQSUM float +#endif + +#ifndef CN4 +#define CN4 1 +#else +#define CN4 4 #endif ////////////////////////////////////////////////// // utilities -#define SQSUMS_PTR(ox, oy) mad24(gidy + oy, img_sqsums_step, gidx + img_sqsums_offset + ox) +#define SQSUMS_PTR(ox, oy) mad24(gidy + oy, img_sqsums_step, (gidx + img_sqsums_offset + ox) * CN4) #define SUMS_PTR(ox, oy) mad24(gidy + oy, img_sums_step, gidx + img_sums_offset + ox) // normAcc* are accurate normalization routines which make GPU matchTemplate // consistent with CPU one @@ -95,7 +101,7 @@ float normAcc_SQDIFF(float num, float denum) __kernel void normalizeKernel_C1_D0 ( - __global const TYPE_IMAGE_SQSUM * img_sqsums, + __global const float * img_sqsums, __global float * res, ulong tpl_sqsum, int res_rows, @@ -119,8 +125,8 @@ void normalizeKernel_C1_D0 if(gidx < res_cols && gidy < res_rows) { float image_sqsum_ = (float)( - (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); + (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); res[res_idx] = normAcc(res[res_idx], sqrt(image_sqsum_ * tpl_sqsum)); } } @@ -152,8 +158,8 @@ void matchTemplate_Prepared_SQDIFF_C1_D0 if(gidx < res_cols && gidy < res_rows) { float image_sqsum_ = (float)( - (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); + (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); res[res_idx] = image_sqsum_ - 2.f * res[res_idx] + tpl_sqsum; } } @@ -161,7 +167,7 @@ void matchTemplate_Prepared_SQDIFF_C1_D0 __kernel void matchTemplate_Prepared_SQDIFF_NORMED_C1_D0 ( - __global const TYPE_IMAGE_SQSUM * img_sqsums, + __global const float * img_sqsums, __global float * res, ulong tpl_sqsum, int res_rows, @@ -185,10 +191,10 @@ void matchTemplate_Prepared_SQDIFF_NORMED_C1_D0 if(gidx < res_cols && gidy < res_rows) { float image_sqsum_ = (float)( - (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); + (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); res[res_idx] = normAcc_SQDIFF(image_sqsum_ - 2.f * res[res_idx] + tpl_sqsum, - sqrt(image_sqsum_ * tpl_sqsum)); + sqrt(image_sqsum_ * tpl_sqsum)); } } @@ -628,8 +634,8 @@ void matchTemplate_Prepared_CCOFF_C1_D0 if(gidx < res_cols && gidy < res_rows) { float sum = (float)( - (img_sums[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums[SUMS_PTR(tpl_cols, 0)]) - - (img_sums[SUMS_PTR(0, tpl_rows)] - img_sums[SUMS_PTR(0, 0)])); + (img_sums[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums[SUMS_PTR(tpl_cols, 0)]) + - (img_sums[SUMS_PTR(0, tpl_rows)] - img_sums[SUMS_PTR(0, 0)])); res[res_idx] -= sum * tpl_sum; } } @@ -671,17 +677,17 @@ void matchTemplate_Prepared_CCOFF_C4_D0 { float ccorr = res[res_idx]; ccorr -= tpl_sum_c0*(float)( - (img_sums_c0[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c0[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c0[SUMS_PTR(0, tpl_rows)] - img_sums_c0[SUMS_PTR(0, 0)])); + (img_sums_c0[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c0[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c0[SUMS_PTR(0, tpl_rows)] - img_sums_c0[SUMS_PTR(0, 0)])); ccorr -= tpl_sum_c1*(float)( - (img_sums_c1[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c1[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c1[SUMS_PTR(0, tpl_rows)] - img_sums_c1[SUMS_PTR(0, 0)])); + (img_sums_c1[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c1[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c1[SUMS_PTR(0, tpl_rows)] - img_sums_c1[SUMS_PTR(0, 0)])); ccorr -= tpl_sum_c2*(float)( - (img_sums_c2[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c2[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c2[SUMS_PTR(0, tpl_rows)] - img_sums_c2[SUMS_PTR(0, 0)])); + (img_sums_c2[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c2[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c2[SUMS_PTR(0, tpl_rows)] - img_sums_c2[SUMS_PTR(0, 0)])); ccorr -= tpl_sum_c3*(float)( - (img_sums_c3[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c3[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c3[SUMS_PTR(0, tpl_rows)] - img_sums_c3[SUMS_PTR(0, 0)])); + (img_sums_c3[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c3[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c3[SUMS_PTR(0, tpl_rows)] - img_sums_c3[SUMS_PTR(0, 0)])); res[res_idx] = ccorr; } } @@ -702,7 +708,7 @@ void matchTemplate_Prepared_CCOFF_NORMED_C1_D0 __global const uint * img_sums, int img_sums_offset, int img_sums_step, - __global const TYPE_IMAGE_SQSUM * img_sqsums, + __global const float * img_sqsums, int img_sqsums_offset, int img_sqsums_step, float tpl_sum, @@ -725,12 +731,12 @@ void matchTemplate_Prepared_CCOFF_NORMED_C1_D0 if(gidx < res_cols && gidy < res_rows) { float image_sum_ = (float)( - (img_sums[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums[SUMS_PTR(tpl_cols, 0)]) - - (img_sums[SUMS_PTR(0, tpl_rows)] - img_sums[SUMS_PTR(0, 0)])); + (img_sums[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums[SUMS_PTR(tpl_cols, 0)]) + - (img_sums[SUMS_PTR(0, tpl_rows)] - img_sums[SUMS_PTR(0, 0)])); float image_sqsum_ = (float)( - (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); + (img_sqsums[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums[SQSUMS_PTR(0, tpl_rows)] - img_sqsums[SQSUMS_PTR(0, 0)])); res[res_idx] = normAcc(res[res_idx] - image_sum_ * tpl_sum, sqrt(tpl_sqsum * (image_sqsum_ - weight * image_sum_ * image_sum_))); } @@ -754,10 +760,10 @@ void matchTemplate_Prepared_CCOFF_NORMED_C4_D0 __global const uint * img_sums_c3, int img_sums_offset, int img_sums_step, - __global const TYPE_IMAGE_SQSUM * img_sqsums_c0, - __global const TYPE_IMAGE_SQSUM * img_sqsums_c1, - __global const TYPE_IMAGE_SQSUM * img_sqsums_c2, - __global const TYPE_IMAGE_SQSUM * img_sqsums_c3, + __global const float * img_sqsums_c0, + __global const float * img_sqsums_c1, + __global const float * img_sqsums_c2, + __global const float * img_sqsums_c3, int img_sqsums_offset, int img_sqsums_step, float tpl_sum_c0, @@ -782,42 +788,71 @@ void matchTemplate_Prepared_CCOFF_NORMED_C4_D0 if(gidx < res_cols && gidy < res_rows) { float image_sum_c0 = (float)( - (img_sums_c0[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c0[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c0[SUMS_PTR(0, tpl_rows)] - img_sums_c0[SUMS_PTR(0, 0)])); + (img_sums_c0[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c0[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c0[SUMS_PTR(0, tpl_rows)] - img_sums_c0[SUMS_PTR(0, 0)])); float image_sum_c1 = (float)( - (img_sums_c1[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c1[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c1[SUMS_PTR(0, tpl_rows)] - img_sums_c1[SUMS_PTR(0, 0)])); + (img_sums_c1[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c1[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c1[SUMS_PTR(0, tpl_rows)] - img_sums_c1[SUMS_PTR(0, 0)])); float image_sum_c2 = (float)( - (img_sums_c2[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c2[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c2[SUMS_PTR(0, tpl_rows)] - img_sums_c2[SUMS_PTR(0, 0)])); + (img_sums_c2[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c2[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c2[SUMS_PTR(0, tpl_rows)] - img_sums_c2[SUMS_PTR(0, 0)])); float image_sum_c3 = (float)( - (img_sums_c3[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c3[SUMS_PTR(tpl_cols, 0)]) - - (img_sums_c3[SUMS_PTR(0, tpl_rows)] - img_sums_c3[SUMS_PTR(0, 0)])); + (img_sums_c3[SUMS_PTR(tpl_cols, tpl_rows)] - img_sums_c3[SUMS_PTR(tpl_cols, 0)]) + - (img_sums_c3[SUMS_PTR(0, tpl_rows)] - img_sums_c3[SUMS_PTR(0, 0)])); float image_sqsum_c0 = (float)( - (img_sqsums_c0[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c0[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums_c0[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c0[SQSUMS_PTR(0, 0)])); + (img_sqsums_c0[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c0[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums_c0[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c0[SQSUMS_PTR(0, 0)])); float image_sqsum_c1 = (float)( - (img_sqsums_c1[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c1[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums_c1[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c1[SQSUMS_PTR(0, 0)])); + (img_sqsums_c1[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c1[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums_c1[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c1[SQSUMS_PTR(0, 0)])); float image_sqsum_c2 = (float)( - (img_sqsums_c2[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c2[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums_c2[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c2[SQSUMS_PTR(0, 0)])); + (img_sqsums_c2[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c2[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums_c2[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c2[SQSUMS_PTR(0, 0)])); float image_sqsum_c3 = (float)( - (img_sqsums_c3[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c3[SQSUMS_PTR(tpl_cols, 0)]) - - (img_sqsums_c3[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c3[SQSUMS_PTR(0, 0)])); + (img_sqsums_c3[SQSUMS_PTR(tpl_cols, tpl_rows)] - img_sqsums_c3[SQSUMS_PTR(tpl_cols, 0)]) - + (img_sqsums_c3[SQSUMS_PTR(0, tpl_rows)] - img_sqsums_c3[SQSUMS_PTR(0, 0)])); float num = res[res_idx] - - image_sum_c0 * tpl_sum_c0 - - image_sum_c1 * tpl_sum_c1 - - image_sum_c2 * tpl_sum_c2 - - image_sum_c3 * tpl_sum_c3; + image_sum_c0 * tpl_sum_c0 - + image_sum_c1 * tpl_sum_c1 - + image_sum_c2 * tpl_sum_c2 - + image_sum_c3 * tpl_sum_c3; float denum = sqrt( tpl_sqsum * ( - image_sqsum_c0 - weight * image_sum_c0 * image_sum_c0 + - image_sqsum_c1 - weight * image_sum_c1 * image_sum_c1 + - image_sqsum_c2 - weight * image_sum_c2 * image_sum_c2 + - image_sqsum_c3 - weight * image_sum_c0 * image_sum_c3) - ); + image_sqsum_c0 - weight * image_sum_c0 * image_sum_c0 + + image_sqsum_c1 - weight * image_sum_c1 * image_sum_c1 + + image_sqsum_c2 - weight * image_sum_c2 * image_sum_c2 + + image_sqsum_c3 - weight * image_sum_c0 * image_sum_c3) + ); res[res_idx] = normAcc(num, denum); } } + +////////////////////////////////////////////////////////////////////// +// extractFirstChannel +__kernel +void extractFirstChannel +( + const __global float4* img, + __global float* res, + int rows, + int cols, + int img_offset, + int res_offset, + int img_step, + int res_step +) +{ + img_step /= sizeof(float4); + res_step /= sizeof(float); + img_offset /= sizeof(float4); + res_offset /= sizeof(float); + img += img_offset; + res += res_offset; + int gidx = get_global_id(0); + int gidy = get_global_id(1); + if(gidx < cols && gidy < rows) + { + res[gidx + gidy * res_step] = img[gidx + gidy * img_step].x; + } +} diff --git a/modules/ocl/test/test_match_template.cpp b/modules/ocl/test/test_match_template.cpp index 2fc6a10f5a..5da7f01cd8 100644 --- a/modules/ocl/test/test_match_template.cpp +++ b/modules/ocl/test/test_match_template.cpp @@ -75,7 +75,7 @@ PARAM_TEST_CASE(MatchTemplate8U, cv::Size, TemplateSize, Channels, TemplateMetho } }; -TEST_P(MatchTemplate8U, DISABLED_Accuracy) +TEST_P(MatchTemplate8U, Accuracy) { std::cout << "Method: " << TEMPLATE_METHOD_NAMES[method] << std::endl; @@ -138,18 +138,18 @@ TEST_P(MatchTemplate32F, Accuracy) EXPECT_MAT_NEAR(dst_gold, mat_dst, templ_size.area() * 1e-1, sss); } -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate8U, +INSTANTIATE_TEST_CASE_P(OCL_ImgProc, MatchTemplate8U, testing::Combine( MTEMP_SIZES, - testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), + testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16)), TemplateSize(cv::Size(30, 30))), testing::Values(Channels(1), Channels(3), Channels(4)), ALL_TEMPLATE_METHODS ) ); -INSTANTIATE_TEST_CASE_P(GPU_ImgProc, MatchTemplate32F, testing::Combine( +INSTANTIATE_TEST_CASE_P(OCL_ImgProc, MatchTemplate32F, testing::Combine( MTEMP_SIZES, - testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16))/*, TemplateSize(cv::Size(30, 30))*/), + testing::Values(TemplateSize(cv::Size(5, 5)), TemplateSize(cv::Size(16, 16)), TemplateSize(cv::Size(30, 30))), testing::Values(Channels(1), Channels(3), Channels(4)), testing::Values(TemplateMethod(cv::TM_SQDIFF), TemplateMethod(cv::TM_CCORR)))); #endif From d6f1ad8c14d9fe6de9c404af43a4ee8ee033e40c Mon Sep 17 00:00:00 2001 From: yao Date: Tue, 26 Mar 2013 14:23:26 +0800 Subject: [PATCH 19/31] more fix --- modules/ocl/src/opencl/stereobm.cl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ocl/src/opencl/stereobm.cl b/modules/ocl/src/opencl/stereobm.cl index 954283987b..99177c7bd0 100644 --- a/modules/ocl/src/opencl/stereobm.cl +++ b/modules/ocl/src/opencl/stereobm.cl @@ -323,7 +323,7 @@ float sobel(__global unsigned char *input, int x, int y, int rows, int cols) float conv = 0; int y1 = y==0? 0 : y-1; int x1 = x==0? 0 : x-1; - if(x < cols && y < rows) + if(x < cols && y < rows && x > 0 && y > 0) { conv = (float)input[(y1) * cols + (x1)] * (-1) + (float)input[(y1) * cols + (x+1)] * (1) + (float)input[(y) * cols + (x1)] * (-2) + (float)input[(y) * cols + (x+1)] * (2) + From 0c19a07bf4ae9fcdf7507d872288e2615d5ca74e Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 26 Mar 2013 15:36:49 +0800 Subject: [PATCH 20/31] Add a function to query ocl device info Currently the function only supports wavefront size query --- .../ocl/include/opencv2/ocl/private/util.hpp | 10 +++++ modules/ocl/src/initialization.cpp | 40 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/modules/ocl/include/opencv2/ocl/private/util.hpp b/modules/ocl/include/opencv2/ocl/private/util.hpp index 405d92ccd5..62e69a8a24 100644 --- a/modules/ocl/include/opencv2/ocl/private/util.hpp +++ b/modules/ocl/include/opencv2/ocl/private/util.hpp @@ -123,6 +123,16 @@ namespace cv // returns whether the current context supports image2d_t format or not bool CV_EXPORTS support_image2d(Context *clCxt = Context::getContext()); + // the enums are used to query device information + // currently only support wavefront size queries + enum DEVICE_INFO + { + WAVEFRONT_SIZE, //in AMD speak + WARP_SIZE = WAVEFRONT_SIZE //in nvidia speak + }; + //info should have been pre-allocated + void CV_EXPORTS queryDeviceInfo(DEVICE_INFO info_type, void* info); + }//namespace ocl }//namespace cv diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index d3fc9c2a2c..763c965e92 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -353,6 +353,46 @@ namespace cv { return &(Context::getContext()->impl->clCmdQueue); } + + void queryDeviceInfo(DEVICE_INFO info_type, void* info) + { + static Info::Impl* impl = Context::getContext()->impl; + switch(info_type) + { + case WAVEFRONT_SIZE: + { +#ifndef CL_DEVICE_WAVEFRONT_WIDTH_AMD + openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0], + CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof(size_t), info, 0)); +#else + const int EXT_LEN = 4096 + 1 ; + char extends_set[EXT_LEN]; + size_t extends_size; + openCLSafeCall(clGetDeviceInfo(impl->devices[impl->devnum], CL_DEVICE_EXTENSIONS, EXT_LEN, (void *)extends_set, &extends_size)); + extends_set[EXT_LEN - 1] = 0; + if(std::string(extends_set).find("cl_nv_device_attribute_query") != std::string::npos) + { + openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0], + CL_DEVICE_WARP_SIZE_NV, sizeof(size_t), info, 0)); + } + else + { + // if no way left for us to query the warp size, we can get it from kernel group info + static const char * _kernel_string = "__kernel void test_func() {}"; + cl_kernel kernel; + kernel = openCLGetKernelFromSource(Context::getContext(), &_kernel_string, "test_func"); + openCLSafeCall(clGetKernelWorkGroupInfo(kernel, impl->devices[impl->devnum], + CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), info, NULL)); + } +#endif + } + break; + default: + CV_Error(-1, "Invalid device info type"); + break; + } + } + void openCLReadBuffer(Context *clCxt, cl_mem dst_buffer, void *host_buffer, size_t size) { cl_int status; From 9698079ca51db652b050b53ab4de75948fc2be7b Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 26 Mar 2013 15:48:15 +0800 Subject: [PATCH 21/31] Pass warp size into SURF --- modules/nonfree/src/surf.ocl.cpp | 38 ++++++++++++++++++++------ modules/nonfree/test/test_surf.ocl.cpp | 2 +- modules/ocl/src/initialization.cpp | 2 +- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/modules/nonfree/src/surf.ocl.cpp b/modules/nonfree/src/surf.ocl.cpp index b72d132d64..533d0c1aee 100644 --- a/modules/nonfree/src/surf.ocl.cpp +++ b/modules/nonfree/src/surf.ocl.cpp @@ -57,19 +57,29 @@ namespace cv ///////////////////////////OpenCL kernel strings/////////////////////////// extern const char *surf; - const char* noImage2dOption = "-D DISABLE_IMAGE2D"; + const char noImage2dOption [] = "-D DISABLE_IMAGE2D"; + static char SURF_OPTIONS [1024] = ""; + static bool USE_IMAGE2d = false; static void openCLExecuteKernelSURF(Context *clCxt , const char **source, string kernelName, size_t globalThreads[3], size_t localThreads[3], vector< pair > &args, int channels, int depth) { - if(support_image2d()) + char * pSURF_OPTIONS = SURF_OPTIONS; + static bool OPTION_INIT = false; + if(!OPTION_INIT) { - openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth); - } - else + if( !USE_IMAGE2d ) { - openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, noImage2dOption); + strcat(pSURF_OPTIONS, noImage2dOption); + pSURF_OPTIONS += strlen(noImage2dOption); + } + + size_t wave_size = 0; + queryDeviceInfo(DEVICE_INFO::WAVEFRONT_SIZE, &wave_size); + sprintf(pSURF_OPTIONS, " -D WAVE_SIZE=%d", static_cast(wave_size)); + OPTION_INIT = true; } + openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, SURF_OPTIONS); } } } @@ -152,8 +162,20 @@ public: integral(img, surf_.sum); if(support_image2d()) { - bindImgTex(img, imgTex); - bindImgTex(surf_.sum, sumTex); + try + { + bindImgTex(img, imgTex); + bindImgTex(surf_.sum, sumTex); + USE_IMAGE2d = true; + } + catch (const cv::Exception& e) + { + USE_IMAGE2d = false; + if(e.code != CL_IMAGE_FORMAT_NOT_SUPPORTED && e.code != -217) + { + throw e; + } + } } maskSumTex = 0; diff --git a/modules/nonfree/test/test_surf.ocl.cpp b/modules/nonfree/test/test_surf.ocl.cpp index 0d09cc8b93..9f1b3f170d 100644 --- a/modules/nonfree/test/test_surf.ocl.cpp +++ b/modules/nonfree/test/test_surf.ocl.cpp @@ -178,7 +178,7 @@ TEST_P(SURF, Detector) EXPECT_GT(matchedRatio, 0.99); } -TEST_P(SURF, DISABLED_Descriptor) +TEST_P(SURF, Descriptor) { cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index 763c965e92..b5eaae6e8b 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -361,7 +361,7 @@ namespace cv { case WAVEFRONT_SIZE: { -#ifndef CL_DEVICE_WAVEFRONT_WIDTH_AMD +#ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0], CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof(size_t), info, 0)); #else From 4dbd0f0e8fa30fd6d2a6e939d2830833caad6819 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Tue, 26 Mar 2013 12:33:13 +0400 Subject: [PATCH 22/31] fixed compilation issues with gpu modules: * disabled warnings from thrust * fixed warnings from ts_gtest.h * possibly fixed superres compilation in Debug mode on Windows --- modules/gpu/CMakeLists.txt | 2 +- modules/gpu/perf/perf_precomp.hpp | 1 - modules/gpu/perf4au/main.cpp | 8 +++++--- modules/nonfree/perf/perf_gpu.cpp | 5 +++-- modules/nonfree/perf/perf_precomp.hpp | 7 ++++--- modules/superres/perf/perf_precomp.hpp | 5 +++-- 6 files changed, 16 insertions(+), 12 deletions(-) diff --git a/modules/gpu/CMakeLists.txt b/modules/gpu/CMakeLists.txt index 05b65f2413..8fba2ef4ec 100644 --- a/modules/gpu/CMakeLists.txt +++ b/modules/gpu/CMakeLists.txt @@ -28,7 +28,7 @@ if(HAVE_CUDA) source_group("Src\\NVidia" FILES ${ncv_files}) ocv_include_directories("src/nvidia" "src/nvidia/core" "src/nvidia/NPP_staging" ${CUDA_INCLUDE_DIRS}) - ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations /wd4211 /wd4201 /wd4100 /wd4505 /wd4408) + ocv_warnings_disable(CMAKE_CXX_FLAGS -Wundef -Wmissing-declarations -Wshadow -Wunused-parameter /wd4211 /wd4201 /wd4100 /wd4505 /wd4408) string(REPLACE "-Wsign-promo" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") #set (CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} "-Xcompiler;/EHsc-;") diff --git a/modules/gpu/perf/perf_precomp.hpp b/modules/gpu/perf/perf_precomp.hpp index 5e31c4cdef..c9cf886bc4 100644 --- a/modules/gpu/perf/perf_precomp.hpp +++ b/modules/gpu/perf/perf_precomp.hpp @@ -61,7 +61,6 @@ #endif #include "opencv2/ts/ts.hpp" -#include "opencv2/ts/ts_perf.hpp" #include "opencv2/ts/gpu_perf.hpp" #include "opencv2/core/core.hpp" diff --git a/modules/gpu/perf4au/main.cpp b/modules/gpu/perf4au/main.cpp index 68c00dbafe..f6a65ad636 100644 --- a/modules/gpu/perf4au/main.cpp +++ b/modules/gpu/perf4au/main.cpp @@ -41,17 +41,19 @@ //M*/ #include + #ifdef HAVE_CVCONFIG_H #include "cvconfig.h" #endif + +#include "opencv2/ts/ts.hpp" +#include "opencv2/ts/gpu_perf.hpp" + #include "opencv2/core/core.hpp" #include "opencv2/gpu/gpu.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/video/video.hpp" #include "opencv2/legacy/legacy.hpp" -#include "opencv2/ts/ts.hpp" -#include "opencv2/ts/ts_perf.hpp" -#include "opencv2/ts/gpu_perf.hpp" int main(int argc, char* argv[]) { diff --git a/modules/nonfree/perf/perf_gpu.cpp b/modules/nonfree/perf/perf_gpu.cpp index af95dbb7d0..aa8516b1c4 100644 --- a/modules/nonfree/perf/perf_gpu.cpp +++ b/modules/nonfree/perf/perf_gpu.cpp @@ -41,6 +41,9 @@ //M*/ #include "perf_precomp.hpp" + +#if defined(HAVE_OPENCV_GPU) && defined(HAVE_CUDA) + #include "opencv2/ts/gpu_perf.hpp" using namespace std; @@ -59,8 +62,6 @@ using namespace perf; # define BUILD_WITH_VIDEO_INPUT_SUPPORT 0 #endif -#if defined(HAVE_OPENCV_GPU) && defined(HAVE_CUDA) - ////////////////////////////////////////////////////////////////////// // SURF diff --git a/modules/nonfree/perf/perf_precomp.hpp b/modules/nonfree/perf/perf_precomp.hpp index 50a7f98f53..addba7b000 100644 --- a/modules/nonfree/perf/perf_precomp.hpp +++ b/modules/nonfree/perf/perf_precomp.hpp @@ -10,16 +10,17 @@ #define __OPENCV_PERF_PRECOMP_HPP__ #include "opencv2/ts/ts.hpp" + #include "opencv2/nonfree/nonfree.hpp" #include "opencv2/highgui/highgui.hpp" - #include "opencv2/opencv_modules.hpp" + #ifdef HAVE_OPENCV_OCL # include "opencv2/nonfree/ocl.hpp" #endif -#if defined(HAVE_OPENCV_GPU) && defined(HAVE_CUDA) - #include "opencv2/nonfree/gpu.hpp" +#ifdef HAVE_OPENCV_GPU +# include "opencv2/nonfree/gpu.hpp" #endif #ifdef GTEST_CREATE_SHARED_LIBRARY diff --git a/modules/superres/perf/perf_precomp.hpp b/modules/superres/perf/perf_precomp.hpp index 85b6c11f7e..f05203718c 100644 --- a/modules/superres/perf/perf_precomp.hpp +++ b/modules/superres/perf/perf_precomp.hpp @@ -55,10 +55,11 @@ #include "cvconfig.h" #endif +#include "opencv2/ts/ts.hpp" +#include "opencv2/ts/gpu_perf.hpp" + #include "opencv2/core/core.hpp" #include "opencv2/core/gpumat.hpp" -#include "opencv2/ts/ts_perf.hpp" -#include "opencv2/ts/gpu_perf.hpp" #include "opencv2/superres/superres.hpp" #include "opencv2/superres/optical_flow.hpp" From 7476bf5cd71b9a40909da523f642f3dc09da2a2a Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 26 Mar 2013 16:40:30 +0800 Subject: [PATCH 23/31] Fix compiler errors --- modules/nonfree/src/surf.ocl.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nonfree/src/surf.ocl.cpp b/modules/nonfree/src/surf.ocl.cpp index 533d0c1aee..9d8fe65a12 100644 --- a/modules/nonfree/src/surf.ocl.cpp +++ b/modules/nonfree/src/surf.ocl.cpp @@ -69,14 +69,14 @@ namespace cv if(!OPTION_INIT) { if( !USE_IMAGE2d ) - { + { strcat(pSURF_OPTIONS, noImage2dOption); pSURF_OPTIONS += strlen(noImage2dOption); } size_t wave_size = 0; - queryDeviceInfo(DEVICE_INFO::WAVEFRONT_SIZE, &wave_size); - sprintf(pSURF_OPTIONS, " -D WAVE_SIZE=%d", static_cast(wave_size)); + queryDeviceInfo(WAVEFRONT_SIZE, &wave_size); + std::sprintf(pSURF_OPTIONS, " -D WAVE_SIZE=%d", static_cast(wave_size)); OPTION_INIT = true; } openCLExecuteKernel(clCxt, source, kernelName, globalThreads, localThreads, args, channels, depth, SURF_OPTIONS); From 8ffc15371ddbac25d140bb797ebb73910397c89b Mon Sep 17 00:00:00 2001 From: peng xiao Date: Tue, 26 Mar 2013 17:23:38 +0800 Subject: [PATCH 24/31] Fix compiler errors --- modules/nonfree/src/surf.ocl.cpp | 1 + modules/ocl/src/initialization.cpp | 13 +++++++++---- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/nonfree/src/surf.ocl.cpp b/modules/nonfree/src/surf.ocl.cpp index 9d8fe65a12..4acb4e36be 100644 --- a/modules/nonfree/src/surf.ocl.cpp +++ b/modules/nonfree/src/surf.ocl.cpp @@ -43,6 +43,7 @@ // //M*/ #include "precomp.hpp" +#include #ifdef HAVE_OPENCV_OCL diff --git a/modules/ocl/src/initialization.cpp b/modules/ocl/src/initialization.cpp index b5eaae6e8b..9a790f4ee2 100644 --- a/modules/ocl/src/initialization.cpp +++ b/modules/ocl/src/initialization.cpp @@ -362,9 +362,13 @@ namespace cv case WAVEFRONT_SIZE: { #ifdef CL_DEVICE_WAVEFRONT_WIDTH_AMD - openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0], - CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof(size_t), info, 0)); -#else + try + { + openCLSafeCall(clGetDeviceInfo(Context::getContext()->impl->devices[0], + CL_DEVICE_WAVEFRONT_WIDTH_AMD, sizeof(size_t), info, 0)); + } + catch(const cv::Exception&) +#elif defined (CL_DEVICE_WARP_SIZE_NV) const int EXT_LEN = 4096 + 1 ; char extends_set[EXT_LEN]; size_t extends_size; @@ -376,6 +380,7 @@ namespace cv CL_DEVICE_WARP_SIZE_NV, sizeof(size_t), info, 0)); } else +#endif { // if no way left for us to query the warp size, we can get it from kernel group info static const char * _kernel_string = "__kernel void test_func() {}"; @@ -384,7 +389,7 @@ namespace cv openCLSafeCall(clGetKernelWorkGroupInfo(kernel, impl->devices[impl->devnum], CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE, sizeof(size_t), info, NULL)); } -#endif + } break; default: From bbf43e8b16a0c1151f84c94c58b09462bb8469be Mon Sep 17 00:00:00 2001 From: Andrey Pavlenko Date: Tue, 26 Mar 2013 19:31:16 +0400 Subject: [PATCH 25/31] fix for bug #2912 (DescriptorExtractor::compute Java wrapper loses native arg change) --- modules/java/generator/src/cpp/features2d_manual.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/java/generator/src/cpp/features2d_manual.hpp b/modules/java/generator/src/cpp/features2d_manual.hpp index 66053bce2a..2457a5d478 100644 --- a/modules/java/generator/src/cpp/features2d_manual.hpp +++ b/modules/java/generator/src/cpp/features2d_manual.hpp @@ -261,8 +261,8 @@ class CV_EXPORTS_AS(DescriptorExtractor) javaDescriptorExtractor : public Descri public: #if 0 //DO NOT REMOVE! The block is required for sources parser - CV_WRAP void compute( const Mat& image, vector& keypoints, Mat& descriptors ) const; - CV_WRAP void compute( const vector& images, vector >& keypoints, CV_OUT vector& descriptors ) const; + CV_WRAP void compute( const Mat& image, CV_IN_OUT vector& keypoints, Mat& descriptors ) const; + CV_WRAP void compute( const vector& images, CV_IN_OUT vector >& keypoints, CV_OUT vector& descriptors ) const; CV_WRAP virtual int descriptorSize() const; CV_WRAP virtual int descriptorType() const; From ad58c084a95a5e8076f25f1bd9b16211f902b5d8 Mon Sep 17 00:00:00 2001 From: peng xiao Date: Wed, 27 Mar 2013 08:56:31 +0800 Subject: [PATCH 26/31] Fix compiler errors --- modules/nonfree/src/surf.ocl.cpp | 2 +- modules/nonfree/test/test_surf.ocl.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/nonfree/src/surf.ocl.cpp b/modules/nonfree/src/surf.ocl.cpp index 4acb4e36be..78864c6f96 100644 --- a/modules/nonfree/src/surf.ocl.cpp +++ b/modules/nonfree/src/surf.ocl.cpp @@ -43,7 +43,7 @@ // //M*/ #include "precomp.hpp" -#include +#include #ifdef HAVE_OPENCV_OCL diff --git a/modules/nonfree/test/test_surf.ocl.cpp b/modules/nonfree/test/test_surf.ocl.cpp index 9f1b3f170d..d5b06fcbec 100644 --- a/modules/nonfree/test/test_surf.ocl.cpp +++ b/modules/nonfree/test/test_surf.ocl.cpp @@ -147,7 +147,7 @@ PARAM_TEST_CASE(SURF, HessianThreshold, Octaves, OctaveLayers, Extended, Upright TEST_P(SURF, Detector) { // the data path should be opencv/samples - cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE); + cv::Mat image = cv::imread("../../../samples/c/fruits.jpg", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); cv::ocl::SURF_OCL surf; @@ -180,7 +180,7 @@ TEST_P(SURF, Detector) TEST_P(SURF, Descriptor) { - cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "c/fruits.jpg", cv::IMREAD_GRAYSCALE); + cv::Mat image = cv::imread("../../../samples/c/fruits.jpg", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); cv::ocl::SURF_OCL surf; From f2ecf4f905455c637c96da7db9f579058acd745e Mon Sep 17 00:00:00 2001 From: peng xiao Date: Wed, 27 Mar 2013 13:25:08 +0800 Subject: [PATCH 27/31] Disable ocl::SURF accurate test --- modules/nonfree/test/test_surf.ocl.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modules/nonfree/test/test_surf.ocl.cpp b/modules/nonfree/test/test_surf.ocl.cpp index d5b06fcbec..76ed37de45 100644 --- a/modules/nonfree/test/test_surf.ocl.cpp +++ b/modules/nonfree/test/test_surf.ocl.cpp @@ -144,10 +144,9 @@ PARAM_TEST_CASE(SURF, HessianThreshold, Octaves, OctaveLayers, Extended, Upright } }; -TEST_P(SURF, Detector) +TEST_P(SURF, DISABLED_Detector) { - // the data path should be opencv/samples - cv::Mat image = cv::imread("../../../samples/c/fruits.jpg", cv::IMREAD_GRAYSCALE); + cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); cv::ocl::SURF_OCL surf; @@ -178,9 +177,9 @@ TEST_P(SURF, Detector) EXPECT_GT(matchedRatio, 0.99); } -TEST_P(SURF, Descriptor) +TEST_P(SURF, DISABLED_Descriptor) { - cv::Mat image = cv::imread("../../../samples/c/fruits.jpg", cv::IMREAD_GRAYSCALE); + cv::Mat image = cv::imread(string(cvtest::TS::ptr()->get_data_path()) + "shared/fruits.png", cv::IMREAD_GRAYSCALE); ASSERT_FALSE(image.empty()); cv::ocl::SURF_OCL surf; From 04a6ab4144be6340251132af4247388874008f5f Mon Sep 17 00:00:00 2001 From: peng xiao Date: Wed, 27 Mar 2013 15:08:51 +0800 Subject: [PATCH 28/31] Fix OCL Canny --- modules/ocl/src/canny.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/ocl/src/canny.cpp b/modules/ocl/src/canny.cpp index ae92bc7c6d..cc7e60e0d9 100644 --- a/modules/ocl/src/canny.cpp +++ b/modules/ocl/src/canny.cpp @@ -98,7 +98,7 @@ void cv::ocl::CannyBuf::create(const Size &image_size, int apperture_size) { openCLFree(counter); } - counter = clCreateBuffer( (cl_context)getoclContext(), CL_MEM_COPY_HOST_PTR, sizeof(int), counter_i, &err ); + counter = clCreateBuffer( *((cl_context*)getoclContext()), CL_MEM_COPY_HOST_PTR, sizeof(int), counter_i, &err ); openCLSafeCall(err); } @@ -354,7 +354,7 @@ void canny::edgesHysteresisLocal_gpu(oclMat &map, oclMat &st1, void *counter, in void canny::edgesHysteresisGlobal_gpu(oclMat &map, oclMat &st1, oclMat &st2, void *counter, int rows, int cols) { unsigned int count; - openCLSafeCall(clEnqueueReadBuffer((cl_command_queue)getoclCommandQueue(), (cl_mem)counter, 1, 0, sizeof(float), &count, 0, NULL, NULL)); + openCLSafeCall(clEnqueueReadBuffer(*(cl_command_queue*)getoclCommandQueue(), (cl_mem)counter, 1, 0, sizeof(float), &count, 0, NULL, NULL)); Context *clCxt = map.clCxt; string kernelName = "edgesHysteresisGlobal"; vector< pair > args; @@ -364,7 +364,7 @@ void canny::edgesHysteresisGlobal_gpu(oclMat &map, oclMat &st1, oclMat &st2, voi int count_i[1] = {0}; while(count > 0) { - openCLSafeCall(clEnqueueWriteBuffer((cl_command_queue)getoclCommandQueue(), (cl_mem)counter, 1, 0, sizeof(int), &count_i, 0, NULL, NULL)); + openCLSafeCall(clEnqueueWriteBuffer(*(cl_command_queue*)getoclCommandQueue(), (cl_mem)counter, 1, 0, sizeof(int), &count_i, 0, NULL, NULL)); args.clear(); size_t globalThreads[3] = {std::min(count, 65535u) * 128, DIVUP(count, 65535), 1}; @@ -379,7 +379,7 @@ void canny::edgesHysteresisGlobal_gpu(oclMat &map, oclMat &st1, oclMat &st2, voi args.push_back( make_pair( sizeof(cl_int), (void *)&map.offset)); openCLExecuteKernel2(clCxt, &imgproc_canny, kernelName, globalThreads, localThreads, args, -1, -1, DISABLE); - openCLSafeCall(clEnqueueReadBuffer((cl_command_queue)getoclCommandQueue(), (cl_mem)counter, 1, 0, sizeof(int), &count, 0, NULL, NULL)); + openCLSafeCall(clEnqueueReadBuffer(*(cl_command_queue*)getoclCommandQueue(), (cl_mem)counter, 1, 0, sizeof(int), &count, 0, NULL, NULL)); std::swap(st1, st2); } #undef DIVUP From c66cf08cedde16d60d84d74e01214b419e5919ae Mon Sep 17 00:00:00 2001 From: Alexander Bohn / FI$H2k Date: Fri, 15 Mar 2013 06:47:52 -0300 Subject: [PATCH 29/31] Fix for encoding errors when building Java source MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The generated OpenCV Java source can contain characters outside of ASCII on some systems – this patch allows the ant task to compile them. (cherry picked from commit f3ee55e04222deea30ffe4e89456c220bc75ff1a) --- modules/java/build.xml.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/java/build.xml.in b/modules/java/build.xml.in index 98ba2e36bc..c1c1854b7d 100644 --- a/modules/java/build.xml.in +++ b/modules/java/build.xml.in @@ -8,8 +8,9 @@ + - \ No newline at end of file + From f5c3cb8b7ca2062b0ff3d5581553b2b57398c797 Mon Sep 17 00:00:00 2001 From: Ryan Rawson Date: Wed, 27 Mar 2013 02:52:53 -0700 Subject: [PATCH 30/31] Update operations_on_arrays.rst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove weirdo unicode – and just use a normal -(cherry picked from commit 0d49de51b79eacccf5b93a6fa67478a59ffd246d) --- modules/core/doc/operations_on_arrays.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/core/doc/operations_on_arrays.rst b/modules/core/doc/operations_on_arrays.rst index 9f1ebad6a8..d338444760 100644 --- a/modules/core/doc/operations_on_arrays.rst +++ b/modules/core/doc/operations_on_arrays.rst @@ -103,7 +103,7 @@ Calculates the per-element sum of two arrays or an array and a scalar. :param dst: output array that has the same size and number of channels as the input array(s); the depth is defined by ``dtype`` or ``src1``/``src2``. - :param mask: optional operation mask – 8-bit single channel array, that specifies elements of the output array to be changed. + :param mask: optional operation mask - 8-bit single channel array, that specifies elements of the output array to be changed. :param dtype: optional depth of the output array (see the discussion below). @@ -868,7 +868,7 @@ Performs a forward or inverse Discrete Fourier transform of a 1D or 2D floating- * **DFT_SCALE** scales the result: divide it by the number of array elements. Normally, it is combined with ``DFT_INVERSE``. * **DFT_ROWS** performs a forward or inverse transform of every individual row of the input matrix; this flag enables you to transform multiple vectors simultaneously and can be used to decrease the overhead (which is sometimes several times larger than the processing itself) to perform 3D and higher-dimensional transformations and so forth. - * **DFT_COMPLEX_OUTPUT** performs a forward transformation of 1D or 2D real array; the result, though being a complex array, has complex-conjugate symmetry (*CCS*, see the function description below for details), and such an array can be packed into a real array of the same size as input, which is the fastest option and which is what the function does by default; however, you may wish to get a full complex array (for simpler spectrum analysis, and so on) – pass the flag to enable the function to produce a full-size complex output array. + * **DFT_COMPLEX_OUTPUT** performs a forward transformation of 1D or 2D real array; the result, though being a complex array, has complex-conjugate symmetry (*CCS*, see the function description below for details), and such an array can be packed into a real array of the same size as input, which is the fastest option and which is what the function does by default; however, you may wish to get a full complex array (for simpler spectrum analysis, and so on) - pass the flag to enable the function to produce a full-size complex output array. * **DFT_REAL_OUTPUT** performs an inverse transformation of a 1D or 2D complex array; the result is normally a complex array of the same size, however, if the input array has conjugate-complex symmetry (for example, it is a result of forward transformation with ``DFT_COMPLEX_OUTPUT`` flag), the output is a real array; while the function itself does not check whether the input is symmetrical or not, you can pass the flag and then the function will assume the symmetry and produce the real output array (note that when the input is packed into a real array and inverse transformation is executed, the function treats the input as a packed complex-conjugate symmetrical array, and the output will also be a real array). From e143706ef9e3544ae72be8cad5346c44e83e3957 Mon Sep 17 00:00:00 2001 From: Misty De Meo Date: Fri, 22 Mar 2013 11:18:42 -0500 Subject: [PATCH 31/31] Fix ant/Java detection in cmake scripts Mac OS X 10.7 and newer don't come with Java installed. They do include some stub binaries, which ask the user if they want to install Java when run. OpenCV's cmake script just checks for the existence of an ant binary and assumes that Java's available if ant is. As a result, cmake will configure the build to use Java and it will fail once it tries to compile the Java bindings. This fixes the issue by checking for the exit status of `ant -version` - it exits 0 if Java is installed, or 1 otherwise.(cherry picked from commit a423afddc143f4b10e09e7b253a420b29f877b6c) --- cmake/OpenCVDetectApacheAnt.cmake | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/cmake/OpenCVDetectApacheAnt.cmake b/cmake/OpenCVDetectApacheAnt.cmake index c98fc48b3e..7b7e9a6da9 100644 --- a/cmake/OpenCVDetectApacheAnt.cmake +++ b/cmake/OpenCVDetectApacheAnt.cmake @@ -16,10 +16,16 @@ find_host_program(ANT_EXECUTABLE NAMES ${ANT_NAME}) if(ANT_EXECUTABLE) execute_process(COMMAND ${ANT_EXECUTABLE} -version + RESULT_VARIABLE ANT_ERROR_LEVEL OUTPUT_VARIABLE ANT_VERSION_FULL OUTPUT_STRIP_TRAILING_WHITESPACE) - string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" ANT_VERSION "${ANT_VERSION_FULL}") - set(ANT_VERSION "${ANT_VERSION}" CACHE INTERNAL "Detected ant vesion") + if (ANT_ERROR_LEVEL) + unset(ANT_EXECUTABLE) + unset(ANT_EXECUTABLE CACHE) + else() + string(REGEX MATCH "[0-9]+.[0-9]+.[0-9]+" ANT_VERSION "${ANT_VERSION_FULL}") + set(ANT_VERSION "${ANT_VERSION}" CACHE INTERNAL "Detected ant vesion") - message(STATUS "Found apache ant ${ANT_VERSION}: ${ANT_EXECUTABLE}") + message(STATUS "Found apache ant ${ANT_VERSION}: ${ANT_EXECUTABLE}") + endif() endif()