Необработанное изображение BGR после сжатия JPG такой же длины? - PullRequest
1 голос
/ 23 ноября 2010

Хорошо.Это немного странно.Короче.Я получаю сырые изображения BGR с камеры, сжимаю их в JPG с OpenCV и отправляю по протоколу UDP на ПК.Вот как я сжимаю изображения:

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

Вот как я получаю их на ПК:

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
    ...

Если я удаляю сжатие JPG в программе, извлекающей изображения с камеры, вывод такой же:

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

Однако когдаЯ сохраняю полученное изображение на диске, его размер составляет около 7,8 КБ, в то время как несжатое необработанное изображение, сохраненное на диске, занимает около 57 КБ.

Что здесь происходит?

Ответы [ 2 ]

1 голос
/ 23 ноября 2010

Вы не используете buf.size () при отправке пакета. Таким образом, вы отправляете больше данных, чем на самом деле содержится в buf. В некоторых случаях вы получите Segfault для этого.

1 голос
/ 23 ноября 2010

«Размер», который вы передаете для отправки, является размером сжатого буфера, верно? Из ваших фрагментов кода не очевидно, откуда взялся «размер» (как предполагает ypnos, я бы ожидал buf.size ()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...