这是我的程序的一部分:
// 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/