error: (-215:Assertion failed) m.dims <= 2 in function 'FormattedImpl' in cv::dnn

error: (-215:Assertion failed) m.dims <= 2 in function 'FormattedImpl' in cv::dnn

我正在使用以下代码在 opencv dnn 模块中加载预训练的 TensorFlow 模型 -

cv::dnn::Net net = cv::dnn::readNetFromTensorflow("frozen_inference_graph.pb",
                                                   "graph.pbtxt");

net.setPreferableBackend(cv::dnn::DNN_BACKEND_CUDA); //Run model on GPU
net.setPreferableTarget(cv::dnn::DNN_TARGET_CUDA);

Mat image = imread("img.jpeg");
Mat resized;
cv::resize(image, resized, cv::Size(300, 300));
cout<<resized.size()<<endl;
cout<<"Resized"<<endl;
auto input_image = dnn::blobFromImage(image, 1.0, cv::Size(300, 300),
                                      cv::Scalar(127.5, 127.5, 127.5),
                                      false, false, CV_32F);
cout<<"Now setting Input";
net.setInput(input_image);
auto detections = net.forward();
cout<<detections;
return 0;

但是我收到问题中提到的以下错误 -

what():  OpenCV(4.4.0) /home/atharva/opencv-4.4.0/modules/core/src/out.cpp:87: error: (-215:Assertion failed) m.dims <= 2 in function 'FormattedImpl'

谁能指出错误是什么?。我相信 BlobFromImage 中存在一些问题,因为打印后什么都没有。 TIA

发生此错误是因为您试图将 cv::Mat 打印到具有超过 2 个维度的标准输出。使用 cv::dnn,使用 net.forward() 后的输出是 4 维的。但是我不知道您使用的是什么模型,因为 blob 的输出结构因您尝试执行的任务而异。如果我不得不猜测你正在根据你选择的变量名进行某种对象检测。在这种情况下,通常第一个维度是批量大小,并且由于您只使用一个图像,因此批量大小为 1。第二个维度是输出中的通道数。当您在图像上进行对象检测时,这也将是大小 1。第三和第四维是最终输出层的行数和列数。

相信你,你可以提取这个 cv::Mat 的 2D 版本打印到标准输出,方法是:

cv::Mat output(detections.size[2], detections.size[3], CV_32F, detection.ptr<float>());

现在这是一个二维矩阵,您可以通过 std::cout << output << std::endl;.

打印出来