OpenCV读取1GB以上大图失败解决措施

问题

  有医学图像处理的读者问我说,他的OpenCV无法读取他所需要的大图,他的图像以位图形式存储时大小约为1.5GB,使用imread读取时图像为空。
  读者可访问此处,下载已经修改好的源代码
  自定义OpenCV代码下载链接

原因分析

  出于对内存的保护,OpenCV的开发者对imread图像的大小做了限制,这个大小是2的30次方,恰好为1个G,这个同学想通过imread函数读取1.5G的图像,在不修改源码的情况下是不现实的。

解决策略

  只需要简单的修改OpenCV的源码就足以解决这个问题。

  1.打开源码中的imgcodecs模块,找到loadsave.cpp
在这里插入图片描述

  2.改

utils::getConfigurationParameterSizeT("OPENCV_IO_MAX_IMAGE_PIXELS", 1</
  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
opencv中,可以使用cv::imread函数读取单张图像,但是如果需要读取大量图片,可以使用以下方法: 1. 使用循环读取单张图片 可以使用循环读取每张图片,然后将它们存储在vector中。示例代码如下: ``` #include <opencv2/opencv.hpp> #include <iostream> #include <vector> using namespace cv; using namespace std; int main(int argc, char** argv) { vector<Mat> images; for(int i=1; i<=100; i++) { string filename = "image" + to_string(i) + ".jpg"; Mat image = imread(filename); if(image.empty()) { cout << "Could not read image " << filename << endl; break; } images.push_back(image); } cout << "Number of images read: " << images.size() << endl; return 0; } ``` 2. 使用glob函数读取多张图片 可以使用glob函数读取所有符合某个模式的图片。示例代码如下: ``` #include <opencv2/opencv.hpp> #include <iostream> #include <vector> using namespace cv; using namespace std; int main(int argc, char** argv) { vector<Mat> images; string pattern = "path/to/images/*.jpg"; // 指定匹配模式 vector<String> filenames; glob(pattern, filenames); for(int i=0; i<filenames.size(); i++) { Mat image = imread(filenames[i]); if(image.empty()) { cout << "Could not read image " << filenames[i] << endl; break; } images.push_back(image); } cout << "Number of images read: " << images.size() << endl; return 0; } ``` 3. 使用OpenCV的数据集读取OpenCV中提供了数据集读取器,可以用来读取大量的图片数据集,例如MNIST、CIFAR等。示例代码如下: ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main(int argc, char** argv) { string dataset_path = "path/to/dataset"; // 指定数据集路径 Ptr<ml::TrainData> dataset = ml::TrainData::loadFromCSV(dataset_path, 0, // 标签列 -1, // 最后一列为特征列 -1, // 不使用行索引 "ord[0,1,2,3]"); // 类别标签为0,1,2,3 cout << "Number of images read: " << dataset->getNSamples() << endl; return 0; } ``` 以上三种方法可以根据实际需求选择使用。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Albert

感谢支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值