diff --git a/modules/dnn/src/onnx/onnx_importer.cpp b/modules/dnn/src/onnx/onnx_importer.cpp index f0b2febb88..b09a9ed360 100644 --- a/modules/dnn/src/onnx/onnx_importer.cpp +++ b/modules/dnn/src/onnx/onnx_importer.cpp @@ -3005,22 +3005,22 @@ void ONNXImporter::parseRange(LayerParams& layerParams, const opencv_onnx::NodeP CV_Assert(const_id.size() == 3); Mat startMat = getBlob(node_proto, 0); - CV_Assert(startMat.type() == CV_32SC1); - int start = startMat.at(0); + startMat.convertTo(startMat, CV_32F); + float start = startMat.at(0); Mat limitMat = getBlob(node_proto, 1); - CV_Assert(limitMat.type() == CV_32SC1); - int limit = limitMat.at(0); + limitMat.convertTo(limitMat, CV_32F); + float limit = limitMat.at(0); Mat deltaMat = getBlob(node_proto, 2); - CV_Assert(deltaMat.type() == CV_32SC1); - int delta = deltaMat.at(0); + deltaMat.convertTo(deltaMat, CV_32F); + float delta = deltaMat.at(0); int number_of_elements = std::max(int(std::ceil((limit - start) / delta)), 0); - Mat r(number_of_elements, 1, CV_32SC1); + Mat r(1, number_of_elements, CV_32FC1); // should be 1d tensor, but Mat doesn't support it for (int i = 0; i < number_of_elements; i++) { - r.at(i) = start + (i * delta); + r.at(i) = start + (i * delta); } addConstant(node_proto.output(0), r); constBlobsExtraInfo.insert(std::make_pair(node_proto.output(0), TensorInfo(1))); diff --git a/modules/dnn/test/test_onnx_importer.cpp b/modules/dnn/test/test_onnx_importer.cpp index 669d363afa..82b10fb1ba 100644 --- a/modules/dnn/test/test_onnx_importer.cpp +++ b/modules/dnn/test/test_onnx_importer.cpp @@ -804,6 +804,12 @@ TEST_P(Test_ONNX_layers, CumSumExclusiveInplace) testONNXModels("cumsum_exclusive_inplace"); } +TEST_P(Test_ONNX_layers, Range) +{ + testONNXModels("range_float"); + testONNXModels("range_float_negative"); +} + TEST_P(Test_ONNX_layers, Eltwise3D) { #if defined(INF_ENGINE_RELEASE) && INF_ENGINE_VER_MAJOR_LT(2021040000)