前提・実現したいこと
ソケットを用いてwebカメラで撮影した画像を10秒に1回送信するプログラム、画像を受信し表示させた後保存するプログラムを作成しています。
画像は送れていて、表示保存もできていますが、定期的に送っている画像の最初の一枚しかできていません。さらに、表示された画像には「応答なし」と出ています。対処方法がわかりません。
該当のソースコード
python
1webcameraで撮影するプログラム 2 3import socket 4import sys 5import numpy 6import cv2 7import base64 8 9HOST, PORT = "", 10 11sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 12sock.connect((HOST,PORT)) 13 14capture = cv2.VideoCapture(0) 15 16capture.set(3,320) #幅 17capture.set(4,240) #高さ 18capture.set(5,30) #FPS 19if not capture: 20 print("Could not open camera") 21 exit() 22 23num = 1 24 25while True: 26 #VideoCaptureから1フレーム読み込む 27 ret, frame = capture.read() 28 29 cv2.imshow("camera", frame) 30 31 if num % 300 == 0: 32 jpg = cv2.imencode('.jpg',frame)[1].tostring() 33 sock.send(jpg) 34 num = num + 1 35 36 37 38 if cv2.waitKey(1) & 0xFF == ord('q'): 39 # 「q」キーが押されたら終了する 40 break 41 42# キャプチャをリリースして、ウィンドウをすべて閉じる 43capture.release() 44cv2.destroyAllWindows() 45 46 47 48 49 50画像を受信、表示、保存するプログラム 51 52# -*- coding:utf-8 -*- 53import socket 54import select 55import threading 56import cv2 57import numpy as np 58 59import sys 60import datetime 61import time 62 63import os 64from pylsd.lsd import lsd 65 66 67host = "" 68port = 69 70serversock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 71serversock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 72serversock.bind((host,port)) #IPとPORTを指定してバインドします 73serversock.listen(10) #接続の待ち受けをします(キューの最大数を指定) 74 75 76 77def handle(connection, address): 78 print ("connect from:", addr) 79 #画像の受け取り 80 buf=b'' #b'': byte型 81 recvlen=100 82 while recvlen>0: 83 receivedstr=connection.recv(1024*8) 84 recvlen=len(receivedstr) 85 print (len(receivedstr)) 86 buf +=receivedstr 87 print("bytes recieved") 88 jpg = np.frombuffer(buf, dtype=np.uint8) 89 90 img = cv2.imdecode(jpg, cv2.IMREAD_COLOR) 91 92 #センシング画像を表示 93 cv2.imshow('img', img) 94 cv2.waitKey(1000) 95 96 now = datetime.datetime.now() 97 rcvmsg = now.strftime('%Y%m%d_%H%M') 98 99 PATH ="C://pythonimg//"+ str(rcvmsg)+".jpg" 100 101 cv2.imwrite(PATH,img) 102 103 104 105 106while True: 107 try: 108 # 接続要求を受信 109 conn, addr = serversock.accept() 110 111 except KeyboardInterrupt: 112 serversock.close() 113 exit() 114 break 115 116 # 待受中にアクセスしてきたクライアントを追加 117 clients.append((conn, addr)) 118 119 handle(conn, addr) 120 121 122 123 124
試したこと
・連続して送られてくる画像に対して、画像を受け取って表示し保存するまでの処理が間に合っていないと考え、5秒おきを10秒おきに変換
(num % 150 → num % 300)
・thread処理が必要なのかと考え、clients.append()の次の行に
thread=threading.Thread(target=handle, arg=(conn, addr))
thread.start()
を追加
handle(conn, addr)を削除
補足情報(FW/ツールのバージョンなど)
環境:python3.7.6, windows10
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。