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.
我对 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.