2010-11-23 17 views
1

Cela fait partie de mon programme:l'image JPG passe de 30KB à 300KB après cvCreateImageHeader

// 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; 

Et la sortie est:

Received 31860 bytes from the client 
307200 

Maintenant, pourquoi est-ce? CvCreateImageHeader() convertit l'image jpg en RGB ou quelque chose comme ça en interne? Je veux qu'il reste JPG et l'affiche avec cvShowImage().

S'il vous plaît, toute aide serait la bienvenue. Jpeg ne représente pas une représentation exacte d'une image.

Répondre

2

Vous comparez la longueur des données d'image jpeg compressées aux données de pixel non compressées.

En particulier, compte tenu:

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

Ce sera toujours le cas que fIplImageHeader->imageSize == width * height * (depth/8) * channels

Affectation des octets recus par l'appel recvfrom() à la zone imageData ne fonctionne pas dans le premier endroit.

+0

Oui. Mais je veux charger le jpg du tampon sans décompresser. –

+2

Eh bien, je veux un poney. Malheureusement pour nous deux, je vais devoir partir sans poney pour l'instant, et vous devrez décompresser les données d'image pour utiliser ces images avec OpenCV. – SingleNegationElimination

1

C'est un format "avec perte" (c'est-à-dire que vous perdez quelques détails en échange d'une image de plus petite taille). Je parie que vous n'avez pas spécifié la 'qualité' de l'image que vous voulez donc il utilise une haute qualité par défaut. Recherchez un paramètre de qualité et définissez-le sur une valeur inférieure. Vous devrez équilibrer la qualité de l'image par rapport à la taille du fichier en fonction de votre application.