2010-11-23 7 views
1

Ok. Das ist ein bisschen seltsam. Um es kurz zu machen. Ich hole rohe BGR-Bilder von einer Kamera, komprimiere sie mit OpenCV zu JPG und sende mit UDP-Protokoll an einen PC. Dies ist, wie ich Bilder komprimieren:Raw BGR-Bild nach JPG-Komprimierung ist die gleiche Länge?

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

Dies ist, wie ich sie mit UDP senden:

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

Dies ist, wie ich sie in einem PC empfangen:

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; 

Ich erhalte dieser Ausgang:

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

Wenn ich die JP entferne G Kompression beim Programm Bilder von der Kamera zu holen, ist der Ausgang gleich:

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

Allerdings, wenn ich das empfangene Bild auf einer Festplatte zu speichern, es Größe ist, ist um 7.8KB während unkomprimiertes RAW-Bild auf der Festplatte gespeichert zu nimmt 57 KB Speicherplatz.

Was geht hier vor?

Antwort

1

Die "Größe", die Sie zum Senden übergeben, ist die Größe des komprimierten Puffers, oder? Es ist nicht offensichtlich aus Ihren Code-Snippets, woher "Größe" kommt (wie ypnos vermuten lässt, hätte ich buf.size() erwartet).

+0

Oh, das stimmt. Größe enthält die Größe des Rohbildes. By the way, wie kann ich die Größe von Vektor buf finden? –

+0

Verwenden Sie einfach buf.size() :) –

1

Sie verwenden buf.size() nicht, wenn Sie das Paket senden. Sie senden also mehr Daten als tatsächlich in buf enthalten sind. In einigen Fällen erhalten Sie dafür einen segfault.

Verwandte Themen