OpenCv DnnSuperResImpl (C++) 异常

Exception with OpenCv DnnSuperResImpl (C++)

我对 OpenCV 的 dnnsuperres 包中的上采样函数有疑问。 我正在通过管道将 bmp 从一个应用程序传输到另一个应用程序。图像驻留在 datamem 中,它是一个无符号字符数组。我使用管道传输许多其他东西,所以我以最常见的数据类型传输数据。 如果我执行以下操作:

        cv::Mat matImg;
        matImg = cv::imdecode(cv::Mat(1, SizeToRead, CV_8UC1, datamem), -1); //-1==CV_LOAD_IMAGE_UNCHANGED 
        imshow("SomeWindowName", matImg);

这成功了,没有问题,位图显示正确。

如果我现在尝试应用上采样:

        string path = "EDSR_x4.pb";
        string modelName = "edsr";
        int scale = 4;
        DnnSuperResImpl sr;
        sr.readModel(path);
        sr.setModel(modelName, scale);
        Mat outputImage;
        sr.upsample(matImg, outputImage);

sr.upsampling() 会抛出异常。不幸的是,异常信息对我没有任何帮助(cv::exception at memory location xyz,没有额外的信息。地址似乎是合理的)。 所以我尝试通过 cv::imread() 从我的硬盘加载一个位图并将其传递给 sr.upsample() 并且这有效。我认为它可能是 datamem 中与 sr.upsampling() 不兼容的某种位图格式。因此我尝试将位图转换为 png 并将其传递给上采样方法,但结果是一样的,我得到了异常。我做的转换是这样的:

        matImg = cv::imdecode(cv::Mat(1, SizeToRead, CV_8UC1, datamem), -1); //-1==CV_LOAD_IMAGE_UNCHANGED
        cv::Mat test(matImg.rows,matImg.cols,CV_8UC4, (cv::Vec4b*)matImg.data);//convert to png

后来我当然通过了upsampling()的测试,但是我得到了同样的异常。

有谁知道是什么导致了这个问题?

DnnSuperResImpl 将只接受 3 通道 BGR 图像,而不是您的 4 通道位图。

将您的图像转换为 3 个通道,同时对其进行解码:

matImg = cv::imdecode(cv::Mat(1, SizeToRead, CV_8UC1, datamem), cv::IMREAD_COLOR);
sr.upsample(matImg, outputImage);

So far I found no documentation which says that it needs three channels.

真的,请raise an issue here