これはちょっと奇妙です。長い話が短い。私は、OpenCVを使ってJPGに圧縮し、UDPプロトコルでPCに送信することで、カメラから生のBGR画像を得ています。これは私が画像を圧縮する方法である:JPG圧縮後のRaw BGRイメージは同じ長さですか?
// 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);
これは私がUDPでそれらを送信する方法である:
n_sent = sendto(sk,&*buf.begin(),(int)size,0,(struct sockaddr*) &server,sizeof(server));
は、これは私が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;
私は取得していますこの出力:
Received 57600 bytes from the client
Received 57600 bytes from the client
...
JPを削除した場合G、出力が同じカメラから画像を取得するプログラムでの圧縮である:ディスクに保存された非圧縮の生の画像を約かかりながら
Received 57600 bytes from the client
Received 57600 bytes from the client
...
しかし、私はディスク上で受信した画像を保存するとき、それは大きさだが7.8キロバイト程度であります57KBのスペース。
ここでは何が起こっていますか?
ああ、そうです。サイズには生の画像のサイズが含まれます。ところで、どのようにベクトル bufのサイズを見つけることができますか? –
buf.size()を使用してください:) –