gpt4 book ai didi

c++ - 除了使用 OpenCV 的 imdecode 之外,还有其他选择吗?太慢了

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:43:45 29 4
gpt4 key购买 nike

我创建了一个 DLL,用户可以在其中从文件名或流中读取图像,如下所示:

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 x 900 图像平均需要 0.001 秒)。然而,第二个版本 readImage(fileStream) 是使用 cv::imdecode 实现的,它相当慢(对于同一张图像平均需要 2.5 秒).

除了 cv::imdecode 之外,我可以从内存缓冲区解码图像而不用花费这么长时间吗?这是针对经常使用的应用程序的核心组件,因此必须快速。

如有任何帮助,我们将不胜感激。提前致谢。

编辑:

我使用计时器测量时间。这对我来说也没有意义。我不明白为什么在时间上会有这么大的差距。 Image2D 只是一个以 OpenCV 矩阵作为成员的类。 readImage函数的实现简化如下:

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;
}

最佳答案

这就是我测试你的代码的方式,也许你可以尝试相同的(在一个干净的项目中)来比较结果。

对我来说,时间测量(CPU 时间,不是挂钟时间)表示仅解码字节流比读取图像快一点(这是有道理的)- Windows - 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;
}

关于c++ - 除了使用 OpenCV 的 imdecode 之外,还有其他选择吗?太慢了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30111368/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com