4

こんにちは私は、デスクトップのスクリーンショットがソケットを介してネットワーク経由で送信されるクライアント/サーバーリモートビューア(デスクトップ共有)アプリケーションを作成しています。2つの画像の差を取得して差を送信することにより、転送のサイズを縮小したいと思います。一方、違いはもう一方の端で前の画像とマージされます。

だから誰かが私にこの仕事をどのように達成できるか教えてください。それでも今、私は毎回ネットワークを介して画面の完全な画像をプログラムで送信し、もう一方の端のプログラムはその画像を表示するだけです。膨大なデータがネットワークを通過していて、もう一方の端の画面更新速度が遅いように感じます。ですから、2つの画像を比較し、違いだけをもう一方の端に送信する方法を教えてください。また、違いを他端の実際の画像とマージする方法も教えてください。

1)画像の比較には多くの無料のコードとライブラリが利用できますが、どれを使用すればよいのか、どれを比較すると非常に高速になるのかがわかりません。だからこれに関して私を導いてください。

2)そして最も重要な部分は、ネットワークを介してのみ差異を送信し、もう一方の端で実際の画像と差異をマージする方法です。

私は自分のポイント2に関する情報を取得するために多くのことを試みましたが、同様のものは何も得られませんでした。ネットワーク経由でのみ違いを送信し、もう一方の端で実際の画像と違いをマージする方法を教えてくれる記事は見つかりませんでした

だから私は特に私のポイント2についての詳細な議論を探しています。ありがとう

4

3 に答える 3

5

次の3つの手順に従う必要があります。

  1. 2つの連続する画像の差分(DIFF)を作成します。ピクセルごとに2つの画像を比較すると、非常に時間がかかります。OpenCVのような定評のあるライブラリを利用する必要があります。.NETのEmguCVライブラリ(http://www.emgu.com/)を確認してください。AbsDiff()が探しているメソッドである必要があります。結果は、DIFF=IMG2-IMG1のようになります。
  2. ネットワークを介してDIFFを送信します。それはまだ完全な画像ですが、JPEGまたはPNGは、それが主に黒い画像、つまりほとんど変更がないことを前提として、その完全な圧縮機能を利用します。したがって、これらは実際には3つのサブステップです。圧縮-送信-解凍
  3. 現在の画像にDIFFを適用します。受信者は、次の画像IMG2 = DIFF+IMG1を計算できます。これは、EmguCVのAddメソッドを使用して実行できます。
于 2012-11-30T10:32:32.917 に答える
1

応答が非常に遅いことはわかっていますが、今日この質問を見つけました

私は画像差分についていくつかの分析を行いましたが、コードはjava用に書かれています。役立つかもしれない以下のリンクをご覧ください

2つの画像の違いの長方形を見つける方法

コードは違いを見つけ、長方形をリンクリストに保持します。長方形を含むリンクリストを使用して、ベースイメージに違いをパッチすることができます。

乾杯 !

于 2013-11-21T09:34:45.277 に答える
1

私のアプローチについてはどうでしょうか。それが役立つかどうかはわかりません。誰かに、これで正しい方向にアプローチしているヒントを教えてもらいたいと思います。

デスクトップから携帯電話へのストリーミングを検討しています。ネットワークTCPソケットでサーバークライアントモデルを使用します。そのようなパターン(プロトコル)を考えます。

サーバ:

0)

画面の画像-IMAGE_SIZE->幅、高さで表されますunsigned char *rgba_array

1)

画像サイズの幅、高さをクライアントに送信します。

2)

長さ<=幅x高さx4バイト(32ビット画像)ですべての配列がゼロになっている初期rgba_array 。

0000 0000 0000 0000 0000 0000 0000 0000(ピクセル例-32ビット)

3)

画面の新しい画像unsigned char *new_rgba_array(スクリーンショット?または他の方法)がある場合は、それをXOR操作に変換しています。

rgba_array XOR new_rgba_array => diff_rgba_array 

4)

私がクライアントにこれを送信するだけよりもdiff_rgba_array圧縮されていますか?JPEG?

5)サーバー側のポイント3)に戻ります。

クライアント:

0)

幅と高さを取得->rgba_array長さ<=幅*高さ*4で初期化し、ゼロにします

1)

diff_rgba_array前の画像と比較した変化を表すものを取得し、それを圧縮解除しますか?JPEG?

0011 1010 0110 0111 1110 0000 0100 0000(ピクセル差の例)

0-ビットは変更なしを意味します

1-ビットは反対の値への変更を意味します

2)

diff_rgba_arrayサーバーから受け取った変更をrgba_array クライアント側に適用します。次のXORingを作るべきだと思います。このような

  10011101   10010101

  00001111   11111111 (XOR) 

= 10010010   01101010 

3)

クライアント側でポイント1)に戻る

于 2016-09-25T19:09:26.570 に答える