From 51ceabb2eb1bba0ab872a81702a60c6b44895d6a Mon Sep 17 00:00:00 2001 From: ChipKerchner Date: Tue, 20 Aug 2019 13:25:35 -0500 Subject: [PATCH 01/12] Change fast corner flags in HAL version from char array to single int --- modules/features2d/src/fast.cpp | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/modules/features2d/src/fast.cpp b/modules/features2d/src/fast.cpp index fe010c0e39..cb9ff257e3 100644 --- a/modules/features2d/src/fast.cpp +++ b/modules/features2d/src/fast.cpp @@ -159,15 +159,12 @@ void FAST_t(InputArray _img, std::vector& keypoints, int threshold, bo } max0 = K16 < v_max(max0, max1); - int m = -v_reduce_sum(v_reinterpret_as_s8(max0)); - uchar mflag[16]; - v_store(mflag, max0); + unsigned int m = v_signmask(v_reinterpret_as_s8(max0)); - for( k = 0; m > 0 && k < 16; k++ ) + for( k = 0; m > 0 && k < 16; k++, m >>= 1 ) { - if(mflag[k]) + if( m & 1 ) { - --m; cornerpos[ncorners++] = j+k; if(nonmax_suppression) { From 57676cf64d5c4a4625932918406da3b74b188ca5 Mon Sep 17 00:00:00 2001 From: Dmitry Kurtaev Date: Sat, 24 Aug 2019 23:14:26 +0300 Subject: [PATCH 02/12] Fix https://github.com/opencv/opencv/issues/15141 --- modules/dnn/src/tensorflow/tf_graph_simplifier.cpp | 4 ++-- modules/dnn/test/test_tf_importer.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp b/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp index 96bcdbd308..0f9670e8a4 100644 --- a/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp +++ b/modules/dnn/src/tensorflow/tf_graph_simplifier.cpp @@ -787,7 +787,7 @@ void RemoveIdentityOps(tensorflow::GraphDef& net) const tensorflow::NodeDef &layer = net.node(li); String type = layer.op(); - if (type == "Identity" || type == "Dropout") { + if (type == "Identity" || type == "Dropout" || type == "PlaceholderWithDefault") { identity_ops_idx.push_back(li); identity_ops[layer.name()] = layer.input(0); } @@ -1031,7 +1031,7 @@ void removePhaseSwitches(tensorflow::GraphDef& net) } } nodesToRemove.push_back(i); - if (node.op() == "Merge") + if (node.op() == "Merge" || node.op() == "Switch") mergeOpSubgraphNodes.push(i); } } diff --git a/modules/dnn/test/test_tf_importer.cpp b/modules/dnn/test/test_tf_importer.cpp index dac55d60b0..dd10a4d68b 100644 --- a/modules/dnn/test/test_tf_importer.cpp +++ b/modules/dnn/test/test_tf_importer.cpp @@ -729,6 +729,7 @@ TEST_P(Test_TensorFlow_layers, subpixel) TEST_P(Test_TensorFlow_layers, keras_mobilenet_head) { runTensorFlowNet("keras_mobilenet_head"); + runTensorFlowNet("keras_learning_phase"); } TEST_P(Test_TensorFlow_layers, resize_bilinear) From 824465ea2783e356d92a8135068f39cab6e6188f Mon Sep 17 00:00:00 2001 From: atinfinity Date: Mon, 26 Aug 2019 23:55:10 +0900 Subject: [PATCH 03/12] Merge pull request #15388 from atinfinity:impl-turbo-colormap Implementation of colormap "Turbo" (#15388) * implemented turbo colormap * add colormap image * changed float value to avoid cast * sorted flag check alphabetically --- .../doc/pics/colormaps/colorscale_turbo.jpg | Bin 0 -> 1565 bytes modules/imgproc/include/opencv2/imgproc.hpp | 3 +- modules/imgproc/src/colormap.cpp | 31 ++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 modules/imgproc/doc/pics/colormaps/colorscale_turbo.jpg diff --git a/modules/imgproc/doc/pics/colormaps/colorscale_turbo.jpg b/modules/imgproc/doc/pics/colormaps/colorscale_turbo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..65246f88c2375c8e7cbd91fce4c5ee019a60d9a5 GIT binary patch literal 1565 zcmbV}Yfuwc7=||qxe%lwAXtk9Z`9Uw>L?%-F*_OoNe8T=Mo`(RMdacINCZ+7s-Q7a zN-aezHe~`L3PJ`gg5k2LL24aA1Gs{s5JVD?l1Kt!&7~U{@sB^+erL{i-ZSUho%fm7 z`q{40C3m>tWN+IfXCU&*73HoBiK68&W>P5B9cf`n`}=Zk?qMO62*aH zPqh`MW;sx2*)F!9On-_e5(q>pnM9r%`A^N-1kfpf2M!?M76N!WjzGs*6@Vw^lQ?A$ zGdo>4Ji(4gB4aijuz_kP%szpDnI>Y6v1tMJ4%pF&&I^{WA-QbaMP8URd&SYyQp%#W zRX1HXJ=8At-kp5Rp6WK|!?_=MeX``!&zAc5uJrT&GJv%%C^%$&C_7^FmaUv^kx_fT zjoBN!FD^cX%R8K!md?-2I(|ZQQhe&?ykGLqoc;A&K~eFAl8dF6E|*=s_DA*gn%W!k zTelU>cUu0u`Z;cXd^ zZCp5fDz*u9JK}=nB6&btRx|70-5vw!q}b3!2rVr=X2&ydb* z0NW}eB6QihHz&NR+>5%qsCPL~PT}~jDenD7Lz+f=S*)KESK?_v8)*QX8 zs)_4gwS8VR+}U`swjxD}7L4#L6$ant1PQGJc^cC|%f7!d1|ntL3oztTcpFO6!Ax*K z!f(k6C{@DswXwZo%aNDn4dL2CEbk&?Y>|MNj%1;w%7!_&SG%Yg<3GrHLk1?{2v}dL@u73dGvEFL{ literal 0 HcmV?d00001 diff --git a/modules/imgproc/include/opencv2/imgproc.hpp b/modules/imgproc/include/opencv2/imgproc.hpp index 5d2b5f8ff7..191502f4fd 100644 --- a/modules/imgproc/include/opencv2/imgproc.hpp +++ b/modules/imgproc/include/opencv2/imgproc.hpp @@ -4356,7 +4356,8 @@ enum ColormapTypes COLORMAP_VIRIDIS = 16, //!< ![viridis](pics/colormaps/colorscale_viridis.jpg) COLORMAP_CIVIDIS = 17, //!< ![cividis](pics/colormaps/colorscale_cividis.jpg) COLORMAP_TWILIGHT = 18, //!< ![twilight](pics/colormaps/colorscale_twilight.jpg) - COLORMAP_TWILIGHT_SHIFTED = 19 //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg) + COLORMAP_TWILIGHT_SHIFTED = 19, //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg) + COLORMAP_TURBO = 20 //!< ![turbo](pics/colormaps/colorscale_turbo.jpg) }; /** @example samples/cpp/falsecolor.cpp diff --git a/modules/imgproc/src/colormap.cpp b/modules/imgproc/src/colormap.cpp index 7252ef7a9f..c56883436e 100644 --- a/modules/imgproc/src/colormap.cpp +++ b/modules/imgproc/src/colormap.cpp @@ -657,6 +657,36 @@ namespace colormap } }; + // Equals the colormap "Turbo" proposed by Google. + // https://ai.googleblog.com/2019/08/turbo-improved-rainbow-colormap-for.html + // https://gist.github.com/mikhailov-work/6a308c20e494d9e0ccc29036b28faa7a + class Turbo : public ColorMap { + public: + Turbo() : ColorMap() { + init(256); + } + Turbo(int n) : ColorMap() { + init(n); + } + + void init(int n) { + // define the basemap + static const float r[] = { 0.18995f,0.19483f,0.19956f,0.20415f,0.20860f,0.21291f,0.21708f,0.22111f,0.22500f,0.22875f,0.23236f,0.23582f,0.23915f,0.24234f,0.24539f,0.24830f,0.25107f,0.25369f,0.25618f,0.25853f,0.26074f,0.26280f,0.26473f,0.26652f,0.26816f,0.26967f,0.27103f,0.27226f,0.27334f,0.27429f,0.27509f,0.27576f,0.27628f,0.27667f,0.27691f,0.27701f,0.27698f,0.27680f,0.27648f,0.27603f,0.27543f,0.27469f,0.27381f,0.27273f,0.27106f,0.26878f,0.26592f,0.26252f,0.25862f,0.25425f,0.24946f,0.24427f,0.23874f,0.23288f,0.22676f,0.22039f,0.21382f,0.20708f,0.20021f,0.19326f,0.18625f,0.17923f,0.17223f,0.16529f,0.15844f,0.15173f,0.14519f,0.13886f,0.13278f,0.12698f,0.12151f,0.11639f,0.11167f,0.10738f,0.10357f,0.10026f,0.09750f,0.09532f,0.09377f,0.09287f,0.09267f,0.09320f,0.09451f,0.09662f,0.09958f,0.10342f,0.10815f,0.11374f,0.12014f,0.12733f,0.13526f,0.14391f,0.15323f,0.16319f,0.17377f,0.18491f,0.19659f,0.20877f,0.22142f,0.23449f,0.24797f,0.26180f,0.27597f,0.29042f,0.30513f,0.32006f,0.33517f,0.35043f,0.36581f,0.38127f,0.39678f,0.41229f,0.42778f,0.44321f,0.45854f,0.47375f,0.48879f,0.50362f,0.51822f,0.53255f,0.54658f,0.56026f,0.57357f,0.58646f,0.59891f,0.61088f,0.62233f,0.63323f,0.64362f,0.65394f,0.66428f,0.67462f,0.68494f,0.69525f,0.70553f,0.71577f,0.72596f,0.73610f,0.74617f,0.75617f,0.76608f,0.77591f,0.78563f,0.79524f,0.80473f,0.81410f,0.82333f,0.83241f,0.84133f,0.85010f,0.85868f,0.86709f,0.87530f,0.88331f,0.89112f,0.89870f,0.90605f,0.91317f,0.92004f,0.92666f,0.93301f,0.93909f,0.94489f,0.95039f,0.95560f,0.96049f,0.96507f,0.96931f,0.97323f,0.97679f,0.98000f,0.98289f,0.98549f,0.98781f,0.98986f,0.99163f,0.99314f,0.99438f,0.99535f,0.99607f,0.99654f,0.99675f,0.99672f,0.99644f,0.99593f,0.99517f,0.99419f,0.99297f,0.99153f,0.98987f,0.98799f,0.98590f,0.98360f,0.98108f,0.97837f,0.97545f,0.97234f,0.96904f,0.96555f,0.96187f,0.95801f,0.95398f,0.94977f,0.94538f,0.94084f,0.93612f,0.93125f,0.92623f,0.92105f,0.91572f,0.91024f,0.90463f,0.89888f,0.89298f,0.88691f,0.88066f,0.87422f,0.86760f,0.86079f,0.85380f,0.84662f,0.83926f,0.83172f,0.82399f,0.81608f,0.80799f,0.79971f,0.79125f,0.78260f,0.77377f,0.76476f,0.75556f,0.74617f,0.73661f,0.72686f,0.71692f,0.70680f,0.69650f,0.68602f,0.67535f,0.66449f,0.65345f,0.64223f,0.63082f,0.61923f,0.60746f,0.59550f,0.58336f,0.57103f,0.55852f,0.54583f,0.53295f,0.51989f,0.50664f,0.49321f,0.47960f }; + static const float g[] = { 0.07176f,0.08339f,0.09498f,0.10652f,0.11802f,0.12947f,0.14087f,0.15223f,0.16354f,0.17481f,0.18603f,0.19720f,0.20833f,0.21941f,0.23044f,0.24143f,0.25237f,0.26327f,0.27412f,0.28492f,0.29568f,0.30639f,0.31706f,0.32768f,0.33825f,0.34878f,0.35926f,0.36970f,0.38008f,0.39043f,0.40072f,0.41097f,0.42118f,0.43134f,0.44145f,0.45152f,0.46153f,0.47151f,0.48144f,0.49132f,0.50115f,0.51094f,0.52069f,0.53040f,0.54015f,0.54995f,0.55979f,0.56967f,0.57958f,0.58950f,0.59943f,0.60937f,0.61931f,0.62923f,0.63913f,0.64901f,0.65886f,0.66866f,0.67842f,0.68812f,0.69775f,0.70732f,0.71680f,0.72620f,0.73551f,0.74472f,0.75381f,0.76279f,0.77165f,0.78037f,0.78896f,0.79740f,0.80569f,0.81381f,0.82177f,0.82955f,0.83714f,0.84455f,0.85175f,0.85875f,0.86554f,0.87211f,0.87844f,0.88454f,0.89040f,0.89600f,0.90142f,0.90673f,0.91193f,0.91701f,0.92197f,0.92680f,0.93151f,0.93609f,0.94053f,0.94484f,0.94901f,0.95304f,0.95692f,0.96065f,0.96423f,0.96765f,0.97092f,0.97403f,0.97697f,0.97974f,0.98234f,0.98477f,0.98702f,0.98909f,0.99098f,0.99268f,0.99419f,0.99551f,0.99663f,0.99755f,0.99828f,0.99879f,0.99910f,0.99919f,0.99907f,0.99873f,0.99817f,0.99739f,0.99638f,0.99514f,0.99366f,0.99195f,0.98999f,0.98775f,0.98524f,0.98246f,0.97941f,0.97610f,0.97255f,0.96875f,0.96470f,0.96043f,0.95593f,0.95121f,0.94627f,0.94113f,0.93579f,0.93025f,0.92452f,0.91861f,0.91253f,0.90627f,0.89986f,0.89328f,0.88655f,0.87968f,0.87267f,0.86553f,0.85826f,0.85087f,0.84337f,0.83576f,0.82806f,0.82025f,0.81236f,0.80439f,0.79634f,0.78823f,0.78005f,0.77181f,0.76352f,0.75519f,0.74682f,0.73842f,0.73000f,0.72140f,0.71250f,0.70330f,0.69382f,0.68408f,0.67408f,0.66386f,0.65341f,0.64277f,0.63193f,0.62093f,0.60977f,0.59846f,0.58703f,0.57549f,0.56386f,0.55214f,0.54036f,0.52854f,0.51667f,0.50479f,0.49291f,0.48104f,0.46920f,0.45740f,0.44565f,0.43399f,0.42241f,0.41093f,0.39958f,0.38836f,0.37729f,0.36638f,0.35566f,0.34513f,0.33482f,0.32473f,0.31489f,0.30530f,0.29599f,0.28696f,0.27824f,0.26981f,0.26152f,0.25334f,0.24526f,0.23730f,0.22945f,0.22170f,0.21407f,0.20654f,0.19912f,0.19182f,0.18462f,0.17753f,0.17055f,0.16368f,0.15693f,0.15028f,0.14374f,0.13731f,0.13098f,0.12477f,0.11867f,0.11268f,0.10680f,0.10102f,0.09536f,0.08980f,0.08436f,0.07902f,0.07380f,0.06868f,0.06367f,0.05878f,0.05399f,0.04931f,0.04474f,0.04028f,0.03593f,0.03169f,0.02756f,0.02354f,0.01963f,0.01583f }; + static const float b[] = { 0.23217f,0.26149f,0.29024f,0.31844f,0.34607f,0.37314f,0.39964f,0.42558f,0.45096f,0.47578f,0.50004f,0.52373f,0.54686f,0.56942f,0.59142f,0.61286f,0.63374f,0.65406f,0.67381f,0.69300f,0.71162f,0.72968f,0.74718f,0.76412f,0.78050f,0.79631f,0.81156f,0.82624f,0.84037f,0.85393f,0.86692f,0.87936f,0.89123f,0.90254f,0.91328f,0.92347f,0.93309f,0.94214f,0.95064f,0.95857f,0.96594f,0.97275f,0.97899f,0.98461f,0.98930f,0.99303f,0.99583f,0.99773f,0.99876f,0.99896f,0.99835f,0.99697f,0.99485f,0.99202f,0.98851f,0.98436f,0.97959f,0.97423f,0.96833f,0.96190f,0.95498f,0.94761f,0.93981f,0.93161f,0.92305f,0.91416f,0.90496f,0.89550f,0.88580f,0.87590f,0.86581f,0.85559f,0.84525f,0.83484f,0.82437f,0.81389f,0.80342f,0.79299f,0.78264f,0.77240f,0.76230f,0.75237f,0.74265f,0.73316f,0.72393f,0.71500f,0.70599f,0.69651f,0.68660f,0.67627f,0.66556f,0.65448f,0.64308f,0.63137f,0.61938f,0.60713f,0.59466f,0.58199f,0.56914f,0.55614f,0.54303f,0.52981f,0.51653f,0.50321f,0.48987f,0.47654f,0.46325f,0.45002f,0.43688f,0.42386f,0.41098f,0.39826f,0.38575f,0.37345f,0.36140f,0.34963f,0.33816f,0.32701f,0.31622f,0.30581f,0.29581f,0.28623f,0.27712f,0.26849f,0.26038f,0.25280f,0.24579f,0.23937f,0.23356f,0.22835f,0.22370f,0.21960f,0.21602f,0.21294f,0.21032f,0.20815f,0.20640f,0.20504f,0.20406f,0.20343f,0.20311f,0.20310f,0.20336f,0.20386f,0.20459f,0.20552f,0.20663f,0.20788f,0.20926f,0.21074f,0.21230f,0.21391f,0.21555f,0.21719f,0.21880f,0.22038f,0.22188f,0.22328f,0.22456f,0.22570f,0.22667f,0.22744f,0.22800f,0.22831f,0.22836f,0.22811f,0.22754f,0.22663f,0.22536f,0.22369f,0.22161f,0.21918f,0.21650f,0.21358f,0.21043f,0.20706f,0.20348f,0.19971f,0.19577f,0.19165f,0.18738f,0.18297f,0.17842f,0.17376f,0.16899f,0.16412f,0.15918f,0.15417f,0.14910f,0.14398f,0.13883f,0.13367f,0.12849f,0.12332f,0.11817f,0.11305f,0.10797f,0.10294f,0.09798f,0.09310f,0.08831f,0.08362f,0.07905f,0.07461f,0.07031f,0.06616f,0.06218f,0.05837f,0.05475f,0.05134f,0.04814f,0.04516f,0.04243f,0.03993f,0.03753f,0.03521f,0.03297f,0.03082f,0.02875f,0.02677f,0.02487f,0.02305f,0.02131f,0.01966f,0.01809f,0.01660f,0.01520f,0.01387f,0.01264f,0.01148f,0.01041f,0.00942f,0.00851f,0.00769f,0.00695f,0.00629f,0.00571f,0.00522f,0.00481f,0.00449f,0.00424f,0.00408f,0.00401f,0.00401f,0.00410f,0.00427f,0.00453f,0.00486f,0.00529f,0.00579f,0.00638f,0.00705f,0.00780f,0.00863f,0.00955f,0.01055f }; + + // breakpoints + Mat X = linspace(0,1,256); + + // now build lookup table + this->_lut = ColorMap::linear_colormap(X, + Mat(256,1, CV_32FC1, (void*)r).clone(), // red + Mat(256,1, CV_32FC1, (void*)g).clone(), // green + Mat(256,1, CV_32FC1, (void*)b).clone(), // blue + n); + } + }; + // UserColormap . class UserColorMap : public ColorMap { public: @@ -724,6 +754,7 @@ namespace colormap colormap == COLORMAP_RAINBOW ? (colormap::ColorMap*)(new colormap::Rainbow) : colormap == COLORMAP_SPRING ? (colormap::ColorMap*)(new colormap::Spring) : colormap == COLORMAP_SUMMER ? (colormap::ColorMap*)(new colormap::Summer) : + colormap == COLORMAP_TURBO ? (colormap::ColorMap*)(new colormap::Turbo) : colormap == COLORMAP_TWILIGHT ? (colormap::ColorMap*)(new colormap::Twilight) : colormap == COLORMAP_TWILIGHT_SHIFTED ? (colormap::ColorMap*)(new colormap::TwilightShifted) : colormap == COLORMAP_VIRIDIS ? (colormap::ColorMap*)(new colormap::Viridis) : From 1b40528e1a1b08aa90e76653da7cf1aa39dceb12 Mon Sep 17 00:00:00 2001 From: Vitaly Tuzov Date: Tue, 27 Aug 2019 14:31:23 +0300 Subject: [PATCH 04/12] Fix for AVX2 implementation of v_check_any(), v_check_all() intrinsics --- .../include/opencv2/core/hal/intrin_avx.hpp | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/modules/core/include/opencv2/core/hal/intrin_avx.hpp b/modules/core/include/opencv2/core/hal/intrin_avx.hpp index 24e2a52893..74db46b470 100644 --- a/modules/core/include/opencv2/core/hal/intrin_avx.hpp +++ b/modules/core/include/opencv2/core/hal/intrin_avx.hpp @@ -1231,19 +1231,16 @@ inline int v_signmask(const v_int16x16& a) inline int v_signmask(const v_uint16x16& a) { return v_signmask(v_reinterpret_as_s16(a)); } -inline int v_signmask(const v_int32x8& a) -{ - v_int16x16 a16 = v_pack(a, a); - return v_signmask(v_pack(a16, a16)) & 0xFF; -} -inline int v_signmask(const v_uint32x8& a) -{ return v_signmask(v_reinterpret_as_s32(a)); } - inline int v_signmask(const v_float32x8& a) { return _mm256_movemask_ps(a.val); } inline int v_signmask(const v_float64x4& a) { return _mm256_movemask_pd(a.val); } +inline int v_signmask(const v_int32x8& a) +{ return v_signmask(v_reinterpret_as_f32(a)); } +inline int v_signmask(const v_uint32x8& a) +{ return v_signmask(v_reinterpret_as_f32(a)); } + inline int v_scan_forward(const v_int8x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } inline int v_scan_forward(const v_uint8x32& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))); } inline int v_scan_forward(const v_int16x16& a) { return trailingZeros32(v_signmask(v_reinterpret_as_s8(a))) / 2; } @@ -1270,10 +1267,10 @@ inline int v_scan_forward(const v_float64x4& a) { return trailingZeros32(v_signm OPENCV_HAL_IMPL_AVX_CHECK(v_uint8x32, OPENCV_HAL_1ST, -1) OPENCV_HAL_IMPL_AVX_CHECK(v_int8x32, OPENCV_HAL_1ST, -1) -OPENCV_HAL_IMPL_AVX_CHECK(v_uint16x16, OPENCV_HAL_AND, (int)0xaaaa) -OPENCV_HAL_IMPL_AVX_CHECK(v_int16x16, OPENCV_HAL_AND, (int)0xaaaa) -OPENCV_HAL_IMPL_AVX_CHECK(v_uint32x8, OPENCV_HAL_AND, (int)0x8888) -OPENCV_HAL_IMPL_AVX_CHECK(v_int32x8, OPENCV_HAL_AND, (int)0x8888) +OPENCV_HAL_IMPL_AVX_CHECK(v_uint16x16, OPENCV_HAL_AND, (int)0xaaaaaaaa) +OPENCV_HAL_IMPL_AVX_CHECK(v_int16x16, OPENCV_HAL_AND, (int)0xaaaaaaaa) +OPENCV_HAL_IMPL_AVX_CHECK(v_uint32x8, OPENCV_HAL_AND, (int)0x88888888) +OPENCV_HAL_IMPL_AVX_CHECK(v_int32x8, OPENCV_HAL_AND, (int)0x88888888) #define OPENCV_HAL_IMPL_AVX_CHECK_FLT(_Tpvec, allmask) \ inline bool v_check_all(const _Tpvec& a) \ From 70b883cfeb46d1bc7cdd6f47502d3432c2523e3b Mon Sep 17 00:00:00 2001 From: ChipKerchner Date: Tue, 27 Aug 2019 11:38:53 -0500 Subject: [PATCH 05/12] Fix macro bug with v_reduce_min and v_reduce_max for chars in VSX --- modules/core/include/opencv2/core/hal/intrin_vsx.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/core/include/opencv2/core/hal/intrin_vsx.hpp b/modules/core/include/opencv2/core/hal/intrin_vsx.hpp index d3f78beb8e..5329d45ce6 100644 --- a/modules/core/include/opencv2/core/hal/intrin_vsx.hpp +++ b/modules/core/include/opencv2/core/hal/intrin_vsx.hpp @@ -764,10 +764,10 @@ inline scalartype v_reduce_##suffix(const _Tpvec& a) rs = func(rs, vec_sld(rs, rs, 2)); \ return vec_extract(func(rs, vec_sld(rs, rs, 1)), 0); \ } -OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_uint8x16, vec_uchar16, uchar, max, vec_max) -OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_uint8x16, vec_uchar16, uchar, min, vec_min) -OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_int8x16, vec_char16, schar, max, vec_max) -OPENCV_HAL_IMPL_VSX_REDUCE_OP_8(v_int8x16, vec_char16, schar, min, vec_min) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_uint8x16, vec_uchar16, uchar, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_uint8x16, vec_uchar16, uchar, min, vec_min) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_int8x16, vec_char16, schar, max, vec_max) +OPENCV_HAL_IMPL_VSX_REDUCE_OP_16(v_int8x16, vec_char16, schar, min, vec_min) inline v_float32x4 v_reduce_sum4(const v_float32x4& a, const v_float32x4& b, const v_float32x4& c, const v_float32x4& d) From d134ec54c5695fa9a3ed8a4a2dc1ec6379abffb0 Mon Sep 17 00:00:00 2001 From: Vitaly Tuzov Date: Wed, 28 Aug 2019 14:53:31 +0300 Subject: [PATCH 06/12] Extend tests for v_check_any and v_check_all intrinsics --- modules/core/test/test_intrin_utils.hpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/modules/core/test/test_intrin_utils.hpp b/modules/core/test/test_intrin_utils.hpp index 177d61f9c7..06aeac867d 100644 --- a/modules/core/test/test_intrin_utils.hpp +++ b/modules/core/test/test_intrin_utils.hpp @@ -804,11 +804,14 @@ template struct TheTest all1s; all1s.ui = (uint_type)-1; LaneType mask_one = all1s.l; + dataB[R::nlanes - 1] = mask_one; + R l = dataB; dataB[1] = mask_one; dataB[R::nlanes / 2] = mask_one; - dataB[R::nlanes - 1] = mask_one; dataC *= (LaneType)-1; R a = dataA, b = dataB, c = dataC, d = dataD, e = dataE; + dataC[R::nlanes - 1] = 0; + R nl = dataC; EXPECT_EQ(2, v_signmask(a)); #if CV_SIMD_WIDTH <= 32 @@ -818,11 +821,12 @@ template struct TheTest EXPECT_EQ(false, v_check_all(a)); EXPECT_EQ(false, v_check_all(b)); EXPECT_EQ(true, v_check_all(c)); + EXPECT_EQ(false, v_check_all(nl)); EXPECT_EQ(true, v_check_any(a)); EXPECT_EQ(true, v_check_any(b)); EXPECT_EQ(true, v_check_any(c)); - + EXPECT_EQ(true, v_check_any(l)); R f = v_select(b, d, e); Data resF = f; for (int i = 0; i < R::nlanes; ++i) From 30a60d396b4fdfba7daedb62ab52a331bcd62359 Mon Sep 17 00:00:00 2001 From: Chip Kerchner <49959681+ChipKerchner@users.noreply.github.com> Date: Wed, 28 Aug 2019 11:56:48 -0400 Subject: [PATCH 07/12] Merge pull request #15274 from ChipKerchner:lkpyramidToHal * Convert lkpyramid from SSE SIMD to HAL - 90% faster on Power (VSX). * Replace stores with reduce_sum. Rework to handle endianess correctly. * Fix compiler warnings by casting values explicitly to shorts * Switch to CV_SIMD128 compiler definition. Unroll loop to 8 elements since we've already loaded the data. --- modules/video/src/lkpyramid.cpp | 182 ++++++++++++++++++-------------- 1 file changed, 103 insertions(+), 79 deletions(-) diff --git a/modules/video/src/lkpyramid.cpp b/modules/video/src/lkpyramid.cpp index 3436c741a3..3e81f3be58 100644 --- a/modules/video/src/lkpyramid.cpp +++ b/modules/video/src/lkpyramid.cpp @@ -239,13 +239,12 @@ void cv::detail::LKTrackerInvoker::operator()(const Range& range) const acctype iA11 = 0, iA12 = 0, iA22 = 0; float A11, A12, A22; -#if CV_SSE2 - __m128i qw0 = _mm_set1_epi32(iw00 + (iw01 << 16)); - __m128i qw1 = _mm_set1_epi32(iw10 + (iw11 << 16)); - __m128i z = _mm_setzero_si128(); - __m128i qdelta_d = _mm_set1_epi32(1 << (W_BITS1-1)); - __m128i qdelta = _mm_set1_epi32(1 << (W_BITS1-5-1)); - __m128 qA11 = _mm_setzero_ps(), qA12 = _mm_setzero_ps(), qA22 = _mm_setzero_ps(); +#if CV_SIMD128 && !CV_NEON + v_int16x8 qw0((short)(iw00), (short)(iw01), (short)(iw00), (short)(iw01), (short)(iw00), (short)(iw01), (short)(iw00), (short)(iw01)); + v_int16x8 qw1((short)(iw10), (short)(iw11), (short)(iw10), (short)(iw11), (short)(iw10), (short)(iw11), (short)(iw10), (short)(iw11)); + v_int32x4 qdelta_d = v_setall_s32(1 << (W_BITS1-1)); + v_int32x4 qdelta = v_setall_s32(1 << (W_BITS1-5-1)); + v_float32x4 qA11 = v_setzero_f32(), qA12 = v_setzero_f32(), qA22 = v_setzero_f32(); #endif #if CV_NEON @@ -275,44 +274,75 @@ void cv::detail::LKTrackerInvoker::operator()(const Range& range) const x = 0; -#if CV_SSE2 - for( ; x <= winSize.width*cn - 4; x += 4, dsrc += 4*2, dIptr += 4*2 ) +#if CV_SIMD128 && !CV_NEON + for( ; x <= winSize.width*cn - 8; x += 8, dsrc += 8*2, dIptr += 8*2 ) { - __m128i v00, v01, v10, v11, t0, t1; + v_int32x4 t0, t1; + v_int16x8 v00, v01, v10, v11, t00, t01, t10, t11; - v00 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(const int*)(src + x)), z); - v01 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(const int*)(src + x + cn)), z); - v10 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(const int*)(src + x + stepI)), z); - v11 = _mm_unpacklo_epi8(_mm_cvtsi32_si128(*(const int*)(src + x + stepI + cn)), z); + v00 = v_reinterpret_as_s16(v_load_expand(src + x)); + v01 = v_reinterpret_as_s16(v_load_expand(src + x + cn)); + v10 = v_reinterpret_as_s16(v_load_expand(src + x + stepI)); + v11 = v_reinterpret_as_s16(v_load_expand(src + x + stepI + cn)); - t0 = _mm_add_epi32(_mm_madd_epi16(_mm_unpacklo_epi16(v00, v01), qw0), - _mm_madd_epi16(_mm_unpacklo_epi16(v10, v11), qw1)); - t0 = _mm_srai_epi32(_mm_add_epi32(t0, qdelta), W_BITS1-5); - _mm_storel_epi64((__m128i*)(Iptr + x), _mm_packs_epi32(t0,t0)); + v_zip(v00, v01, t00, t01); + v_zip(v10, v11, t10, t11); - v00 = _mm_loadu_si128((const __m128i*)(dsrc)); - v01 = _mm_loadu_si128((const __m128i*)(dsrc + cn2)); - v10 = _mm_loadu_si128((const __m128i*)(dsrc + dstep)); - v11 = _mm_loadu_si128((const __m128i*)(dsrc + dstep + cn2)); + t0 = v_dotprod(t00, qw0, qdelta) + v_dotprod(t10, qw1); + t1 = v_dotprod(t01, qw0, qdelta) + v_dotprod(t11, qw1); + t0 = t0 >> (W_BITS1-5); + t1 = t1 >> (W_BITS1-5); + v_store(Iptr + x, v_pack(t0, t1)); - t0 = _mm_add_epi32(_mm_madd_epi16(_mm_unpacklo_epi16(v00, v01), qw0), - _mm_madd_epi16(_mm_unpacklo_epi16(v10, v11), qw1)); - t1 = _mm_add_epi32(_mm_madd_epi16(_mm_unpackhi_epi16(v00, v01), qw0), - _mm_madd_epi16(_mm_unpackhi_epi16(v10, v11), qw1)); - t0 = _mm_srai_epi32(_mm_add_epi32(t0, qdelta_d), W_BITS1); - t1 = _mm_srai_epi32(_mm_add_epi32(t1, qdelta_d), W_BITS1); - v00 = _mm_packs_epi32(t0, t1); // Ix0 Iy0 Ix1 Iy1 ... + v00 = v_reinterpret_as_s16(v_load(dsrc)); + v01 = v_reinterpret_as_s16(v_load(dsrc + cn2)); + v10 = v_reinterpret_as_s16(v_load(dsrc + dstep)); + v11 = v_reinterpret_as_s16(v_load(dsrc + dstep + cn2)); - _mm_storeu_si128((__m128i*)dIptr, v00); - t0 = _mm_srai_epi32(v00, 16); // Iy0 Iy1 Iy2 Iy3 - t1 = _mm_srai_epi32(_mm_slli_epi32(v00, 16), 16); // Ix0 Ix1 Ix2 Ix3 + v_zip(v00, v01, t00, t01); + v_zip(v10, v11, t10, t11); - __m128 fy = _mm_cvtepi32_ps(t0); - __m128 fx = _mm_cvtepi32_ps(t1); + t0 = v_dotprod(t00, qw0, qdelta_d) + v_dotprod(t10, qw1); + t1 = v_dotprod(t01, qw0, qdelta_d) + v_dotprod(t11, qw1); + t0 = t0 >> W_BITS1; + t1 = t1 >> W_BITS1; + v00 = v_pack(t0, t1); // Ix0 Iy0 Ix1 Iy1 ... + v_store(dIptr, v00); - qA22 = _mm_add_ps(qA22, _mm_mul_ps(fy, fy)); - qA12 = _mm_add_ps(qA12, _mm_mul_ps(fx, fy)); - qA11 = _mm_add_ps(qA11, _mm_mul_ps(fx, fx)); + v00 = v_reinterpret_as_s16(v_interleave_pairs(v_reinterpret_as_s32(v_interleave_pairs(v00)))); + v_expand(v00, t1, t0); + + v_float32x4 fy = v_cvt_f32(t0); + v_float32x4 fx = v_cvt_f32(t1); + + qA22 = v_muladd(fy, fy, qA22); + qA12 = v_muladd(fx, fy, qA12); + qA11 = v_muladd(fx, fx, qA11); + + v00 = v_reinterpret_as_s16(v_load(dsrc + 4*2)); + v01 = v_reinterpret_as_s16(v_load(dsrc + 4*2 + cn2)); + v10 = v_reinterpret_as_s16(v_load(dsrc + 4*2 + dstep)); + v11 = v_reinterpret_as_s16(v_load(dsrc + 4*2 + dstep + cn2)); + + v_zip(v00, v01, t00, t01); + v_zip(v10, v11, t10, t11); + + t0 = v_dotprod(t00, qw0, qdelta_d) + v_dotprod(t10, qw1); + t1 = v_dotprod(t01, qw0, qdelta_d) + v_dotprod(t11, qw1); + t0 = t0 >> W_BITS1; + t1 = t1 >> W_BITS1; + v00 = v_pack(t0, t1); // Ix0 Iy0 Ix1 Iy1 ... + v_store(dIptr + 4*2, v00); + + v00 = v_reinterpret_as_s16(v_interleave_pairs(v_reinterpret_as_s32(v_interleave_pairs(v00)))); + v_expand(v00, t1, t0); + + fy = v_cvt_f32(t0); + fx = v_cvt_f32(t1); + + qA22 = v_muladd(fy, fy, qA22); + qA12 = v_muladd(fx, fy, qA12); + qA11 = v_muladd(fx, fx, qA11); } #endif @@ -419,14 +449,10 @@ void cv::detail::LKTrackerInvoker::operator()(const Range& range) const } } -#if CV_SSE2 - float CV_DECL_ALIGNED(16) A11buf[4], A12buf[4], A22buf[4]; - _mm_store_ps(A11buf, qA11); - _mm_store_ps(A12buf, qA12); - _mm_store_ps(A22buf, qA22); - iA11 += A11buf[0] + A11buf[1] + A11buf[2] + A11buf[3]; - iA12 += A12buf[0] + A12buf[1] + A12buf[2] + A12buf[3]; - iA22 += A22buf[0] + A22buf[1] + A22buf[2] + A22buf[3]; +#if CV_SIMD128 && !CV_NEON + iA11 += v_reduce_sum(qA11); + iA12 += v_reduce_sum(qA12); + iA22 += v_reduce_sum(qA22); #endif #if CV_NEON @@ -479,10 +505,10 @@ void cv::detail::LKTrackerInvoker::operator()(const Range& range) const iw11 = (1 << W_BITS) - iw00 - iw01 - iw10; acctype ib1 = 0, ib2 = 0; float b1, b2; -#if CV_SSE2 - qw0 = _mm_set1_epi32(iw00 + (iw01 << 16)); - qw1 = _mm_set1_epi32(iw10 + (iw11 << 16)); - __m128 qb0 = _mm_setzero_ps(), qb1 = _mm_setzero_ps(); +#if CV_SIMD128 && !CV_NEON + qw0 = v_int16x8((short)(iw00), (short)(iw01), (short)(iw00), (short)(iw01), (short)(iw00), (short)(iw01), (short)(iw00), (short)(iw01)); + qw1 = v_int16x8((short)(iw10), (short)(iw11), (short)(iw10), (short)(iw11), (short)(iw10), (short)(iw11), (short)(iw10), (short)(iw11)); + v_float32x4 qb0 = v_setzero_f32(), qb1 = v_setzero_f32(); #endif #if CV_NEON @@ -503,34 +529,32 @@ void cv::detail::LKTrackerInvoker::operator()(const Range& range) const x = 0; -#if CV_SSE2 +#if CV_SIMD128 && !CV_NEON for( ; x <= winSize.width*cn - 8; x += 8, dIptr += 8*2 ) { - __m128i diff0 = _mm_loadu_si128((const __m128i*)(Iptr + x)), diff1; - __m128i v00 = _mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i*)(Jptr + x)), z); - __m128i v01 = _mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i*)(Jptr + x + cn)), z); - __m128i v10 = _mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i*)(Jptr + x + stepJ)), z); - __m128i v11 = _mm_unpacklo_epi8(_mm_loadl_epi64((const __m128i*)(Jptr + x + stepJ + cn)), z); + v_int16x8 diff0 = v_reinterpret_as_s16(v_load(Iptr + x)), diff1, diff2; + v_int16x8 v00 = v_reinterpret_as_s16(v_load_expand(Jptr + x)); + v_int16x8 v01 = v_reinterpret_as_s16(v_load_expand(Jptr + x + cn)); + v_int16x8 v10 = v_reinterpret_as_s16(v_load_expand(Jptr + x + stepJ)); + v_int16x8 v11 = v_reinterpret_as_s16(v_load_expand(Jptr + x + stepJ + cn)); - __m128i t0 = _mm_add_epi32(_mm_madd_epi16(_mm_unpacklo_epi16(v00, v01), qw0), - _mm_madd_epi16(_mm_unpacklo_epi16(v10, v11), qw1)); - __m128i t1 = _mm_add_epi32(_mm_madd_epi16(_mm_unpackhi_epi16(v00, v01), qw0), - _mm_madd_epi16(_mm_unpackhi_epi16(v10, v11), qw1)); - t0 = _mm_srai_epi32(_mm_add_epi32(t0, qdelta), W_BITS1-5); - t1 = _mm_srai_epi32(_mm_add_epi32(t1, qdelta), W_BITS1-5); - diff0 = _mm_subs_epi16(_mm_packs_epi32(t0, t1), diff0); - diff1 = _mm_unpackhi_epi16(diff0, diff0); - diff0 = _mm_unpacklo_epi16(diff0, diff0); // It0 It0 It1 It1 ... - v00 = _mm_loadu_si128((const __m128i*)(dIptr)); // Ix0 Iy0 Ix1 Iy1 ... - v01 = _mm_loadu_si128((const __m128i*)(dIptr + 8)); - v10 = _mm_unpacklo_epi16(v00, v01); - v11 = _mm_unpackhi_epi16(v00, v01); - v00 = _mm_unpacklo_epi16(diff0, diff1); - v01 = _mm_unpackhi_epi16(diff0, diff1); - v00 = _mm_madd_epi16(v00, v10); - v11 = _mm_madd_epi16(v01, v11); - qb0 = _mm_add_ps(qb0, _mm_cvtepi32_ps(v00)); - qb1 = _mm_add_ps(qb1, _mm_cvtepi32_ps(v11)); + v_int32x4 t0, t1; + v_int16x8 t00, t01, t10, t11; + v_zip(v00, v01, t00, t01); + v_zip(v10, v11, t10, t11); + + t0 = v_dotprod(t00, qw0, qdelta) + v_dotprod(t10, qw1); + t1 = v_dotprod(t01, qw0, qdelta) + v_dotprod(t11, qw1); + t0 = t0 >> (W_BITS1-5); + t1 = t1 >> (W_BITS1-5); + diff0 = v_pack(t0, t1) - diff0; + v_zip(diff0, diff0, diff2, diff1); // It0 It0 It1 It1 ... + v00 = v_reinterpret_as_s16(v_load(dIptr)); // Ix0 Iy0 Ix1 Iy1 ... + v01 = v_reinterpret_as_s16(v_load(dIptr + 8)); + v_zip(v00, v01, v10, v11); + v_zip(diff2, diff1, v00, v01); + qb0 += v_cvt_f32(v_dotprod(v00, v10)); + qb1 += v_cvt_f32(v_dotprod(v01, v11)); } #endif @@ -616,11 +640,11 @@ void cv::detail::LKTrackerInvoker::operator()(const Range& range) const } } -#if CV_SSE2 - float CV_DECL_ALIGNED(16) bbuf[4]; - _mm_store_ps(bbuf, _mm_add_ps(qb0, qb1)); - ib1 += bbuf[0] + bbuf[2]; - ib2 += bbuf[1] + bbuf[3]; +#if CV_SIMD128 && !CV_NEON + v_float32x4 qf0, qf1; + v_recombine(v_interleave_pairs(qb0 + qb1), v_setzero_f32(), qf0, qf1); + ib1 += v_reduce_sum(qf0); + ib2 += v_reduce_sum(qf1); #endif #if CV_NEON From 90eb529bc456b7757d025e2244c4d691d6990cf6 Mon Sep 17 00:00:00 2001 From: Lubov Batanina Date: Thu, 29 Aug 2019 10:52:02 +0300 Subject: [PATCH 08/12] Merge pull request #15395 from l-bat:fully_connected * Fix IE FullyConnected layer * Fix MyriadX --- modules/dnn/src/layers/fully_connected_layer.cpp | 2 +- modules/dnn/test/test_halide_layers.cpp | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/dnn/src/layers/fully_connected_layer.cpp b/modules/dnn/src/layers/fully_connected_layer.cpp index 2e08ed6d7e..c9baf79d00 100644 --- a/modules/dnn/src/layers/fully_connected_layer.cpp +++ b/modules/dnn/src/layers/fully_connected_layer.cpp @@ -449,7 +449,7 @@ public: InferenceEngine::Builder::Layer l = ieLayer; addConstantData("weights", wrapToInfEngineBlob(blobs[0], {(size_t)blobs[0].size[0], (size_t)blobs[0].size[1], 1, 1}, InferenceEngine::Layout::OIHW), l); - if (blobs.size() > 1) + if (bias) addConstantData("biases", wrapToInfEngineBlob(blobs[1], {(size_t)outNum}, InferenceEngine::Layout::C), l); return Ptr(new InfEngineBackendNode(l)); diff --git a/modules/dnn/test/test_halide_layers.cpp b/modules/dnn/test/test_halide_layers.cpp index d019b1d1ed..a85b3fa897 100644 --- a/modules/dnn/test/test_halide_layers.cpp +++ b/modules/dnn/test/test_halide_layers.cpp @@ -386,8 +386,11 @@ TEST_P(FullyConnected, Accuracy) bool hasBias = get<3>(GetParam()); Backend backendId = get<0>(get<4>(GetParam())); Target targetId = get<1>(get<4>(GetParam())); - if (backendId == DNN_BACKEND_INFERENCE_ENGINE) - applyTestTag(CV_TEST_TAG_DNN_SKIP_IE); + if (backendId == DNN_BACKEND_INFERENCE_ENGINE && (targetId == DNN_TARGET_OPENCL_FP16 || + (targetId == DNN_TARGET_MYRIAD && getInferenceEngineVPUType() == CV_DNN_INFERENCE_ENGINE_VPU_TYPE_MYRIAD_X))) { + applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_OPENCL_FP16); + applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_MYRIAD_X); + } Mat weights(outChannels, inChannels * inSize.height * inSize.width, CV_32F); randu(weights, -1.0f, 1.0f); From 654d0c29ad51b3434c0b6ba754ede2687321833b Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 29 Aug 2019 14:37:35 +0300 Subject: [PATCH 09/12] ts: fix callback function signature detected by UBSAN --- modules/ts/src/ts.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/ts/src/ts.cpp b/modules/ts/src/ts.cpp index 13bf51ec59..2e35bcb720 100644 --- a/modules/ts/src/ts.cpp +++ b/modules/ts/src/ts.cpp @@ -512,8 +512,9 @@ string TS::str_from_code( const TS::FailureCode code ) return "Generic/Unknown"; } -static int tsErrorCallback( int status, const char* func_name, const char* err_msg, const char* file_name, int line, TS* ts ) +static int tsErrorCallback( int status, const char* func_name, const char* err_msg, const char* file_name, int line, void* data ) { + TS* ts = (TS*)data; const char* delim = std::string(err_msg).find('\n') == std::string::npos ? "" : "\n"; ts->printf(TS::LOG, "OpenCV Error:\n\t%s (%s%s) in %s, file %s, line %d\n", cvErrorStr(status), delim, err_msg, func_name[0] != 0 ? func_name : "unknown function", file_name, line); return 0; From 8c849a48ccaaf5e10361aeae738279028a7232d3 Mon Sep 17 00:00:00 2001 From: Maksim Shabunin Date: Thu, 29 Aug 2019 16:57:42 +0300 Subject: [PATCH 10/12] Ported install layout refactoring from master branch --- CMakeLists.txt | 142 ++++---------------------------- cmake/OpenCVDetectPython.cmake | 6 +- cmake/OpenCVGenConfig.cmake | 7 +- cmake/OpenCVInstallLayout.cmake | 101 +++++++++++++++++++++++ 4 files changed, 117 insertions(+), 139 deletions(-) create mode 100644 cmake/OpenCVInstallLayout.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 0cd7a56001..148ee83f7f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -508,9 +508,21 @@ ocv_cmake_hook(POST_OPTIONS) # Build & install layouts # ---------------------------------------------------------------------------- +if(OPENCV_TEST_DATA_PATH) + get_filename_component(OPENCV_TEST_DATA_PATH ${OPENCV_TEST_DATA_PATH} ABSOLUTE) +endif() + # Save libs and executables in the same place set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/bin" CACHE PATH "Output directory for applications") +if(ANDROID) + set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}") + ocv_update(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}") +else() + set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib") + ocv_update(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib") +endif() + if(ANDROID) if(ANDROID_ABI MATCHES "NEON") set(ENABLE_NEON ON) @@ -520,134 +532,6 @@ if(ANDROID) endif() endif() -if(ANDROID OR WIN32) - ocv_update(OPENCV_DOC_INSTALL_PATH doc) -else() - ocv_update(OPENCV_DOC_INSTALL_PATH share/OpenCV/doc) -endif() - -if(WIN32 AND CMAKE_HOST_SYSTEM_NAME MATCHES Windows) - if(DEFINED OpenCV_RUNTIME AND DEFINED OpenCV_ARCH) - ocv_update(OpenCV_INSTALL_BINARIES_PREFIX "${OpenCV_ARCH}/${OpenCV_RUNTIME}/") - else() - message(STATUS "Can't detect runtime and/or arch") - ocv_update(OpenCV_INSTALL_BINARIES_PREFIX "") - endif() -elseif(ANDROID) - ocv_update(OpenCV_INSTALL_BINARIES_PREFIX "sdk/native/") -else() - ocv_update(OpenCV_INSTALL_BINARIES_PREFIX "") -endif() - -if(ANDROID) - ocv_update(OPENCV_SAMPLES_BIN_INSTALL_PATH "${OpenCV_INSTALL_BINARIES_PREFIX}samples/${ANDROID_NDK_ABI_NAME}") -else() - ocv_update(OPENCV_SAMPLES_BIN_INSTALL_PATH "${OpenCV_INSTALL_BINARIES_PREFIX}samples") -endif() - -if(ANDROID) - ocv_update(OPENCV_BIN_INSTALL_PATH "${OpenCV_INSTALL_BINARIES_PREFIX}bin/${ANDROID_NDK_ABI_NAME}") -else() - ocv_update(OPENCV_BIN_INSTALL_PATH "${OpenCV_INSTALL_BINARIES_PREFIX}bin") -endif() - -if(NOT OPENCV_TEST_INSTALL_PATH) - ocv_update(OPENCV_TEST_INSTALL_PATH "${OPENCV_BIN_INSTALL_PATH}") -endif() - -if (OPENCV_TEST_DATA_PATH) - get_filename_component(OPENCV_TEST_DATA_PATH ${OPENCV_TEST_DATA_PATH} ABSOLUTE) -endif() - -if(ANDROID) - ocv_update(OPENCV_TEST_DATA_INSTALL_PATH "sdk/etc/testdata") -elseif(WIN32) - ocv_update(OPENCV_TEST_DATA_INSTALL_PATH "testdata") -else() - ocv_update(OPENCV_TEST_DATA_INSTALL_PATH "share/OpenCV/testdata") -endif() - -if(ANDROID) - set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib/${ANDROID_NDK_ABI_NAME}") - ocv_update(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib/${ANDROID_NDK_ABI_NAME}") - ocv_update(OPENCV_LIB_INSTALL_PATH sdk/native/libs/${ANDROID_NDK_ABI_NAME}) - ocv_update(OPENCV_LIB_ARCHIVE_INSTALL_PATH sdk/native/staticlibs/${ANDROID_NDK_ABI_NAME}) - ocv_update(OPENCV_3P_LIB_INSTALL_PATH sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME}) - ocv_update(OPENCV_CONFIG_INSTALL_PATH sdk/native/jni) - ocv_update(OPENCV_INCLUDE_INSTALL_PATH sdk/native/jni/include) - ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH samples/native) - ocv_update(OPENCV_OTHER_INSTALL_PATH sdk/etc) - ocv_update(OPENCV_LICENSES_INSTALL_PATH "${OPENCV_OTHER_INSTALL_PATH}/licenses") -else() - set(LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/lib") - ocv_update(3P_LIBRARY_OUTPUT_PATH "${OpenCV_BINARY_DIR}/3rdparty/lib${LIB_SUFFIX}") - - if(WIN32 AND CMAKE_HOST_SYSTEM_NAME MATCHES Windows) - if(OpenCV_STATIC) - ocv_update(OPENCV_LIB_INSTALL_PATH "${OpenCV_INSTALL_BINARIES_PREFIX}staticlib${LIB_SUFFIX}") - else() - ocv_update(OPENCV_LIB_INSTALL_PATH "${OpenCV_INSTALL_BINARIES_PREFIX}lib${LIB_SUFFIX}") - endif() - ocv_update(OPENCV_3P_LIB_INSTALL_PATH "${OpenCV_INSTALL_BINARIES_PREFIX}staticlib${LIB_SUFFIX}") - ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH samples) - ocv_update(OPENCV_JAR_INSTALL_PATH java) - ocv_update(OPENCV_OTHER_INSTALL_PATH etc) - ocv_update(OPENCV_CONFIG_INSTALL_PATH ".") - ocv_update(OPENCV_LICENSES_INSTALL_PATH "${OPENCV_OTHER_INSTALL_PATH}/licenses") - else() - include(GNUInstallDirs) - ocv_update(OPENCV_LIB_INSTALL_PATH ${CMAKE_INSTALL_LIBDIR}) - ocv_update(OPENCV_3P_LIB_INSTALL_PATH share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}) - ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH share/OpenCV/samples) - ocv_update(OPENCV_JAR_INSTALL_PATH share/OpenCV/java) - ocv_update(OPENCV_OTHER_INSTALL_PATH share/OpenCV) - ocv_update(OPENCV_LICENSES_INSTALL_PATH "${CMAKE_INSTALL_DATAROOTDIR}/licenses/opencv3") - - if(NOT DEFINED OPENCV_CONFIG_INSTALL_PATH) - math(EXPR SIZEOF_VOID_P_BITS "8 * ${CMAKE_SIZEOF_VOID_P}") - if(LIB_SUFFIX AND NOT SIZEOF_VOID_P_BITS EQUAL LIB_SUFFIX) - ocv_update(OPENCV_CONFIG_INSTALL_PATH ${CMAKE_INSTALL_LIBDIR}/cmake/opencv) - else() - ocv_update(OPENCV_CONFIG_INSTALL_PATH share/OpenCV) - endif() - endif() - endif() - ocv_update(OPENCV_INCLUDE_INSTALL_PATH "include") - #ocv_update(OPENCV_PYTHON_INSTALL_PATH "python") # no default value, see https://github.com/opencv/opencv/issues/13202 -endif() - -ocv_update(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}") -set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) - -if(INSTALL_TO_MANGLED_PATHS) - set(OPENCV_INCLUDE_INSTALL_PATH ${OPENCV_INCLUDE_INSTALL_PATH}/opencv-${OPENCV_VERSION}) - foreach(v - OPENCV_3P_LIB_INSTALL_PATH - OPENCV_SAMPLES_SRC_INSTALL_PATH - OPENCV_CONFIG_INSTALL_PATH - OPENCV_DOC_INSTALL_PATH - OPENCV_JAR_INSTALL_PATH - OPENCV_TEST_DATA_INSTALL_PATH - OPENCV_OTHER_INSTALL_PATH - ) - string(REPLACE "OpenCV" "OpenCV-${OPENCV_VERSION}" ${v} "${${v}}") - string(REPLACE "opencv" "opencv-${OPENCV_VERSION}" ${v} "${${v}}") - endforeach() -endif() - -if(ANDROID) - ocv_update(OPENCV_JNI_INSTALL_PATH "${OPENCV_LIB_INSTALL_PATH}") -elseif(INSTALL_CREATE_DISTRIB) - ocv_update(OPENCV_JNI_INSTALL_PATH "${OPENCV_JAR_INSTALL_PATH}/${OpenCV_ARCH}") -else() - ocv_update(OPENCV_JNI_INSTALL_PATH "${OPENCV_JAR_INSTALL_PATH}") -endif() -ocv_update(OPENCV_JNI_BIN_INSTALL_PATH "${OPENCV_JNI_INSTALL_PATH}") - -if(NOT OPENCV_LIB_ARCHIVE_INSTALL_PATH) - set(OPENCV_LIB_ARCHIVE_INSTALL_PATH ${OPENCV_LIB_INSTALL_PATH}) -endif() - if(WIN32) # Postfix of DLLs: ocv_update(OPENCV_DLLVERSION "${OPENCV_VERSION_MAJOR}${OPENCV_VERSION_MINOR}${OPENCV_VERSION_PATCH}") @@ -666,6 +550,8 @@ if((INSTALL_CREATE_DISTRIB AND BUILD_SHARED_LIBS AND NOT DEFINED BUILD_opencv_wo set(BUILD_opencv_world ON CACHE INTERNAL "") endif() +include(cmake/OpenCVInstallLayout.cmake) + # ---------------------------------------------------------------------------- # Path for build/platform -specific headers # ---------------------------------------------------------------------------- diff --git a/cmake/OpenCVDetectPython.cmake b/cmake/OpenCVDetectPython.cmake index 1b1fbf17b0..5d0ee4a96b 100644 --- a/cmake/OpenCVDetectPython.cmake +++ b/cmake/OpenCVDetectPython.cmake @@ -186,11 +186,7 @@ if(NOT ${found}) else() #debian based assumed, install to the dist-packages. set(_packages_path "python${_version_major_minor}/dist-packages") endif() - if(EXISTS "${CMAKE_INSTALL_PREFIX}/lib${LIB_SUFFIX}/${${packages_path}}") - set(_packages_path "lib${LIB_SUFFIX}/${_packages_path}") - else() - set(_packages_path "lib/${_packages_path}") - endif() + set(_packages_path "lib/${_packages_path}") elseif(CMAKE_HOST_WIN32) get_filename_component(_path "${_executable}" PATH) file(TO_CMAKE_PATH "${_path}" _path) diff --git a/cmake/OpenCVGenConfig.cmake b/cmake/OpenCVGenConfig.cmake index 2c7c42b719..64331f7645 100644 --- a/cmake/OpenCVGenConfig.cmake +++ b/cmake/OpenCVGenConfig.cmake @@ -123,12 +123,7 @@ endif() # -------------------------------------------------------------------------------------------- if(WIN32) if(CMAKE_HOST_SYSTEM_NAME MATCHES Windows) - if(BUILD_SHARED_LIBS) - set(_lib_suffix "lib") - else() - set(_lib_suffix "staticlib") - endif() - ocv_gen_config("${CMAKE_BINARY_DIR}/win-install" "${OpenCV_INSTALL_BINARIES_PREFIX}${_lib_suffix}" "OpenCVConfig.root-WIN32.cmake.in") + ocv_gen_config("${CMAKE_BINARY_DIR}/win-install" "${OPENCV_LIB_INSTALL_PATH}" "OpenCVConfig.root-WIN32.cmake.in") else() ocv_gen_config("${CMAKE_BINARY_DIR}/win-install" "" "") endif() diff --git a/cmake/OpenCVInstallLayout.cmake b/cmake/OpenCVInstallLayout.cmake new file mode 100644 index 0000000000..86fd6ab70d --- /dev/null +++ b/cmake/OpenCVInstallLayout.cmake @@ -0,0 +1,101 @@ +# message(STATUS "Initial install layout:") +# ocv_cmake_dump_vars("OPENCV_.*_INSTALL_PATH") + +if(ANDROID) + + ocv_update(OPENCV_BIN_INSTALL_PATH "sdk/native/bin/${ANDROID_NDK_ABI_NAME}") + ocv_update(OPENCV_TEST_INSTALL_PATH "${OPENCV_BIN_INSTALL_PATH}") + ocv_update(OPENCV_SAMPLES_BIN_INSTALL_PATH "sdk/native/samples/${ANDROID_NDK_ABI_NAME}") + ocv_update(OPENCV_LIB_INSTALL_PATH "sdk/native/libs/${ANDROID_NDK_ABI_NAME}") + ocv_update(OPENCV_LIB_ARCHIVE_INSTALL_PATH "sdk/native/staticlibs/${ANDROID_NDK_ABI_NAME}") + ocv_update(OPENCV_3P_LIB_INSTALL_PATH "sdk/native/3rdparty/libs/${ANDROID_NDK_ABI_NAME}") + ocv_update(OPENCV_CONFIG_INSTALL_PATH "sdk/native/jni") + ocv_update(OPENCV_INCLUDE_INSTALL_PATH "sdk/native/jni/include") + ocv_update(OPENCV_OTHER_INSTALL_PATH "sdk/etc") + ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH "samples/native") + ocv_update(OPENCV_LICENSES_INSTALL_PATH "${OPENCV_OTHER_INSTALL_PATH}/licenses") + ocv_update(OPENCV_TEST_DATA_INSTALL_PATH "sdk/etc/testdata") + ocv_update(OPENCV_DOC_INSTALL_PATH "doc") + ocv_update(OPENCV_JAR_INSTALL_PATH ".") + ocv_update(OPENCV_JNI_INSTALL_PATH "${OPENCV_LIB_INSTALL_PATH}") + ocv_update(OPENCV_JNI_BIN_INSTALL_PATH "${OPENCV_JNI_INSTALL_PATH}") + +elseif(WIN32 AND CMAKE_HOST_SYSTEM_NAME MATCHES Windows) + + if(DEFINED OpenCV_RUNTIME AND DEFINED OpenCV_ARCH) + set(_prefix "${OpenCV_ARCH}/${OpenCV_RUNTIME}/") + else() + message(STATUS "Can't detect runtime and/or arch") + set(_prefix "") + endif() + if(OpenCV_STATIC) + set(_suffix "staticlib") + else() + set(_suffix "lib") + endif() + if(INSTALL_CREATE_DISTRIB) + set(_jni_suffix "/${OpenCV_ARCH}") + else() + set(_jni_suffix "") + endif() + + ocv_update(OPENCV_BIN_INSTALL_PATH "${_prefix}bin") + ocv_update(OPENCV_TEST_INSTALL_PATH "${OPENCV_BIN_INSTALL_PATH}") + ocv_update(OPENCV_SAMPLES_BIN_INSTALL_PATH "${_prefix}samples") + ocv_update(OPENCV_LIB_INSTALL_PATH "${_prefix}${_suffix}") + ocv_update(OPENCV_LIB_ARCHIVE_INSTALL_PATH "${OPENCV_LIB_INSTALL_PATH}") + ocv_update(OPENCV_3P_LIB_INSTALL_PATH "${_prefix}staticlib") + ocv_update(OPENCV_CONFIG_INSTALL_PATH ".") + ocv_update(OPENCV_INCLUDE_INSTALL_PATH "include") + ocv_update(OPENCV_OTHER_INSTALL_PATH "etc") + ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH "samples") + ocv_update(OPENCV_LICENSES_INSTALL_PATH "${OPENCV_OTHER_INSTALL_PATH}/licenses") + ocv_update(OPENCV_TEST_DATA_INSTALL_PATH "testdata") + ocv_update(OPENCV_DOC_INSTALL_PATH "doc") + ocv_update(OPENCV_JAR_INSTALL_PATH "java") + ocv_update(OPENCV_JNI_INSTALL_PATH "${OPENCV_JAR_INSTALL_PATH}${_jni_suffix}") + ocv_update(OPENCV_JNI_BIN_INSTALL_PATH "${OPENCV_JNI_INSTALL_PATH}") + +else() # UNIX + + include(GNUInstallDirs) + ocv_update(OPENCV_BIN_INSTALL_PATH "bin") + ocv_update(OPENCV_TEST_INSTALL_PATH "${OPENCV_BIN_INSTALL_PATH}") + ocv_update(OPENCV_SAMPLES_BIN_INSTALL_PATH "${OPENCV_BIN_INSTALL_PATH}") + ocv_update(OPENCV_LIB_INSTALL_PATH "${CMAKE_INSTALL_LIBDIR}") + ocv_update(OPENCV_LIB_ARCHIVE_INSTALL_PATH "${OPENCV_LIB_INSTALL_PATH}") + ocv_update(OPENCV_3P_LIB_INSTALL_PATH "share/OpenCV/3rdparty/${OPENCV_LIB_INSTALL_PATH}") + ocv_update(OPENCV_CONFIG_INSTALL_PATH "share/OpenCV") + ocv_update(OPENCV_INCLUDE_INSTALL_PATH "include") + ocv_update(OPENCV_OTHER_INSTALL_PATH "share/OpenCV") + ocv_update(OPENCV_SAMPLES_SRC_INSTALL_PATH "share/OpenCV/samples") + ocv_update(OPENCV_LICENSES_INSTALL_PATH "${CMAKE_INSTALL_DATAROOTDIR}/licenses/opencv3") + ocv_update(OPENCV_TEST_DATA_INSTALL_PATH "share/OpenCV/testdata") + ocv_update(OPENCV_DOC_INSTALL_PATH "share/OpenCV/doc") + ocv_update(OPENCV_JAR_INSTALL_PATH "share/OpenCV/java") + ocv_update(OPENCV_JNI_INSTALL_PATH "${OPENCV_JAR_INSTALL_PATH}") + ocv_update(OPENCV_JNI_BIN_INSTALL_PATH "${OPENCV_JNI_INSTALL_PATH}") + +endif() + +ocv_update(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/${OPENCV_LIB_INSTALL_PATH}") +set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE) + +if(INSTALL_TO_MANGLED_PATHS) + set(OPENCV_INCLUDE_INSTALL_PATH ${OPENCV_INCLUDE_INSTALL_PATH}/opencv-${OPENCV_VERSION}) + foreach(v + OPENCV_CONFIG_INSTALL_PATH + OPENCV_3P_LIB_INSTALL_PATH + OPENCV_SAMPLES_SRC_INSTALL_PATH + OPENCV_DOC_INSTALL_PATH + OPENCV_JAR_INSTALL_PATH + OPENCV_TEST_DATA_INSTALL_PATH + OPENCV_OTHER_INSTALL_PATH + ) + string(REPLACE "OpenCV" "OpenCV-${OPENCV_VERSION}" ${v} "${${v}}") + string(REPLACE "opencv" "opencv-${OPENCV_VERSION}" ${v} "${${v}}") + endforeach() +endif() + +# message(STATUS "Final install layout:") +# ocv_cmake_dump_vars("OPENCV_.*_INSTALL_PATH") From d4120dd2fe6cda10bb72408f48ab62bab7f1ffa5 Mon Sep 17 00:00:00 2001 From: Braedy Kuzma Date: Wed, 28 Aug 2019 17:39:08 -0600 Subject: [PATCH 11/12] Disambiguate vecpopcnt for (u)dword2. --- modules/core/include/opencv2/core/vsx_utils.hpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/core/include/opencv2/core/vsx_utils.hpp b/modules/core/include/opencv2/core/vsx_utils.hpp index 6e2baeacfc..c60da3cbbc 100644 --- a/modules/core/include/opencv2/core/vsx_utils.hpp +++ b/modules/core/include/opencv2/core/vsx_utils.hpp @@ -363,10 +363,12 @@ VSX_FINLINE(Tvec) vec_popcntu(const Tvec2& a) \ VSX_IMPL_POPCNTU(vec_uchar16, vec_char16, vec_uchar16_c); VSX_IMPL_POPCNTU(vec_ushort8, vec_short8, vec_ushort8_c); VSX_IMPL_POPCNTU(vec_uint4, vec_int4, vec_uint4_c); +VSX_IMPL_POPCNTU(vec_udword2, vec_dword2, vec_udword2_c); // redirect unsigned types VSX_REDIRECT_1RG(vec_uchar16, vec_uchar16, vec_popcntu, vec_popcnt) VSX_REDIRECT_1RG(vec_ushort8, vec_ushort8, vec_popcntu, vec_popcnt) VSX_REDIRECT_1RG(vec_uint4, vec_uint4, vec_popcntu, vec_popcnt) +VSX_REDIRECT_1RG(vec_udword2, vec_udword2, vec_popcntu, vec_popcnt) // converts between single and double precision VSX_REDIRECT_1RG(vec_float4, vec_double2, vec_cvfo, __builtin_vsx_xvcvdpsp) From 9bf8b496d611c482cd609b709164d7e7fb6e6756 Mon Sep 17 00:00:00 2001 From: Braedy Kuzma Date: Wed, 28 Aug 2019 18:20:09 -0600 Subject: [PATCH 12/12] Use commonly supported instruction mnemonic. --- modules/core/include/opencv2/core/fast_math.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/include/opencv2/core/fast_math.hpp b/modules/core/include/opencv2/core/fast_math.hpp index 0e8187cac0..0fbb2804fe 100644 --- a/modules/core/include/opencv2/core/fast_math.hpp +++ b/modules/core/include/opencv2/core/fast_math.hpp @@ -102,7 +102,7 @@ #define CV_INLINE_ROUND_DBL(value) \ int out; \ double temp; \ - __asm__( "fctiw %[temp],%[in]\n\tmffprwz %[out],%[temp]\n\t" : [out] "=r" (out), [temp] "=d" (temp) : [in] "d" ((double)(value)) : ); \ + __asm__( "fctiw %[temp],%[in]\n\tmfvsrwz %[out],%[temp]\n\t" : [out] "=r" (out), [temp] "=d" (temp) : [in] "d" ((double)(value)) : ); \ return out; // FP32 also works with FP64 routine above