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?
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? –
Verwenden Sie einfach buf.size() :) –