JPG压缩后的原始BGR图像长度是否相同?

时间:2010-11-23 10:10:33

标签: c++ opencv

确定。这有点奇怪。长话短说。我正在从相机中获取原始BGR图像,使用OpenCV将它们压缩为JPG并使用UDP协议发送到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空间。

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

您传递给的“大小”是压缩缓冲区的大小,对吗?从您的代码片段中可以看出“大小”来自(如ypnos所示,我原本期望buf.size())。

答案 1 :(得分:1)

发送数据包时不使用buf.size()。因此,您发送的数据多于buf中实际包含的数据。在某些情况下,你会得到一个段错误。