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

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

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

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

Raspberry Pi

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

Python

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

Q&A

解決済

1回答

9665閲覧

cv2.putTextの描画書き換え方法がわからない

oyatsu8

総合スコア97

OpenCV

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

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2019/04/14 09:14

編集2019/04/14 12:40

python、OpenCV初心者です。生成した画面に、cv2.putTextで置いた文字をif文で書き換えたいのですが、うまくできません。

やりたいことは、初期値で"FIRST"が表示され、
キーボードのaを押したら、"A"、キーボードのbを押したら、"B"、と表示することで表示はできるのですが、前のが消されずに残ってしまいます。
生成した画面は同じまま、文字の描画を前のものは消し、今のものだけ表示するにはどうしたらいいのでしょうか?

python2.7.13

1# -*- coding: utf-8 -*- 2#!/usr/bin/python 3import time 4import sys 5import cv2 6 7cap = cv2.VideoCapture(0) 8 9# フレームをキャプチャする 10ret, frame = cap.read() 11ret=cap.set(3,240) 12ret=cap.set(4,180) 13 14height=frame.shape[0] 15width=frame.shape[1] 16font01=cv2.FONT_HERSHEY_SIMPLEX 17 18text01 = 'FIRST' 19CV_AA = 16 20cv2.putText(frame,text01,(10,100),font01,2,(0,255,255),4) 21 22while(True): 23 24 # 画面に表示する 25 cv2.imshow('frame',frame) 26 27 # キーボード入力待ち 28 key = cv2.waitKey(1) & 0xFF 29 30 # aを押した時 31 if key == ord('a'): 32 print("aを押した") 33 text01='A' 34 cv2.putText(frame,text01,(10,100),font01,2,(0,255,255),4) 35 # bを押した時 36 elif key == ord('b'): 37 print("bを押した") 38 text01='B' 39 cv2.putText(frame,text01,(10,100),font01,2,(0,255,255),4) 40 41 # qが押された場合は終了する 42 if key == ord('q'): 43 print("quit") 44 GPIO.cleanup() 45 sys.exit(0) 46 break 47 48 print(text01) 49 50# ウィンドウをすべて消す 51cv2.destroyAllWindows() 52 53

tiitoiさんのアドバイスから、下記のように修正しました。
tiitoiさんありがとうございます。

なんとか切り替わるようになりました!
しかし、今度は文字がチカチカしてしまい、これもどうしたらいいのか、、と思いました。

python

1# -*- coding: utf-8 -*- 2#!/usr/bin/python 3 4import numpy as np 5import cv2 6 7cap = cv2.VideoCapture(0) 8 9curr_key = "None" 10 11# フレームをキャプチャする 12ret, frame = cap.read() 13ret=cap.set(3,240) 14ret=cap.set(4,180) 15 16height=frame.shape[0] 17width=frame.shape[1] 18font01=cv2.FONT_HERSHEY_SIMPLEX 19 20#text01 = 'FIRST' 21#CV_AA = 16 22#cv2.putText(frame,curr_key,(10,100),font01,2,(0,255,255),4) 23 24 25while True: 26 frame_copy = frame.copy() 27 28 # 画面に表示する 29 cv2.imshow('frame',frame) 30 31 # キーボード入力待ち 32 key = cv2.waitKey(1) & 0xFF 33 34 # 一番最後にキー入力された文字を表示する。 35 if curr_key: 36 cv2.putText(frame_copy,curr_key,(10, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,255,255), 4) 37 38 cv2.imshow('frame',frame_copy) 39 key = cv2.waitKey(1) & 0xFF 40 41 if key == ord('a'): 42 curr_key = 'A' 43 print("Aを入力") 44 elif key == ord('b'): 45 curr_key = 'B' 46 print("Bを入力") 47 elif key == ord('q'): 48 break 49 50 51# ウィンドウをすべて消す 52cv2.destroyAllWindows() 53

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

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

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

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

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

guest

回答1

0

ベストアンサー

1度描画したものを消すということはできないので、frame をコピーして描画するようにすればいいのではないでしょうか。(つまり、元の frame 自体には描画しない)

diff

1while(True): 2+ frame_copy = frame.copy()

while 内の putText は frame ではなく、コピーした frame_copy に対して描画するようにする。

diff

1- cv2.putText(frame 2+ cv2.putText(frame_copy

サンプルコード

python

1import cv2 2import numpy as np 3 4frame = np.zeros((500, 500, 3), dtype=np.uint8) # ダミーの画像 5curr_key = None # 一番最後に入力されたキー 6 7while True: 8 frame_copy = frame.copy() 9 10 # 一番最後にキー入力された文字を表示する。 11 if curr_key: 12 cv2.putText(frame_copy, curr_key, (10, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (0,255,255), 4) 13 14 cv2.imshow('frame', frame_copy) 15 key = cv2.waitKey(1) & 0xFF 16 17 if key == ord('a'): 18 curr_key = 'A' 19 elif key == ord('b'): 20 curr_key = 'B' 21 elif key == ord('q'): 22 break # 終了 23 24cv2.destroyAllWindows()

投稿2019/04/14 09:38

編集2019/04/14 09:55
tiitoi

総合スコア21956

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

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

oyatsu8

2019/04/14 09:43

ありがとうございます。今から試してみます。
tiitoi

2019/04/14 09:56

while の中身を少し工夫する必要があるかもしれません。 動作確認したサンプルコードを追記しました。
oyatsu8

2019/04/14 10:07

大変ありがとうございます!
oyatsu8

2019/04/14 12:42

ありがとうございました。なんとか切り替わるようになりました!(while文のせいか、今度は文字がチカチカしてしまっておりますが、、^^;;)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問