我對 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() 將拋出例外。不幸的是,例外資訊對我沒有任何幫助(記憶體位置 xyz 處的 cv::exception,沒有其他資訊。地址似乎合理)。所以我試圖簡單地通過 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
之后我當然通過了上采樣()的測驗,但我得到了同樣的例外。
有誰知道是什么導致了這個問題?
uj5u.com熱心網友回復:
將DnnSuperResImpl只接受 3 通道 BGR 影像,而不是您的 4 通道位圖。
將影像轉換為 3 個通道,同時對其進行解碼:
matImg = cv::imdecode(cv::Mat(1, SizeToRead, CV_8UC1, datamem), cv::IMREAD_COLOR);
sr.upsample(matImg, outputImage);
到目前為止,我沒有找到說明它需要三個通道的檔案。
確實,請在這里提出一個問題
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/447024.html
上一篇:獲取某個圓的像素值?
