Pythonでキーボード入力した文字列を横にスライドさせて表示し、それを動画にするプログラム
Pythonでキーボード入力した文字列を横にスライドさせて表示し、それをMP4形式の動画にするプログラムの紹介をします。
文字列を横にスライドさせる方法はこちら「Pythonで画像を横にスライドさせる表示の仕方とそれを動画にする方法」の投稿で紹介した「文字列画像をスライドさせるプログラム」と同じものを使っているので、この投稿ではキーボード入力した文字列を画像にするプログラムをメインに説明します。
また、入力した文字列を画像にすると文字列以外の余白ができるので、その余白がなしの場合とありの場合、両方のプログラムを交えて紹介します。
目次
【余白なし】
・キーボード入力した文字列を横にスライドさせて表示している様子
・キーボード入力した文字列を画像にするプログラム + 横にスライドさせる表示とそれを動画にするプログラム
・MP4形式の動画で保存した様子
【余白あり】
・キーボード入力した文字列を横にスライドさせて表示している様子
・キーボード入力した文字列を画像にするプログラム + 横にスライドさせる表示とそれを動画にするプログラム
・MP4形式の動画で保存した様子
・参考サイト
余白なし
キーボード入力した文字列を横にスライドさせて表示している様子
文字列以外の余白を切り取っています。
キーボード入力した文字列を画像にするプログラム + 横にスライドさせる表示とそれを動画にするプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
import matplotlib.pyplot as plt import japanize_matplotlib#日本語入力 import cv2 import copy moji=input("\n文字列の入力") num_w=int(len(moji))#文字列の個数で表示する幅を決める #文字を描画する範囲を決める figsize=(幅 , 高さ) fig, ax = plt.subplots(figsize=(num_w, 10)) #文字列を描画する位置とサイズを決める text(x,y,文字列 ,文字サイズ) x=0.0~1.0 y=0.0~1.0 ax.text(0.0, 0.5, moji, size=50)#(x横, y縦) ax.grid()#マス目を付けるようにしています。この命令はなくてもいい plt.axis("off")#マス目と枠線を表示しないようにする plt.savefig("mp_text.png")#入力した文字列画像を保存 img=cv2.imread("mp_text.png")#画像の読み込み height, width = img.shape[:2]#高さ、幅を取り出す left=num_w*10 right=num_w*15#右側の余白の方が左側より広がるから、少し大きめに設定しています。次の行の15+left:width-(20+right)も同様に、右側を大きめに設定しています。 img=img[0+430:height-480,15+left:width-(20+right)] #ここから下は「Pythonで画像を横にスライドさせる表示の仕方とそれを動画にする方法」の文字列画像をスライドさせるプログラムと同じです height, width = img.shape[:2]#高さ、幅を取り出す bimg=copy.copy(img)#黒色にする変数bimg for x in range(height):#imgの高さ、幅の数繰り返して色を黒色にする for y in range(width): bimg[x, y]=255,255,255#255,255,255で白色にしている #bimg[x, y]=0,0,0#0,0,0で黒色にしている size=(width,height)#MP4動画のサイズ指定 fourcc = cv2.VideoWriter_fourcc('m','p','4','v')#保存形式 save = cv2.VideoWriter('input_text2.mp4',fourcc,80,size)#動画を保存するための形を作成 data=width#dataの値がスライドを動かす数になります。 while True: f=0 #1回目 右から左にスライド num=sepa=data for i in range(num): bk=copy.copy(bimg)#動かすたびに、新しくコピーした黒色画像を使う img_cut=img[0:height,0:(width//num)*sepa]#(width//n)の()はなくていいです。見やすいから付けています bk[0:height,(width//num)*i:width]=img_cut#黒色画像に切り取った画像を入れる cv2.imshow("img",bk)#表示 save.write(bk)#保存 k=cv2.waitKey(1)#1ミリ秒wait sepa-=1 if k==27:#ESCキーを押したとき終了 f=1 break#for文の終了 if f==1: break#while文の終了 #2回目 右から左にスライド num=sepa=data for i in range(num): bk=copy.copy(bimg) img_cut=img[0:height,(width//num)*sepa:width] bk[0:height,0:(width//num)*i]=img_cut cv2.imshow("img",bk) save.write(bk)#保存 k=cv2.waitKey(1) sepa-=1 if k==27:#ESCキーを押したとき終了 f=1 break#for文の終了 if f==1: break#while文の終了 #最後、2回目のfor文のスライドが1つ足りないので、追加 bk=copy.copy(bimg) img_cut=img[0:height,(width//num)*0:width] bk[0:height,0:(width//num)*num]=img_cut cv2.imshow("img",bk) save.write(bk)#保存 k=cv2.waitKey(1) save.release() # ファイルを閉じる cv2.destroyAllWindows() |
プログラムの説明をします。
7行目はキーボード入力を可能にして、入力された文字列を変数mojiに代入しています。
11行目は文字列を描画する範囲を決めています。この描画する範囲の横幅を決めるときに、8行目で調べた文字列の個数を使います。
14行目は文字列を描画する位置とサイズを決めて、11行目で指定した範囲内に文字列を描画しています。
(0.0, 0.5, moji, size=50)の0.0の部分はx軸(横)、0.5の部分はy軸(縦)を指定しています。また、x軸とy軸はともに0.0~1.0までの範囲になります。
※ここのx軸とy軸の範囲は下で説明している(余白あり)の方が、目で見てわかりやすいです。
17行目は文字列を描画した様子を画像にして保存しています。
plt.savefigについてはこちら「plt.showで表示する画像をプログラム上で保存する方法」の投稿で紹介しています。
20行目は19行目で読み込んだ画像の高さと幅の値を変数height, widthに代入しています。
21、22行目は余白を切り取るときに使う、数値を決めています。余白は右側の方が広くなるので、左側より少し大きめに設定しています。
23行目は読み込んだ文字列画像の余白を切り取っています。
”15+left:width-(20+right)”の15と20は、21、22行目で設定した切り取る値とプラスして、余白を切り取ります。この右側の数値20も22行目と同様に、左側より少し大きめに設定しています。
28行目から下は「Pythonで画像を横にスライドさせる表示の仕方とそれを動画にする方法」と同じプログラムなので、そちらの投稿を拝見してください。
17行目のplt.savefig(“mp_text.png”)で保存した画像

余白を切り取る前の画像になります。19~23行目で余白を切り取っています。
MP4形式の動画で保存した様子
Pythonプログラムで保存したMP4形式の動画になります。
余白あり
キーボード入力した文字列を横にスライドさせて表示している様子
文字列以外の余白を切り取らない場合
余白があることを強調するために、背景を黒色にしています。
キーボード入力した文字列を画像にするプログラム + 横にスライドさせる表示とそれを動画にするプログラム
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
import matplotlib.pyplot as plt import japanize_matplotlib#日本語入力 import cv2 import copy moji=input("\n文字列の入力") num_w=int(len(moji))#文字列の個数で表示する幅を決める #文字を描画する範囲を決める figsize=(幅 , 高さ) fig, ax = plt.subplots(figsize=(num_w, 10)) #文字列を描画する位置とサイズを決める text(x,y,文字列 ,文字サイズ) x=0.0~1.0 y=0.0~1.0 ax.text(0.0, 0.5, moji, size=50)#(x横, y縦) ax.grid()#マス目を付けるようにしています。 plt.savefig("mp_text.png")#入力した文字列画像を保存 img=cv2.imread("mp_text.png")#画像の読み込み img=cv2.resize(img,(600,600))#余白を切り取らない場合は、画像が大きいので小さくしています。 #ここから下は「Pythonで画像を横にスライドさせる表示の仕方とそれを動画にする方法」の文字列画像をスライドさせるプログラムと同じです height, width = img.shape[:2]#高さ、幅を取り出す bimg=copy.copy(img)#黒色にする変数bimg for x in range(height):#imgの高さ、幅の数繰り返して色を黒色にする for y in range(width): #bimg[x, y]=255,255,255#255,255,255で白色にしている bimg[x, y]=0,0,0#0,0,0で黒色にしている size=(width,height)#MP4動画のサイズ指定 fourcc = cv2.VideoWriter_fourcc('m','p','4','v')#保存形式 save = cv2.VideoWriter('input_text3.mp4',fourcc,80,size)#動画を保存するための形を作成 data=width#dataの値がスライドを動かす数になります。 while True: f=0 #1回目 右から左にスライド num=sepa=data for i in range(num): bk=copy.copy(bimg)#動かすたびに、新しくコピーした黒色画像を使う img_cut=img[0:height,0:(width//num)*sepa]#(width//n)の()はなくていいです。見やすいから付けています bk[0:height,(width//num)*i:width]=img_cut#黒色画像に切り取った画像を入れる cv2.imshow("img",bk)#表示 save.write(bk)#保存 k=cv2.waitKey(1)#1ミリ秒wait sepa-=1 if k==27:#ESCキーを押したとき終了 f=1 break#for文の終了 if f==1: break#while文の終了 #2回目 右から左にスライド num=sepa=data for i in range(num): bk=copy.copy(bimg) img_cut=img[0:height,(width//num)*sepa:width] bk[0:height,0:(width//num)*i]=img_cut cv2.imshow("img",bk) save.write(bk)#保存 k=cv2.waitKey(1) sepa-=1 if k==27:#ESCキーを押したとき終了 f=1 break#for文の終了 if f==1: break#while文の終了 #最後、2回目のfor文のスライドが1つ足りないので、追加 bk=copy.copy(bimg) img_cut=img[0:height,(width//num)*0:width] bk[0:height,0:(width//num)*num]=img_cut cv2.imshow("img",bk) save.write(bk)#保存 k=cv2.waitKey(1) save.release() # ファイルを閉じる cv2.destroyAllWindows() |
(余白なし)プログラムから変更、追加した箇所だけ説明します。
plt.axis(“off”)を削減して、マス目と枠線を表示しています。
余白を切り取らないので、余白を切り取るプログラムを削減しています。
追加した箇所は18行目に読み込んだ画像を小さくするプログラムを追加しています。
余白がある場合は画像のサイズが大きいので、小さくしています。
余白なしのプログラムでは、下画像の赤矢印の部分を削って、緑の枠線で囲んだ部分だけ切り取っています。

15行目のplt.savefig(“mp_text.png”)で保存した画像

余白を切り取らずに、この画像のままサイズを小さくして横にスライドさせています。
MP4形式の動画で保存した様子
Pythonプログラムで保存したMP4形式の動画になります。
参考サイト
matplotlibに日本語入力ができるようにする方法について
https://yolo.love/matplotlib/japanese/