mirror of
https://github.com/opencv/opencv.git
synced 2026-07-30 15:53:03 +04:00
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
@@ -394,7 +394,9 @@ enum ConnectedComponentsTypes {
|
||||
CC_STAT_WIDTH = 2, //!< The horizontal size of the bounding box
|
||||
CC_STAT_HEIGHT = 3, //!< The vertical size of the bounding box
|
||||
CC_STAT_AREA = 4, //!< The total area (in pixels) of the connected component
|
||||
CC_STAT_MAX = 5
|
||||
#ifndef CV_DOXYGEN
|
||||
CC_STAT_MAX = 5 //!< Max enumeration value. Used internally only for memory allocation
|
||||
#endif
|
||||
};
|
||||
|
||||
//! connected components algorithm
|
||||
@@ -4008,7 +4010,23 @@ without self-intersections. Otherwise, the function output is undefined.
|
||||
*/
|
||||
CV_EXPORTS_W bool isContourConvex( InputArray contour );
|
||||
|
||||
//! finds intersection of two convex polygons
|
||||
/** @example samples/cpp/intersectExample.cpp
|
||||
Examples of how intersectConvexConvex works
|
||||
*/
|
||||
|
||||
/** @brief Finds intersection of two convex polygons
|
||||
|
||||
@param _p1 First polygon
|
||||
@param _p2 Second polygon
|
||||
@param _p12 Output polygon describing the intersecting area
|
||||
@param handleNested When true, an intersection is found if one of the polygons is fully enclosed in the other.
|
||||
When false, no intersection is found. If the polygons share a side or the vertex of one polygon lies on an edge
|
||||
of the other, they are not considered nested and an intersection will be found regardless of the value of handleNested.
|
||||
|
||||
@returns Absolute value of area of intersecting polygon
|
||||
|
||||
@note intersectConvexConvex doesn't confirm that both polygons are convex and will return invalid results if they aren't.
|
||||
*/
|
||||
CV_EXPORTS_W float intersectConvexConvex( InputArray _p1, InputArray _p2,
|
||||
OutputArray _p12, bool handleNested = true );
|
||||
|
||||
|
||||
@@ -2624,11 +2624,127 @@ void accW_simd_(const uchar* src, float* dst, const uchar* mask, int len, int cn
|
||||
v_dst10 = v_fma(v_dst10, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src10)) * v_alpha);
|
||||
v_dst11 = v_fma(v_dst11, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src11)) * v_alpha);
|
||||
|
||||
v_store(dst + x, v_dst00);
|
||||
v_store(dst + x + step, v_dst01);
|
||||
v_store(dst + x , v_dst00);
|
||||
v_store(dst + x + step , v_dst01);
|
||||
v_store(dst + x + step * 2, v_dst10);
|
||||
v_store(dst + x + step * 3, v_dst11);
|
||||
}
|
||||
} else {
|
||||
const v_float32 zero = vx_setall_f32((float)0);
|
||||
int size = len * cn;
|
||||
|
||||
if ( cn == 1 ){
|
||||
for (; x <= size - cVectorWidth; x += cVectorWidth)
|
||||
{
|
||||
v_uint8 v_src = vx_load(src + x);
|
||||
v_uint8 v_mask = vx_load(mask + x);
|
||||
|
||||
v_uint16 v_m0, v_m1;
|
||||
v_expand(v_mask, v_m0, v_m1);
|
||||
v_uint32 v_m00, v_m01, v_m10, v_m11;
|
||||
v_expand(v_m0, v_m00, v_m01);
|
||||
v_expand(v_m1, v_m10, v_m11);
|
||||
|
||||
v_float32 v_mf00, v_mf01, v_mf10, v_mf11;
|
||||
v_mf00 = v_cvt_f32(v_reinterpret_as_s32(v_m00));
|
||||
v_mf01 = v_cvt_f32(v_reinterpret_as_s32(v_m01));
|
||||
v_mf10 = v_cvt_f32(v_reinterpret_as_s32(v_m10));
|
||||
v_mf11 = v_cvt_f32(v_reinterpret_as_s32(v_m11));
|
||||
|
||||
v_uint16 v_src0, v_src1;
|
||||
v_expand(v_src, v_src0, v_src1);
|
||||
|
||||
v_uint32 v_src00, v_src01, v_src10, v_src11;
|
||||
v_expand(v_src0, v_src00, v_src01);
|
||||
v_expand(v_src1, v_src10, v_src11);
|
||||
|
||||
v_float32 v_dst00 = vx_load(dst + x);
|
||||
v_float32 v_dst01 = vx_load(dst + x + step);
|
||||
v_float32 v_dst10 = vx_load(dst + x + step * 2);
|
||||
v_float32 v_dst11 = vx_load(dst + x + step * 3);
|
||||
|
||||
v_mf00 = v_mf00 != zero;
|
||||
v_mf01 = v_mf01 != zero;
|
||||
v_mf10 = v_mf10 != zero;
|
||||
v_mf11 = v_mf11 != zero;
|
||||
|
||||
v_dst00 = v_select(v_mf00, v_fma(v_dst00, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src00)) * v_alpha), v_dst00);
|
||||
v_dst01 = v_select(v_mf01, v_fma(v_dst01, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src01)) * v_alpha), v_dst01);
|
||||
v_dst10 = v_select(v_mf10, v_fma(v_dst10, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src10)) * v_alpha), v_dst10);
|
||||
v_dst11 = v_select(v_mf11, v_fma(v_dst11, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src11)) * v_alpha), v_dst11);
|
||||
|
||||
v_store(dst + x , v_dst00);
|
||||
v_store(dst + x + step , v_dst01);
|
||||
v_store(dst + x + step * 2, v_dst10);
|
||||
v_store(dst + x + step * 3, v_dst11);
|
||||
}
|
||||
} else if ( cn == 3 )
|
||||
{
|
||||
for (; x*cn <= size - cVectorWidth*cn; x += cVectorWidth )
|
||||
{
|
||||
v_uint8 v_src0, v_src1, v_src2;
|
||||
v_load_deinterleave(src + x * cn, v_src0, v_src1, v_src2);
|
||||
|
||||
v_uint16 v_src00, v_src01, v_src10, v_src11, v_src20, v_src21;
|
||||
v_expand(v_src0, v_src00, v_src01);
|
||||
v_expand(v_src1, v_src10, v_src11);
|
||||
v_expand(v_src2, v_src20, v_src21);
|
||||
|
||||
v_uint32 v_src000, v_src001, v_src010, v_src011, v_src100, v_src101, v_src110, v_src111, v_src200, v_src201, v_src210, v_src211;
|
||||
v_expand(v_src00, v_src000, v_src001);
|
||||
v_expand(v_src01, v_src010, v_src011);
|
||||
v_expand(v_src10, v_src100, v_src101);
|
||||
v_expand(v_src11, v_src110, v_src111);
|
||||
v_expand(v_src20, v_src200, v_src201);
|
||||
v_expand(v_src21, v_src210, v_src211);
|
||||
|
||||
v_float32 v_dst00, v_dst01, v_dst02, v_dst03, v_dst10, v_dst11, v_dst12, v_dst13;
|
||||
v_float32 v_dst20, v_dst21, v_dst22, v_dst23;
|
||||
v_load_deinterleave(dst + x * cn , v_dst00, v_dst10, v_dst20);
|
||||
v_load_deinterleave(dst + (x + step) * cn, v_dst01, v_dst11, v_dst21);
|
||||
v_load_deinterleave(dst + (x + 2 * step) * cn, v_dst02, v_dst12, v_dst22);
|
||||
v_load_deinterleave(dst + (x + 3 * step) * cn, v_dst03, v_dst13, v_dst23);
|
||||
|
||||
v_uint8 v_mask = vx_load(mask + x);
|
||||
|
||||
v_uint16 v_m0, v_m1;
|
||||
v_expand(v_mask, v_m0, v_m1);
|
||||
v_uint32 v_m00, v_m01, v_m10, v_m11;
|
||||
v_expand(v_m0, v_m00, v_m01);
|
||||
v_expand(v_m1, v_m10, v_m11);
|
||||
|
||||
v_float32 v_mf00, v_mf01, v_mf10, v_mf11;
|
||||
v_mf00 = v_cvt_f32(v_reinterpret_as_s32(v_m00));
|
||||
v_mf01 = v_cvt_f32(v_reinterpret_as_s32(v_m01));
|
||||
v_mf10 = v_cvt_f32(v_reinterpret_as_s32(v_m10));
|
||||
v_mf11 = v_cvt_f32(v_reinterpret_as_s32(v_m11));
|
||||
|
||||
v_mf00 = v_mf00 != zero;
|
||||
v_mf01 = v_mf01 != zero;
|
||||
v_mf10 = v_mf10 != zero;
|
||||
v_mf11 = v_mf11 != zero;
|
||||
|
||||
v_dst00 = v_select(v_mf00, v_fma(v_dst00, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src000)) * v_alpha), v_dst00);
|
||||
v_dst01 = v_select(v_mf01, v_fma(v_dst01, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src001)) * v_alpha), v_dst01);
|
||||
v_dst02 = v_select(v_mf10, v_fma(v_dst02, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src010)) * v_alpha), v_dst02);
|
||||
v_dst03 = v_select(v_mf11, v_fma(v_dst03, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src011)) * v_alpha), v_dst03);
|
||||
|
||||
v_dst10 = v_select(v_mf00, v_fma(v_dst10, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src100)) * v_alpha), v_dst10);
|
||||
v_dst11 = v_select(v_mf01, v_fma(v_dst11, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src101)) * v_alpha), v_dst11);
|
||||
v_dst12 = v_select(v_mf10, v_fma(v_dst12, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src110)) * v_alpha), v_dst12);
|
||||
v_dst13 = v_select(v_mf11, v_fma(v_dst13, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src111)) * v_alpha), v_dst13);
|
||||
|
||||
v_dst20 = v_select(v_mf00, v_fma(v_dst20, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src200)) * v_alpha), v_dst20);
|
||||
v_dst21 = v_select(v_mf01, v_fma(v_dst21, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src201)) * v_alpha), v_dst21);
|
||||
v_dst22 = v_select(v_mf10, v_fma(v_dst22, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src210)) * v_alpha), v_dst22);
|
||||
v_dst23 = v_select(v_mf11, v_fma(v_dst23, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src211)) * v_alpha), v_dst23);
|
||||
|
||||
v_store_interleave(dst + x * cn , v_dst00, v_dst10, v_dst20);
|
||||
v_store_interleave(dst + ( x + step ) * cn, v_dst01, v_dst11, v_dst21);
|
||||
v_store_interleave(dst + ( x + step * 2 ) * cn, v_dst02, v_dst12, v_dst22);
|
||||
v_store_interleave(dst + ( x + step * 3 ) * cn, v_dst03, v_dst13, v_dst23);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // CV_SIMD
|
||||
accW_general_(src, dst, mask, len, cn, alpha, x);
|
||||
@@ -2657,9 +2773,81 @@ void accW_simd_(const ushort* src, float* dst, const uchar* mask, int len, int c
|
||||
v_dst0 = v_fma(v_dst0, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_int0)) * v_alpha);
|
||||
v_dst1 = v_fma(v_dst1, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_int1)) * v_alpha);
|
||||
|
||||
v_store(dst + x, v_dst0);
|
||||
v_store(dst + x , v_dst0);
|
||||
v_store(dst + x + step, v_dst1);
|
||||
}
|
||||
} else {
|
||||
const v_float32 zero = vx_setall_f32((float)0);
|
||||
int size = len * cn;
|
||||
if ( cn == 1 )
|
||||
{
|
||||
for (; x <= size - cVectorWidth; x += cVectorWidth)
|
||||
{
|
||||
v_uint16 v_src = vx_load(src + x);
|
||||
v_uint16 v_mask = v_reinterpret_as_u16(vx_load_expand(mask + x));
|
||||
|
||||
v_uint32 v_m0, v_m1;
|
||||
v_expand(v_mask, v_m0, v_m1);
|
||||
|
||||
v_float32 v_mf0, v_mf1;
|
||||
v_mf0 = v_cvt_f32(v_reinterpret_as_s32(v_m0));
|
||||
v_mf1 = v_cvt_f32(v_reinterpret_as_s32(v_m1));
|
||||
|
||||
v_uint32 v_src0, v_src1;
|
||||
v_expand(v_src, v_src0, v_src1);
|
||||
|
||||
v_float32 v_dst0 = vx_load(dst + x);
|
||||
v_float32 v_dst1 = vx_load(dst + x + step);
|
||||
|
||||
v_mf0 = v_mf0 != zero;
|
||||
v_mf1 = v_mf1 != zero;
|
||||
|
||||
v_dst0 = v_select(v_mf0, v_fma(v_dst0, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src0)) * v_alpha), v_dst0);
|
||||
v_dst1 = v_select(v_mf1, v_fma(v_dst1, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src1)) * v_alpha), v_dst1);
|
||||
|
||||
v_store(dst + x , v_dst0);
|
||||
v_store(dst + x + step, v_dst1);
|
||||
}
|
||||
} else if ( cn == 3 )
|
||||
{
|
||||
for (; x*cn <= size - cVectorWidth*cn; x += cVectorWidth )
|
||||
{
|
||||
v_uint16 v_src0, v_src1, v_src2;
|
||||
v_load_deinterleave(src + x * cn, v_src0, v_src1, v_src2);
|
||||
|
||||
v_uint16 v_mask = v_reinterpret_as_u16(vx_load_expand(mask + x));
|
||||
|
||||
v_uint32 v_m0, v_m1;
|
||||
v_expand(v_mask, v_m0, v_m1);
|
||||
|
||||
v_uint32 v_src00, v_src01, v_src10, v_src11, v_src20, v_src21;
|
||||
v_expand(v_src0, v_src00, v_src01);
|
||||
v_expand(v_src1, v_src10, v_src11);
|
||||
v_expand(v_src2, v_src20, v_src21);
|
||||
|
||||
v_float32 v_dst00, v_dst01, v_dst02, v_dst10, v_dst11, v_dst20, v_dst21;
|
||||
v_load_deinterleave(dst + x * cn , v_dst00, v_dst10, v_dst20);
|
||||
v_load_deinterleave(dst + (x + step) * cn, v_dst01, v_dst11, v_dst21);
|
||||
|
||||
v_float32 v_mf0, v_mf1;
|
||||
v_mf0 = v_cvt_f32(v_reinterpret_as_s32(v_m0));
|
||||
v_mf1 = v_cvt_f32(v_reinterpret_as_s32(v_m1));
|
||||
|
||||
v_mf0 = v_mf0 != zero;
|
||||
v_mf1 = v_mf1 != zero;
|
||||
|
||||
v_dst00 = v_select(v_mf0, v_fma(v_dst00, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src00)) * v_alpha), v_dst00);
|
||||
v_dst10 = v_select(v_mf0, v_fma(v_dst10, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src10)) * v_alpha), v_dst10);
|
||||
v_dst20 = v_select(v_mf0, v_fma(v_dst20, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src20)) * v_alpha), v_dst20);
|
||||
|
||||
v_dst01 = v_select(v_mf1, v_fma(v_dst01, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src01)) * v_alpha), v_dst01);
|
||||
v_dst11 = v_select(v_mf1, v_fma(v_dst11, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src11)) * v_alpha), v_dst11);
|
||||
v_dst21 = v_select(v_mf1, v_fma(v_dst21, v_beta, v_cvt_f32(v_reinterpret_as_s32(v_src21)) * v_alpha), v_dst21);
|
||||
|
||||
v_store_interleave(dst + x * cn , v_dst00, v_dst10, v_dst20);
|
||||
v_store_interleave(dst + ( x + step ) * cn, v_dst01, v_dst11, v_dst21);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif // CV_SIMD
|
||||
accW_general_(src, dst, mask, len, cn, alpha, x);
|
||||
|
||||
Reference in New Issue
Block a user