Skip to content

Commit f290ff2

Browse files
committed
features2d: fix ORB::setFirstScale() handling
1 parent 8286d84 commit f290ff2

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

modules/features2d/src/orb.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1025,15 +1025,20 @@ void ORB_Impl::detectAndCompute( InputArray _image, InputArray _mask,
10251025
Mat imagePyramid, maskPyramid;
10261026
UMat uimagePyramid, ulayerInfo;
10271027

1028-
int level_dy = image.rows + border*2;
1029-
Point level_ofs(0,0);
1030-
Size bufSize((cvRound(image.cols/getScale(0, firstLevel, scaleFactor)) + border*2 + 15) & -16, 0);
1028+
float level0_inv_scale = 1.0f / getScale(0, firstLevel, scaleFactor);
1029+
size_t level0_width = (size_t)cvRound(image.cols * level0_inv_scale);
1030+
size_t level0_height = (size_t)cvRound(image.rows * level0_inv_scale);
1031+
Size bufSize((int)alignSize(level0_width + border*2, 16), 0); // TODO change alignment to 64
1032+
1033+
int level_dy = (int)level0_height + border*2;
1034+
Point level_ofs(0, 0);
10311035

10321036
for( level = 0; level < nLevels; level++ )
10331037
{
10341038
float scale = getScale(level, firstLevel, scaleFactor);
10351039
layerScale[level] = scale;
1036-
Size sz(cvRound(image.cols/scale), cvRound(image.rows/scale));
1040+
float inv_scale = 1.0f / scale;
1041+
Size sz(cvRound(image.cols * inv_scale), cvRound(image.rows * inv_scale));
10371042
Size wholeSize(sz.width + border*2, sz.height + border*2);
10381043
if( level_ofs.x + wholeSize.width > bufSize.width )
10391044
{

modules/features2d/test/test_orb.cpp

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ TEST(Features2D_ORB, _1996)
9090
ASSERT_EQ(0, roiViolations);
9191
}
9292

93-
TEST(Features2D_ORB, crash)
93+
TEST(Features2D_ORB, crash_5031)
9494
{
9595
cv::Mat image = cv::Mat::zeros(cv::Size(1920, 1080), CV_8UC3);
9696

@@ -123,4 +123,23 @@ TEST(Features2D_ORB, crash)
123123
ASSERT_NO_THROW(orb->compute(image, keypoints, descriptors));
124124
}
125125

126+
127+
TEST(Features2D_ORB, regression_16197)
128+
{
129+
Mat img(Size(72, 72), CV_8UC1, Scalar::all(0));
130+
Ptr<ORB> orbPtr = ORB::create();
131+
orbPtr->setNLevels(5);
132+
orbPtr->setFirstLevel(3);
133+
orbPtr->setScaleFactor(1.8);
134+
orbPtr->setPatchSize(8);
135+
orbPtr->setEdgeThreshold(8);
136+
137+
std::vector<KeyPoint> kps;
138+
Mat fv;
139+
140+
// exception in debug mode, crash in release
141+
ASSERT_NO_THROW(orbPtr->detectAndCompute(img, noArray(), kps, fv));
142+
}
143+
144+
126145
}} // namespace

0 commit comments

Comments
 (0)