実現したいこと
サーバーが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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/04/16 03:01