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 行ありません。簡単ですね!

最後に自動保存された動画ファイルを掲載します。

顔認証検証用

Follow me!

前の記事

wxPython サンプル(3)