c++ - JPG压缩后的原始BGR图像长度相同吗?

标签 c++ opencv

好的。这有点奇怪。长话短说。我正在从相机中提取原始 BGR 图像,使用 OpenCV 将它们压缩为 JPG,然后使用 UDP 协议(protocol)发送到 PC。这就是我压缩图像的方式:

// memblock contains raw image
IplImage* fIplImageHeader;
fIplImageHeader = cvCreateImageHeader(cvSize(160, 120), 8, 3);
fIplImageHeader->imageData = (char*) memblock;

// compress to JPG
vector<int> p;
p.push_back(CV_IMWRITE_JPEG_QUALITY);
p.push_back(75);
vector<unsigned char> buf;
cv::imencode(".jpg", fIplImageHeader, buf, p);

这是我用 UDP 发送它们的方式:

n_sent = sendto(sk,&*buf.begin(),(int)size,0,(struct sockaddr*) &server,sizeof(server));

这是我在 PC 上接收它们的方式:

int iRcvdBytes=recvfrom(iSockFd,buff,bufferSize,0,
(struct sockaddr*)&cliAddr,(socklen_t*)&cliAddrLen);
// print how many bytes we have received
cout<<"Received "<<iRcvdBytes<<" bytes from the client"<<endl;

我得到这个输出:

    Received 57600 bytes from the client
    Received 57600 bytes from the client
    ...

如果我在从相机获取图像的程序中删除 JPG 压缩,输出是相同的:

    Received 57600 bytes from the client
    Received 57600 bytes from the client
    ...

但是,当我将接收到的图像保存在磁盘上时,它的大小约为 7.8KB,而保存到磁盘的未压缩原始图像大约需要 57KB 空间。

这是怎么回事?

最佳答案

你传递给send的“size”是压缩缓冲区的大小,对吧?从您的代码片段中,“大小”的来源并不明显(正如 ypnos 所建议的那样,我会期望 buf.size() )。

关于c++ - JPG压缩后的原始BGR图像长度相同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4254886/

相关文章:

c++: string::find 对于空输入字符串的行为是否定义明确

c++ - 错误 : copy assignment operator not allowed in union

c++ - OpenCV undistortPoints 没有给出失真模型的精确逆

c++ - Opencv 在 cv::Mat 中存储 Yuyv (YCrCb)

.net - C++ 和 Windows 窗体中的数组

OpenCV Stitcher 返回 ERR_NEED_MORE_IMGS

ios - 打开 cv 划痕检测

使用带有 Wt 的 OpenCV 的 C++ Web 项目

c++ - 如何存储指向将 Callable 对象作为其参数之一的函数模板的指针

c++ - 为什么 C++ 允许将整数分配给字符串?