Skip to content

Commit 560f85f

Browse files
committed
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
2 parents f856c96 + 223790e commit 560f85f

40 files changed

+3101
-708
lines changed

3rdparty/carotene/hal/CMakeLists.txt

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,6 @@ function(compile_carotene)
6060
endif()
6161

6262
add_subdirectory("${CAROTENE_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/carotene")
63-
64-
if(ARM OR AARCH64)
65-
if(CMAKE_BUILD_TYPE)
66-
set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE})
67-
endif()
68-
check_cxx_compiler_flag("-mfpu=neon" CXX_HAS_MFPU_NEON)
69-
check_c_compiler_flag("-mfpu=neon" C_HAS_MFPU_NEON)
70-
if(${CXX_HAS_MFPU_NEON} AND ${C_HAS_MFPU_NEON} AND NOT "${CMAKE_CXX_FLAGS} " MATCHES "-mfpu=neon[^ ]*")
71-
get_target_property(old_flags "carotene_objs" COMPILE_FLAGS)
72-
if(old_flags)
73-
set_target_properties("carotene_objs" PROPERTIES COMPILE_FLAGS "${old_flags} -mfpu=neon")
74-
else()
75-
set_target_properties("carotene_objs" PROPERTIES COMPILE_FLAGS "-mfpu=neon")
76-
endif()
77-
endif()
78-
endif()
7963
endfunction()
8064

8165
compile_carotene()

CMakeLists.txt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -792,9 +792,13 @@ endif()
792792

793793
foreach(hal ${OpenCV_HAL})
794794
if(hal STREQUAL "carotene")
795-
add_subdirectory(3rdparty/carotene/hal)
796-
ocv_hal_register(CAROTENE_HAL_LIBRARIES CAROTENE_HAL_HEADERS CAROTENE_HAL_INCLUDE_DIRS)
797-
list(APPEND OpenCV_USED_HAL "carotene (ver ${CAROTENE_HAL_VERSION})")
795+
if(";${CPU_BASELINE_FINAL};" MATCHES ";NEON;")
796+
add_subdirectory(3rdparty/carotene/hal)
797+
ocv_hal_register(CAROTENE_HAL_LIBRARIES CAROTENE_HAL_HEADERS CAROTENE_HAL_INCLUDE_DIRS)
798+
list(APPEND OpenCV_USED_HAL "carotene (ver ${CAROTENE_HAL_VERSION})")
799+
else()
800+
message(STATUS "Carotene: NEON is not available, disabling carotene...")
801+
endif()
798802
elseif(hal STREQUAL "openvx")
799803
add_subdirectory(3rdparty/openvx)
800804
ocv_hal_register(OPENVX_HAL_LIBRARIES OPENVX_HAL_HEADERS OPENVX_HAL_INCLUDE_DIRS)

modules/calib3d/misc/python/test/test_solvepnp.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,26 @@ def test_regression_16040_2(self):
3939
obj_points, img_points, cameraMatrix, distCoeffs, reprojectionError=r
4040
)
4141

42+
def test_regression_16049(self):
43+
obj_points = np.array([[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]], dtype=np.float32)
44+
img_points = np.array(
45+
[[[700, 400], [700, 600], [900, 600], [900, 400]]], dtype=np.float32
46+
)
47+
48+
cameraMatrix = np.array(
49+
[[712.0634, 0, 800], [0, 712.540, 500], [0, 0, 1]], dtype=np.float32
50+
)
51+
distCoeffs = np.array([[0, 0, 0, 0]], dtype=np.float32)
52+
x, r, t, e = cv.solvePnPGeneric(
53+
obj_points, img_points, cameraMatrix, distCoeffs
54+
)
55+
if e is None:
56+
# noArray() is supported, see https://github.com/opencv/opencv/issues/16049
57+
pass
58+
else:
59+
eDump = cv.utils.dumpInputArray(e)
60+
self.assertEqual(eDump, "InputArray: empty()=false kind=0x00010000 flags=0x01010000 total(-1)=1 dims(-1)=2 size(-1)=1x1 type(-1)=CV_32FC1")
61+
4262

4363
if __name__ == '__main__':
4464
NewOpenCVTests.bootstrap()

modules/calib3d/src/solvepnp.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1009,7 +1009,10 @@ int solvePnPGeneric( InputArray _opoints, InputArray _ipoints,
10091009

10101010
if (reprojectionError.needed())
10111011
{
1012-
int type = reprojectionError.type();
1012+
int type = (reprojectionError.fixedType() || !reprojectionError.empty())
1013+
? reprojectionError.type()
1014+
: (max(_ipoints.depth(), _opoints.depth()) == CV_64F ? CV_64F : CV_32F);
1015+
10131016
reprojectionError.create(solutions, 1, type);
10141017
CV_CheckType(reprojectionError.type(), type == CV_32FC1 || type == CV_64FC1,
10151018
"Type of reprojectionError must be CV_32FC1 or CV_64FC1!");

modules/core/src/matmul.simd.hpp

Lines changed: 115 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2078,6 +2078,10 @@ MulTransposedR(const Mat& srcmat, const Mat& dstmat, const Mat& deltamat, double
20782078
deltastep = deltastep ? 4 : 0;
20792079
}
20802080

2081+
#if CV_SIMD_64F
2082+
v_float64x2 v_scale = v_setall_f64(scale);
2083+
#endif
2084+
20812085
if( !delta )
20822086
for( i = 0; i < size.width; i++, tdst += dststep )
20832087
{
@@ -2086,22 +2090,41 @@ MulTransposedR(const Mat& srcmat, const Mat& dstmat, const Mat& deltamat, double
20862090

20872091
for( j = i; j <= size.width - 4; j += 4 )
20882092
{
2089-
double s0 = 0, s1 = 0, s2 = 0, s3 = 0;
2090-
const sT *tsrc = src + j;
2093+
#if CV_SIMD_64F
2094+
if (DataType<sT>::depth == CV_64F && DataType<dT>::depth == CV_64F)
2095+
{
2096+
v_float64x2 s0 = v_setzero_f64(), s1 = v_setzero_f64();
2097+
const double *tsrc = (double*)(src + j);
20912098

2092-
for( k = 0; k < size.height; k++, tsrc += srcstep )
2099+
for( k = 0; k < size.height; k++, tsrc += srcstep )
2100+
{
2101+
v_float64x2 a = v_setall_f64((double)col_buf[k]);
2102+
s0 += a * v_load(tsrc+0);
2103+
s1 += a * v_load(tsrc+2);
2104+
}
2105+
2106+
v_store((double*)(tdst+j), s0*v_scale);
2107+
v_store((double*)(tdst+j+2), s1*v_scale);
2108+
} else
2109+
#endif
20932110
{
2094-
double a = col_buf[k];
2095-
s0 += a * tsrc[0];
2096-
s1 += a * tsrc[1];
2097-
s2 += a * tsrc[2];
2098-
s3 += a * tsrc[3];
2099-
}
2111+
double s0 = 0, s1 = 0, s2 = 0, s3 = 0;
2112+
const sT *tsrc = src + j;
21002113

2101-
tdst[j] = (dT)(s0*scale);
2102-
tdst[j+1] = (dT)(s1*scale);
2103-
tdst[j+2] = (dT)(s2*scale);
2104-
tdst[j+3] = (dT)(s3*scale);
2114+
for( k = 0; k < size.height; k++, tsrc += srcstep )
2115+
{
2116+
double a = col_buf[k];
2117+
s0 += a * tsrc[0];
2118+
s1 += a * tsrc[1];
2119+
s2 += a * tsrc[2];
2120+
s3 += a * tsrc[3];
2121+
}
2122+
2123+
tdst[j] = (dT)(s0*scale);
2124+
tdst[j+1] = (dT)(s1*scale);
2125+
tdst[j+2] = (dT)(s2*scale);
2126+
tdst[j+3] = (dT)(s3*scale);
2127+
}
21052128
}
21062129

21072130
for( ; j < size.width; j++ )
@@ -2127,23 +2150,45 @@ MulTransposedR(const Mat& srcmat, const Mat& dstmat, const Mat& deltamat, double
21272150

21282151
for( j = i; j <= size.width - 4; j += 4 )
21292152
{
2130-
double s0 = 0, s1 = 0, s2 = 0, s3 = 0;
2131-
const sT *tsrc = src + j;
2132-
const dT *d = delta_buf ? delta_buf : delta + j;
2133-
2134-
for( k = 0; k < size.height; k++, tsrc+=srcstep, d+=deltastep )
2153+
#if CV_SIMD_64F
2154+
if (DataType<sT>::depth == CV_64F && DataType<dT>::depth == CV_64F)
21352155
{
2136-
double a = col_buf[k];
2137-
s0 += a * (tsrc[0] - d[0]);
2138-
s1 += a * (tsrc[1] - d[1]);
2139-
s2 += a * (tsrc[2] - d[2]);
2140-
s3 += a * (tsrc[3] - d[3]);
2156+
v_float64x2 s0 = v_setzero_f64(), s1 = v_setzero_f64();
2157+
const double *tsrc = (double*)(src + j);
2158+
const double *d = (double*)(delta_buf ? delta_buf : delta + j);
2159+
2160+
for( k = 0; k < size.height; k++, tsrc+=srcstep, d+=deltastep )
2161+
{
2162+
v_float64x2 a = v_setall_f64((double)col_buf[k]);
2163+
s0 += a * (v_load(tsrc+0) - v_load(d+0));
2164+
s1 += a * (v_load(tsrc+2) - v_load(d+2));
2165+
}
2166+
2167+
v_store((double*)(tdst+j), s0*v_scale);
2168+
v_store((double*)(tdst+j+2), s1*v_scale);
21412169
}
2170+
else
2171+
#endif
21422172

2143-
tdst[j] = (dT)(s0*scale);
2144-
tdst[j+1] = (dT)(s1*scale);
2145-
tdst[j+2] = (dT)(s2*scale);
2146-
tdst[j+3] = (dT)(s3*scale);
2173+
{
2174+
double s0 = 0, s1 = 0, s2 = 0, s3 = 0;
2175+
const sT *tsrc = src + j;
2176+
const dT *d = delta_buf ? delta_buf : delta + j;
2177+
2178+
for( k = 0; k < size.height; k++, tsrc+=srcstep, d+=deltastep )
2179+
{
2180+
double a = col_buf[k];
2181+
s0 += a * (tsrc[0] - d[0]);
2182+
s1 += a * (tsrc[1] - d[1]);
2183+
s2 += a * (tsrc[2] - d[2]);
2184+
s3 += a * (tsrc[3] - d[3]);
2185+
}
2186+
2187+
tdst[j] = (dT)(s0*scale);
2188+
tdst[j+1] = (dT)(s1*scale);
2189+
tdst[j+2] = (dT)(s2*scale);
2190+
tdst[j+3] = (dT)(s3*scale);
2191+
}
21472192
}
21482193

21492194
for( ; j < size.width; j++ )
@@ -2182,10 +2227,25 @@ MulTransposedL(const Mat& srcmat, const Mat& dstmat, const Mat& deltamat, double
21822227
double s = 0;
21832228
const sT *tsrc1 = src + i*srcstep;
21842229
const sT *tsrc2 = src + j*srcstep;
2185-
2186-
for( k = 0; k <= size.width - 4; k += 4 )
2187-
s += (double)tsrc1[k]*tsrc2[k] + (double)tsrc1[k+1]*tsrc2[k+1] +
2188-
(double)tsrc1[k+2]*tsrc2[k+2] + (double)tsrc1[k+3]*tsrc2[k+3];
2230+
#if CV_SIMD_64F
2231+
if (DataType<sT>::depth == CV_64F && DataType<dT>::depth == CV_64F)
2232+
{
2233+
const double *v_tsrc1 = (double *)(tsrc1);
2234+
const double *v_tsrc2 = (double *)(tsrc2);
2235+
v_float64x2 v_s = v_setzero_f64();
2236+
2237+
for( k = 0; k <= size.width - 4; k += 4 )
2238+
v_s += (v_load(v_tsrc1+k) * v_load(v_tsrc2+k)) +
2239+
(v_load(v_tsrc1+k+2) * v_load(v_tsrc2+k+2));
2240+
s += v_reduce_sum(v_s);
2241+
}
2242+
else
2243+
#endif
2244+
{
2245+
for( k = 0; k <= size.width - 4; k += 4 )
2246+
s += (double)tsrc1[k]*tsrc2[k] + (double)tsrc1[k+1]*tsrc2[k+1] +
2247+
(double)tsrc1[k+2]*tsrc2[k+2] + (double)tsrc1[k+3]*tsrc2[k+3];
2248+
}
21892249
for( ; k < size.width; k++ )
21902250
s += (double)tsrc1[k] * tsrc2[k];
21912251
tdst[j] = (dT)(s*scale);
@@ -2220,11 +2280,30 @@ MulTransposedL(const Mat& srcmat, const Mat& dstmat, const Mat& deltamat, double
22202280
delta_buf[2] = delta_buf[3] = tdelta2[0];
22212281
tdelta2 = delta_buf;
22222282
}
2223-
for( k = 0; k <= size.width-4; k += 4, tdelta2 += delta_shift )
2224-
s += (double)row_buf[k]*(tsrc2[k] - tdelta2[0]) +
2225-
(double)row_buf[k+1]*(tsrc2[k+1] - tdelta2[1]) +
2226-
(double)row_buf[k+2]*(tsrc2[k+2] - tdelta2[2]) +
2227-
(double)row_buf[k+3]*(tsrc2[k+3] - tdelta2[3]);
2283+
#if CV_SIMD_64F
2284+
if (DataType<sT>::depth == CV_64F && DataType<dT>::depth == CV_64F)
2285+
{
2286+
const double *v_tsrc2 = (double *)(tsrc2);
2287+
const double *v_tdelta2 = (double *)(tdelta2);
2288+
const double *v_row_buf = (double *)(row_buf);
2289+
v_float64x2 v_s = v_setzero_f64();
2290+
2291+
for( k = 0; k <= size.width - 4; k += 4, v_tdelta2 += delta_shift )
2292+
v_s += ((v_load(v_tsrc2+k) - v_load(v_tdelta2)) * v_load(v_row_buf+k)) +
2293+
((v_load(v_tsrc2+k+2) - v_load(v_tdelta2+2)) * v_load(v_row_buf+k+2));
2294+
s += v_reduce_sum(v_s);
2295+
2296+
tdelta2 = (const dT *)(v_tdelta2);
2297+
}
2298+
else
2299+
#endif
2300+
{
2301+
for( k = 0; k <= size.width-4; k += 4, tdelta2 += delta_shift )
2302+
s += (double)row_buf[k]*(tsrc2[k] - tdelta2[0]) +
2303+
(double)row_buf[k+1]*(tsrc2[k+1] - tdelta2[1]) +
2304+
(double)row_buf[k+2]*(tsrc2[k+2] - tdelta2[2]) +
2305+
(double)row_buf[k+3]*(tsrc2[k+3] - tdelta2[3]);
2306+
}
22282307
for( ; k < size.width; k++, tdelta2++ )
22292308
s += (double)row_buf[k]*(tsrc2[k] - tdelta2[0]);
22302309
tdst[j] = (dT)(s*scale);

modules/core/src/parallel_impl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ DECLARE_CV_PAUSE
4040
#endif
4141
#ifndef CV_PAUSE
4242
# if defined __GNUC__ && (defined __i386__ || defined __x86_64__)
43-
# if !defined(__SSE__)
43+
# if !defined(__SSE2__)
4444
static inline void cv_non_sse_mm_pause() { __asm__ __volatile__ ("rep; nop"); }
4545
# define _mm_pause cv_non_sse_mm_pause
4646
# endif

modules/dnn/include/opencv2/dnn/all_layers.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,8 @@ CV__DNN_INLINE_NS_BEGIN
250250
std::vector<size_t> pads_begin, pads_end;
251251
CV_DEPRECATED_EXTERNAL Size kernel, stride, pad;
252252
CV_DEPRECATED_EXTERNAL int pad_l, pad_t, pad_r, pad_b;
253-
bool globalPooling;
253+
bool globalPooling; //!< Flag is true if at least one of the axes is global pooled.
254+
std::vector<bool> isGlobalPooling;
254255
bool computeMaxIdx;
255256
String padMode;
256257
bool ceilMode;

modules/dnn/include/opencv2/dnn/version.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#define OPENCV_DNN_VERSION_HPP
77

88
/// Use with major OpenCV version only.
9-
#define OPENCV_DNN_API_VERSION 20191202
9+
#define OPENCV_DNN_API_VERSION 20200128
1010

1111
#if !defined CV_DOXYGEN && !defined CV_STATIC_ANALYSIS && !defined CV_DNN_DONT_ADD_INLINE_NS
1212
#define CV__DNN_INLINE_NS __CV_CAT(dnn4_v, OPENCV_DNN_API_VERSION)

modules/dnn/src/layers/convolution_layer.cpp

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,19 +1555,6 @@ class DeConvolutionLayerImpl CV_FINAL : public BaseConvolutionLayerImpl
15551555
const int group = numOutput / outGroupCn;
15561556

15571557
if (backendId == DNN_BACKEND_INFERENCE_ENGINE_NGRAPH) {
1558-
if (padMode.empty()) {
1559-
for (int i = 0; i < adjust_pads.size(); i++) {
1560-
if (pads_end[i] < adjust_pads[i])
1561-
return false;
1562-
}
1563-
} else if (padMode == "SAME") {
1564-
for (int i = 0; i < adjust_pads.size(); i++) {
1565-
if (kernel_size[i] < pads_begin[i] + 1 + adjust_pads[i])
1566-
return false;
1567-
}
1568-
} else if (padMode == "VALID")
1569-
return false;
1570-
15711558
return group == 1;
15721559
}
15731560

@@ -2334,28 +2321,27 @@ class DeConvolutionLayerImpl CV_FINAL : public BaseConvolutionLayerImpl
23342321
ieWeights = std::make_shared<ngraph::op::Constant>(ngraph::element::f32, kernel_shape, newWeights.data);
23352322
}
23362323
std::vector<size_t> paddings_end;
2337-
if (padMode.empty())
2338-
{
2339-
for (int i = 0; i < pads_end.size(); i++) {
2340-
paddings_end.push_back(pads_end[i] - adjust_pads[i]);
2341-
}
2342-
}
2343-
else if (padMode == "SAME")
2324+
if (padMode == "SAME")
23442325
{
23452326
for (int i = 0; i < pads_begin.size(); i++) {
23462327
paddings_end.push_back(kernel_size[i] - pads_begin[i] - 1 - adjust_pads[i]);
23472328
}
2329+
adjust_pads = std::vector<size_t>(pads_begin.size(), 0);
23482330
} else {
23492331
paddings_end = pads_end;
23502332
}
2333+
ngraph::op::PadType pad_type = padMode == "VALID" ? ngraph::op::PadType::VALID : ngraph::op::PadType::EXPLICIT;
23512334

23522335
auto deconv = std::make_shared<ngraph::op::v1::ConvolutionBackpropData>(
23532336
ieInpNode,
23542337
ieWeights,
23552338
ngraph::Strides(strides),
23562339
ngraph::CoordinateDiff(std::vector<std::ptrdiff_t>(pads_begin.begin(), pads_begin.end())),
23572340
ngraph::CoordinateDiff(std::vector<std::ptrdiff_t>(paddings_end.begin(), paddings_end.end())),
2358-
ngraph::Strides(dilations));
2341+
ngraph::Strides(dilations),
2342+
pad_type,
2343+
ngraph::CoordinateDiff(std::vector<std::ptrdiff_t>(adjust_pads.begin(), adjust_pads.end())));
2344+
23592345
if (hasBias() || fusedBias)
23602346
{
23612347
std::vector<size_t> shape(deconv->get_shape().size(), 1);

0 commit comments

Comments
 (0)