void TLDDetector::ocl_batchSrSc(const Mat_<uchar>& patches, double *resultSr, double *resultSc, int numOfPatches) { UMat devPatches = patches.getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); UMat devPositiveSamples = posExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); UMat devNegativeSamples = negExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); UMat devPosNCC(MAX_EXAMPLES_IN_MODEL, numOfPatches, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY); UMat devNegNCC(MAX_EXAMPLES_IN_MODEL, numOfPatches, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY); ocl::Kernel k; ocl::ProgramSource src = ocl::tracking::tldDetector_oclsrc; String error; ocl::Program prog(src, String(), error); k.create("batchNCC", prog); if (k.empty()) printf("Kernel create failed!!!\n"); k.args( ocl::KernelArg::PtrReadOnly(devPatches), ocl::KernelArg::PtrReadOnly(devPositiveSamples), ocl::KernelArg::PtrReadOnly(devNegativeSamples), ocl::KernelArg::PtrWriteOnly(devPosNCC), ocl::KernelArg::PtrWriteOnly(devNegNCC), *posNum, *negNum, numOfPatches); size_t globSize = 2 * numOfPatches*MAX_EXAMPLES_IN_MODEL; if (!k.run(1, &globSize, NULL, true)) printf("Kernel Run Error!!!"); Mat posNCC = devPosNCC.getMat(ACCESS_READ); Mat negNCC = devNegNCC.getMat(ACCESS_READ); //Calculate Srs for (int id = 0; id < numOfPatches; id++) { double spr = 0.0, smr = 0.0, spc = 0.0, smc = 0; int med = getMedian((*timeStampsPositive)); for (int i = 0; i < *posNum; i++) { spr = std::max(spr, 0.5 * (posNCC.at<float>(id * 500 + i) + 1.0)); if ((int)(*timeStampsPositive)[i] <= med) spc = std::max(spr, 0.5 * (posNCC.at<float>(id * 500 + i) + 1.0)); } for (int i = 0; i < *negNum; i++) smc = smr = std::max(smr, 0.5 * (negNCC.at<float>(id * 500 + i) + 1.0)); if (spr + smr == 0.0) resultSr[id] = 0.0; else resultSr[id] = spr / (smr + spr); if (spc + smc == 0.0) resultSc[id] = 0.0; else resultSc[id] = spc / (smc + spc); } }
double TLDDetector::ocl_Sc(const Mat_<uchar>& patch) { double splus = 0.0, sminus = 0.0; UMat devPatch = patch.getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); UMat devPositiveSamples = posExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); UMat devNegativeSamples = negExp->getUMat(ACCESS_READ, USAGE_ALLOCATE_DEVICE_MEMORY); UMat devNCC(1, 2 * MAX_EXAMPLES_IN_MODEL, CV_32FC1, ACCESS_RW, USAGE_ALLOCATE_DEVICE_MEMORY); ocl::Kernel k; ocl::ProgramSource src = ocl::tracking::tldDetector_oclsrc; String error; ocl::Program prog(src, String(), error); k.create("NCC", prog); if (k.empty()) printf("Kernel create failed!!!\n"); k.args( ocl::KernelArg::PtrReadOnly(devPatch), ocl::KernelArg::PtrReadOnly(devPositiveSamples), ocl::KernelArg::PtrReadOnly(devNegativeSamples), ocl::KernelArg::PtrWriteOnly(devNCC), *posNum, *negNum); size_t globSize = 1000; if (!k.run(1, &globSize, NULL, false)) printf("Kernel Run Error!!!"); Mat resNCC = devNCC.getMat(ACCESS_READ); int med = getMedian((*timeStampsPositive)); for (int i = 0; i < *posNum; i++) if ((int)(*timeStampsPositive)[i] <= med) splus = std::max(splus, 0.5 * (resNCC.at<float>(i) +1.0)); for (int i = 0; i < *negNum; i++) sminus = std::max(sminus, 0.5 * (resNCC.at<float>(i + 500) + 1.0)); if (splus + sminus == 0.0) return 0.0; return splus / (sminus + splus); }