2010-11-23 15 views
1

Ok. C'est un peu étrange. Longue histoire courte. Je suis en train de créer des images BGR brutes à partir d'une caméra, en les compressant en JPG avec OpenCV et en les envoyant avec un protocole UDP sur un PC. Voici comment compresser les images:L'image BGR brute après la compression JPG est la même longueur?

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

Voici comment je les envoie avec UDP:

n_sent = sendto(sk,&*buf.begin(),(int)size,0,(struct sockaddr*) &server,sizeof(server)); 

Voici comment je les reçois dans un 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; 

Je reçois cette sortie:

Received 57600 bytes from the client 
    Received 57600 bytes from the client 
    ... 

Si je supprime le JP G compression au programme pour récupérer les images de la caméra, la sortie est le même:

Received 57600 bytes from the client 
    Received 57600 bytes from the client 
    ... 

Cependant, lorsque j'enregistre l'image reçue sur un disque, sa taille est d'environ 7.8KB en image brute non compressé enregistré sur le disque prend environ 57 Ko d'espace.

Que se passe-t-il ici?

Répondre

1

La "taille" que vous passez pour envoyer est la taille du tampon compressé, non? Ce n'est pas évident à partir de vos extraits de code d'où vient la "taille" (comme le suggère ypnos, je m'attendrais à buf.size()).

+0

Oh, c'est vrai. la taille contient la taille de l'image brute. Par ailleurs, comment puis-je trouver la taille du vecteur buf? –

+0

Utilisez simplement buf.size() :) –

1

Vous n'utilisez pas buf.size() lors de l'envoi du paquet. Vous envoyez donc plus de données que ce qui est réellement contenu dans buf. Dans certains cas, vous obtiendrez un segfault pour cela.