确定。这有点奇怪。长话短说。我正在从相机中获取原始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空间。
这里发生了什么?
答案 0 :(得分:1)
您传递给的“大小”是压缩缓冲区的大小,对吗?从您的代码片段中可以看出“大小”来自(如ypnos所示,我原本期望buf.size())。
答案 1 :(得分:1)
发送数据包时不使用buf.size()。因此,您发送的数据多于buf中实际包含的数据。在某些情况下,你会得到一个段错误。