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

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

ただいまの
回答率

88.90%

opencvでのカメラの映像に画像認識の結果表示

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 212

huton

score 22

質問内容

a~zのうちjとz以外の24個のアルファベットの手話のデータを学習させた学習済みモデルとopencvを使ってカメラの映像で画像認識を行いたいと考えています。
この結果を[MNIST学習済みモデルとOpenCVを使ってリアルタイムに手書き数字を認識させる]の実行結果の左上の表示と同じようにしたいと考えています。例としては以下のようなものです。

1:[a, 1.0]
2:[o, 0.0]
3:[c, 0.0]

しかしどのようにすれば数字の部分をアルファベットにできるのかがよくわかりません。
このサイトを参考に自分なりにやってみたのですがうまくいく気がしません。
どのようにすればうまく表示できるのでしょうか?

ソースコード

エラーの発生したソースコード(kamera.py)
エラーの発生した行の先頭に(*)を書いておきました。

from keras.models import load_model
import numpy as np
import cv2

# カメラから画像を取得して,リアルタイムに手書き数字を判別させる。
# 動画表示
cap = cv2.VideoCapture(0)

model = load_model("sign.h5") # 学習済みモデルをロード

# 無限ループ
while(True):

    # 判定用データの初期化
    Xt = []
    Yt = []

    ret, frame = cap.read()

    # 画像のサイズを取得,表示。グレースケールの場合,shape[:2]
    h, w, _ = frame.shape[:3]

    # 画像の中心点を計算
    w_center = w//2
    h_center = h//2

    # 画像の真ん中に142×142サイズの四角を描く
    cv2.rectangle(frame, (w_center-71, h_center-71), (w_center+71, h_center+71),(255, 0, 0))

    # カメラ画像の整形
    im = frame[h_center-70:h_center+70, w_center-70:w_center+70] # トリミング
    im = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # グレースケールに変換
    _, th = cv2.threshold(im, 0, 255, cv2.THRESH_OTSU) # 2値化
    th = cv2.bitwise_not(th) # 白黒反転
    th = cv2.GaussianBlur(th,(9,9), 0) # ガウスブラーをかけて補間
    th = cv2.resize(th,(28, 28), cv2.INTER_CUBIC) # 訓練データと同じサイズに整形
    th = th.reshape(28,28,1)

    Xt.append(th)
    Xt = np.array(Xt)/255

    result = model.predict(Xt, batch_size=1) # 判定,ソート

    ch = ['a','b','c','d','e','f','g','h','i','k','l','m',
    'n','o','p','q','r','s','t','u','v','w','x','y']

    for i in range(len(ch)):
(*)     r = round(result[0,ch[i]], 2)
        Yt.append([ch[i], r])
        Yt = sorted(Yt, key=lambda x:(x[1]))

    # 判定結果を上位3番目まで表示させる
    cv2.putText(frame, "1:"+str(Yt[9]), (10,80), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 1, cv2.LINE_AA)
    cv2.putText(frame, "2:"+str(Yt[8]), (10,110), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 1, cv2.LINE_AA)
    cv2.putText(frame, "3:"+str(Yt[7]), (10,140), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255,255,255), 1, cv2.LINE_AA)

    cv2.imshow("frame",frame) # カメラ画像を表示

    k =  cv2.waitKey(1) & 0xFF # キーが押下されるのを待つ。1秒置き。64ビットマシンの場合,& 0xFFが必要
    prop_val = cv2.getWindowProperty("frame", cv2.WND_PROP_ASPECT_RATIO) # アスペクト比を取得

    if k == ord("q") or (prop_val < 0): # 終了処理
        break

cap.release() # カメラを解放
cv2.destroyAllWindows() # ウィンドウを消す

エラーメッセージ

Traceback (moset recent call last):
  File "kamera.py", line 48, in <module>
    r = round(result[0,ch[i]],2)
IndexError: only integers, slices (':'), ellipsis ('...'), numpy.newaxis ('None') and integer or boolean arrays are valid indices 
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

r = round(result[0,ch[i]], 2)はたとえばi=0だとr = round(result[0,'a'], 2)と同じとなります。
配列位置の指定には文字ではだめなので提示エラーが発生します。
r = round(result[0,i], 2)ではないでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/13 09:02

    1:[a, 0.0] のように表示できましたありがとうございます。
    質問に答えて頂いたのに厚かましくて申し訳ないのですが、
    [,]内の左側側が何をしても0.0のままなのですが心当たりはありますか?

    キャンセル

  • 2020/07/13 09:07

    ちょっと分かりませんが、まずはresultに意図した値が入っているか確認されるとよいかと思います。

    キャンセル

  • 2020/07/13 09:30

    ありがとうございます。
    確認してみます。

    キャンセル

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

  • ただいまの回答率 88.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る