OpenCVを使用してTCP経由でビデオを圧縮およびストリーミングする

私の仕事では、画像処理アルゴリズムの開発、特に、特別なアプリケーションのためにビデオ上のオブジェクトを自動的に追跡するアルゴリズムの開発に携わっています。 最近、複雑なシステムで作業のロジックをデバッグするために、リモートコンピューターから制御されるアルゴリズムモデルを作成する必要がありました。 以前は、これはタスクではありませんでした。 すべてのアルゴリズムは最終的にFPGAに実装されました。 私はOpenCVで長い間仕事をしており、手をこすりながらプログラムを書きに行きました。 しかし、ネットワークを介してビデオを直接送信すると、熱意はすぐに薄れていきました。



タスクは次のとおりです。



1.サーバーにプログラムを書き込みます。サーバーは、ファイルからビデオをダウンロードし、JPEGに圧縮して、TCPプロトコルを介してクライアントにプログラムを送信します。

2. TCP経由でビデオを受信し、デコードして表示するクライアントプログラムを作成します。



上記のタスクは基本的なものであり、テクノロジを「解決」するのに役立ちます。 このトピックはすでに長い間説明されているようですが、しばらくして既製の回答(コード)を探した後、すべてが明らかではないことに気付きました。 したがって、ここでこの問題に関する私の経験を紹介します。 おそらく誰かが私の経験を役に立つと思うでしょう。



プログラムは、OpenCVバージョン3.1ライブラリを使用してVisual Studio 2015で開発されました。 プロジェクトの作成、ライブラリの接続、ネットワーキングを担当するコードの作成の手順は省略します。 記事の最後で、プロジェクトのソースコードへのリンクを提供し、コード内の完全なコメントを使用して、すばやく理解できるようにします。 主な問題に焦点を当てます。ファイルからビデオを取得し、希望する圧縮率でJPEGに圧縮し、さらにデコードして受信側で表示してネットワーク経由で送信する方法です。 以下は、ビデオフレームを圧縮してネットワーク経由で送信する方法を示す小さなコードです(受信側との接続が確立されていることを考慮して)。



//   Mat srcMat; //    vector<uchar> imgBuf; //     vector<int> quality_params = vector<int>(2); //     quality_params[0] = CV_IMWRITE_JPEG_QUALITY; //  JPEG quality_params[1] = 20; //     (95) 0-100 //    cd.frame = cvQueryFrame(cd.videocap); //     srcMat = cv::cvarrToMat(cd.frame); //    JPEG imencode(".jpg", srcMat, imgBuf, quality_params); //   send(clientSocket, (const char*)&imgBuf[0], static_cast<int>(imgBuf.size()), 0);
      
      





次に、受信側でイメージを解凍する方法について説明します。 以下は、クライアントプログラムのコードフラグメントです。



 //   int iResult; //     const int MAX_BUF_SIZE = 2073600; //      unsigned char *buf = new unsigned char[MAX_BUF_SIZE]; //     vector<uchar> videoBuffer; //    Mat jpegimage; //    IplImage img; //    //    iResult = recv(connectSocket, (char *)&buf[0], MAX_BUF_SIZE, 0); if (iResult > 0) { //    ,   videoBuffer.resize(iResult); memcpy((char*)(&videoBuffer[0]), buf, iResult); //   jpegimage = imdecode(Mat(videoBuffer), CV_LOAD_IMAGE_COLOR); img = jpegimage; //   cvShowImage("Recieved Video", &img); //    ( 5 ms) cvWaitKey(5); }//if (iResult > 0)...
      
      





説明されている操作は、ビデオの各フレームに対して実行されます。 この小さな例が、OpenCVライブラリを使用してTCPでストリーミングビデオを圧縮および送信する際に発生する問題を解決するのに役立つことを願っています。 以下は、クライアントとサーバーのスクリーンショットです。

www.dropbox.com/s/ikisl8rjxxd5d0f/%D0%91%D0%B5%D0%B7%D1%8B%D0%BC%D1%8F%D0%BD%D0%BD%D1%8B%D0%B9 .png

受信側の圧縮率は20(高圧縮)であるため、画像の著しい歪みに気付くことができます。



詳細なコメント付きのサーバーおよびクライアントプログラムのソースコードは、リンクで表示できます。



www.dropbox.com/s/3ucjsdes7khcr24/Server.cpp?dl=0

www.dropbox.com/s/14mat8bhlonz392/Client.cpp?dl=0



頑張ってください!



All Articles