mirror of
https://github.com/opencv/opencv.git
synced 2025-06-13 13:13:26 +08:00
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
commit
735a79ae83
@ -1194,7 +1194,7 @@ double norm( InputArray _src1, InputArray _src2, int normType, InputArray _mask
|
|||||||
// special case to handle "integer" overflow in accumulator
|
// special case to handle "integer" overflow in accumulator
|
||||||
const size_t esz = src1.elemSize();
|
const size_t esz = src1.elemSize();
|
||||||
const int total = (int)it.size;
|
const int total = (int)it.size;
|
||||||
const int intSumBlockSize = normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15);
|
const int intSumBlockSize = (normType == NORM_L1 && depth <= CV_8S ? (1 << 23) : (1 << 15))/cn;
|
||||||
const int blockSize = std::min(total, intSumBlockSize);
|
const int blockSize = std::min(total, intSumBlockSize);
|
||||||
int isum = 0;
|
int isum = 0;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
|
@ -2166,6 +2166,15 @@ TEST(Core_Norm, IPP_regression_NORM_L1_16UC3_small)
|
|||||||
EXPECT_EQ((double)20*cn, cv::norm(a, b, NORM_L1, mask));
|
EXPECT_EQ((double)20*cn, cv::norm(a, b, NORM_L1, mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Core_Norm, NORM_L2_8UC4)
|
||||||
|
{
|
||||||
|
// Tests there is no integer overflow in norm computation for multiple channels.
|
||||||
|
const int kSide = 100;
|
||||||
|
cv::Mat4b a(kSide, kSide, cv::Scalar(255, 255, 255, 255));
|
||||||
|
cv::Mat4b b = cv::Mat4b::zeros(kSide, kSide);
|
||||||
|
const double kNorm = 2.*kSide*255.;
|
||||||
|
EXPECT_EQ(kNorm, cv::norm(a, b, NORM_L2));
|
||||||
|
}
|
||||||
|
|
||||||
TEST(Core_ConvertTo, regression_12121)
|
TEST(Core_ConvertTo, regression_12121)
|
||||||
{
|
{
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -1337,6 +1337,13 @@ CV_EXPORTS_W void drawMatches( InputArray img1, const std::vector<KeyPoint>& key
|
|||||||
const std::vector<char>& matchesMask=std::vector<char>(), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT );
|
const std::vector<char>& matchesMask=std::vector<char>(), DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT );
|
||||||
|
|
||||||
/** @overload */
|
/** @overload */
|
||||||
|
CV_EXPORTS_W void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
||||||
|
InputArray img2, const std::vector<KeyPoint>& keypoints2,
|
||||||
|
const std::vector<DMatch>& matches1to2, InputOutputArray outImg,
|
||||||
|
const int matchesThickness, const Scalar& matchColor=Scalar::all(-1),
|
||||||
|
const Scalar& singlePointColor=Scalar::all(-1), const std::vector<char>& matchesMask=std::vector<char>(),
|
||||||
|
DrawMatchesFlags flags=DrawMatchesFlags::DEFAULT );
|
||||||
|
|
||||||
CV_EXPORTS_AS(drawMatchesKnn) void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
CV_EXPORTS_AS(drawMatchesKnn) void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
||||||
InputArray img2, const std::vector<KeyPoint>& keypoints2,
|
InputArray img2, const std::vector<KeyPoint>& keypoints2,
|
||||||
const std::vector<std::vector<DMatch> >& matches1to2, InputOutputArray outImg,
|
const std::vector<std::vector<DMatch> >& matches1to2, InputOutputArray outImg,
|
||||||
|
@ -183,7 +183,8 @@ static void _prepareImgAndDrawKeypoints( InputArray img1, const std::vector<KeyP
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void _drawMatch( InputOutputArray outImg, InputOutputArray outImg1, InputOutputArray outImg2 ,
|
static inline void _drawMatch( InputOutputArray outImg, InputOutputArray outImg1, InputOutputArray outImg2 ,
|
||||||
const KeyPoint& kp1, const KeyPoint& kp2, const Scalar& matchColor, DrawMatchesFlags flags )
|
const KeyPoint& kp1, const KeyPoint& kp2, const Scalar& matchColor, DrawMatchesFlags flags,
|
||||||
|
const int matchesThickness )
|
||||||
{
|
{
|
||||||
RNG& rng = theRNG();
|
RNG& rng = theRNG();
|
||||||
bool isRandMatchColor = matchColor == Scalar::all(-1);
|
bool isRandMatchColor = matchColor == Scalar::all(-1);
|
||||||
@ -199,7 +200,7 @@ static inline void _drawMatch( InputOutputArray outImg, InputOutputArray outImg1
|
|||||||
line( outImg,
|
line( outImg,
|
||||||
Point(cvRound(pt1.x*draw_multiplier), cvRound(pt1.y*draw_multiplier)),
|
Point(cvRound(pt1.x*draw_multiplier), cvRound(pt1.y*draw_multiplier)),
|
||||||
Point(cvRound(dpt2.x*draw_multiplier), cvRound(dpt2.y*draw_multiplier)),
|
Point(cvRound(dpt2.x*draw_multiplier), cvRound(dpt2.y*draw_multiplier)),
|
||||||
color, 1, LINE_AA, draw_shift_bits );
|
color, matchesThickness, LINE_AA, draw_shift_bits );
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
||||||
@ -207,6 +208,21 @@ void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
|||||||
const std::vector<DMatch>& matches1to2, InputOutputArray outImg,
|
const std::vector<DMatch>& matches1to2, InputOutputArray outImg,
|
||||||
const Scalar& matchColor, const Scalar& singlePointColor,
|
const Scalar& matchColor, const Scalar& singlePointColor,
|
||||||
const std::vector<char>& matchesMask, DrawMatchesFlags flags )
|
const std::vector<char>& matchesMask, DrawMatchesFlags flags )
|
||||||
|
{
|
||||||
|
drawMatches( img1, keypoints1,
|
||||||
|
img2, keypoints2,
|
||||||
|
matches1to2, outImg,
|
||||||
|
1, matchColor,
|
||||||
|
singlePointColor, matchesMask,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
||||||
|
InputArray img2, const std::vector<KeyPoint>& keypoints2,
|
||||||
|
const std::vector<DMatch>& matches1to2, InputOutputArray outImg,
|
||||||
|
const int matchesThickness, const Scalar& matchColor,
|
||||||
|
const Scalar& singlePointColor, const std::vector<char>& matchesMask,
|
||||||
|
DrawMatchesFlags flags )
|
||||||
{
|
{
|
||||||
if( !matchesMask.empty() && matchesMask.size() != matches1to2.size() )
|
if( !matchesMask.empty() && matchesMask.size() != matches1to2.size() )
|
||||||
CV_Error( Error::StsBadSize, "matchesMask must have the same size as matches1to2" );
|
CV_Error( Error::StsBadSize, "matchesMask must have the same size as matches1to2" );
|
||||||
@ -226,11 +242,12 @@ void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
|||||||
CV_Assert(i2 >= 0 && i2 < static_cast<int>(keypoints2.size()));
|
CV_Assert(i2 >= 0 && i2 < static_cast<int>(keypoints2.size()));
|
||||||
|
|
||||||
const KeyPoint &kp1 = keypoints1[i1], &kp2 = keypoints2[i2];
|
const KeyPoint &kp1 = keypoints1[i1], &kp2 = keypoints2[i2];
|
||||||
_drawMatch( outImg, outImg1, outImg2, kp1, kp2, matchColor, flags );
|
_drawMatch( outImg, outImg1, outImg2, kp1, kp2, matchColor, flags, matchesThickness );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
||||||
InputArray img2, const std::vector<KeyPoint>& keypoints2,
|
InputArray img2, const std::vector<KeyPoint>& keypoints2,
|
||||||
const std::vector<std::vector<DMatch> >& matches1to2, InputOutputArray outImg,
|
const std::vector<std::vector<DMatch> >& matches1to2, InputOutputArray outImg,
|
||||||
@ -254,7 +271,7 @@ void drawMatches( InputArray img1, const std::vector<KeyPoint>& keypoints1,
|
|||||||
if( matchesMask.empty() || matchesMask[i][j] )
|
if( matchesMask.empty() || matchesMask[i][j] )
|
||||||
{
|
{
|
||||||
const KeyPoint &kp1 = keypoints1[i1], &kp2 = keypoints2[i2];
|
const KeyPoint &kp1 = keypoints1[i1], &kp2 = keypoints2[i2];
|
||||||
_drawMatch( outImg, outImg1, outImg2, kp1, kp2, matchColor, flags );
|
_drawMatch( outImg, outImg1, outImg2, kp1, kp2, matchColor, flags, 1 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2023,6 +2023,7 @@ static gboolean icvOnMouse( GtkWidget *widget, GdkEvent *event, gpointer user_da
|
|||||||
(unsigned)pt.y < (unsigned)(image_widget->original_image->height)
|
(unsigned)pt.y < (unsigned)(image_widget->original_image->height)
|
||||||
))
|
))
|
||||||
{
|
{
|
||||||
|
state &= gtk_accelerator_get_default_mod_mask();
|
||||||
flags |= BIT_MAP(state, GDK_SHIFT_MASK, CV_EVENT_FLAG_SHIFTKEY) |
|
flags |= BIT_MAP(state, GDK_SHIFT_MASK, CV_EVENT_FLAG_SHIFTKEY) |
|
||||||
BIT_MAP(state, GDK_CONTROL_MASK, CV_EVENT_FLAG_CTRLKEY) |
|
BIT_MAP(state, GDK_CONTROL_MASK, CV_EVENT_FLAG_CTRLKEY) |
|
||||||
BIT_MAP(state, GDK_MOD1_MASK, CV_EVENT_FLAG_ALTKEY) |
|
BIT_MAP(state, GDK_MOD1_MASK, CV_EVENT_FLAG_ALTKEY) |
|
||||||
|
@ -47,24 +47,16 @@
|
|||||||
namespace cv
|
namespace cv
|
||||||
{
|
{
|
||||||
|
|
||||||
int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& rect2, OutputArray intersectingRegion )
|
static int _rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& rect2, std::vector<Point2f> &intersection )
|
||||||
{
|
{
|
||||||
CV_INSTRUMENT_REGION();
|
CV_INSTRUMENT_REGION();
|
||||||
|
|
||||||
// L2 metric
|
// L2 metric
|
||||||
const float samePointEps = std::max(1e-16f, 1e-6f * (float)std::max(rect1.size.area(), rect2.size.area()));
|
const float samePointEps = std::max(1e-16f, 1e-6f * (float)std::max(rect1.size.area(), rect2.size.area()));
|
||||||
|
|
||||||
if (rect1.size.empty() || rect2.size.empty())
|
|
||||||
{
|
|
||||||
intersectingRegion.release();
|
|
||||||
return INTERSECT_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
Point2f vec1[4], vec2[4];
|
Point2f vec1[4], vec2[4];
|
||||||
Point2f pts1[4], pts2[4];
|
Point2f pts1[4], pts2[4];
|
||||||
|
|
||||||
std::vector <Point2f> intersection; intersection.reserve(24);
|
|
||||||
|
|
||||||
rect1.points(pts1);
|
rect1.points(pts1);
|
||||||
rect2.points(pts2);
|
rect2.points(pts2);
|
||||||
|
|
||||||
@ -92,8 +84,6 @@ int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& r
|
|||||||
intersection[i] = pts1[i];
|
intersection[i] = pts1[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
Mat(intersection).copyTo(intersectingRegion);
|
|
||||||
|
|
||||||
return INTERSECT_FULL;
|
return INTERSECT_FULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -300,7 +290,50 @@ int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& r
|
|||||||
}
|
}
|
||||||
|
|
||||||
intersection.resize(N);
|
intersection.resize(N);
|
||||||
Mat(intersection).copyTo(intersectingRegion);
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int rotatedRectangleIntersection( const RotatedRect& rect1, const RotatedRect& rect2, OutputArray intersectingRegion )
|
||||||
|
{
|
||||||
|
CV_INSTRUMENT_REGION();
|
||||||
|
|
||||||
|
if (rect1.size.empty() || rect2.size.empty())
|
||||||
|
{
|
||||||
|
intersectingRegion.release();
|
||||||
|
return INTERSECT_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Shift rectangles closer to origin (0, 0) to improve the calculation of the intesection region
|
||||||
|
// To do that, the average center of the rectangles is moved to the origin
|
||||||
|
const Point2f averageCenter = (rect1.center + rect2.center) / 2.0f;
|
||||||
|
|
||||||
|
RotatedRect shiftedRect1(rect1);
|
||||||
|
RotatedRect shiftedRect2(rect2);
|
||||||
|
|
||||||
|
// Move rectangles closer to origin
|
||||||
|
shiftedRect1.center -= averageCenter;
|
||||||
|
shiftedRect2.center -= averageCenter;
|
||||||
|
|
||||||
|
std::vector <Point2f> intersection; intersection.reserve(24);
|
||||||
|
|
||||||
|
const int ret = _rotatedRectangleIntersection(shiftedRect1, shiftedRect2, intersection);
|
||||||
|
|
||||||
|
// If return is not None, the intersection Points are shifted back to the original position
|
||||||
|
// and copied to the interesectingRegion
|
||||||
|
if (ret != INTERSECT_NONE)
|
||||||
|
{
|
||||||
|
for (size_t i = 0; i < intersection.size(); ++i)
|
||||||
|
{
|
||||||
|
intersection[i] += averageCenter;
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat(intersection).copyTo(intersectingRegion);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
intersectingRegion.release();
|
||||||
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -391,4 +391,21 @@ TEST(Imgproc_RotatedRectangleIntersection, regression_18520)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Imgproc_RotatedRectangleIntersection, regression_19824)
|
||||||
|
{
|
||||||
|
RotatedRect r1(
|
||||||
|
Point2f(246805.033f, 4002326.94f),
|
||||||
|
Size2f(26.40587f, 6.20026f),
|
||||||
|
-62.10156f);
|
||||||
|
RotatedRect r2(
|
||||||
|
Point2f(246805.122f, 4002326.59f),
|
||||||
|
Size2f(27.4821f, 8.5361f),
|
||||||
|
-56.33761f);
|
||||||
|
|
||||||
|
std::vector<Point2f> intersections;
|
||||||
|
int interType = cv::rotatedRectangleIntersection(r1, r2, intersections);
|
||||||
|
EXPECT_EQ(INTERSECT_PARTIAL, interType);
|
||||||
|
EXPECT_LE(intersections.size(), (size_t)7);
|
||||||
|
}
|
||||||
|
|
||||||
}} // namespace
|
}} // namespace
|
||||||
|
Loading…
Reference in New Issue
Block a user