From 25b014691f9f5f9acf9344a3c324f60ea71a2034 Mon Sep 17 00:00:00 2001 From: Vitaly Tuzov Date: Tue, 27 Sep 2016 19:05:35 +0300 Subject: [PATCH] Fix for OpenVX implementation of morphology HAL API --- 3rdparty/openvx/include/openvx_hal.hpp | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/3rdparty/openvx/include/openvx_hal.hpp b/3rdparty/openvx/include/openvx_hal.hpp index a6547e1..e21b2ea 100644 --- a/3rdparty/openvx/include/openvx_hal.hpp +++ b/3rdparty/openvx/include/openvx_hal.hpp @@ -777,8 +777,13 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int vxContext * ctx = vxContext::getContext(); + vx_size maxKernelDim; + vxErr::check(vxQueryContext(ctx->ctx, VX_CONTEXT_NONLINEAR_MAX_DIMENSION, &maxKernelDim, sizeof(maxKernelDim))); + if (kernel_width > maxKernelDim || kernel_height > maxKernelDim) + return CV_HAL_ERROR_NOT_IMPLEMENTED; + std::vector kernel_mat; - kernel_mat.resize(kernel_width * kernel_height); + kernel_mat.reserve(kernel_width * kernel_height); switch (CV_MAT_DEPTH(kernel_type)) { case CV_8U: @@ -786,7 +791,7 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int for (int j = 0; j < kernel_height; ++j) { uchar * kernel_row = kernel_data + j * kernel_step; - for (int i = 0; i < kernel_height; ++i) + for (int i = 0; i < kernel_width; ++i) kernel_mat.push_back(kernel_row[i] ? 255 : 0); } break; @@ -795,7 +800,7 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int for (int j = 0; j < kernel_height; ++j) { short * kernel_row = (short*)(kernel_data + j * kernel_step); - for (int i = 0; i < kernel_height; ++i) + for (int i = 0; i < kernel_width; ++i) kernel_mat.push_back(kernel_row[i] ? 255 : 0); } break; @@ -803,7 +808,7 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int for (int j = 0; j < kernel_height; ++j) { int * kernel_row = (int*)(kernel_data + j * kernel_step); - for (int i = 0; i < kernel_height; ++i) + for (int i = 0; i < kernel_width; ++i) kernel_mat.push_back(kernel_row[i] ? 255 : 0); } break; @@ -811,7 +816,7 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int for (int j = 0; j < kernel_height; ++j) { float * kernel_row = (float*)(kernel_data + j * kernel_step); - for (int i = 0; i < kernel_height; ++i) + for (int i = 0; i < kernel_width; ++i) kernel_mat.push_back(kernel_row[i] ? 255 : 0); } break; @@ -819,7 +824,7 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int for (int j = 0; j < kernel_height; ++j) { double * kernel_row = (double*)(kernel_data + j * kernel_step); - for (int i = 0; i < kernel_height; ++i) + for (int i = 0; i < kernel_width; ++i) kernel_mat.push_back(kernel_row[i] ? 255 : 0); } break; @@ -832,6 +837,7 @@ inline int ovx_hal_morphInit(cvhalFilter2D **filter_context, int operation, int { case MORPH_ERODE: mat = new MorphCtx(*ctx, kernel_mat.data(), kernel_width, kernel_height, VX_NONLINEAR_FILTER_MIN, border); + break; case MORPH_DILATE: mat = new MorphCtx(*ctx, kernel_mat.data(), kernel_width, kernel_height, VX_NONLINEAR_FILTER_MAX, border); break; -- 2.7.4