大内存遥感图像加载和处理

一米六小仙女 2018-09-30 04:44:48
我现在做一个遥感图像质检的软件,用到了gdal,OpenCV ,Cximage库,当影像比较大有几G时,imread ,load会加载失败。
CxImage *cimage = new CxImage;
CString filename = “D:/123.tif”;
cimage->Load(filename, CXIMAGE_FORMAT_TIF);
这里得到的cimage中head都为0.为什么呢?imread ,load这两个函数最大能支持多大的影像?

由于一些功能需要用到Cximage这个类,我也试了从内存加载图像到类中:
poDataset->RasterIO(GF_Read, 0, 0, bufWidth, bufHeight, imgBuf, bufWidth, bufHeight, iDataType, nBand, 0, 0, 0, 0);
CxImage image((BYTE*)imgBuf, sizeX*sizeY, CXIMAGE_FORMAT_TIF);
这里的buffer怎么理解啊,用gdal读的内存再加载不对吗?


哎。。。刚刚接触图像处理这块,好多东西不会,全是现学现用,自己鼓捣了好久还是搞不出来,麻烦大家帮忙看看 QAQ
...全文
918 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
一米六小仙女 2018-10-10
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
https://bbs.csdn.net/topics/392294537

谢谢您了,感觉我的问题不在这块,我自己再鼓捣吧
赵4老师 2018-10-08
  • 打赏
  • 举报
回复
仅供参考:
// 创建文件句柄
HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 创建文件映射
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL);
// 读取映射中的内存
LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);

// 好了文件的内存已经获取了,你可以随意处理了

// 释放映射内存
::UnmapViewOfFile(lpBuffer);
// 关闭文件映射
::CloseHandle(hMap);
// close file handle
::CloseHandle(hFile);
一米六小仙女 2018-10-08
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
生成x64应用程序。

是x64的应用程序。
赵4老师 2018-10-08
  • 打赏
  • 举报
回复
赵4老师 2018-10-08
  • 打赏
  • 举报
回复
不行,可能只是因为你不会用或用不好FileMapping技术;
或者你要处理的数据大到用FileMapping技术也不够大。
可以试试参考下面:
容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储
当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);

一米六小仙女 2018-10-08
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
仅供参考:
// 创建文件句柄
HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
// 创建文件映射
HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL);
// 读取映射中的内存
LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);

// 好了文件的内存已经获取了,你可以随意处理了

// 释放映射内存
::UnmapViewOfFile(lpBuffer);
// 关闭文件映射
::CloseHandle(hMap);
// close file handle
::CloseHandle(hFile);

谢谢了,还是不行额
赵4老师 2018-09-30
  • 打赏
  • 举报
回复
生成x64应用程序。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧