2017-06-05 18 views
0

UDP/RTPでJPEG圧縮データをストリームするIPカメラを持っています。私はBoost Asioを使ってデータを受け取りました。 Wiresharkで各パケットのヘッダー情報をチェックしたので、データが正しく受信されたことがわかります。IPカメラから受け取ったJPEGストリームをC++のRGB画像にデコードする

#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バイト、JPEGヘッダー(8バイト)が続くRTPヘッダー(12バイト)であるの最初の20バイトの合計を受け取ります。残りの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); 

でも動作しませんでした。このウェブサイトで見つけられる可能性のあるすべての解決策を探しましたが、どれも私のために働いていませんでした。このバッファを関数の1つに渡してJPEGフレームを取得するために使用できるライブラリがありますか?また、フレームをデコードするために、バッファにヘッダーバイトも含める必要がありますか?はいの場合はどのヘッダーですか? JPEGヘッダ、RTPヘッダ、またはその両方?

私は非常に有用な解決策や提案を感謝します。

+0

パケットを正確にどのようにソートしていますか?それはあなたの問題の根源かもしれません。 –

+0

あなたは、 'cv :: imdecode()'に渡すバッファにJPEGヘッダを含める必要があります。画像のフォーマットを知ることができなければならないので、ヘッダが必要です。画像を正しく受信した最初のテストとして、ファイルに保存し、JPEGビューアでそのファイルを開こうとします。別のテストとして、 'cv :: imdecode()'を使ってディスクファイルからJPEGイメージをデコードし、APIを正しく使っているかどうかを調べる小さなプログラムを作ることをお勧めします。 – zett42

+0

あなたの返信をありがとう。 RTPヘッダーから取得したタイムスタンプとシーケンス番号に基づいてパケットをソートするので、ソートに問題はないと思います。 –

答えて

0

JPEG over RTPヘッダーはメインヘッダーと呼ばれ、わずか8バイトです。 JFIFヘッダーは、JPEG圧縮データをデコードできるように作成する必要があります。 JFIFヘッダーの作成は、「RFC 2435」形式を使用して行うことができます。すべてがそこで説明されています。 JFIFヘッダーが作成されたら、圧縮データの前に追加してからuncompressedFrame = cv :: imdecode(compressedImage、1)またはその他のJPEGデコーダに渡して圧縮されていないフレームを取得します。このような問題が発生した場合は、([email protected])までお知らせください。お手伝いします。

関連する問題