2010-11-23 10 views
1

これはちょっと奇妙です。長い話が短い。私は、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のスペース。

ここでは何が起こっていますか?

答えて

1

あなたが送るために渡す "サイズ"は、圧縮されたバッファのサイズですか?あなたのコードスニペットから、 "size"がどこから来るのかは明らかではありません(ypnosが示唆するように、私はbuf.size()を期待していました)。

+0

ああ、そうです。サイズには生の画像のサイズが含まれます。ところで、どのようにベクトル bufのサイズを見つけることができますか? –

+0

buf.size()を使用してください:) –

1

パケットを送信するときにbuf.size()を使用しません。したがって、bufに実際に含まれるよりも多くのデータを送信します。場合によっては、そのためのセグメンテーションを取得します。

関連する問題