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

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

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

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

Python

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

Q&A

解決済

1回答

539閲覧

opencvを使ったカメラ映像での画像認識

huton

総合スコア30

OpenCV

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

Python

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

0グッド

0クリップ

投稿2020/07/12 07:13

質問内容

自作した学習済みモデルとopencvでカメラの映像を使った画像認識を行いたいと思い以下のサイト(リンク内容)を参考にやってみようとしたのですがエラーが発生してしまいました。このエラーを解決するにはどのようにすればいいのでしょうか?
ソースコード

学習済みモデル(sign.py)
保存方法に問題があるかもしれないので一応学習済みモデルのソースコードを載せます。

python

1import keras 2import pickle 3import pandas as pd 4import numpy as np 5import matplotlib.pyplot as plt 6import seaborn as sns 7from keras import models 8from keras import layers 9from keras import optimizers 10from pandas import Series,DataFrame 11from keras.utils import to_categorical 12from keras.optimizers import RMSprop 13from keras.preprocessing.image import ImageDataGenerator 14from sklearn.preprocessing import LabelBinarizer 15 16#csv読み込み 17sign_train = pd.read_csv("sign_mnist_train.csv",sep=",") 18sign_test = pd.read_csv("sign_mnist_test.csv",sep=",") 19lb=LabelBinarizer() 20 21#特訓データ 22train_data=sign_train.drop(['label'],axis=1) 23train_data = train_data.values.reshape(-1,28,28,1) 24train_data=train_data.astype('float32')/255 25 26train_label=sign_train['label'] 27train_label=lb.fit_transform(train_label) 28 29#テストデータ 30test_data=sign_test.drop(['label'],axis=1) 31test_data = test_data.values.reshape(-1,28,28,1) 32test_data=test_data.astype('float32')/255 33 34test_label=sign_test['label'] 35test_label=lb.fit_transform(test_label) 36 37#モデル 38model=models.Sequential() 39model.add(layers.Conv2D(32,(3,3),activation='relu',input_shape=(28,28,1))) 40model.add(layers.MaxPooling2D((2,2))) 41model.add(layers.Conv2D(64,(3,3),activation='relu')) 42model.add(layers.MaxPooling2D((2,2))) 43model.add(layers.Conv2D(64,(3,3),activation='relu')) 44 45model.add(layers.Flatten()) 46model.add(layers.Dense(64,activation='relu')) 47model.add(layers.Dropout(0.1)) 48model.add(layers.Dense(64,activation='relu')) 49model.add(layers.Dropout(0.1)) 50model.add(layers.Dense(24,activation='softmax')) 51 52#学習の取り決め 53model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['acc']) 54 55#学習 56history=model.fit(train_data,train_label,epochs=20,batch_size=200,validation_data=(test_data,test_label)) 57 58#保存 59model.save("sign.h5")

エラーの出たソースコード(kamera.py)
エラーの出た行の先頭に(*)と書いておきます。

python

1from keras.models import load_model 2import numpy as np 3import cv2 4 5# カメラから画像を取得して,リアルタイムに手書き数字を判別させる。 6# 動画表示 7cap = cv2.VideoCapture(1) 8 9model = load_model("sign.h5") # 学習済みモデルをロード 10 11# 無限ループ 12while(True): 13 14 # 判定用データの初期化 15 Xt = [] 16 Yt = [] 17 18 ret, frame = cap.read() 19 20 # 画像のサイズを取得,表示。グレースケールの場合,shape[:2] 21(*) h, w, _ = frame.shape[:3] 22 23 # 画像の中心点を計算 24 w_center = w//2 25 h_center = h//2 26 27 # 画像の真ん中に142×142サイズの四角を描く 28 cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71),(255, 0, 0)) 29 30 # カメラ画像の整形 31 im = frame[h_center-70:h_center+70, w_center-70:w_center+70] # トリミング 32 im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # グレースケールに変換 33 _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU) # 2値化 34 th = cv2.bitwise_not(th) # 白黒反転 35 th = cv2.GaussianBlur(th,(9,9), 0) # ガウスブラーをかけて補間 36 th = cv2.resize(th,(28, 28), cv2.INTER_CUBIC) # 訓練データと同じサイズに整形 37 38 Xt.append(th) 39 Xt = np.array(Xt)/255 40 41 result = model.predict(Xt, batch_size=1) # 判定,ソート 42 for i in range(10): 43 r = round(result[0,i], 2) 44 Yt.append([i, r]) 45 Yt = sorted(Yt, key=lambda x:(x[1])) 46 47 # 判定結果を上位3番目まで表示させる 48 cv2.putText(frame, "1:"+str(Yt[9]), (10,80), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 1, cv2.LINE_AA) 49 cv2.putText(frame, "2:"+str(Yt[8]), (10,110), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 1, cv2.LINE_AA) 50 cv2.putText(frame, "3:"+str(Yt[7]), (10,140), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 1, cv2.LINE_AA) 51 cv2.imshow("frame",frame) # カメラ画像を表示 52 53 k = cv2.waitKey(1) & 0xFF # キーが押下されるのを待つ。1秒置き。64ビットマシンの場合,& 0xFFが必要 54 prop_val = cv2.getWindowProperty("frame", cv2.WND_PROP_ASPECT_RATIO) # アスペクト比を取得 55 56 if k == ord("q") or (prop_val < 0): # 終了処理 57 break 58 59cap.release() # カメラを解放 60cv2.destroyAllWindows() # ウィンドウを消す

エラーメッセージ

python

1Traceback (most recent call last): 2 File "kamera.py",line 21, in <module> 3 h, w, _ = frame.shape[:3] 4AttributeError: 'NoneType' object has no attribute 'shape'

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因

おそらくですが、カメラから映像を取得するのに失敗しています。
映像の取得に失敗した場合、以下の ret は False になっているので、それをチェックしましょう。

python

1ret, frame = cap.read() 2assert ret, "フレームの取得に失敗"

カメラのデバイス ID は通常は0から割り当てられるので、ノート PC に内蔵カメラがすでにあり、別途 Web カメラを接続しているといった状況でなければ、以下のデバイス ID は0になると思います。

diff

1- cap = cv2.VideoCapture(1) 2+ cap = cv2.VideoCapture(0)

参考

投稿2020/07/12 07:41

tiitoi

総合スコア21956

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

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

huton

2020/07/12 09:51

エラーが消えました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問