diff --git a/modules/objdetect/src/hog.cpp b/modules/objdetect/src/hog.cpp index 43771a8bda..8a2107734a 100644 --- a/modules/objdetect/src/hog.cpp +++ b/modules/objdetect/src/hog.cpp @@ -122,6 +122,12 @@ void HOGDescriptor::setSVMDetector(InputArray _svmDetector) _svmDetector.getMat().convertTo(svmDetector, CV_32F); CV_Assert(checkDetectorSize()); + if (_svmDetector.empty()) + { + oclSvmDetector = UMat(); + return; + } + Mat detector_reordered(1, (int)svmDetector.size(), CV_32FC1); size_t block_hist_size = getBlockHistogramSize(blockSize, cellSize, nbins); diff --git a/modules/objdetect/test/opencl/test_hogdetector.cpp b/modules/objdetect/test/opencl/test_hogdetector.cpp index 009274096f..cffe2e3fb5 100644 --- a/modules/objdetect/test/opencl/test_hogdetector.cpp +++ b/modules/objdetect/test/opencl/test_hogdetector.cpp @@ -93,6 +93,25 @@ OCL_TEST_P(HOG, GetDescriptors) EXPECT_MAT_SIMILAR(cpu_desc, gpu_desc, 1e-1); } +OCL_TEST_P(HOG, SVMDetector) +{ + HOGDescriptor hog_first, hog_second; + + // empty -> empty + hog_first.copyTo(hog_second); + + // first -> both + hog_first.setSVMDetector(hog_first.getDefaultPeopleDetector()); + hog_first.copyTo(hog_second); + + // both -> both + hog_first.copyTo(hog_second); + + // second -> empty + hog_first.setSVMDetector(cv::noArray()); + hog_first.copyTo(hog_second); +} + OCL_TEST_P(HOG, Detect) { HOGDescriptor hog;