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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

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

Q&A

2回答

1348閲覧

エラーの原因がわからない

colorful

総合スコア23

Python 3.x

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

0グッド

1クリップ

投稿2020/05/28 07:41

編集2020/05/28 07:45

こんにちは。
ご覧頂きありがとうございます。

現在、1台のパソコンとソケット通信を用いて、画像を送受信するプログラムを作成しています。
これは、1台のパソコンの中で、クライアント側とサーバー側で通信を行い、画像を送受信するというプログラムを作成しています。
ですが、サーバー側のプログラムの方でエラーが出ており、対処法がわからずに困っています。

ですので、ご指摘やアドバイスお願いできないでしょうか。

[server.py] import numpy as np from PIL import Image import cv2 import time import json import base64 import requests import os import shutil def send_image(img): encimg = cv2.imencode(".png", img) img_byte = base64.b64encode(img_str).decode("utf-8") img_json = json.dumps({'image': img_byte}).encode('utf-8') img_str = encimg.tostring() ponse = requests.post("http://localhost:8080/save", data=img_json) print('{0} {1}'.format(response.status_code, json.loads(response.text)["message"])) if __name__ == '__main__': cap = cv2.VideoCapture(0) print('cap return value = ',cap) cap.set(cv2.CAP_PROP_FPS, 30) i = 0 while True: img = cap.read() if i % 5 == 0: send_image(img) i += 1

error

1

cap return value = <VideoCapture 000001E1C8476E30>
Traceback (most recent call last):
File "send.py", line 27, in <module>
send_image(img)
File "send.py", line 12, in send_image
encimg = cv2.imencode(".png", img)
TypeError: Expected Ptrcv::UMat for argument '%s'

[client.py]
import os
import json
import cv2
import base64
import numpy as np
from datetime import datetime
from flask import Flask, request, Response
app = Flask(name)
count = 0

image_dir = "./images"
if not os.path.isdir(image_dir):
os.mkdir(image_dir)

def detect_face(img):
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(img, 1.3, 5)
return faces

@app.route('/save', methods=['POST'])
def save_image():

data = request.data.decode('utf-8') data_json = json.loads(data) image = data_json['image'] image_dec = base64.b64decode(image) data_np = np.fromstring(image_dec, dtype='uint8') decimg = cv2.imdecode(data_np, 1) gray_img = cv2.cvtColor(decimg, cv2.COLOR_BGR2GRAY) faces = detect_face(gray_img) for (x,y,w,h) in faces: decimg = cv2.rectangle(decimg,(x,y),(x+w,y+h),(255,0,0),2) global count filename = "./images/image{}.png".format(count) cv2.imwrite(filename, decimg) count += 1 return Response(response=json.dumps({"message": "{} was saved".format(filename)}), status=200)

if name == 'main':
app.run(host='0.0.0.0', port=8080)

[実行結果]

  • Serving Flask app "client" (lazy loading)
  • Environment: production
    WARNING: This is a development server. Do not use it in a production deployment.
    Use a production WSGI server instead.
  • Debug mode: off
  • Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)

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

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

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

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

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

guest

回答2

0

cap.read()からの受取り方が間違っている為、画像データがsend_image()に渡されていません。

rururu3さんの回答にあるように、ret, frame = cap.read() と、複数の値を受け取るのが正しい処理です。
これを、img = cap.read()とした場合、imgの中身は、(ret, frame)となります。

このデータでは画像処理ができませんので、エラーとなります。

この場合、ret, img = cap.read() が、colorfulさんの希望の処理になるのではないでしょうか。

ただし、こちらで確認した限りでは、フレームデータがpng形式のデータであるという記述を発見できませんでした。
現在、開発環境がありませんので、これに関しては、colorfulさんがご確認ください。

投稿2020/06/08 04:40

YT0014

総合スコア1708

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

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

colorful

2020/06/08 05:54

回答ありがとうございます。 server.pyの12行目のエラーを消すことが無事に出来ました。 ただ、13行目の所で「UnboundLocalError: local variable 'img_str' referenced before assignment」のエラーが出てきてしまいました。もし、この対処法をご存じでしたらアドバイスを頂けないでしょうか?
YT0014

2020/06/08 06:11

google翻訳の結果「UnboundLocalError:割り当て前に参照されるローカル変数 'img_str'」 質問を重ねる前に、自力での解決を試みてください。
colorful

2020/06/08 06:23

すみません、ありがとうございます。調べたところ、定義する前にimg_strを使っていたことが原因見たいですね。そこで、12行目の後に img_str = encimg.tostring()を定義して、やりま押してみましたが、「AttributeError: 'tuple' object has no attribute 'tostring' [ WARN:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap_msmf.cpp (674) SourceReaderCB::~SourceReaderCB terminating async callback」というエラーが出てきました。おそらく、contribパッケージがインストールされていないことが原因だろうと思い、インストールしたのですが、エラーが消えないです。これって、他に何か原因があるのでしょうか?
YT0014

2020/06/08 06:44

エラー内容に関する情報を収集し、確実性の高い原因を推測してください。 まず、エラー発生行を特定してください。修正は、原因を完全に特定してからです。
guest

0

python知らないので参考程度にしかならないかもしれませんが

TypeError: Expected Ptr<cv::UMat> for argument '%s'
型が cv::UMatじゃないものを引数にしてるのでエラーになってるっぽいですね

Python, OpenCVで動画を読み込み(ファイル・カメラ映像)

ret, frame = cap.read()

ってなってるから、
img = cap.read()
imgには多分bool値が入ってるんじゃないかなぁ…

投稿2020/05/28 11:14

rururu3

総合スコア5545

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

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

colorful

2020/05/29 13:08

回答ありがとうございます。 また、返信遅くなってしまい申し訳ございません。 img = cap.read()で画像を読み込んだ後に、imencodeで画像変換を行いたいんです。 しかし、imencodeを行うときにエラーが出てしまったので、何かインストールをする必要があるんですかね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問