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

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

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

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

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Python

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

Q&A

解決済

1回答

4161閲覧

OpenCV webカメラの映像に画像を貼り付けたい

genosuke

総合スコア12

OpenCV

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

ウィンドウ

コンピューター用語において、ウィンドウとはユーザとプログラムのやり取りを可能にするGUIの枠組みのことをいいます。

Python

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

0グッド

0クリップ

投稿2020/01/16 09:51

編集2020/01/17 10:07

前提・実現したいこと

OpenCVとKerasを利用して、webカメラに写されたイラストの顔を検知し判別するプログラムを作りました。
イラストを判別したときにイラストの説明文を書いた画像を画面の下あたりに貼り付けたいのですが何かいい方法を知っている方教えていただきたいです。。

イラストの顔を判別するプログラムコードは以下のホームページとほぼ同じ物を書いています
↓                ↓
https://ai-coordinator.jp/real-time-person-detection

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

Python

1import gakusyu2 as face 2import sys, os 3from keras.preprocessing.image import load_img, img_to_array 4import numpy as np 5import cv2 6import time 7 8cascade_path = 'C:\Users\Taisei\Anaconda3\envs\OpenCV\Lib\site-packages\cv2\data\haarcascade_frontalface_default.xml' 9cascade = cv2.CascadeClassifier(cascade_path) 10cam = cv2.VideoCapture(1) 11color = (255, 0, 255) 12 13image_size = 32 14categories = ["monariza","Lady with an Ermine","Girl with a Pearl Earring"] 15 16def main(): 17 18 while(True): 19 ret, frame = cam.read() 20 facerect = cascade.detectMultiScale(frame, scaleFactor=1.3, minNeighbors=2, minSize=(10, 10)) 21 22 for rect in facerect: 23 cv2.rectangle(frame, tuple(rect[0:2]),tuple(rect[0:2] + rect[2:4]), color, thickness=2) 24 x = rect[0] 25 y = rect[1] 26 width = rect[2] 27 height = rect[3] 28 29 cv2.imwrite("frontalface.png", frame) 30 img = cv2.imread("frontalface.png") 31 32 dst = img[y:y+height, x:x+width] 33 cv2.imwrite("output.png", dst) 34 cv2.imread("output.png") 35 X = [] 36 37 img = load_img("output.png", target_size=(image_size,image_size)) 38 in_data = img_to_array(img) 39 40 X.append(in_data) 41 X = np.array(X) 42 X = X.astype("float") / 256 43 44 model = face.build_model(X.shape[1:]) 45 model.load_weights("C:\python code\system2.hdf5") 46 47 pre = model.predict(X) 48 print(pre) 49 if pre[0][0] > 0.95: 50 print(categories[0]) 51 text = categories[0] 52 font = cv2.FONT_HERSHEY_PLAIN 53 cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, color, 2, cv2.LINE_AA) 54 elif pre[0][1] > 0.95: 55 print(categories[1]) 56 text = categories[1] 57 font = cv2.FONT_HERSHEY_PLAIN 58 cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, color, 2, cv2.LINE_AA) 59 elif pre[0][2] > 0.95: 60 print(categories[2]) 61 text = categories[2] 62 font = cv2.FONT_HERSHEY_PLAIN 63 cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, color, 2, cv2.LINE_AA) 64 65 cv2.imshow("Show FLAME Image", frame) 66 #time.sleep(0.1) 67 68 k = cv2.waitKey(1) 69 70 if k == ord('q'): 71 break 72 73 cam.release() 74 cv2.destroyAllWindows() 75 76if __name__ == '__main__': 77 main()

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

Keras 2.3.1
TensorFlow 2.0.0
OpenCV 4.1.0
Python 3.6.8

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/16 21:29

> イラストの説明文を書いた画像を同じウィンドウに表示させたい 上下左右に乗せたい、画像にかぶせたい、いろいろやりようはありそうですが、「どれで行きたい」という方法や模式図等がありますか?
genosuke

2020/01/16 23:31

ご回答ありがとうございます。 イラストの説明文を書いた画像ファイルを同じウィンドウの下部分に載せたいと考えています。
退会済みユーザー

退会済みユーザー

2020/01/17 21:31 編集

> 画像ファイルを同じウィンドウの下部分に載せたい 適当なサンプル(ダミー)で良いので、カメラに映るであろう画像と説明文の画像を掲載できますか?
genosuke

2020/01/18 10:59

搭載できていないです。。 現在こちらのサイト(https://betashort-lab.com/opencv/リアルタイムで顔をジャンヌに変える/#toc3) を参考に画像を顔の部分ではなくウィンドウの下に貼り付けられるように考えているのですが プログラムコードのどの部分で貼り付けを実行しているのか、どの部分で画像の張り付ける場所を指定しているのかがイマイチわからないです。。
guest

回答1

0

ベストアンサー

イメージ説明

Python3

1import cv2 2import numpy as np 3 4frame_raw = cv2.imread("./lenna.png") 5 6img_description_col = np.zeros((227,227,3),np.uint8) 7img_description_col[:,:,1] = 255 8 9img_description_gray = cv2.cvtColor(img_description_col,cv2.COLOR_BGR2GRAY) 10 11# cv2.imshow("frame(raw)",frame_raw) 12# cv2.imshow("img_description_col",img_description_col) 13 14############################################################### 15# カラー画像にカラー説明を張り付ける 16frame_color = frame_raw.copy() 17 18frame_color[512:512+227,256:256+227] = img_description_col 19cv2.imshow("frame_color",frame_color) 20cv2.waitKey(0) 21cv2.destroyAllWindows() 22 23 24############################################################### 25# グレースケール画像にグレースケール説明を張り付ける 26frame_gray = cv2.cvtColor(frame_color,cv2.COLOR_BGR2GRAY) 27frame_gray[512:512+227,256:256+227] = img_description_gray 28cv2.imshow("frame_gray",frame_gray) 29 30cv2.waitKey(0) 31cv2.destroyAllWindows() 32 33############################################################### 34# カラー画像にグレースケール説明を張り付ける 35frame_color = frame_raw.copy() 36 37print("カラー画像にグレースケール説明を張り付ける") 38frame_color[512:512+227,256:256+227] = img_description_gray 39cv2.imshow("frame_gray",frame_color) 40 41cv2.waitKey(0) 42cv2.destroyAllWindows() 43 44############################################################### 45# グレースケール画像にカラー説明を張り付ける 46frame_color = frame_raw.copy() 47frame_gray = cv2.cvtColor(frame_color,cv2.COLOR_BGR2GRAY) 48 49print("グレースケール画像にカラー説明を張り付ける") 50frame_gray = cv2.cvtColor(frame_color,cv2.COLOR_BGR2GRAY) 51frame_gray[512:512+227,256:256+227] = img_description_col 52cv2.imshow("frame_gray",frame_gray) 53 54cv2.waitKey(0) 55cv2.destroyAllWindows() 56

ボールドテキスト> 現在こちらのサイトを参考に画像を顔の部分ではなくウィンドウの下に貼り付けられるように考えているのですがプログラムコードのどの部分で貼り付けを実行しているのか、どの部分で画像の張り付ける場所を指定しているのかがイマイチわからないです。。

Numpyで画像に画像を張り付ける方法がリンク先コードの43行目にあります。
具体的には、画像をカメラから取得するたびに53行目で関数が呼び出され、呼び出す中身が33行目にあり、ここで先の「画像を張り付ける方法」に至ります。

■Numpyでの画像の張り付け方
img[y左上:y右下(※1),x左上:x右下(※2)] = 上からかぶせる画像
※1: y左上+貼り付ける画像の高さ
※2: x左上+貼り付ける画像の幅

ですので、

画像を画面の下あたりに貼り付けたい

を実現させるには、cv2.puttext()で使う座標(rect[0],rect[1]-10)よりも少し下(y座標が大きい座標)を上記のy左上x左上に指定してください。y左下x右下は貼り付け先の画像サイズに合わせて指定すればいけそうですね。

投稿2020/01/18 13:37

編集2020/01/21 21:10
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

genosuke

2020/01/18 13:47

ご回答ありがとうございます! 本当に助かります。。 img[y左上:y右下(※1),x左上:x右下(※2)] = 上からかぶせる画像  の部分ですが、貼っているソースコードのif文内(puttextのある部分)に直接書き入れても実行はされますかね、、? それとも先ほど貼ったリンクのように、画像を貼る関数を作成しないと実行はしないですか? お分かりでしたら回答していただきたいです。。
genosuke

2020/01/18 19:35

貼りたい画像をグレースケース化して試しにif文の中に frame[rect[0]:rect[0] + 100,rect[0]:rect[0] + 100] = gray_img と書き入れ実行すると、顔を認識した際、画面に一瞬だけ貼りたい画像が映るのですがすぐにエラーが起こって実行が終了されます。 ValueError: could not broadcast input array from shape (1200,1920) into shape (227,227,3) エラー文はこんな感じです。。 なにか解決方法がお分かりでしたら教えていただきたいです!!
退会済みユーザー

退会済みユーザー

2020/01/19 03:43

Q.画像を貼る関数を作成しないと実行はしないですか? A.もう試されたと思いますので、不要かもしれませんが、関数を使っても、関数の中身を直接forループの中で使ってもできることは同じです。異なるのは保守性やごくわずかな速度差くらいです。どちらでもやりやすい方法でやってOKな内容です。 Q. ValueError: could ... 良くあるのは、(幅:1920,高さ:1200…しかも3つ目の数字がないのでグレースケール)が、(幅:227,高さ:227、BGRの3ch…Alexnet?)と一致しないので処理できない。というものです。エラーの起きた行数付近のコードがあればもう少し詳しく答えられますので、もしもう少し詳しい説明が必要でしたら質問に追記ください。
genosuke

2020/01/21 06:10

anime_file = "cat.jpg" anime_face = cv2.imread(anime_file) img_face = cv2.resize(anime_face, (100, 100)) gray_img = cv2.cvtColor(anime_face, cv2.COLOR_RGB2GRAY) if pre[0][0] > 0.95: print(categories[0]) text = categories[0] font = cv2.FONT_HERSHEY_PLAIN cv2.putText(frame,text,(rect[0],rect[1]-10),font, 2, color, 2, cv2.LINE_AA) print('これはモナリザです') frame[rect[0]:rect[1] + 100,rect[0]:rect[1] + 100] = gray_img エラー付近のコードですが原因が分かりましたら回答お願いしたいです。。
退会済みユーザー

退会済みユーザー

2020/01/21 21:16

検証コードを追加しました。 ■検証コードについて 3回目に(「カラー画像にグレースケール説明を張り付ける」で)画像を表示させようとすると、 ValueError: could not broadcast input array from shape (227,227) into shape (227,227,3) と出ます。 貼り付け先(カラー画像:(227,227,3))と張り付けようとしている説明(グレースケール: (227,227) )のshapeが一致していないわけです。 今困っている、 ValueError: could not broadcast input array from shape (1200,1920) into shape (227,227,3) とよく似ていますね。 ■今困っているコードについて 課題は二つあります。 課題1. カラー/グレースケール:貼り付け先(カラー画像:(227,227,3))と張り付けようとしている説明(グレースケール: (1200,1920) )ですので、どちらかをカラーにするかグレースケールにするかで統一しないといけません。元画像のカラーを生かしたいと思いますので、張り付ける説明をカラーにしたら良さそうですね。 課題2. 貼り付け先(227四方)に説明( (1200,1920) )を張り付けようとしてサイズが合っていません。張り付けようとしている画像を一度cv2.imshow()で確認ください。恐らく思っているのとは違う画像を間違えて指定していることと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問