2015-05-07 224 views
5

我创建了一个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; 
} 
+2

你如何衡量时间?这似乎没有多大意义:'imread'在内部使用'imdecode',并且您只是读取实际上根本没有解码的位图文件。您还应该显示类Image2D的代码和readImage实现的方法(2个过载选项)。 – Antonio

+0

查看我的编辑@Antonio。 – Duncs

+0

秒表如何实现?既然你第一次测量imread,也许它是某种单身人士,而不是重新设置? – Micka

回答

2

这是我的测试代码,也许你可以尝试同样的(在一个干净的项目)进行比较的结果:的readImage功能的实现如下简化。

对我来说,时间测量(CPU时间,它不是挂钟时间)说,这是一个快一点,只是解码字节流,而不是imread图像(这是有道理的) - 窗口 - VC 2010 OpenCV的2.49

#include <fstream> 

cv::Mat MreadImage(std::ifstream& input) 
{  
    input.seekg(0, std::ios::end); 
    size_t fileSize = input.tellg(); 
    input.seekg(0, std::ios::beg); 

    if (fileSize == 0) { 
     return cv::Mat(); 
    } 

    std::vector<unsigned char> data(fileSize); 
    input.read(reinterpret_cast<char*>(&data[0]), sizeof(unsigned char) * fileSize); 

    if (!input) { 
     return cv::Mat(); 
    } 

    clock_t startTime = clock(); 
    cv::Mat mImg = cv::imdecode(cv::Mat(data), CV_LOAD_IMAGE_COLOR); 
    clock_t endTime = clock(); 
    std::cout << "Time to decode image: " << (float)(endTime-startTime)/(float)CLOCKS_PER_SEC << std::endl; 

    return mImg; 
} 


cv::Mat MreadImage(const std::string& fileName) 
{ 
    clock_t startTime = clock(); 
    cv::Mat mImg = cv::imread(fileName, CV_LOAD_IMAGE_COLOR); 
    clock_t endTime = clock(); 

    std::cout << "Time to read image: " << (float)(endTime-startTime)/(float)CLOCKS_PER_SEC << std::endl; 
    return mImg; 
} 

// test speed of imread vs imdecode 
int main() 
{ 

    //std::string path = "../inputData/Lenna.png"; 
    //std::string path = "../inputData/Aachen_Germany_Imperial-Cathedral-01.jpg"; 
    std::string path = "../inputData/bmp.bmp"; 

    cv::Mat i1 = MreadImage(path); 


    std::ifstream imgStream (path.c_str(), std::ios::binary); 
    cv::Mat i2 = MreadImage(imgStream); 

    cv::imshow("input 1", i1); 
    cv::imshow("input 2", i2); 
    cv::waitKey(0); 
    return 0; 
} 
+0

所以我在一个干净的项目中测试了上面的代码,并且时间与您提到的大致相同。我真的不明白为什么在我的生产级应用程序中运行'imdecode'需要更长的时间。我将不得不深入这一点。我可能会错过一些东西。任何建议都会有帮助。谢谢。 – Duncs

+0

您是否在生产代码中尝试了替代时间测量方法? – Micka

+1

是的,我做到了。我不明白为什么需要这么长时间。我为这个问题创建了一个解决方法,但我仍然对时间的差异感到困惑。我不知道为什么我明确调用'cv :: imdecode'需要更长的时间。尽管感谢您的帮助。 – Duncs

相关问题