mirror of
https://github.com/opencv/opencv.git
synced 2026-07-29 23:33:05 +04:00
Merge branch 4.x
This commit is contained in:
@@ -577,7 +577,7 @@ CV_EXPORTS_W void ensureSizeIsEnough(int rows, int cols, int type, OutputArray a
|
||||
*/
|
||||
CV_EXPORTS_W GpuMat inline createGpuMatFromCudaMemory(int rows, int cols, int type, size_t cudaMemoryAddress, size_t step = Mat::AUTO_STEP) {
|
||||
return GpuMat(rows, cols, type, reinterpret_cast<void*>(cudaMemoryAddress), step);
|
||||
};
|
||||
}
|
||||
|
||||
/** @overload
|
||||
@param size 2D array size: Size(cols, rows). In the Size() constructor, the number of rows and the number of columns go in the reverse order.
|
||||
@@ -588,7 +588,7 @@ CV_EXPORTS_W GpuMat inline createGpuMatFromCudaMemory(int rows, int cols, int ty
|
||||
*/
|
||||
CV_EXPORTS_W inline GpuMat createGpuMatFromCudaMemory(Size size, int type, size_t cudaMemoryAddress, size_t step = Mat::AUTO_STEP) {
|
||||
return GpuMat(size, type, reinterpret_cast<void*>(cudaMemoryAddress), step);
|
||||
};
|
||||
}
|
||||
|
||||
/** @brief BufferPool for use with CUDA streams
|
||||
|
||||
|
||||
@@ -201,7 +201,7 @@ cvRound( double value )
|
||||
{
|
||||
#if defined CV_INLINE_ROUND_DBL
|
||||
CV_INLINE_ROUND_DBL(value);
|
||||
#elif (defined _MSC_VER && defined _M_X64) && !defined(__CUDACC__)
|
||||
#elif ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __SSE2__)) && !defined(__CUDACC__)
|
||||
__m128d t = _mm_set_sd( value );
|
||||
return _mm_cvtsd_si32(t);
|
||||
#elif defined _MSC_VER && defined _M_IX86
|
||||
@@ -323,7 +323,7 @@ CV_INLINE int cvRound(float value)
|
||||
{
|
||||
#if defined CV_INLINE_ROUND_FLT
|
||||
CV_INLINE_ROUND_FLT(value);
|
||||
#elif (defined _MSC_VER && defined _M_X64) && !defined(__CUDACC__)
|
||||
#elif ((defined _MSC_VER && defined _M_X64) || (defined __GNUC__ && defined __SSE2__)) && !defined(__CUDACC__)
|
||||
__m128 t = _mm_set_ss( value );
|
||||
return _mm_cvtss_si32(t);
|
||||
#elif defined _MSC_VER && defined _M_IX86
|
||||
@@ -354,7 +354,7 @@ CV_INLINE int cvFloor( float value )
|
||||
#if defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \
|
||||
defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS
|
||||
return (int)__builtin_floorf(value);
|
||||
#elif defined __loongarch
|
||||
#elif defined __loongarch__
|
||||
int i;
|
||||
float tmp;
|
||||
__asm__ ("ftintrm.w.s %[tmp], %[in] \n\t"
|
||||
@@ -381,7 +381,7 @@ CV_INLINE int cvCeil( float value )
|
||||
#if defined CV__FASTMATH_ENABLE_GCC_MATH_BUILTINS || \
|
||||
defined CV__FASTMATH_ENABLE_CLANG_MATH_BUILTINS
|
||||
return (int)__builtin_ceilf(value);
|
||||
#elif defined __loongarch
|
||||
#elif defined __loongarch__
|
||||
int i;
|
||||
float tmp;
|
||||
__asm__ ("ftintrp.w.s %[tmp], %[in] \n\t"
|
||||
|
||||
@@ -1651,6 +1651,10 @@ inline v_uint32 v_popcount(const v_uint32& a)
|
||||
{
|
||||
return v_hadd(v_hadd(v_popcount(vreinterpret_u8m1(a))));
|
||||
}
|
||||
inline v_uint64 v_popcount(const v_uint64& a)
|
||||
{
|
||||
return v_hadd(v_hadd(v_hadd(v_popcount(vreinterpret_u8m1(a)))));
|
||||
}
|
||||
|
||||
inline v_uint8 v_popcount(const v_int8& a)
|
||||
{
|
||||
@@ -1664,6 +1668,11 @@ inline v_uint32 v_popcount(const v_int32& a)
|
||||
{
|
||||
return v_popcount(v_abs(a));\
|
||||
}
|
||||
inline v_uint64 v_popcount(const v_int64& a)
|
||||
{
|
||||
// max(0 - a) is used, since v_abs does not support 64-bit integers.
|
||||
return v_popcount(v_reinterpret_as_u64(vmax(a, v_sub(v_setzero_s64(), a), VTraits<v_int64>::vlanes())));
|
||||
}
|
||||
|
||||
|
||||
//////////// SignMask ////////////
|
||||
|
||||
@@ -1288,15 +1288,36 @@ public:
|
||||
t(); // finally, transpose the Nx3 matrix.
|
||||
// This involves copying all the elements
|
||||
@endcode
|
||||
3-channel 2x2 matrix reshaped to 1-channel 4x3 matrix, each column has values from one of original channels:
|
||||
@code
|
||||
Mat m(Size(2, 2), CV_8UC3, Scalar(1, 2, 3));
|
||||
vector<int> new_shape {4, 3};
|
||||
m = m.reshape(1, new_shape);
|
||||
@endcode
|
||||
or:
|
||||
@code
|
||||
Mat m(Size(2, 2), CV_8UC3, Scalar(1, 2, 3));
|
||||
const int new_shape[] = {4, 3};
|
||||
m = m.reshape(1, 2, new_shape);
|
||||
@endcode
|
||||
@param cn New number of channels. If the parameter is 0, the number of channels remains the same.
|
||||
@param rows New number of rows. If the parameter is 0, the number of rows remains the same.
|
||||
*/
|
||||
Mat reshape(int cn, int rows=0) const;
|
||||
|
||||
/** @overload */
|
||||
/** @overload
|
||||
* @param cn New number of channels. If the parameter is 0, the number of channels remains the same.
|
||||
* @param newndims New number of dimentions.
|
||||
* @param newsz Array with new matrix size by all dimentions. If some sizes are zero,
|
||||
* the original sizes in those dimensions are presumed.
|
||||
*/
|
||||
Mat reshape(int cn, int newndims, const int* newsz) const;
|
||||
|
||||
/** @overload */
|
||||
/** @overload
|
||||
* @param cn New number of channels. If the parameter is 0, the number of channels remains the same.
|
||||
* @param newshape Vector with new matrix size by all dimentions. If some sizes are zero,
|
||||
* the original sizes in those dimensions are presumed.
|
||||
*/
|
||||
Mat reshape(int cn, const std::vector<int>& newshape) const;
|
||||
|
||||
/** @brief Transposes a matrix.
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
|
||||
#ifdef _MSC_VER
|
||||
#pragma warning( push )
|
||||
#pragma warning( disable: 4127 )
|
||||
#pragma warning( disable: 4127 5054 )
|
||||
#endif
|
||||
|
||||
#if defined(CV_SKIP_DISABLE_CLANG_ENUM_WARNINGS)
|
||||
|
||||
@@ -256,6 +256,7 @@ public:
|
||||
//! return codes for cv::solveLP() function
|
||||
enum SolveLPResult
|
||||
{
|
||||
SOLVELP_LOST = -3, //!< problem is feasible, but solver lost solution due to floating-point arithmetic errors
|
||||
SOLVELP_UNBOUNDED = -2, //!< problem is unbounded (target function can achieve arbitrary high values)
|
||||
SOLVELP_UNFEASIBLE = -1, //!< problem is unfeasible (there are no points that satisfy all the constraints imposed)
|
||||
SOLVELP_SINGLE = 0, //!< there is only one maximum for target function
|
||||
@@ -291,8 +292,12 @@ in the latter case it is understood to correspond to \f$c^T\f$.
|
||||
and the remaining to \f$A\f$. It should contain 32- or 64-bit floating point numbers.
|
||||
@param z The solution will be returned here as a column-vector - it corresponds to \f$c\f$ in the
|
||||
formulation above. It will contain 64-bit floating point numbers.
|
||||
@param constr_eps allowed numeric disparity for constraints
|
||||
@return One of cv::SolveLPResult
|
||||
*/
|
||||
CV_EXPORTS_W int solveLP(InputArray Func, InputArray Constr, OutputArray z, double constr_eps);
|
||||
|
||||
/** @overload */
|
||||
CV_EXPORTS_W int solveLP(InputArray Func, InputArray Constr, OutputArray z);
|
||||
|
||||
//! @}
|
||||
|
||||
@@ -527,23 +527,23 @@ The sample below demonstrates how to use RotatedRect:
|
||||
|
||||
@sa CamShift, fitEllipse, minAreaRect, CvBox2D
|
||||
*/
|
||||
class CV_EXPORTS RotatedRect
|
||||
class CV_EXPORTS_W_SIMPLE RotatedRect
|
||||
{
|
||||
public:
|
||||
//! default constructor
|
||||
RotatedRect();
|
||||
CV_WRAP RotatedRect();
|
||||
/** full constructor
|
||||
@param center The rectangle mass center.
|
||||
@param size Width and height of the rectangle.
|
||||
@param angle The rotation angle in a clockwise direction. When the angle is 0, 90, 180, 270 etc.,
|
||||
the rectangle becomes an up-right rectangle.
|
||||
*/
|
||||
RotatedRect(const Point2f& center, const Size2f& size, float angle);
|
||||
CV_WRAP RotatedRect(const Point2f& center, const Size2f& size, float angle);
|
||||
/**
|
||||
Any 3 end points of the RotatedRect. They must be given in order (either clockwise or
|
||||
anticlockwise).
|
||||
*/
|
||||
RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);
|
||||
CV_WRAP RotatedRect(const Point2f& point1, const Point2f& point2, const Point2f& point3);
|
||||
|
||||
/** returns 4 vertices of the rotated rectangle
|
||||
@param pts The points array for storing rectangle vertices. The order is _bottomLeft_, _topLeft_, topRight, bottomRight.
|
||||
@@ -552,16 +552,19 @@ public:
|
||||
rectangle.
|
||||
*/
|
||||
void points(Point2f pts[]) const;
|
||||
|
||||
CV_WRAP void points(CV_OUT std::vector<Point2f>& pts) const;
|
||||
|
||||
//! returns the minimal up-right integer rectangle containing the rotated rectangle
|
||||
Rect boundingRect() const;
|
||||
CV_WRAP Rect boundingRect() const;
|
||||
//! returns the minimal (exact) floating point rectangle containing the rotated rectangle, not intended for use with images
|
||||
Rect_<float> boundingRect2f() const;
|
||||
//! returns the rectangle mass center
|
||||
Point2f center;
|
||||
CV_PROP_RW Point2f center;
|
||||
//! returns width and height of the rectangle
|
||||
Size2f size;
|
||||
CV_PROP_RW Size2f size;
|
||||
//! returns the rotation angle. When the angle is 0, 90, 180, 270 etc., the rectangle becomes an up-right rectangle.
|
||||
float angle;
|
||||
CV_PROP_RW float angle;
|
||||
};
|
||||
|
||||
template<> class DataType< RotatedRect >
|
||||
|
||||
@@ -470,6 +470,7 @@ public class Mat {
|
||||
* Element-wise multiplication with scale factor
|
||||
* @param m operand with with which to perform element-wise multiplication
|
||||
* @param scale scale factor
|
||||
* @return reference to a new Mat object
|
||||
*/
|
||||
public Mat mul(Mat m, double scale) {
|
||||
return new Mat(n_mul(nativeObj, m.nativeObj, scale));
|
||||
@@ -478,6 +479,7 @@ public class Mat {
|
||||
/**
|
||||
* Element-wise multiplication
|
||||
* @param m operand with with which to perform element-wise multiplication
|
||||
* @return reference to a new Mat object
|
||||
*/
|
||||
public Mat mul(Mat m) {
|
||||
return new Mat(n_mul(nativeObj, m.nativeObj));
|
||||
@@ -487,6 +489,7 @@ public class Mat {
|
||||
* Matrix multiplication
|
||||
* @param m operand with with which to perform matrix multiplication
|
||||
* @see Core#gemm(Mat, Mat, double, Mat, double, Mat, int)
|
||||
* @return reference to a new Mat object
|
||||
*/
|
||||
public Mat matMul(Mat m) {
|
||||
return new Mat(n_matMul(nativeObj, m.nativeObj));
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
__all__ = []
|
||||
|
||||
import sys
|
||||
import numpy as np
|
||||
import cv2 as cv
|
||||
from typing import TYPE_CHECKING, Any
|
||||
|
||||
# Same as cv2.typing.NumPyArrayGeneric, but avoids circular dependencies
|
||||
if TYPE_CHECKING:
|
||||
_NumPyArrayGeneric = np.ndarray[Any, np.dtype[np.generic]]
|
||||
else:
|
||||
_NumPyArrayGeneric = np.ndarray
|
||||
|
||||
# NumPy documentation: https://numpy.org/doc/stable/user/basics.subclassing.html
|
||||
|
||||
class Mat(np.ndarray):
|
||||
class Mat(_NumPyArrayGeneric):
|
||||
'''
|
||||
cv.Mat wrapper for numpy array.
|
||||
|
||||
|
||||
@@ -46,44 +46,44 @@ mixChannels_( const T** src, const int* sdelta,
|
||||
}
|
||||
|
||||
|
||||
static void mixChannels8u( const uchar** src, const int* sdelta,
|
||||
uchar** dst, const int* ddelta,
|
||||
static void mixChannels8u( const void** src, const int* sdelta,
|
||||
void** dst, const int* ddelta,
|
||||
int len, int npairs )
|
||||
{
|
||||
mixChannels_(src, sdelta, dst, ddelta, len, npairs);
|
||||
mixChannels_((const uchar**)src, sdelta, (uchar**)dst, ddelta, len, npairs);
|
||||
}
|
||||
|
||||
static void mixChannels16u( const ushort** src, const int* sdelta,
|
||||
ushort** dst, const int* ddelta,
|
||||
static void mixChannels16u( const void** src, const int* sdelta,
|
||||
void** dst, const int* ddelta,
|
||||
int len, int npairs )
|
||||
{
|
||||
mixChannels_(src, sdelta, dst, ddelta, len, npairs);
|
||||
mixChannels_((const ushort**)src, sdelta, (ushort**)dst, ddelta, len, npairs);
|
||||
}
|
||||
|
||||
static void mixChannels32s( const int** src, const int* sdelta,
|
||||
int** dst, const int* ddelta,
|
||||
static void mixChannels32s( const void** src, const int* sdelta,
|
||||
void** dst, const int* ddelta,
|
||||
int len, int npairs )
|
||||
{
|
||||
mixChannels_(src, sdelta, dst, ddelta, len, npairs);
|
||||
mixChannels_((const int**)src, sdelta, (int**)dst, ddelta, len, npairs);
|
||||
}
|
||||
|
||||
static void mixChannels64s( const int64** src, const int* sdelta,
|
||||
int64** dst, const int* ddelta,
|
||||
static void mixChannels64s( const void** src, const int* sdelta,
|
||||
void** dst, const int* ddelta,
|
||||
int len, int npairs )
|
||||
{
|
||||
mixChannels_(src, sdelta, dst, ddelta, len, npairs);
|
||||
mixChannels_((const int64**)src, sdelta, (int64**)dst, ddelta, len, npairs);
|
||||
}
|
||||
|
||||
typedef void (*MixChannelsFunc)( const uchar** src, const int* sdelta,
|
||||
uchar** dst, const int* ddelta, int len, int npairs );
|
||||
typedef void (*MixChannelsFunc)( const void** src, const int* sdelta,
|
||||
void** dst, const int* ddelta, int len, int npairs );
|
||||
|
||||
static MixChannelsFunc getMixchFunc(int depth)
|
||||
{
|
||||
static MixChannelsFunc mixchTab[] =
|
||||
{
|
||||
(MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels8u, (MixChannelsFunc)mixChannels16u,
|
||||
(MixChannelsFunc)mixChannels16u, (MixChannelsFunc)mixChannels32s, (MixChannelsFunc)mixChannels32s,
|
||||
(MixChannelsFunc)mixChannels64s, 0
|
||||
mixChannels8u, mixChannels8u, mixChannels16u,
|
||||
mixChannels16u, mixChannels32s, mixChannels32s,
|
||||
mixChannels64s, 0
|
||||
};
|
||||
|
||||
return mixchTab[depth];
|
||||
@@ -158,7 +158,7 @@ void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, cons
|
||||
for( int t = 0; t < total; t += blocksize )
|
||||
{
|
||||
int bsz = std::min(total - t, blocksize);
|
||||
func( srcs, sdelta, dsts, ddelta, bsz, (int)npairs );
|
||||
func( (const void**)srcs, sdelta, (void **)dsts, ddelta, bsz, (int)npairs );
|
||||
|
||||
if( t + blocksize < total )
|
||||
for( k = 0; k < npairs; k++ )
|
||||
|
||||
@@ -90,7 +90,7 @@ static void swap_columns(Mat_<double>& A,int col1,int col2);
|
||||
#define SWAP(type,a,b) {type tmp=(a);(a)=(b);(b)=tmp;}
|
||||
|
||||
//return codes:-2 (no_sol - unbdd),-1(no_sol - unfsbl), 0(single_sol), 1(multiple_sol=>least_l2_norm)
|
||||
int solveLP(InputArray Func_, InputArray Constr_, OutputArray z_)
|
||||
int solveLP(InputArray Func_, InputArray Constr_, OutputArray z_, double constr_eps)
|
||||
{
|
||||
dprintf(("call to solveLP\n"));
|
||||
|
||||
@@ -143,9 +143,25 @@ int solveLP(InputArray Func_, InputArray Constr_, OutputArray z_)
|
||||
}
|
||||
|
||||
z.copyTo(z_);
|
||||
|
||||
//check constraints feasibility
|
||||
Mat prod = Constr(Rect(0, 0, Constr.cols - 1, Constr.rows)) * z;
|
||||
Mat constr_check = Constr.col(Constr.cols - 1) - prod;
|
||||
double min_value = 0.0;
|
||||
minMaxIdx(constr_check, &min_value);
|
||||
if (min_value < -constr_eps)
|
||||
{
|
||||
return SOLVELP_LOST;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
int solveLP(InputArray Func, InputArray Constr, OutputArray z)
|
||||
{
|
||||
return solveLP(Func, Constr, z, 1e-12);
|
||||
}
|
||||
|
||||
static int initialize_simplex(Mat_<double>& c, Mat_<double>& b,double& v,vector<int>& N,vector<int>& B,vector<unsigned int>& indexToRow){
|
||||
N.resize(c.cols);
|
||||
N[0]=0;
|
||||
@@ -255,7 +271,7 @@ static int initialize_simplex(Mat_<double>& c, Mat_<double>& b,double& v,vector<
|
||||
static int inner_simplex(Mat_<double>& c, Mat_<double>& b,double& v,vector<int>& N,vector<int>& B,vector<unsigned int>& indexToRow){
|
||||
|
||||
for(;;){
|
||||
static MatIterator_<double> pos_ptr;
|
||||
MatIterator_<double> pos_ptr;
|
||||
int e=-1,pos_ctr=0,min_var=INT_MAX;
|
||||
bool all_nonzero=true;
|
||||
for(pos_ptr=c.begin();pos_ptr!=c.end();pos_ptr++,pos_ctr++){
|
||||
|
||||
@@ -603,10 +603,10 @@ flipVert( const uchar* src0, size_t sstep, uchar* dst0, size_t dstep, Size size,
|
||||
{
|
||||
for (; i <= size.width - CV_SIMD_WIDTH; i += CV_SIMD_WIDTH)
|
||||
{
|
||||
v_int32 t0 = vx_load((int*)(src0 + i));
|
||||
v_int32 t1 = vx_load((int*)(src1 + i));
|
||||
v_store((int*)(dst0 + i), t1);
|
||||
v_store((int*)(dst1 + i), t0);
|
||||
v_int32 t0 = v_reinterpret_as_s32(vx_load(src0 + i));
|
||||
v_int32 t1 = v_reinterpret_as_s32(vx_load(src1 + i));
|
||||
v_store(dst0 + i, v_reinterpret_as_u8(t1));
|
||||
v_store(dst1 + i, v_reinterpret_as_u8(t0));
|
||||
}
|
||||
}
|
||||
#if CV_STRONG_ALIGNMENT
|
||||
|
||||
@@ -24,7 +24,7 @@ struct SumSqr_SIMD
|
||||
}
|
||||
};
|
||||
|
||||
#if CV_SIMD
|
||||
#if CV_SIMD || CV_SIMD_SCALABLE
|
||||
|
||||
template <>
|
||||
struct SumSqr_SIMD<uchar, int, int>
|
||||
@@ -39,37 +39,37 @@ struct SumSqr_SIMD<uchar, int, int>
|
||||
v_int32 v_sum = vx_setzero_s32();
|
||||
v_int32 v_sqsum = vx_setzero_s32();
|
||||
|
||||
const int len0 = len & -v_uint8::nlanes;
|
||||
const int len0 = len & -VTraits<v_uint8>::vlanes();
|
||||
while(x < len0)
|
||||
{
|
||||
const int len_tmp = min(x + 256*v_uint16::nlanes, len0);
|
||||
const int len_tmp = min(x + 256*VTraits<v_uint16>::vlanes(), len0);
|
||||
v_uint16 v_sum16 = vx_setzero_u16();
|
||||
for ( ; x < len_tmp; x += v_uint8::nlanes)
|
||||
for ( ; x < len_tmp; x += VTraits<v_uint8>::vlanes())
|
||||
{
|
||||
v_uint16 v_src0 = vx_load_expand(src0 + x);
|
||||
v_uint16 v_src1 = vx_load_expand(src0 + x + v_uint16::nlanes);
|
||||
v_sum16 += v_src0 + v_src1;
|
||||
v_uint16 v_src1 = vx_load_expand(src0 + x + VTraits<v_uint16>::vlanes());
|
||||
v_sum16 = v_add(v_sum16, v_add(v_src0, v_src1));
|
||||
v_int16 v_tmp0, v_tmp1;
|
||||
v_zip(v_reinterpret_as_s16(v_src0), v_reinterpret_as_s16(v_src1), v_tmp0, v_tmp1);
|
||||
v_sqsum += v_dotprod(v_tmp0, v_tmp0) + v_dotprod(v_tmp1, v_tmp1);
|
||||
v_sqsum = v_add(v_sqsum, v_add(v_dotprod(v_tmp0, v_tmp0), v_dotprod(v_tmp1, v_tmp1)));
|
||||
}
|
||||
v_uint32 v_half0, v_half1;
|
||||
v_expand(v_sum16, v_half0, v_half1);
|
||||
v_sum += v_reinterpret_as_s32(v_half0 + v_half1);
|
||||
v_sum = v_add(v_sum, v_reinterpret_as_s32(v_add(v_half0, v_half1)));
|
||||
}
|
||||
if (x <= len - v_uint16::nlanes)
|
||||
if (x <= len - VTraits<v_uint16>::vlanes())
|
||||
{
|
||||
v_uint16 v_src = vx_load_expand(src0 + x);
|
||||
v_uint16 v_half = v_combine_high(v_src, v_src);
|
||||
|
||||
v_uint32 v_tmp0, v_tmp1;
|
||||
v_expand(v_src + v_half, v_tmp0, v_tmp1);
|
||||
v_sum += v_reinterpret_as_s32(v_tmp0);
|
||||
v_expand(v_add(v_src, v_half), v_tmp0, v_tmp1);
|
||||
v_sum = v_add(v_sum, v_reinterpret_as_s32(v_tmp0));
|
||||
|
||||
v_int16 v_tmp2, v_tmp3;
|
||||
v_zip(v_reinterpret_as_s16(v_src), v_reinterpret_as_s16(v_half), v_tmp2, v_tmp3);
|
||||
v_sqsum += v_dotprod(v_tmp2, v_tmp2);
|
||||
x += v_uint16::nlanes;
|
||||
v_sqsum = v_add(v_sqsum, v_dotprod(v_tmp2, v_tmp2));
|
||||
x += VTraits<v_uint16>::vlanes();
|
||||
}
|
||||
|
||||
if (cn == 1)
|
||||
@@ -79,13 +79,13 @@ struct SumSqr_SIMD<uchar, int, int>
|
||||
}
|
||||
else
|
||||
{
|
||||
int CV_DECL_ALIGNED(CV_SIMD_WIDTH) ar[2 * v_int32::nlanes];
|
||||
int CV_DECL_ALIGNED(CV_SIMD_WIDTH) ar[2 * VTraits<v_int32>::max_nlanes];
|
||||
v_store(ar, v_sum);
|
||||
v_store(ar + v_int32::nlanes, v_sqsum);
|
||||
for (int i = 0; i < v_int32::nlanes; ++i)
|
||||
v_store(ar + VTraits<v_int32>::vlanes(), v_sqsum);
|
||||
for (int i = 0; i < VTraits<v_int32>::vlanes(); ++i)
|
||||
{
|
||||
sum[i % cn] += ar[i];
|
||||
sqsum[i % cn] += ar[v_int32::nlanes + i];
|
||||
sqsum[i % cn] += ar[VTraits<v_int32>::vlanes() + i];
|
||||
}
|
||||
}
|
||||
v_cleanup();
|
||||
@@ -106,37 +106,37 @@ struct SumSqr_SIMD<schar, int, int>
|
||||
v_int32 v_sum = vx_setzero_s32();
|
||||
v_int32 v_sqsum = vx_setzero_s32();
|
||||
|
||||
const int len0 = len & -v_int8::nlanes;
|
||||
const int len0 = len & -VTraits<v_int8>::vlanes();
|
||||
while (x < len0)
|
||||
{
|
||||
const int len_tmp = min(x + 256 * v_int16::nlanes, len0);
|
||||
const int len_tmp = min(x + 256 * VTraits<v_int16>::vlanes(), len0);
|
||||
v_int16 v_sum16 = vx_setzero_s16();
|
||||
for (; x < len_tmp; x += v_int8::nlanes)
|
||||
for (; x < len_tmp; x += VTraits<v_int8>::vlanes())
|
||||
{
|
||||
v_int16 v_src0 = vx_load_expand(src0 + x);
|
||||
v_int16 v_src1 = vx_load_expand(src0 + x + v_int16::nlanes);
|
||||
v_sum16 += v_src0 + v_src1;
|
||||
v_int16 v_src1 = vx_load_expand(src0 + x + VTraits<v_int16>::vlanes());
|
||||
v_sum16 = v_add(v_sum16, v_add(v_src0, v_src1));
|
||||
v_int16 v_tmp0, v_tmp1;
|
||||
v_zip(v_src0, v_src1, v_tmp0, v_tmp1);
|
||||
v_sqsum += v_dotprod(v_tmp0, v_tmp0) + v_dotprod(v_tmp1, v_tmp1);
|
||||
v_sqsum = v_add(v_sqsum, v_add(v_dotprod(v_tmp0, v_tmp0), v_dotprod(v_tmp1, v_tmp1)));
|
||||
}
|
||||
v_int32 v_half0, v_half1;
|
||||
v_expand(v_sum16, v_half0, v_half1);
|
||||
v_sum += v_half0 + v_half1;
|
||||
v_sum = v_add(v_sum, v_add(v_half0, v_half1));
|
||||
}
|
||||
if (x <= len - v_int16::nlanes)
|
||||
if (x <= len - VTraits<v_int16>::vlanes())
|
||||
{
|
||||
v_int16 v_src = vx_load_expand(src0 + x);
|
||||
v_int16 v_half = v_combine_high(v_src, v_src);
|
||||
|
||||
v_int32 v_tmp0, v_tmp1;
|
||||
v_expand(v_src + v_half, v_tmp0, v_tmp1);
|
||||
v_sum += v_tmp0;
|
||||
v_expand(v_add(v_src, v_half), v_tmp0, v_tmp1);
|
||||
v_sum = v_add(v_sum, v_tmp0);
|
||||
|
||||
v_int16 v_tmp2, v_tmp3;
|
||||
v_zip(v_src, v_half, v_tmp2, v_tmp3);
|
||||
v_sqsum += v_dotprod(v_tmp2, v_tmp2);
|
||||
x += v_int16::nlanes;
|
||||
v_sqsum = v_add(v_sqsum, v_dotprod(v_tmp2, v_tmp2));
|
||||
x += VTraits<v_int16>::vlanes();
|
||||
}
|
||||
|
||||
if (cn == 1)
|
||||
@@ -146,13 +146,13 @@ struct SumSqr_SIMD<schar, int, int>
|
||||
}
|
||||
else
|
||||
{
|
||||
int CV_DECL_ALIGNED(CV_SIMD_WIDTH) ar[2 * v_int32::nlanes];
|
||||
int CV_DECL_ALIGNED(CV_SIMD_WIDTH) ar[2 * VTraits<v_int32>::max_nlanes];
|
||||
v_store(ar, v_sum);
|
||||
v_store(ar + v_int32::nlanes, v_sqsum);
|
||||
for (int i = 0; i < v_int32::nlanes; ++i)
|
||||
v_store(ar + VTraits<v_int32>::vlanes(), v_sqsum);
|
||||
for (int i = 0; i < VTraits<v_int32>::vlanes(); ++i)
|
||||
{
|
||||
sum[i % cn] += ar[i];
|
||||
sqsum[i % cn] += ar[v_int32::nlanes + i];
|
||||
sqsum[i % cn] += ar[VTraits<v_int32>::vlanes() + i];
|
||||
}
|
||||
}
|
||||
v_cleanup();
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
#include <set>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <iostream> // std::cerr
|
||||
#include <fstream>
|
||||
#if !(defined _MSC_VER) || (defined _MSC_VER && _MSC_VER > 1700)
|
||||
#include <inttypes.h>
|
||||
|
||||
@@ -128,6 +128,8 @@
|
||||
#include <ppltasks.h>
|
||||
#elif defined HAVE_CONCURRENCY
|
||||
#include <ppl.h>
|
||||
#elif defined HAVE_PTHREADS_PF
|
||||
#include <pthread.h>
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@@ -2522,7 +2522,7 @@ public:
|
||||
ippStatus = ippGetCpuFeatures(&cpuFeatures, NULL);
|
||||
if(ippStatus < 0)
|
||||
{
|
||||
std::cerr << "ERROR: IPP cannot detect CPU features, IPP was disabled " << std::endl;
|
||||
CV_LOG_ERROR(NULL, "ERROR: IPP cannot detect CPU features, IPP was disabled");
|
||||
useIPP = false;
|
||||
return;
|
||||
}
|
||||
@@ -2560,7 +2560,7 @@ public:
|
||||
|
||||
if(env == "disabled")
|
||||
{
|
||||
std::cerr << "WARNING: IPP was disabled by OPENCV_IPP environment variable" << std::endl;
|
||||
CV_LOG_WARNING(NULL, "WARNING: IPP was disabled by OPENCV_IPP environment variable");
|
||||
useIPP = false;
|
||||
}
|
||||
else if(env == "sse42")
|
||||
@@ -2574,7 +2574,7 @@ public:
|
||||
#endif
|
||||
#endif
|
||||
else
|
||||
std::cerr << "ERROR: Improper value of OPENCV_IPP: " << env.c_str() << ". Correct values are: disabled, sse42, avx2, avx512 (Intel64 only)" << std::endl;
|
||||
CV_LOG_ERROR(NULL, "ERROR: Improper value of OPENCV_IPP: " << env.c_str() << ". Correct values are: disabled, sse42, avx2, avx512 (Intel64 only)");
|
||||
|
||||
// Trim unsupported features
|
||||
ippFeatures &= cpuFeatures;
|
||||
|
||||
@@ -186,6 +186,11 @@ void RotatedRect::points(Point2f pt[]) const
|
||||
pt[3].y = 2*center.y - pt[1].y;
|
||||
}
|
||||
|
||||
void RotatedRect::points(std::vector<Point2f>& pts) const {
|
||||
pts.resize(4);
|
||||
points(pts.data());
|
||||
}
|
||||
|
||||
Rect RotatedRect::boundingRect() const
|
||||
{
|
||||
Point2f pt[4];
|
||||
|
||||
@@ -2048,6 +2048,7 @@ void test_hal_intrin_uint64()
|
||||
.test_rotate<0>().test_rotate<1>()
|
||||
.test_extract_n<0>().test_extract_n<1>()
|
||||
.test_extract_highest()
|
||||
.test_popcount()
|
||||
//.test_broadcast_element<0>().test_broadcast_element<1>()
|
||||
;
|
||||
}
|
||||
@@ -2069,6 +2070,7 @@ void test_hal_intrin_int64()
|
||||
.test_extract_highest()
|
||||
//.test_broadcast_element<0>().test_broadcast_element<1>()
|
||||
.test_cvt64_double()
|
||||
.test_popcount()
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
@@ -151,4 +151,18 @@ TEST(Core_LPSolver, issue_12337)
|
||||
EXPECT_ANY_THROW(Mat1b z_8u; cv::solveLP(A, B, z_8u));
|
||||
}
|
||||
|
||||
// NOTE: Test parameters found experimentally to get numerically inaccurate result.
|
||||
// The test behaviour may change after algorithm tuning and may removed.
|
||||
TEST(Core_LPSolver, issue_12343)
|
||||
{
|
||||
Mat A = (cv::Mat_<double>(4, 1) << 3., 3., 3., 4.);
|
||||
Mat B = (cv::Mat_<double>(4, 5) << 0., 1., 4., 4., 3.,
|
||||
3., 1., 2., 2., 3.,
|
||||
4., 4., 0., 1., 4.,
|
||||
4., 0., 4., 1., 4.);
|
||||
Mat z;
|
||||
int result = cv::solveLP(A, B, z);
|
||||
EXPECT_EQ(SOLVELP_LOST, result);
|
||||
}
|
||||
|
||||
}} // namespace
|
||||
|
||||
@@ -18,7 +18,7 @@ class Core_ReduceTest : public cvtest::BaseTest
|
||||
public:
|
||||
Core_ReduceTest() {}
|
||||
protected:
|
||||
void run( int);
|
||||
void run( int) CV_OVERRIDE;
|
||||
int checkOp( const Mat& src, int dstType, int opType, const Mat& opRes, int dim );
|
||||
int checkCase( int srcType, int dstType, int dim, Size sz );
|
||||
int checkDim( int dim, Size sz );
|
||||
@@ -495,7 +495,7 @@ public:
|
||||
Core_ArrayOpTest();
|
||||
~Core_ArrayOpTest();
|
||||
protected:
|
||||
void run(int);
|
||||
void run(int) CV_OVERRIDE;
|
||||
};
|
||||
|
||||
|
||||
@@ -599,6 +599,11 @@ static void setValue(SparseMat& M, const int* idx, double value, RNG& rng)
|
||||
CV_Error(CV_StsUnsupportedFormat, "");
|
||||
}
|
||||
|
||||
#if defined(__GNUC__) && (__GNUC__ == 11 || __GNUC__ == 12)
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Warray-bounds"
|
||||
#endif
|
||||
|
||||
template<typename Pixel>
|
||||
struct InitializerFunctor{
|
||||
/// Initializer for cv::Mat::forEach test
|
||||
@@ -621,6 +626,11 @@ struct InitializerFunctor5D{
|
||||
}
|
||||
};
|
||||
|
||||
#if defined(__GNUC__) && (__GNUC__ == 11 || __GNUC__ == 12)
|
||||
#pragma GCC diagnostic pop
|
||||
#endif
|
||||
|
||||
|
||||
template<typename Pixel>
|
||||
struct EmptyFunctor
|
||||
{
|
||||
@@ -1023,7 +1033,7 @@ class Core_MergeSplitBaseTest : public cvtest::BaseTest
|
||||
protected:
|
||||
virtual int run_case(int depth, size_t channels, const Size& size, RNG& rng) = 0;
|
||||
|
||||
virtual void run(int)
|
||||
virtual void run(int) CV_OVERRIDE
|
||||
{
|
||||
// m is Mat
|
||||
// mv is vector<Mat>
|
||||
@@ -1068,7 +1078,7 @@ public:
|
||||
~Core_MergeTest() {}
|
||||
|
||||
protected:
|
||||
virtual int run_case(int depth, size_t matCount, const Size& size, RNG& rng)
|
||||
virtual int run_case(int depth, size_t matCount, const Size& size, RNG& rng) CV_OVERRIDE
|
||||
{
|
||||
const int maxMatChannels = 10;
|
||||
|
||||
@@ -1126,7 +1136,7 @@ public:
|
||||
~Core_SplitTest() {}
|
||||
|
||||
protected:
|
||||
virtual int run_case(int depth, size_t channels, const Size& size, RNG& rng)
|
||||
virtual int run_case(int depth, size_t channels, const Size& size, RNG& rng) CV_OVERRIDE
|
||||
{
|
||||
Mat src(size, CV_MAKETYPE(depth, (int)channels));
|
||||
rng.fill(src, RNG::UNIFORM, 0, 100, true);
|
||||
@@ -1990,7 +2000,6 @@ TEST(Core_InputArray, fetch_MatExpr)
|
||||
}
|
||||
|
||||
|
||||
#ifdef CV_CXX11
|
||||
class TestInputArrayRangeChecking {
|
||||
static const char *kind2str(cv::_InputArray ia)
|
||||
{
|
||||
@@ -2136,8 +2145,6 @@ TEST(Core_InputArray, range_checking)
|
||||
{
|
||||
TestInputArrayRangeChecking::run();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
TEST(Core_Vectors, issue_13078)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user