c++ - OpenCV保存带有imwrite问题的大图像
问题描述
我想使用 OpenCV 保存一个包含 300 个大小为 256x256 的图像序列的图像(即宽度:300*256,高度:256)。
我尝试使用以下代码保存:
#include <string.h>
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <vector>
#include <opencv2/opencv.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
int img_num = 300;
cv::Mat img = cv::imread( "256.jpg", cv::IMREAD_UNCHANGED );
if( img.empty() )
{
return -1;
}
cv::Mat img_big = cv::Mat::zeros(256,256*img_num,CV_8UC3);
for (int i = 0; i < img_num; i++)
{ img(cv::Rect(0,0,256,256)).copyTo(img_big(cv::Rect((i)*256,0,256,256)));
}
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
imwrite("big.jpg",img_big,compression_params);
img_big.release();
img.release();
}
并编译
g++ -std=gnu++0x -o saveOpenCV saveOpenCV.cpp `pkg-config --libs --cflags opencv`
我预计结果将是一个大小为 76800x256 的图像(连续 300 个图像大小为 256x256),但输出图像只有 4.1kb 并且无法打开。将图像编号更改为 200 或 250 时,结果正常。我观察到,如果图像编号大于 250,则出现问题。
谁能告诉我出了什么问题或在机器上尝试我的代码,看看它是否会出现同样的问题?
解决方案
尝试使用其他图像格式。
在 Google 上快速搜索发现:
根据维基百科,JPG 支持的最大图像尺寸为 65535×65535。JPEG 格式限制在任一维度上均为 64k。但是 13.1 之前的 Photoshop 实现在任一维度上只允许最多 30000 个像素(历史原因,加上需要一段时间才能解决的奇怪错误)
所以最大值是 255 个 256 像素的图像。
也许imwrite
正在报告错误。您应该始终检查返回值。
推荐阅读
- html - document.getElementById("componentID").clientHeight 在 componentDidMount() 函数中总是给出零
- delphi - 使用 UIB 组件进行测试:Firebird 数据库连接是否存在?
- android - 即使我使用正确的 IP 地址,也无法在 android 中托管异常?
- mysql - 将 MySql 查询与 Sphinx 查询相结合?
- c++ - 为什么我得到类不是模板错误?
- angular -
内部不工作 离子 4 - laravel - 如何在谷歌图表库的刻度区域网格中显示颜色
- mongodb - MongoDB中$和$$的区别
- delphi - Delphi,将PNG图像的内容复制到另一个不同大小的PNG图像
- python - 删除数组中的最后一个值(使用 Numpy)