お世話になります。Winsockを使用し、UDP・非同期通信によるUSBカメラデータの
送受信テストを行っています。
ネットワークのトラブルはないと思うのですが、送信されてきたデータが受信側で正しく
表示できません。宜しくご教示願います。以下に送受信の簡単な説明を記します。
☆ 送信側の手順(ソケットの生成、非同期通信の設定など、ネットワークの設定は
準備済とします)
1 送信側、OpenCVの画像データを管理しているIplImage構造体を準備する。
2 USB カメラから撮影したデータの1フレームをキャプチャーする。
3 手順2で取得したデータが大きすぎるとき、udpプロトコルで送信できる、最大サ
イズに分割する。
4 sendto 関数でIplImage構造体の中の、IplImage->imageSize(画像データサイ
ズ)と、
IplImage->imageData(画像データ)を手順3で述べた、サイズに分割して送信する。
☆ 受信側の手順(送信側と同様にソケットの生成、bind(ソケットとポートの結
合)などは、準備済とします)
1 送信側、で指定したサイズと同じサイズのIplImage構造体を準備する。
2 while(1) の無限ループ内で、fdsに設定されたソケットが読み込み可能になるま
で待つ。
3 手順2で、準備したソケットに、読み込み可能データがある場合、recvfrom 関数
を使用し
受信バッファー(char buf[UDPの送・受信で扱える最大サイズ])に送信データを受信す
る。
4 手順3 のデータ(IplImage->imageSize、IplImage->imageData)を手順1で作っ
た構造体に収める。
5 OpenCVの、cvShowImage関数(指定したウィンドウ内に画像を表示する関数)を
使用し
手順1のデータを表示させる。
結果
動画表示されない。
ネットワークエラーはなし。
補足
当該プログラムを作成する前に、同じ通信方式・同じプロトコルを用い、
テキストの文字列を連続送受信する、プログラムを作りました。
結果は、受信側で送信されてきた文字列が表示できています。
環境
OpenCV2.0
Visual Studio 2010 Professional Edition (Win32 Project)
どこまでできているのかわからず上記情報では
みなさん答えにくいと思います。
キャプチャできたのかどうか、
データが受信できたのかどうか、
随時ダンプするなりして確認するしかないでしょうか。
OpenCVに正しいデータが渡っているのであれば
ここで出す話題ではないかもしれません。
Wireshark というソフトもお勧めです。
UDPでは
1.データは正しく受信できない可能性がある。
2.データは送信された順番通りに受信できない可能性がある。
3.両者ともネットワークのエラーなしに発生する。
ので、それでも動き続けるアプリとして設計されなければなりません。
一般的には数百Byte程度をやり取りするのが精一杯といったものです。
つまり、大きなサイズの一連のデータをやりとりする手段としては
まったく向きではありません。TCP/IPに変更しましょう。
通信状況を見てみてください.
UDPでたとえパケットが落ちたとしても非圧縮データなら何らかの像が写るはずです.何も
写らないのであれば,通信がまったく行われてない可能性が高いです.
あとUDPは,仲澤@失業者がいうとおり,送ったものが届く保証も送った順番に届く保証も
ありません.ですが,最速のプロトコルです.適切に使えば通信出来るはずです.
あとネットワークの中の機器では,あまり大きなパケットが通過するのを許可していないも
のもあります.パケットサイズを小さくしてみてはどうでしょうか?