ソケットイメージ伝送ホストコンピュータ設計実績

前回の記事でTCP/UDPのデータ転送についてある程度の紹介をし、チャタリングや画像転送の設計を行ったので、ここでは前回のpyqtを組み合わせて最後の改善点を作っていきます。それ。

さらに詳しく知りたい場合は、私の以前のコラムを読んでください

TCP/UDP記録画像伝送方式

TCP/UDP 記録チャット

TCP通信およびUDP通信記録

1. ホストコンピュータのページと機能の設計

1. ページデザイン

ページのこの部分は比較的単純です。QT を使用してブロックをドラッグ ダウンし、次に主にいくつかの入力ボックスの定義を定義し、必要な変数を定義します。ここでの変数の定義は次のとおりです。定義することをお勧めします。最初に変数を入力し、
ここに画像の説明を挿入
次に変数を変更すると、より便利になりますが、変数が多すぎるため、使用するときに混乱しやすくなります。このようにしてください。

ここのビデオ部分については、ラベルを選択するだけです。ラベル コントロールはテキストを表示するために使用されますが、画像の本質はバイトではないため、ここでテキストをバイトに置き換えるだけで十分です。

2. 関数の定義

これは単なるデモなので、多くの機能を作成する必要はありません、主にビデオの表示、その後の画像のキャプチャと保存の操作。これは、上の図に示されている選択したファイルのボタンです。同時に、いくつかのプロンプト情報の表示を容易にするために、ここに情報出力ボックスを追加するのが最善です。デバッグプロセスの一部なので、要約関数はおそらく次のようになります。

  • 画像表示
  • 画像保存
  • ビデオ録画

ここでは基本的な例なので、プログラム部分は一部だけ移植します、ここではUDP部分のみを移植します、画像送信の3つの方法については以前紹介したので、すべてをここに移植するわけではありません。

2. ホストコンピュータプログラムの設計

ここのコードはそれほど多くなく、最後に100行強しかありません。途中の空行を除いて、いくつかの繰り返しがあります。ファームウェアの有効なコードは50行強しかないので、この部分は実際はとてもシンプルです。
ここに画像の説明を挿入

1 つ目は初期化部分です。ここでの初期化部分は、一方ではいくつかの変数の初期化であり、他方ではソケットの初期化です。ここでのソケットの初期化では、IP アドレスとポート番号はそのまま残ります。

ここに画像の説明を挿入

ファイルを保存するために選択したフォルダーは次のとおりです。ここではqtの公式機能を使用します

ここに画像の説明を挿入
関数のソースコードは次のとおりです。開始パスが事前に入力されています。

        self.path = QtWidgets.QFileDialog.getExistingDirectory(None,"选取文件夹","G:/")  # 起始路径

その結果、 を押した後にファイル選択ボックスがポップアップ表示されます。
ここに画像の説明を挿入

この後、画像のオンオフを行いますが、実はこの部分が最も重要な部分とも言えますので、まずはコードを見てみましょう。

ここに画像の説明を挿入
ここでは、入力ミスを防ぐために、大きな問題が起こらないように try を追加します。下の情報出力ボックスは、正しい IP アドレスとポート番号の入力を求めます。ここは非常に重要だと思います。間違い qt プログラムがフラッシュバックしてしまい非常に面倒なので、
ここに画像の説明を挿入
タイマーをオンにするとタイマー機能に入り、前回の UDP 送信のデコード関数をタイマーに入れてデコードすることで実現します。ループ更新し、公式関数を使用して画像を塗りつぶします。関数は次のとおりです。

 showimage = QtGui.QImage(self.iamge.data, self.iamge.shape[1], self.iamge.shape[0], self.iamge.shape[1] * 3,
                                        QtGui.QImage.Format_RGB888)

実はここで注意すべき点は、BGR画像をRGBに変換しないと、表示上のチャンネルの乱れによる違和感が非常に大きいので、ここではopencvの公式機能を使います。

self.iamge = cv2.cvtColor(self.img, cv2.COLOR_BGR2RGB)

最終的な完全なコードは次のとおりです
ここに画像の説明を挿入

以下は写真を保存する部分で、基本的には opencv の公式関数を呼び出します。

ここに画像の説明を挿入

最後にビデオを保存します. こちらも以前の公式機能です. 機能は次のとおりです:

 self.video_out = cv2.VideoWriter(str(self.path) + '/' + str(self.video_index) + '.avi',
                                                 cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 50, (640, 480))

もちろん、この関数は常に保存する必要があるため、
ここに画像の説明を挿入
すべての作業が完了するようにタイマーの関数に追加する必要があります。以下はテストです。

3. テスト効果

ここではRaspberry Piを使用して接続しています。遅延は大丈夫です。基本的には明らかではありません。効果は次のとおりです。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/m0_51220742/article/details/124537421