【发布时间】:2015-03-16 05:45:11
【问题描述】:
说实话,我很惊讶到目前为止还没有人遇到这种情况。 我正在将 OpenCV 中的图片加载到 cv::Mat 中,我想在通过套接字发送之前对其进行 base64 编码。
对于 base64,我使用 libb64,因为它是 Debian/Ubuntu 原生的,易于使用且速度非常快。编码函数以std::ifstream为参数,输出std::ofstream。
#include <opencv2/opencv.hpp>
#include <b64/encode.h>
#include <fstream>
using namespace cv;
Mat image;
image = imread( "picture.jpg", CV_LOAD_IMAGE_COLOR );
if ( image.data )
{
std::ifstream instream( ???, std::ios_base::in | std::ios_base::binary);
std::ofstream outstream;
// Convert Matrix to ifstream
// ...
base64::encoder E;
E.encode( instream, outstream );
// Now put it in a string, and send it over a socket...
}
我真的不知道如何从 cv::Mat 填充流内。 谷歌搜索,我发现我可以按列和行迭代 cv::Mat,并获取每个(我假设的像素)RGB 值:
for ( int j = 0; j < image.rows; j++ )
{
for ( int i = 0; i < image.cols; i++ )
{
unsigned char b = input [ image.step * j + i ] ;
unsigned char g = input [ image.step * j + i + 1 ];
unsigned char r = input [ image.step * j + i + 2 ];
}
}
这是正确的处理方式吗?还有更优雅的方式吗?
【问题讨论】:
-
你到底想完成什么?你想序列化图像(你希望能够在另一边读取它)吗?如果您只对图像数据进行编码,那么您将不知道它的宽度、高度或通道数。为什么不对输入文件而不是 Mat 进行 base64 编码?此外,如果您想通过套接字发送图像,您实际上不需要对其进行 base64 编码,您可以按原样发送并减少开销。
-
@Ove 套接字的另一端可能是不同的架构或平台,并且不会使用 C++。我希望通过使用 base64 序列化来避免某些问题,但我愿意接受任何建议。所以,你认为序列化图片而不是 cv::Mat 更好吗?问题是,可能没有任何图片,而是相机拍摄的图像。另外,套接字使用的是 HTTP 协议,所以我发布的是 JSON 文本。