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

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

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

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

OpenCV

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

Q&A

1回答

1055閲覧

Raspberry PiとPython(OpenCV)を用いたカメラのプログラムで、HTTPErrorとTypeErrorが起こる

Ekito

総合スコア4

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

OpenCV

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

0グッド

0クリップ

投稿2021/04/04 06:17

編集2021/04/04 06:19

株式会社VOLT著『Pythonで動かして学ぶ!あたらしいIoTの教科書』(翔泳社、2020)の内容で、うまくいかない箇所があったので、こちらでご質問させていただきます。

該当箇所:本書第8章 8.8_セキュリティカメラのプログラムを作成する(162p~168p)

Raspberry Piにカメラモジュールを取り付けて、そこに人が映ったら認識するようなプログラムを作りました。しかし実際に実行してみると、いざカメラに人が映ったときに以下のエラーが生じて動かなくなります。

urllib.error.HTTPError: HTTP Error 400: Bad Request
TypeError: the JSON Object must be str, not 'bytes'

エラーの詳細とプログラムの内容は末尾に記載します。実行環境は次の通りです。
・Raspberry Pi 3 Model B (+ CAMERA MODULE V2)
・Thonny Python IDE

エラーの原因について、ご教授いただければ幸いです。どうぞよろしくお願いいたします。

【エラーの詳細】
エラーの中にある、opencv-secyrity-camera.pyはプログラムの名称です。

Traceback (most recent call last):

File "/home/pi/opencv-security-camera.py", line 94, in <module>
response = urllib.request.urlopen(req)
File "/usr/lib/python3.5/urllib/request.py", line 163, in urlopen
return opener.open(url, data, timeout)
File "/usr/lib/python3.5/urllib/request.py", line 472, in open
response = meth(req, response)
File "/usr/lib/python3.5/urllib/request.py", line 582, in http_response
'http', request, response, code, msg, hdrs)
File "/usr/lib/python3.5/urllib/request.py", line 510, in error
return self._call_chain(*args)
File "/usr/lib/python3.5/urllib/request.py", line 444, in _call_chain
result = func(*args)
File "/usr/lib/python3.5/urllib/request.py", line 590, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request


During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/home/pi/opencv-security-camera.py", line 123, in <module>
print(json.loads(error.read()))
File "/usr/lib/python3.5/json/init.py", line 312, in loads
s.class.name))
TypeError: the JSON object must be str, not 'bytes'

【プログラムの内容】

Python

1# ライブラリのインポート 2from picamera.array import PiRGBArray 3from picamera import PiCamera 4import time 5import cv2 6import urllib 7import urllib.request 8import urllib.error 9import json 10import ssl 11import RPi.GPIO as GPIO 12 13 14# ウインドウやフレームレートの設定 15camera = PiCamera() 16camera.resolution = (640, 480) 17camera.framerate = 32 18rawCapture = PiRGBArray(camera, size=(640, 480)) 19time.sleep(0.1) 20 21 22# データを格納するリストを定義 23face_data=[] 24 25 26# カスケードファイルの指定 27faceCascade = cv2.CascadeClassifier("/home/pi/デスクトップ/opencv/haarcascade_frontalface_alt.xml") 28 29 30# 顔を認識した場合にAzure Machine Learningにデータを送信する処理 31for frame in camera.capture_continuous(rawCapture, format="bgr", use_video_port=True): 32 image = frame.array 33 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 34 faces = faceCascade.detectMultiScale( 35 gray, 36 scaleFactor=1.1, 37 minNeighbors=5, 38 minSize=(30, 30), 39 flags=cv2.CASCADE_SCALE_IMAGE 40 ) 41 42 43 # 顔を四角枠で囲う 44 for (x, y, w, h) in faces: 45 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2) 46 47 48 # フレームを表示 49 cv2.imshow("Frame", image) 50 key = cv2.waitKey(1) & 0xFF 51 52 53 # 次のフレームを表示 54 rawCapture.truncate(0) 55 56 57 # [Q]キーでストップ 58 if key == ord("q"): 59 break 60 61 62 # 顔を認識し矩形にリスト化 63 face_list = faceCascade.detectMultiScale(image) 64 65 if len(face_list) > 0: 66 for face in face_list: 67 image = image[face[1]:face[1] + face[3], face[0]:face[0] + face[2]] # トリミング 例:[68:218 , 55:205] 68 image = cv2.resize(image, (28, 28)) # リサイズ 69 image_gs = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # グレースケール 70 image_gs = image_gs.flatten() # リストを平坦化 71 i= 1 72 for n in image_gs: 73 exec("img%d = %d" % (i, n)) 74 i = i+1 75 ssl._create_default_https_context = ssl._create_unverified_context 76 data = { 77 "Inputs": { 78 "input1": 79 { 80 "ColumnNames": ["Col1", "Col2", "Col3", [途中略] "Col784", "Col785"], 81 "Values": [ [ "0", img1, img2, [途中略] img783, img784 ], ] 82 }, }, 83 "GlobalParameters": { 84 } 85 } 86 body = str.encode(json.dumps(data)) 87 88 url = 'url' # Azure Machine Learningで取得したURL 89 api_key = 'api_key' # Azure Machine Learningで取得したAPI KEY 90 headers = {'Content-Type': 'application/json', 'Authorization': ('Bearer ' + api_key)} 91 req = urllib.request.Request(url, body, headers) 92 try: 93 response = urllib.request.urlopen(req) 94 result = response.read().decode("utf-8") 95 json_str = result 96 json_dict = json.loads(json_str) 97 output1 = json_dict["Results"]["output1"]["value"]["Values"] 98 last_val = output1[0][-1] 99 100 print(last_val) 101 print("人を認識しました。") 102 if last_val == "0": 103 print("不審者") 104 105 GPIO.setmode(GPIO.BCM) # ピン番号ではなくGPIOの番号で指定 106 GPIO.setup(21, GPIO.OUT) # GPIO 21を出力として指定 107 108 # 繰り返し処理 109 for l in range(2): 110 GPIO.output(21, GPIO.HIGH) # GPIO 21をHIGHに変更 111 time.sleep(0.5) # 0.5秒停止 112 GPIO.output(21, GPIO.LOW) # GPIO 21をLOWに変更 113 time. sleep(0.5) # 0.5秒停止 114 else: 115 print("一般人") 116 time.sleep(1) 117 118 except urllib.error.HTTPError as error: 119 print("The request failed with status code: " + str(error.code)) 120 print(error.info()) 121 print(json.loads(error.read())) 122 123 face_list = [] 124 125cv2.destroyAllWindows()

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

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

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

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

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

yskszk63

2021/04/21 12:33 編集

- Azure Machine Learningが400 Bad Requestを返している - -> APIの呼び出し方に何か誤りがあると思われる - Azure Machine Learningが返してきたメッセージをJSONとして解析しようとしてエラーが発生 - -> なんのエラーが発生したかわからなくなっている。。 ``` During handling of the above exception, another exception occurred: Traceback (most recent call last): File "/home/pi/opencv-security-camera.py", line 123, in <module> print(json.loads(error.read())) File "/usr/lib/python3.5/json/init.py", line 312, in loads s.class.name)) TypeError: the JSON object must be str, not 'bytes' ``` Azureがなんて言っているか分からないと解決が難しいと思うので、 まずは、123行目(?)の ``` print(json.loads(error.read())) ``` を ``` print(str(error.read())) ``` みたいに変えてみると何か解決の糸口が見えるかもしれないです。
guest

回答1

0

url = 'url' # Azure Machine Learningで取得したURL api_key = 'api_key' # Azure Machine Learningで取得したAPI KEY

ここじゃないですか?
''の中身を書き換えないと行けないと思います。

投稿2021/04/21 15:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問