wxPython の改良(1)
こんにちは。terms です。今日は今までのサンプルを少し改良して見やすいようにしましょう。
まずソースコードです。
【追記】
wxPython は Python2 専用です。Python3 になってからは wxPython Pheonix に変わっています。
記事執筆時には Python2.7 でしたので ‘Classic’ wxPython のコードとなっています。
Python3 系を使用する場合は最新の wxPython Pheonix のコードに直してください。
‘Classic’ wxPython か Pheonix かどちらがインストールされているか分からない場合、端末から
$ python3 -c “import wx; print(wx.version())”
4.0.1 gtk3 (phoenix)
のようにして確認してください。
‘Classic’ から Pheonix への移行ガイドは wxPython Project Phoenix Migration Guide から確認できます。
また Pheonix 用のサンプルコードは「データベースと GUI のサンプルを紹介!」に記載しましたのであわせてご参照ください。
# -*- coding:utf-8 -*-
print 'Start test_script'
# Face01 ================================================================
import face01 as f
known_face_encodings, known_face_names = f.load_priset_image(1)
xs = f.face_attestation( known_face_encodings, known_face_names, 0.35 )
# opencv =================================================================
import cv2
# wxPython ===============================================================
import wx
class Sample(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(800, 500))
# メニューバー
menubar = wx.MenuBar()
file = wx.Menu()
quit = wx.Menu()
quit = wx.MenuItem(file, 1, '&Quit\tCtrl+Q')
file.AppendItem(quit)
self.Bind(wx.EVT_MENU, self.OnQuit, id=1)
menubar.Append(file, '&File')
self.SetMenuBar(menubar)
panel = wx.ScrolledWindow(self, -1)
panel.SetBackgroundColour('white')
vbox = wx.BoxSizer(wx.VERTICAL)
# grid 設定
grid1 = wx.GridSizer(800, 5)
# 一行目
grid1.Add(wx.StaticText(panel, -1, '記録された画像', (0, 1)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
grid1.Add(wx.StaticText(panel, -1, 'プリセットデータ', (0, 2)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
grid1.Add(wx.StaticText(panel, -1, '検出人物名', (0, 3)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
grid1.Add(wx.StaticText(panel, -1, '日時', (0, 4)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
grid1.Add(wx.StaticText(panel, -1, '', (0, 5)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
num = 0
for x in xs:
for n in x:
(name, pict, date, img) = (x['name'], x['pict'], x['date'], x['img'])
print 'name is ', name
print 'pict is ', pict
print 'date is ', date, "\n"
cv2.imshow('Video2', x['img'])
img_known_picture = name
img_croped_picture = pict
# ~ exit(0)
if not img_known_picture == 'Unknown.jpg':
file_name = img_known_picture
else:
file_name = 'Unknown'
# img_croped_picture の描画
image2 = wx.Image(img_croped_picture)
self.bitmap = image2.ConvertToBitmap()
img_croped_picture = wx.StaticBitmap(panel, -1, self.bitmap, (0, 0), (100, 100))
img_croped_picture.SetBackgroundColour('#ededed')
grid1.Add(img_croped_picture, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL , 5)
# img_known_picture の描画
if not img_known_picture == 'Unknown.jpg':
img_known_picture = 'pictures_of_people_i_know/' + img_known_picture
image = wx.Image(img_known_picture)
self.bitmap = image.ConvertToBitmap()
img_known_picture = wx.StaticBitmap(panel, -1, self.bitmap, (0, 0), (100, 100))
img_known_picture.SetBackgroundColour('#ededed')
grid1.Add(img_known_picture, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL , 5)
# 名前の描画
grid1.Add(wx.StaticText(panel, -1, file_name, (num, 3)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
# date の描画
grid1.Add(wx.StaticText(panel, -1, (date), (num, 3)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
# 空白の描画
grid1.Add(wx.StaticText(panel, -1, '', (num, 3)), 0, wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_CENTER_HORIZONTAL)
num = num + 1
if num > 990:
break
(ID, img_known_picture, img_croped_picture, date) = ('', '', '', '')
panel.SetSizer(grid1)
panel.SetScrollRate(10,10)
vbox.Add(panel, 0, wx.BOTTOM | wx.TOP, 9)
self.Centre()
self.Show(True)
def OnQuit(self, event):
self.Close()
app = wx.App()
Sample(None, -1, 'Sample.py')
app.MainLoop()
【追記】
Face01 シリーズの 1.0.4 からは Face01 の呼び出し方が変わりました。
# Face01 ===============================================================
import face01_linux_for_testscript as f
kaoninshoDir, pictures_of_people_i_knowDir = f.home()
known_face_encodings, known_face_names = f.load_priset_image(kaoninshoDir, pictures_of_people_i_knowDir, jitters = 1)
xs = f.face_attestation( kaoninshoDir, known_face_encodings, known_face_names, tolerance=0.5 )
移植性を高めるため等から内部プログラムが変更されています。ご注意ください。
まず前回までと比べて、Face01 (フェイスゼロワン)からの戻り値である「映像データ」を別ウィンドウで開いています。2つウィンドウがあるのが見て取れるでしょうか。

次のウィンドウは下図です。

人物の名前がわかるようにしました。変更点としてはこれだけですが、見やすくなったと思います。ソースコードは 100 行ありません。簡単ですね!
最後に自動保存された動画ファイルを掲載します。