我创建了一个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