c++ - 如何将 Opencv Mat 转换为 JPEG 字符数据
问题描述
最近,我无法将 OpenCV 从我的网络摄像头捕获的 Mat 帧转换为普通的 JPEG 无符号字符数组。我在 Google 上尝试了一种或两种方法,但结果似乎不是正确的 jpeg uchar 数组。这是我的一段代码:
VideoCapture cap(0);
if(!cap.isOpened())
return -1;
Mat frame;
cap >> frame;
if( frame.empty())
return -1;
int size = frame.total() * frame.elemSize();
unsigned char* buffer = new unsigned char[size];
memcpy(buffer, frame.data, size * sizeof(unsigned char));
然后我使用fwrite将该缓冲区写入file.jpg(它看起来很傻,但如果缓冲区正确,它确实可以工作),但该文件无法打开或被确定为 jpeg 图像。
谁能帮我解决这个问题?
解决方案
查看 OpenCV 功能imencode()
。它将使用编码为正确图像类型(基于文件类型参数)的数据填充缓冲区,以便可以将其写入文件并且其他程序将知道如何处理它。
您当前方法的问题是您试图将原始图像数据写入 JPEG,但 JPEG 是一种压缩数据格式,因此程序不知道如何处理您写入的数据。这相当于获取一个二进制文件并将其保存为 JPEG,该文件将没有正确的标题作为图像解码,否则数据很可能与 JPEG 格式不匹配。
推荐阅读
- python - 如何在从类方法打印时打印列表(不是整个列表)中的“特定”元素,不带括号和引号?
- python - 我正在尝试将公司交易量的平均值与同一公司的每日交易量进行比较,并找出 pandas 的差异。我在公司做了groupby
- android - Android,在 ViewGroup 的子项上捕获单点事件,但在父项上双击事件
- python - 在 Django 视图中获取列表索引必须是整数
- python - 从 CoinMarketCap 的表中提取数据
- linux - 为什么 gcc 汇编器生成带有两个程序段的 ELF 文件?
- node.js - Sequelize v6 - TypeError: sequelize.import 不是函数
- node.js - NodeJS广播频道仅以一种方式工作
- javascript - Nuxt 中的 ESLint 问题
- php - Laravel 8:使用数据库表检查用户数据无法正常工作