diff --git a/modules/features2d/src/fast.cpp b/modules/features2d/src/fast.cpp index 8fa6b79f77..e731dedca7 100644 --- a/modules/features2d/src/fast.cpp +++ b/modules/features2d/src/fast.cpp @@ -45,6 +45,7 @@ The references are: #include "fast_score.hpp" #include "opencl_kernels_features2d.hpp" +#include "opencv2/core/openvx/ovx_defs.hpp" #if defined _MSC_VER # pragma warning( disable : 4127) #endif @@ -329,6 +330,67 @@ static bool ocl_FAST( InputArray _img, std::vector& keypoints, } #endif + +#ifdef HAVE_OPENVX +static bool openvx_FAST(InputArray _img, std::vector& keypoints, + int _threshold, bool nonmaxSuppression, int type) +{ + using namespace ivx; + + // Nonmax suppression is done differently in OpenCV than in OpenVX + // 9/16 is the only supported mode in OpenVX + if(nonmaxSuppression || type != FastFeatureDetector::TYPE_9_16) + return false; + + Mat imgMat = _img.getMat(); + if(imgMat.empty() || imgMat.type() != CV_8UC1) + return false; + + try + { + Context context = Context::create(); + Image img = Image::createFromHandle(context, Image::matTypeToFormat(imgMat.type()), + Image::createAddressing(imgMat), (void*)imgMat.data); + ivx::Scalar threshold = ivx::Scalar::create(context, _threshold); + vx_size capacity = imgMat.cols * imgMat.rows; + Array corners = Array::create(context, VX_TYPE_KEYPOINT, capacity); + + ivx::Scalar numCorners = ivx::Scalar::create(context, 0); + + IVX_CHECK_STATUS(vxuFastCorners(context, img, threshold, (vx_bool)nonmaxSuppression, corners, numCorners)); + + size_t nPoints = numCorners.getValue(); + keypoints.clear(); keypoints.reserve(nPoints); + std::vector vxCorners; + corners.copyTo(vxCorners); + for(size_t i = 0; i < nPoints; i++) + { + vx_keypoint_t kp = vxCorners[i]; + //if nonmaxSuppression is false, kp.strength is undefined + keypoints.push_back(KeyPoint((float)kp.x, (float)kp.y, 7.f, -1, kp.strength)); + } + +#ifdef VX_VERSION_1_1 + //we should take user memory back before release + //(it's not done automatically according to standard) + img.swapHandle(); +#endif + } + catch (RuntimeError & e) + { + VX_DbgThrow(e.what()); + } + catch (WrapperError & e) + { + VX_DbgThrow(e.what()); + } + + return true; +} + +#endif + + void FAST(InputArray _img, std::vector& keypoints, int threshold, bool nonmax_suppression, int type) { CV_INSTRUMENT_REGION() @@ -342,6 +404,9 @@ void FAST(InputArray _img, std::vector& keypoints, int threshold, bool } #endif + CV_OVX_RUN(true, + openvx_FAST(_img, keypoints, threshold, nonmax_suppression, type)) + switch(type) { case FastFeatureDetector::TYPE_5_8: FAST_t<8>(_img, keypoints, threshold, nonmax_suppression);