PyQt 写真撮影 ver2

PyQt 写真撮影 ver2

まずは前回のをご参考に

今回はただの暇つぶしです。PyQtという点では前回のプログラムの方がいいかもしれないです。

仕様

今回のプログラムの機能を以下の通りです。

  • カメラの映像をリアルタイム出力
  • Enterキーを押すとシャッター音を鳴らし、押した瞬間の画像を保存する
  • Enterで反応しないなら適当なキーを割り当て
  • 保存形式は「yyyymmdd_hhmmss.png」(要はdatetime)
  • シャッター音はPyQt全く関係なし
  • Escキーか×ボタンでプログラム終了
  • 表示・撮影画像ともに1280×720

準備

このプログラム通り動かすにはこれらが必要です
(PyQtは大前提)

pip opencv-python
pip pygame  

音を鳴らす必要がない、使えるmp3を持っていないという人はスルーして該当箇所を消せばOK

ソースコード

from PyQt5 import QtCore, QtGui,QtWidgets
import sys
import cv2
import datetime
from pygame import mixer
 
class Ui_Form(object):
	def setupUi(self, Form):
		Form.setObjectName("Form")
		Form.resize(1280, 720)
		self.graphicsView = QtWidgets.QGraphicsView(Form)
		self.graphicsView.setGeometry(QtCore.QRect(0, 0, 1282, 722))
		self.graphicsView.setObjectName("graphicsView")
		self.graphicsView.setFocusPolicy(QtCore.Qt.StrongFocus)
 
		self.retranslateUi(Form)
		QtCore.QMetaObject.connectSlotsByName(Form)
 
	def retranslateUi(self, Form):
		_translate = QtCore.QCoreApplication.translate
		Form.setWindowTitle(_translate("Form", "Form"))
 
class Camera(QtWidgets.QDialog):
	msec = 10 # ms
	def __init__(self,parent=None):
		super(Camera, self).__init__(parent)
		self.ui = Ui_Form()
		self.ui.setupUi(self)
		
		self.capture = cv2.VideoCapture(0)
		
		
		self.capture.set(cv2.CAP_PROP_FRAME_WIDTH , 1280)#1920
		self.capture.set(cv2.CAP_PROP_FRAME_HEIGHT , 720)#1080
		
		if self.capture.isOpened() is False:
			raise("IO Error")
			
		self.scene = QtWidgets.QGraphicsScene()
		self.set()
 
	   
		timer = QtCore.QTimer(self)
		timer.timeout.connect(self.set)
		timer.start(self.msec)
 
	def set(self):
 
		ret, cv_img = self.capture.read()
		if ret == False:
			return
		self.picture = cv_img
		cv_img = cv2.cvtColor(cv_img,cv2.COLOR_BGR2RGB)
 
		self.image = QtGui.QImage(cv_img.data, 1280, 720, QtGui.QImage.Format_RGB888)
		self.item = QtWidgets.QGraphicsPixmapItem(QtGui.QPixmap.fromImage(self.image))
		self.scene.clear()
		self.scene.addItem(self.item)
		self.ui.graphicsView.setScene(self.scene)
	
	def keyPressEvent(self,event):
		if event.key() == QtCore.Qt.Key_Return:
			now_time = datetime.datetime.now()
			mixer.init()        #初期化
			mixer.music.load("./music.mp3")
			mixer.music.play(1)
			cv2.imwrite("./picture/"+now_time.strftime('%Y%m%d_%H%M%S')+".png",self.picture)
		elif event.key() == QtCore.Qt.Key_Escape:
			self.close()
   
 
if __name__ == '__main__':
	app = QtWidgets.QApplication(sys.argv)
 
	window = Camera()
	window.show()
	sys.exit(app.exec_())

補足

if event.key() == QtCore.Qt.Key_Return のところで、
Enterが反応しない人は、Qt.Key_Enterに変更するか任意のキーに
割り当てたほうが良いです。

写真の保存場所は直下にフォルダを作るようにしていますが、
自分でパスの変更をお願いします。

最後に

今回のソースも素材の一つとして使ってみてください。

もし、余計なものがあったら消せばOKです!
エラー起きたらその時は頑張ってください!

4 のコメント

comments user
クソ森省吾

撮影中の画面表示をHDからFHDにしたいのですが
ソースコード全て
1280×700 → 1900×1080に置き換えると画面がバグります
どのようにすればいいのでしょうか?

    comments user
    sou

    4か所全てを1920×1080に置き換えても解決しないということでしょうか?
    self.graphicsView.setGeometry(QtCore.QRect(0, 0, 1922, 1082))も大丈夫ですか?

      comments user
      クソ森省吾

      上記内容に書き換えましたが
      表示がバグったままですね
      カメラが対応してないパターンですかね

        comments user
        sou

        今回のコードでは対応しているとわかっているので数値を絶対指定しています。
        カメラの解像度を取得して値を入れるか、v4l2などで最大解像度を調べて、
        コードに反映させるのがいいかもしれません。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です