Skip to content

Commit ee4feb4

Browse files
shimatalalek
authored andcommitted
Merge pull request opencv#16208 from shimat:fix_compare_16f
* add cv::compare test when Mat type == CV_16F * add assertion in cv::compare when src.depth() == CV_16F * cv::compare assertion minor fix * core: add more checks
1 parent 1fac142 commit ee4feb4

File tree

2 files changed

+28
-4
lines changed

2 files changed

+28
-4
lines changed

modules/core/src/arithm.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t bl
6161
{
6262
int scn = (int)sc.total(), cn = CV_MAT_CN(buftype);
6363
size_t esz = CV_ELEM_SIZE(buftype);
64-
getConvertFunc(sc.depth(), buftype)(sc.ptr(), 1, 0, 1, scbuf, 1, Size(std::min(cn, scn), 1), 0);
64+
BinaryFunc cvtFn = getConvertFunc(sc.depth(), buftype);
65+
CV_Assert(cvtFn);
66+
cvtFn(sc.ptr(), 1, 0, 1, scbuf, 1, Size(std::min(cn, scn), 1), 0);
6567
// unroll the scalar
6668
if( scn < cn )
6769
{
@@ -196,7 +198,10 @@ static void binary_op( InputArray _src1, InputArray _src2, OutputArray _dst,
196198
cn = (int)CV_ELEM_SIZE(type1);
197199
}
198200
else
201+
{
199202
func = tab[depth1];
203+
}
204+
CV_Assert(func);
200205

201206
Mat src1 = psrc1->getMat(), src2 = psrc2->getMat(), dst = _dst.getMat();
202207
Size sz = getContinuousSize2D(src1, src2, dst);
@@ -270,6 +275,7 @@ static void binary_op( InputArray _src1, InputArray _src2, OutputArray _dst,
270275
}
271276
else
272277
func = tab[depth1];
278+
CV_Assert(func);
273279

274280
if( !haveScalar )
275281
{
@@ -745,6 +751,7 @@ static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
745751
(cvtdst ? wsz : 0) +
746752
(haveMask ? dsz : 0);
747753
BinaryFuncC func = tab[CV_MAT_DEPTH(wtype)];
754+
CV_Assert(func);
748755

749756
if( !haveScalar )
750757
{
@@ -1228,17 +1235,23 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
12281235
_InputArray::KindFlag kind1 = _src1.kind(), kind2 = _src2.kind();
12291236
Mat src1 = _src1.getMat(), src2 = _src2.getMat();
12301237

1238+
int depth1 = src1.depth(), depth2 = src2.depth();
1239+
if (depth1 == CV_16F || depth2 == CV_16F)
1240+
CV_Error(Error::StsNotImplemented, "Unsupported depth value CV_16F");
1241+
12311242
if( kind1 == kind2 && src1.dims <= 2 && src2.dims <= 2 && src1.size() == src2.size() && src1.type() == src2.type() )
12321243
{
12331244
int cn = src1.channels();
12341245
_dst.create(src1.size(), CV_8UC(cn));
12351246
Mat dst = _dst.getMat();
12361247
Size sz = getContinuousSize2D(src1, src2, dst, src1.channels());
1237-
getCmpFunc(src1.depth())(src1.ptr(), src1.step, src2.ptr(), src2.step, dst.ptr(), dst.step, sz.width, sz.height, &op);
1248+
BinaryFuncC cmpFn = getCmpFunc(depth1);
1249+
CV_Assert(cmpFn);
1250+
cmpFn(src1.ptr(), src1.step, src2.ptr(), src2.step, dst.ptr(), dst.step, sz.width, sz.height, &op);
12381251
return;
12391252
}
12401253

1241-
int cn = src1.channels(), depth1 = src1.depth(), depth2 = src2.depth();
1254+
int cn = src1.channels();
12421255

12431256
_dst.create(src1.dims, src1.size, CV_8UC(cn));
12441257
src1 = src1.reshape(1); src2 = src2.reshape(1);
@@ -1247,6 +1260,7 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
12471260
size_t esz = std::max(src1.elemSize(), (size_t)1);
12481261
size_t blocksize0 = (size_t)(BLOCK_SIZE + esz-1)/esz;
12491262
BinaryFuncC func = getCmpFunc(depth1);
1263+
CV_Assert(func);
12501264

12511265
if( !haveScalar )
12521266
{
@@ -1275,7 +1289,9 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
12751289
else
12761290
{
12771291
double fval=0;
1278-
getConvertFunc(depth2, CV_64F)(src2.ptr(), 1, 0, 1, (uchar*)&fval, 1, Size(1,1), 0);
1292+
BinaryFunc cvtFn = getConvertFunc(depth2, CV_64F);
1293+
CV_Assert(cvtFn);
1294+
cvtFn(src2.ptr(), 1, 0, 1, (uchar*)&fval, 1, Size(1,1), 0);
12791295
if( fval < getMinVal(depth1) )
12801296
{
12811297
dst = Scalar::all(op == CMP_GT || op == CMP_GE || op == CMP_NE ? 255 : 0);

modules/core/test/test_arithm.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,6 +2021,14 @@ TEST(Compare, regression_8999)
20212021
EXPECT_THROW(cv::compare(A, B, C, CMP_LT), cv::Exception);
20222022
}
20232023

2024+
TEST(Compare, regression_16F_do_not_crash)
2025+
{
2026+
cv::Mat mat1(2, 2, CV_16F, cv::Scalar(1));
2027+
cv::Mat mat2(2, 2, CV_16F, cv::Scalar(2));
2028+
cv::Mat dst;
2029+
EXPECT_THROW(cv::compare(mat1, mat2, dst, cv::CMP_EQ), cv::Exception);
2030+
}
2031+
20242032

20252033
TEST(Core_minMaxIdx, regression_9207_1)
20262034
{

0 commit comments

Comments
 (0)