@@ -61,7 +61,9 @@ void convertAndUnrollScalar( const Mat& sc, int buftype, uchar* scbuf, size_t bl
61
61
{
62
62
int scn = (int )sc.total (), cn = CV_MAT_CN (buftype);
63
63
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 );
65
67
// unroll the scalar
66
68
if ( scn < cn )
67
69
{
@@ -196,7 +198,10 @@ static void binary_op( InputArray _src1, InputArray _src2, OutputArray _dst,
196
198
cn = (int )CV_ELEM_SIZE (type1);
197
199
}
198
200
else
201
+ {
199
202
func = tab[depth1];
203
+ }
204
+ CV_Assert (func);
200
205
201
206
Mat src1 = psrc1->getMat (), src2 = psrc2->getMat (), dst = _dst.getMat ();
202
207
Size sz = getContinuousSize2D (src1, src2, dst);
@@ -270,6 +275,7 @@ static void binary_op( InputArray _src1, InputArray _src2, OutputArray _dst,
270
275
}
271
276
else
272
277
func = tab[depth1];
278
+ CV_Assert (func);
273
279
274
280
if ( !haveScalar )
275
281
{
@@ -745,6 +751,7 @@ static void arithm_op(InputArray _src1, InputArray _src2, OutputArray _dst,
745
751
(cvtdst ? wsz : 0 ) +
746
752
(haveMask ? dsz : 0 );
747
753
BinaryFuncC func = tab[CV_MAT_DEPTH (wtype)];
754
+ CV_Assert (func);
748
755
749
756
if ( !haveScalar )
750
757
{
@@ -1228,17 +1235,23 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
1228
1235
_InputArray::KindFlag kind1 = _src1.kind (), kind2 = _src2.kind ();
1229
1236
Mat src1 = _src1.getMat (), src2 = _src2.getMat ();
1230
1237
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
+
1231
1242
if ( kind1 == kind2 && src1.dims <= 2 && src2.dims <= 2 && src1.size () == src2.size () && src1.type () == src2.type () )
1232
1243
{
1233
1244
int cn = src1.channels ();
1234
1245
_dst.create (src1.size (), CV_8UC (cn));
1235
1246
Mat dst = _dst.getMat ();
1236
1247
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);
1238
1251
return ;
1239
1252
}
1240
1253
1241
- int cn = src1.channels (), depth1 = src1. depth (), depth2 = src2. depth () ;
1254
+ int cn = src1.channels ();
1242
1255
1243
1256
_dst.create (src1.dims , src1.size , CV_8UC (cn));
1244
1257
src1 = src1.reshape (1 ); src2 = src2.reshape (1 );
@@ -1247,6 +1260,7 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
1247
1260
size_t esz = std::max (src1.elemSize (), (size_t )1 );
1248
1261
size_t blocksize0 = (size_t )(BLOCK_SIZE + esz-1 )/esz;
1249
1262
BinaryFuncC func = getCmpFunc (depth1);
1263
+ CV_Assert (func);
1250
1264
1251
1265
if ( !haveScalar )
1252
1266
{
@@ -1275,7 +1289,9 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
1275
1289
else
1276
1290
{
1277
1291
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 );
1279
1295
if ( fval < getMinVal (depth1) )
1280
1296
{
1281
1297
dst = Scalar::all (op == CMP_GT || op == CMP_GE || op == CMP_NE ? 255 : 0 );
0 commit comments