我創建了一個DLL,其中用戶可以從文件名或從流如下讀取圖像太慢:有沒有其他方法可以使用OpenCV的imdecode?這是
std::string filePath = "SomeImage.bmp";
// (1) Reading from a file
Image2D img1;
img1.readImage(filePath);
// (2) Reading from a stream
std::ifstream imgStream (filePath.c_str(), std::ios::binary);
Image2D img2;
img2.readImage(imgStream);
第一readImage(filePath)
使用cv::imread(filePath)
這是相當快的實現(上對於600×900圖像平均爲0.001秒)。然而,第二個版本readImage(fileStream)
使用cv::imdecode
實現,其是相當慢的(對於同一圖像平均2.5秒)。
cv::imdecode
有什麼替代方案可以解碼來自內存緩衝區的圖像而不需要很長時間嗎?這是經常使用的應用程序的核心組件,因此它必須很快。
任何援助將不勝感激。提前致謝。
編輯:
我使用計時器來測量計時。這對我也沒有意義。我不明白爲什麼在這個時候有這麼大的差距。 Image2D
只是一個具有OpenCV矩陣作爲成員的類。
int Image2D::readImage(std::ifstream& input)
{
input.seekg(0, std::ios::end);
size_t fileSize = input.tellg();
input.seekg(0, std::ios::beg);
if (fileSize == 0) {
return 1;
}
std::vector<unsigned char> data(fileSize);
input.read(reinterpret_cast<char*>(&data[0]), sizeof(unsigned char) * fileSize);
if (!input) {
return 1;
}
StopWatch stopWatch;
mImg = cv::imdecode(cv::Mat(data), CV_LOAD_IMAGE_COLOR);
std::cout << "Time to decode: " << stopWatch.getElapsedTime() << std::endl;
return 0;
}
int Image2D::readImage(const std::string& fileName)
{
StopWatch stopWatch;
mImg = cv::imread(fileName, CV_LOAD_IMAGE_COLOR);
std::cout << "Time to read image: " << stopWatch.getElapsedTime() << std::endl;
return 0;
}
你如何衡量時間?這似乎沒有多大意義:'imread'在內部使用'imdecode',並且您只是讀取實際上根本沒有解碼的位圖文件。您還應該顯示類Image2D的代碼和readImage實現的方法(2個過載選項)。 – Antonio
查看我的編輯@Antonio。 – Duncs
秒錶如何實現?既然你第一次測量imread,也許它是某種單身人士,而不是重新設置? – Micka