1793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// This file is part of OpenCV project. 2793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// It is subject to the license terms in the LICENSE file found in the top-level directory 3793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// of this distribution and at http://opencv.org/license.html. 4793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 5793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Copyright (C) 2014, Itseez, Inc., all rights reserved. 6793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler// Third party copyrights are property of their respective owners. 7793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 8793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "../test_precomp.hpp" 9793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#include "opencv2/ts/ocl_test.hpp" 10793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 11793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#ifdef HAVE_OPENCL 12793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 13793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace cvtest { 14793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslernamespace ocl { 15793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 16793ee12c6df9cad3806238d32528c49a3ff9331dNoah Preslerstruct Vec2fComparator 17793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 18793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler bool operator()(const Vec2f& a, const Vec2f b) const 19793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 20793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if(a[0] != b[0]) return a[0] < b[0]; 21793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler else return a[1] < b[1]; 22793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 23793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 24793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 25793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////////// HoughLines //////////////////////////////////// 26793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 27793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPARAM_TEST_CASE(HoughLines, double, double, int) 28793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 29793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double rhoStep, thetaStep; 30793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int threshold; 31793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 32793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Size src_size; 33793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat src, dst; 34793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UMat usrc, udst; 35793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 36793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void SetUp() 37793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 38793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rhoStep = GET_PARAM(0); 39793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler thetaStep = GET_PARAM(1); 40793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler threshold = GET_PARAM(2); 41793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 42793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 43793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void generateTestData() 44793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 45793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler src_size = randomSize(500, 1920); 46793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler src.create(src_size, CV_8UC1); 47793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler src.setTo(Scalar::all(0)); 48793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(src, Point(0, 100), Point(100, 100), Scalar::all(255), 1); 49793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(src, Point(0, 200), Point(100, 200), Scalar::all(255), 1); 50793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(src, Point(0, 400), Point(100, 400), Scalar::all(255), 1); 51793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(src, Point(100, 0), Point(100, 200), Scalar::all(255), 1); 52793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(src, Point(200, 0), Point(200, 200), Scalar::all(255), 1); 53793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(src, Point(400, 0), Point(400, 200), Scalar::all(255), 1); 54793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 55793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler src.copyTo(usrc); 56793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 57793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 58793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void readRealTestData() 59793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 60793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat img = readImage("shared/pic5.png", IMREAD_GRAYSCALE); 61793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Canny(img, src, 100, 150, 3); 62793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 63793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler src.copyTo(usrc); 64793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 65793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 66793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void Near(double eps = 0.) 67793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 68793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXPECT_EQ(dst.size(), udst.size()); 69793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 70793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (dst.total() > 0) 71793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 72793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat lines_cpu, lines_gpu; 73793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler dst.copyTo(lines_cpu); 74793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler udst.copyTo(lines_gpu); 75793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 76793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler std::sort(lines_cpu.begin<Vec2f>(), lines_cpu.end<Vec2f>(), Vec2fComparator()); 77793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler std::sort(lines_gpu.begin<Vec2f>(), lines_gpu.end<Vec2f>(), Vec2fComparator()); 78793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 79793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXPECT_LE(TestUtils::checkNorm2(lines_cpu, lines_gpu), eps); 80793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 81793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 82793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 83793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 84793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOCL_TEST_P(HoughLines, RealImage) 85793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 86793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler readRealTestData(); 87793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 88793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_OFF(cv::HoughLines(src, dst, rhoStep, thetaStep, threshold)); 89793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_ON(cv::HoughLines(usrc, udst, rhoStep, thetaStep, threshold)); 90793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 91793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Near(1e-5); 92793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 93793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 94793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOCL_TEST_P(HoughLines, GeneratedImage) 95793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 96793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for (int j = 0; j < test_loop_times; j++) 97793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 98793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler generateTestData(); 99793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 100793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_OFF(cv::HoughLines(src, dst, rhoStep, thetaStep, threshold)); 101793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_ON(cv::HoughLines(usrc, udst, rhoStep, thetaStep, threshold)); 102793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 103793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Near(1e-5); 104793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 105793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 106793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 107793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler/////////////////////////////// HoughLinesP /////////////////////////////////// 108793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 109793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerPARAM_TEST_CASE(HoughLinesP, int, double, double) 110793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 111793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler double rhoStep, thetaStep, minLineLength, maxGap; 112793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler int threshold; 113793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 114793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Size src_size; 115793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat src, dst; 116793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler UMat usrc, udst; 117793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 118793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void SetUp() 119793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 120793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler rhoStep = 1.0; 121793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler thetaStep = CV_PI / 180; 122793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler threshold = GET_PARAM(0); 123793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler minLineLength = GET_PARAM(1); 124793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler maxGap = GET_PARAM(2); 125793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 126793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 127793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void readRealTestData() 128793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 129793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat img = readImage("shared/pic5.png", IMREAD_GRAYSCALE); 130793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Canny(img, src, 50, 200, 3); 131793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 132793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler src.copyTo(usrc); 133793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 134793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 135793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler virtual void Near(double eps = 0.) 136793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 137793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat lines_gpu = udst.getMat(ACCESS_READ); 138793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 139793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler if (dst.total() > 0 && lines_gpu.total() > 0) 140793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 141793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat result_cpu(src.size(), CV_8UC1, Scalar::all(0)); 142793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Mat result_gpu(src.size(), CV_8UC1, Scalar::all(0)); 143793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 144793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler MatConstIterator_<Vec4i> it = dst.begin<Vec4i>(), end = dst.end<Vec4i>(); 145793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for ( ; it != end; it++) 146793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 147793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec4i p = *it; 148793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(result_cpu, Point(p[0], p[1]), Point(p[2], p[3]), Scalar(255)); 149793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 150793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 151793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler it = lines_gpu.begin<Vec4i>(), end = lines_gpu.end<Vec4i>(); 152793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler for ( ; it != end; it++) 153793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler { 154793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Vec4i p = *it; 155793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler line(result_gpu, Point(p[0], p[1]), Point(p[2], p[3]), Scalar(255)); 156793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 157793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 158793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler EXPECT_MAT_SIMILAR(result_cpu, result_gpu, eps); 159793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 160793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler } 161793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler}; 162793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 163793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 164793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOCL_TEST_P(HoughLinesP, RealImage) 165793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler{ 166793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler readRealTestData(); 167793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 168793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_OFF(cv::HoughLinesP(src, dst, rhoStep, thetaStep, threshold, minLineLength, maxGap)); 169793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler OCL_ON(cv::HoughLinesP(usrc, udst, rhoStep, thetaStep, threshold, minLineLength, maxGap)); 170793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 171793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Near(0.25); 172793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} 173793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 174793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOCL_INSTANTIATE_TEST_CASE_P(Imgproc, HoughLines, Combine(Values(1, 0.5), // rhoStep 175793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Values(CV_PI / 180.0, CV_PI / 360.0), // thetaStep 176793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Values(80, 150))); // threshold 177793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 178793ee12c6df9cad3806238d32528c49a3ff9331dNoah PreslerOCL_INSTANTIATE_TEST_CASE_P(Imgproc, HoughLinesP, Combine(Values(100, 150), // threshold 179793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Values(50, 100), // minLineLength 180793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler Values(5, 10))); // maxLineGap 181793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 182793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler} } // namespace cvtest::ocl 183793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler 184793ee12c6df9cad3806238d32528c49a3ff9331dNoah Presler#endif // HAVE_OPENCL