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

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

新規登録して質問してみよう
ただいま回答率
85.49%
ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Python

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

Q&A

解決済

1回答

3639閲覧

Python3で定期的に送られてくる画像を表示、保存する

kakazu

総合スコア1

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

Python

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

0グッド

0クリップ

投稿2020/10/09 08:53

編集2020/10/10 08:36

前提・実現したいこと

ソケットを用いて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

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

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

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

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

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

guest

回答1

0

自己解決

while recvlen>0:のループの部分が原因でした。
クライアントから送られてくる画像サイズrecvlenは、連続して画像を受信するため永遠に0でない状態が続いていたため、whileループを抜け出せていませんでした。
修正後は以下の通りです。
recvlen=10248
while recvlen==1024
8:
receivedstr=clientsocket.recv(1024*8)
recvlen=len(receivedstr)
print (len(receivedstr))
buf +=receivedstr

投稿2020/10/10 13:24

kakazu

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問