2015-05-07 222 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

相關問題