将JPEG流从IP摄像机接收到C 的RGB图像



我有一个IP摄像头,该IP摄像头在UDP/RTP中流式jpeg压缩数据。我使用Boost Asio接收数据。我知道我已经正确地收到了数据,因为我检查了Wireshark的每个数据包的标题信息。

#include <boost/asio.hpp>
#define MAX_BYTES 1500 
using boost::asio::ip::udp;
int main(){
  boost::asio::io_service io_service;
  udp::socket socket( io_service , udp::endpoint(udp::v4(),50242) );
  char data[MAX_BYTES];
  size_t bytes_received = 0;
  while(true){
    bytes_received = socket.receive(boost::asio::buffer(data,MAX_BYTES));
  }
}

i每个数据包总共收到1452个字节,其前20个字节是RTP标头(12个字节(,其次是JPEG标头(8个字节(。其余的1432个字节包含有效载荷。假设每个帧均由145个数据包(FRM_PCKTS = 145(制成。对数据包进行排序后,我将它们存储在缓冲区中以进行单个帧,如下所示:

unsigned char* buffer = (unsigned char*) malloc( frm_pckts * 1432 * sizeof(unsigned char);  
memcpy( &buffer[packet_index*1432] , &data[20], 1432);

如果我将此缓冲区复制到OpenCV垫子中,并显示其将显示垃圾值。我也尝试了

cv::Mat img = cv::imdecode(frame, CV_LOAD_IMAGE_COLOR);

,但也没有用。我看了在这个网站上找到的所有可能的解决方案,但它们都不适合我。有没有可以用来将此缓冲区传递给其功能之一并检索JPEG框架的库?另外,对于解码框架,我也应该在缓冲区中加入标题字节吗?如果是哪个标题?JPEG标头,RTP标头还是两者?

我非常感谢任何有用的解决方案或建议。

RTP标头上的JPEG称为主标头,只有8个字节长。由此应该创建JFIF标头,以便能够解码JPEG压缩数据。JFIF标头创建可以使用" RFC 2435"格式完成。一切都在那里解释了。创建JFIF标头后,应将其预到压缩数据,然后将其传递到UncompressedFrame = CV :: IMDecode(CompressedsImage,1(或任何其他JPEG解码器以检索未压缩的帧。如果您遇到这样的问题,请在(davar.daei@gmail.com(上告诉我,我将很乐意提供帮助。

最新更新