From ecb6bcf2e07d7e56e9f4f59feb78ab8fecc11f81 Mon Sep 17 00:00:00 2001 From: Tomoaki Teshima Date: Tue, 12 Dec 2017 21:27:46 +0900 Subject: [PATCH] fix build error on Visual Studio 2012 * round doesn't exists in standard library of Visual Studio 2012 * apply the correct computation of ROI --- modules/dnn/src/layers/pooling_layer.cpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/modules/dnn/src/layers/pooling_layer.cpp b/modules/dnn/src/layers/pooling_layer.cpp index 6c51f61..6f53531 100644 --- a/modules/dnn/src/layers/pooling_layer.cpp +++ b/modules/dnn/src/layers/pooling_layer.cpp @@ -57,6 +57,10 @@ namespace cv { namespace dnn { +static inline int scaleAndRoundRoi(float f, float scale) +{ + return (int)(f * scale + (f >= 0.f ? 0.5f : -0.5f)); +} class PoolingLayerImpl : public PoolingLayer { @@ -296,16 +300,16 @@ public: if (poolingType == ROI) { const float *roisData = rois->ptr(n); - int ystartROI = round(roisData[2] * spatialScale); - int yendROI = round(roisData[4] * spatialScale); + int ystartROI = scaleAndRoundRoi(roisData[2], spatialScale); + int yendROI = scaleAndRoundRoi(roisData[4], spatialScale); int roiHeight = std::max(yendROI - ystartROI + 1, 1); roiRatio = (float)roiHeight / height; ystart = ystartROI + y0 * roiRatio; yend = ystartROI + std::ceil((y0 + 1) * roiRatio); - xstartROI = round(roisData[1] * spatialScale); - int xendROI = round(roisData[3] * spatialScale); + xstartROI = scaleAndRoundRoi(roisData[1], spatialScale); + int xendROI = scaleAndRoundRoi(roisData[3], spatialScale); int roiWidth = std::max(xendROI - xstartROI + 1, 1); roiRatio = (float)roiWidth / width; -- 2.7.4