From 595ec6b852588df9008a5e73755da224f5b14b99 Mon Sep 17 00:00:00 2001 From: Guo Yejun Date: Thu, 8 Jan 2015 16:10:38 +0800 Subject: [PATCH 1/6] correct the size of buf which holds integral sum/sumsq layer_dy is not initialized correctly, it results in a small height of the buffer, and so memory write is out of range in cv::integral. --- modules/objdetect/src/cascadedetect.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modules/objdetect/src/cascadedetect.cpp b/modules/objdetect/src/cascadedetect.cpp index 6ddc0c878f..c11e552666 100644 --- a/modules/objdetect/src/cascadedetect.cpp +++ b/modules/objdetect/src/cascadedetect.cpp @@ -449,6 +449,12 @@ bool FeatureEvaluator::updateScaleData( Size imgsz, const std::vector& _s s.ystep = sc >= 2 ? 1 : 2; s.scale = sc; s.szi = Size(sz.width+1, sz.height+1); + + if( i == 0 ) + { + layer_dy = s.szi.height; + } + if( layer_ofs.x + s.szi.width > sbufSize.width ) { layer_ofs = Point(0, layer_ofs.y + layer_dy); From 52535b356c2e14a572086ee2554e9f41156abdb7 Mon Sep 17 00:00:00 2001 From: Andrew Senin Date: Thu, 29 Jan 2015 21:29:57 +0400 Subject: [PATCH 2/6] Fix for assert in compute when subimage is used (see issue #4149) --- modules/objdetect/src/hog.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/modules/objdetect/src/hog.cpp b/modules/objdetect/src/hog.cpp index c078c2deba..32a6a21b92 100644 --- a/modules/objdetect/src/hog.cpp +++ b/modules/objdetect/src/hog.cpp @@ -301,8 +301,10 @@ void HOGDescriptor::computeGradient(const Mat& img, Mat& grad, Mat& qangle, for( y = 0; y < gradsize.height; y++ ) { const uchar* imgPtr = img.ptr(ymap[y]); - const uchar* prevPtr = img.ptr(ymap[y-1]); - const uchar* nextPtr = img.ptr(ymap[y+1]); + //In case subimage is used ptr() generates an assert for next and prev rows + //(see http://code.opencv.org/issues/4149) + const uchar* prevPtr = img.data + img.step*ymap[y-1]; + const uchar* nextPtr = img.data + img.step*ymap[y+1]; float* gradPtr = grad.ptr(y); uchar* qanglePtr = qangle.ptr(y); From c85197da5566e135bb9af5873c440ef0c1a9e7d6 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Tue, 3 Feb 2015 18:11:25 +0300 Subject: [PATCH 3/6] Fixed allocated vector size in ML ANN algorithm - updated return value of points_classifier sample --- modules/ml/src/ann_mlp.cpp | 2 +- samples/cpp/points_classifier.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/ml/src/ann_mlp.cpp b/modules/ml/src/ann_mlp.cpp index 08b5c5f959..3bc173513b 100644 --- a/modules/ml/src/ann_mlp.cpp +++ b/modules/ml/src/ann_mlp.cpp @@ -731,7 +731,7 @@ public: for( i = 0; i < l_count; i++ ) { int n = layer_sizes[i]; - x[i].resize(n); + x[i].resize(n+1); df[i].resize(n); dw[i].create(weights[i].size(), CV_64F); } diff --git a/samples/cpp/points_classifier.cpp b/samples/cpp/points_classifier.cpp index a91a2e3a93..9b274bac1a 100644 --- a/samples/cpp/points_classifier.cpp +++ b/samples/cpp/points_classifier.cpp @@ -398,5 +398,5 @@ int main() } } - return 1; + return 0; } From f5987c258fe2087125622ae64a201f08a7e42428 Mon Sep 17 00:00:00 2001 From: VBystricky Date: Tue, 3 Feb 2015 21:29:27 +0400 Subject: [PATCH 4/6] Fix small error in traincascade application --- apps/traincascade/boost.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/traincascade/boost.cpp b/apps/traincascade/boost.cpp index ac2303300b..5864022048 100644 --- a/apps/traincascade/boost.cpp +++ b/apps/traincascade/boost.cpp @@ -903,7 +903,7 @@ struct FeatureValAndIdxPrecalc : ParallelLoopBody *(idst + fi*sample_count + si) = si; } if ( is_buf_16u ) - std::sort(idst + fi*sample_count, idst + (fi + 1)*sample_count, LessThanIdx(valCache->ptr(fi)) ); + std::sort(udst + fi*sample_count, udst + (fi + 1)*sample_count, LessThanIdx(valCache->ptr(fi)) ); else std::sort(idst + fi*sample_count, idst + (fi + 1)*sample_count, LessThanIdx(valCache->ptr(fi)) ); } From a9325102a2d15d4acf40fad378b17cdff648a7c3 Mon Sep 17 00:00:00 2001 From: Vladislav Vinogradov Date: Wed, 4 Feb 2015 12:39:51 +0300 Subject: [PATCH 5/6] colorize opencv_run_all_tests_unix.sh script output --- .../templates/opencv_run_all_tests_unix.sh.in | 92 +++++++++++++++++-- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/cmake/templates/opencv_run_all_tests_unix.sh.in b/cmake/templates/opencv_run_all_tests_unix.sh.in index 77dc1191a9..2e1b167738 100644 --- a/cmake/templates/opencv_run_all_tests_unix.sh.in +++ b/cmake/templates/opencv_run_all_tests_unix.sh.in @@ -1,25 +1,99 @@ #!/bin/sh +# Text style + +TEXT_RED="$(tput setaf 1)" +TEXT_GREEN="$(tput setaf 2)" +TEXT_CYAN="$(tput setaf 6)" +TEXT_RESET="$(tput sgr0)" + +# Test binaries and data paths + OPENCV_TEST_PATH=@CMAKE_INSTALL_PREFIX@/@OPENCV_TEST_INSTALL_PATH@ +OPENCV_PYTHON_TESTS=@OPENCV_PYTHON_TESTS_LIST@ export OPENCV_TEST_DATA_PATH=@CMAKE_INSTALL_PREFIX@/share/OpenCV/testdata +# Run tests + SUMMARY_STATUS=0 +FAILED_TESTS="" +PASSED_TESTS="" + for t in "$OPENCV_TEST_PATH/"opencv_test_* "$OPENCV_TEST_PATH/"opencv_perf_*; do - report="`basename "$t"`-`date --rfc-3339=date`.xml" - "$t" --perf_min_samples=1 --perf_force_samples=1 --gtest_output=xml:"$report" - TEST_STATUS=$? - if [ $TEST_STATUS -ne 0 ]; then - SUMMARY_STATUS=$TEST_STATUS - fi + test_name=`basename "$t"` + report="$test_name-`date --rfc-3339=date`.xml" + + cmd="$t --perf_min_samples=1 --perf_force_samples=1 --gtest_output=xml:\"$report\"" + + seg_reg="s/^/${TEXT_CYAN}[$test_name]${TEXT_RESET} /" # append test name + seg_reg="${seg_reg};s/\[==========\]/${TEXT_GREEN}&${TEXT_RESET}/g" # green for [==========] + seg_reg="${seg_reg};s/\[----------\]/${TEXT_GREEN}&${TEXT_RESET}/g" # green for [----------] + seg_reg="${seg_reg};s/\[ RUN \]/${TEXT_GREEN}&${TEXT_RESET}/g" # green for [ RUN ] + seg_reg="${seg_reg};s/\[ OK \]/${TEXT_GREEN}&${TEXT_RESET}/g" # green for [ OK ] + seg_reg="${seg_reg};s/\[ FAILED \]/${TEXT_RED}&${TEXT_RESET}/g" # red for [ FAILED ] + seg_reg="${seg_reg};s/\[ PASSED \]/${TEXT_GREEN}&${TEXT_RESET}/g" # green for [ PASSED ] + + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} RUN : $cmd" + eval "$cmd" | sed -r "$seg_reg" + + ret=${PIPESTATUS[0]} + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} RETURN_CODE : $ret" + + if [ $ret -ne 0 ]; then + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} ${TEXT_RED}FAILED${TEXT_RESET}" + SUMMARY_STATUS=1 + FAILED_TESTS="$FAILED_TESTS $test_name" + else + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} ${TEXT_GREEN}OK${TEXT_RESET}" + PASSED_TESTS="$PASSED_TESTS $test_name" + fi + + echo "" +done + +for t in $OPENCV_PYTHON_TESTS; +do + test_name=`basename "$t"` + report="$test_name-`date --rfc-3339=date`.xml" + + cmd="py.test --junitxml $report \"$OPENCV_TEST_PATH\"/$t" + + seg_reg="s/^/${TEXT_CYAN}[$test_name]${TEXT_RESET} /" # append test name + + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} RUN : $cmd" + eval "$cmd" | sed -r "$seg_reg" + + ret=${PIPESTATUS[0]} + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} RETURN_CODE : $ret" + + if [ $ret -ne 0 ]; then + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} ${TEXT_RED}FAILED${TEXT_RESET}" + SUMMARY_STATUS=1 + FAILED_TESTS="$FAILED_TESTS $test_name" + else + echo "${TEXT_CYAN}[$test_name]${TEXT_RESET} ${TEXT_GREEN}OK${TEXT_RESET}" + PASSED_TESTS="$PASSED_TESTS $test_name" + fi + + echo "" done +# Remove temporary test files + rm -f /tmp/__opencv_temp.* +# Report final status + +echo "${TEXT_CYAN}===============================================================${TEXT_RESET}" +echo "${TEXT_CYAN}PASSED TESTS : $PASSED_TESTS${TEXT_RESET}" +echo "${TEXT_CYAN}FAILED TESTS : $FAILED_TESTS${TEXT_RESET}" if [ $SUMMARY_STATUS -eq 0 ]; then - echo "All OpenCV tests finished successfully" + echo "${TEXT_GREEN}STATUS : OK${TEXT_RESET}" + echo "${TEXT_GREEN}STATUS : All OpenCV tests finished successfully${TEXT_RESET}" else - echo "OpenCV tests finished with status $SUMMARY_STATUS" + echo "${TEXT_RED}STATUS : FAIL${TEXT_RESET}" + echo "${TEXT_RED}STATUS : OpenCV tests finished with status $SUMMARY_STATUS${TEXT_RESET}" fi -return $SUMMARY_STATUS \ No newline at end of file +exit $SUMMARY_STATUS From 2054123890a3b2167e2f845047cacc0f1063afc3 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Wed, 4 Feb 2015 13:03:27 +0300 Subject: [PATCH 6/6] coreTlsData -> getCoreTlsData() --- modules/core/src/ocl.cpp | 8 ++++---- modules/core/src/precomp.hpp | 2 +- modules/core/src/rand.cpp | 2 +- modules/core/src/system.cpp | 24 ++++++++++++++++-------- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/modules/core/src/ocl.cpp b/modules/core/src/ocl.cpp index efe3b936d5..f7117d8a71 100644 --- a/modules/core/src/ocl.cpp +++ b/modules/core/src/ocl.cpp @@ -1471,7 +1471,7 @@ bool haveOpenCL() bool useOpenCL() { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); if( data->useOpenCL < 0 ) { try @@ -1490,7 +1490,7 @@ void setUseOpenCL(bool flag) { if( haveOpenCL() ) { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); data->useOpenCL = (flag && Device::getDefault().ptr() != NULL) ? 1 : 0; } } @@ -2161,7 +2161,7 @@ size_t Device::profilingTimerResolution() const const Device& Device::getDefault() { const Context& ctx = Context::getDefault(); - int idx = coreTlsData.get()->device; + int idx = getCoreTlsData().get()->device; const Device& device = ctx.device(idx); return device; } @@ -3040,7 +3040,7 @@ void* Queue::ptr() const Queue& Queue::getDefault() { - Queue& q = coreTlsData.get()->oclQueue; + Queue& q = getCoreTlsData().get()->oclQueue; if( !q.p && haveOpenCL() ) q.create(Context::getDefault()); return q; diff --git a/modules/core/src/precomp.hpp b/modules/core/src/precomp.hpp index 0f85cc5568..b35be6ecc2 100644 --- a/modules/core/src/precomp.hpp +++ b/modules/core/src/precomp.hpp @@ -255,7 +255,7 @@ struct CoreTLSData #endif }; -extern TLSData coreTlsData; +TLSData& getCoreTlsData(); #if defined(BUILD_SHARED_LIBS) #if defined WIN32 || defined _WIN32 || defined WINCE diff --git a/modules/core/src/rand.cpp b/modules/core/src/rand.cpp index 1b71900baa..bd1d80ca2b 100644 --- a/modules/core/src/rand.cpp +++ b/modules/core/src/rand.cpp @@ -731,7 +731,7 @@ void RNG::fill( InputOutputArray _mat, int disttype, cv::RNG& cv::theRNG() { - return coreTlsData.get()->rng; + return getCoreTlsData().get()->rng; } void cv::randu(InputOutputArray dst, InputArray low, InputArray high) diff --git a/modules/core/src/system.cpp b/modules/core/src/system.cpp index 2590f215a9..43d5bd0a0b 100644 --- a/modules/core/src/system.cpp +++ b/modules/core/src/system.cpp @@ -1146,12 +1146,20 @@ TLSStorage::~TLSStorage() tlsData_.clear(); } -TLSData coreTlsData; + + +TLSData& getCoreTlsData() +{ + static TLSData *value = new TLSData(); + return *value; +} + + #ifdef CV_COLLECT_IMPL_DATA void setImpl(int flags) { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); data->implFlags = flags; data->implCode.clear(); data->implFun.clear(); @@ -1159,7 +1167,7 @@ void setImpl(int flags) void addImpl(int flag, const char* func) { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); data->implFlags |= flag; if(func) // use lazy collection if name was not specified { @@ -1174,7 +1182,7 @@ void addImpl(int flag, const char* func) int getImpl(std::vector &impl, std::vector &funName) { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); impl = data->implCode; funName = data->implFun; return data->implFlags; // return actual flags for lazy collection @@ -1182,13 +1190,13 @@ int getImpl(std::vector &impl, std::vector &funName) bool useCollection() { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); return data->useCollection; } void setUseCollection(bool flag) { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); data->useCollection = flag; } #endif @@ -1221,7 +1229,7 @@ String getIppErrorLocation() bool useIPP() { #ifdef HAVE_IPP - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); if(data->useIPP < 0) { const char* pIppEnv = getenv("OPENCV_IPP"); @@ -1238,7 +1246,7 @@ bool useIPP() void setUseIPP(bool flag) { - CoreTLSData* data = coreTlsData.get(); + CoreTLSData* data = getCoreTlsData().get(); #ifdef HAVE_IPP data->useIPP = flag; #else