开发者

JPG image goes from 30KB to 300KB after cvCreateImageHeader

This is part of my program:

// 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 i开发者_运维技巧mage 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;

And the output is:

Received 31860 bytes from the client
307200

Now why is that? Is cvCreateImageHeader() converting the jpg image to RGB or something like that internally? I want it to stay JPG and show it with cvShowImage().

Please, any help would be welcome.


You are comparing the lenght of the compressed jpeg image data to the uncompressed pixel data.

In particular, given:

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

It will always be the case that fIplImageHeader->imageSize == width * height * (depth/8) * channels

Assigning the bytes recieved by the recvfrom() call to the imageData area doesn't work in the first place.


Jpeg does not represent an exact representation of an image. It's a "lossy" format (i.e. you lose some detail in exchange for a smaller size image). I'd bet you haven't specified the 'quality' of the image you want so it's using a default high quality. Look for a quality setting and set it for a lower value. You'll need to balance quality of image versus file size to suit your application.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜