質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1620閲覧

Pythonでsocket通信を使ってクライアントからサーバーに画像を送ることがしたいです

Eitoen

総合スコア4

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/04/15 14:57

実現したいこと

サーバーがtake pictureを送信したらクライアントがサーバーに画像を送ることです

前提

Pythonでsocket通信とopencv2を使っています

発生している問題・エラーメッセージ

一回目の画像はきちんと表示されるのですが二回目からtake pictureを送っても一枚目の画像のままです

該当のソースコード

Pythonサーバ側

1import socket 2 3# サーバーのIPアドレスとポート番号を指定する 4hostname = socket.gethostname() 5HOST = socket.gethostbyname(hostname) 6PORT = 8000 7print(HOST) 8 9# ソケットを作成し、接続を待機する 10server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11server_socket.bind((HOST, PORT)) 12server_socket.listen(1) 13 14# クライアントからの接続を受け入れる 15client_socket, addr = server_socket.accept() 16 17# 受信するデータのバッファサイズを指定する 18BUFFER_SIZE = 1000000 19 20# 受信したデータをファイルに保存する 21with open('photo.jpg', 'wb') as f: 22 while True: 23 # サーバー側での命令を入力する 24 command = input("Enter command: ") 25 26 # クライアントに対して命令を送信する 27 client_socket.send(command.encode()) 28 29 if command == 'exit': 30 break 31 32 # データを受信する 33 data = client_socket.recv(BUFFER_SIZE) 34 35 # 受信したデータをファイルに書き込む 36 f.write(data) 37 38 # ソケットを閉じる 39 client_socket.close() 40server_socket.close()

pythonクライアント側

1import socket 2import cv2 3import numpy as np 4 5# サーバーのIPアドレスとポート番号を指定する 6HOST = "サーバーのIPアドレス" 7PORT = 8000 8 9# ソケットを作成し、サーバーに接続する 10client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 11client_socket.connect((HOST, PORT)) 12 13while True: 14 # サーバーからの指示を受信する 15 message = client_socket.recv(1024).decode() 16 17 if message == 'take picture': 18 # カメラから画像を撮影する 19 cap = cv2.VideoCapture(0) 20 ret, frame = cap.read() 21 22 # 画像をJPEG形式にエンコードする 23 encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 90] 24 img_bytes = cv2.imencode('.jpg', frame, encode_param)[1].tobytes() 25 26 # 画像データをサーバーに送信する 27 client_socket.sendall(img_bytes) 28 29 # カメラを解放する 30 cap.release() 31 32 # 画像データをサーバーに送信する 33 client_socket.sendall(img_bytes) 34 35 elif message == 'exit': 36 # 終了の指示を受信した場合はループを抜ける 37 break 38 39 else: 40 # サポートされていない指示を受信した場合はエラーを出力する 41 print(f'Unknown command: {message}') 42 43# ソケットを閉じる 44client_socket.close() 45 46

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

提示されたサーバー側のコードではphoto.jpgという1つのファイルに複数の受信(画像)データが書き込まれるような動作になっています。
意図通りの動作をさせるには、ファイル名を連番なりにして受信毎に別ファイルとして保存すべきと思います。

投稿2023/04/16 00:04

can110

総合スコア38267

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Eitoen

2023/04/16 03:01

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問