c++ - JPG 图像在 cvCreateImageHeader 之后从 30KB 变为 300KB

标签 c++ opencv

这是我的程序的一部分:

// let's get jpg image from socket
int iRcvdBytes=recvfrom(iSockFd, buff, bufferSize, 0, 
(struct sockaddr*)&cliAddr, (socklen_t*)&cliAddrLen);

// buff now contains 30KB jpg image

// let's load the jpg image to IplImage
IplImage* fIplImageHeader;
fIplImageHeader = cvCreateImageHeader(cvSize(640, 480), 8, 1);
fIplImageHeader->imageData = (char *)buff;

// now let's check the size difference
cout << "Received " << iRcvdBytes << " bytes from the client" << endl;
cout << fIplImageHeader->imageSize << endl;

输出是:

Received 31860 bytes from the client
307200

为什么会这样? cvCreateImageHeader() 是否在内部将 jpg 图像转换为 RGB 或类似的东西?我希望它保持 JPG 格式并使用 cvShowImage() 显示它。

欢迎任何帮助。

最佳答案

您正在比较压缩的 jpeg 图像数据与未压缩的像素数据的长度。

特别是,给定:

fIplImageHeader = cvCreateImageHeader(cvSize(width, height), depth, channels) 

总是这样 fIplImageHeader->imageSize == width * height * (depth/8) * channels

recvfrom() 调用接收到的字节分配给 imageData 区域首先不起作用。

关于c++ - JPG 图像在 cvCreateImageHeader 之后从 30KB 变为 300KB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261861/

相关文章:

c++ - 使用 openCV 检测多个对象

android - 在Android应用程序开发中将OpenCV与NDK结合使用

linux - 在 Beagleboard-xm 中打开 CV 和 ubuntu 优化

c++ - 如何在 Leap Motion 上检测棋盘以进行相机校准?

android - 在 Android NDK 中使用一个简单的 C++ 类

来自非成员函数的 C++ 虚拟继承

c++ - av_free 使应用程序随机崩溃 - FFMPEG C++

c++ - vector 数组 C++ - 添加元素时的奇怪行为

机器人 : using opencv for image recognition

c++ - 给定迭代器列表,如何从 vector 中删除元素?