現時点でOpenCVあるいはPillow、PILのいずれかを使い、画像を表示しています。
しかし、ただ表示するのではなく、表示する画像を「矢印キー」で切り替えたいです。
調べても、矢印キーではうまくいかないという情報しか見つかりませんでした。
矢印キーで画像を切り替えて表示することは、不可能なのでしょうか?
画像の処理をOpenCVでやって、表示は別のモジュールで・・・というやり方であっても、情報が欲しいです。
実行環境はWindows10(できれば、MacやLinuxでも)です。
回答よろしくお願いします。
追記
https://twitter.com/amdkkj/status/875877581802749952
上のTwitterのように、矢印キーが押されたかどうかは検出できましたが、どの方向のキーが押されたのかを取得できません。
どの方向のキーが押されたのかよって画像を切り替えたいです。(右なら次の画像、左なら前の画像を表示するというように)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
画像の処理をOpenCVでやって、表示は別のモジュールで・・・というやり方であっても、情報が欲しいです。
実行環境はWindows10(できれば、MacやLinuxでも)です。
ハリボテですが、OpenCV + PyQt で書いてみました。
main.py
Python
1import sys 2 3import cv2 4 5from PyQt5.QtCore import Qt, QObject, pyqtSlot 6from PyQt5.QtWidgets import QApplication 7 8from img_view import ImageView, convert_npimg_to_pixmap 9 10 11class Main(QObject): 12 def __init__(self, cvimg): 13 QObject.__init__(self, parent=None) 14 self._app = QApplication(sys.argv) 15 16 self._key_to_func = { 17 Qt.Key_Right: self.next_img, 18 Qt.Key_Left: self.prev_img, 19 } 20 21 viewer = ImageView(parent=None) 22 viewer.key_pressed.connect(self.key_pressed) 23 viewer.set_image( 24 convert_npimg_to_pixmap(cvimg) 25 ) 26 viewer.show() 27 28 sys.exit( 29 self._app.exec_() 30 ) 31 32 @pyqtSlot(int) 33 def key_pressed(self, key): 34 if key in self._key_to_func: 35 self._key_to_func[key]() 36 else: 37 print(key) 38 39 def next_img(self): 40 print('show next img.') 41 42 def prev_img(self): 43 print('show prev img.') 44 45 46if __name__ == '__main__': 47 img = cv2.imread(r'./Lenna.jpg') 48 assert img is not None 49 50 _ = Main(img)
img_view.py
Python
1from PyQt5.QtCore import pyqtSignal 2from PyQt5.QtGui import QImage, QPainter, QPixmap 3from PyQt5.QtWidgets import QWidget 4 5 6def convert_npimg_to_pixmap(npimg): 7 height, width, depth = npimg.shape 8 assert depth == 3 9 10 return QPixmap( 11 QImage(npimg, width, height, width * 3, QImage.Format_RGB888).rgbSwapped() 12 ) 13 14def read_img_as_pixmap(filename: str): 15 return QPixmap(filename) 16 17 18class ImageView(QWidget): 19 key_pressed = pyqtSignal(int) 20 21 def __init__(self, parent=None): 22 QWidget.__init__(self, parent) 23 self._pixmap = None 24 25 # Override 26 def paintEvent(self, event): 27 if self._pixmap is None: 28 return 29 30 size = self._pixmap.width(), self._pixmap.height() 31 32 self.resize(*size) 33 QPainter(self).drawPixmap( 34 0, 0, *size, self._pixmap 35 ) 36 37 # Override 38 def keyPressEvent(self, key_event): 39 self.key_pressed.emit(key_event.key()) 40 41 def set_image(self, pixmap): 42 self._pixmap = pixmap 43 self.update()
動作確認環境
- Windows10
- Python3.6.2
- opencv3.3.0
- qt5.6.2
使っているのはcondaで放り込んだ野良バイナリです。
投稿2018/06/27 15:51
総合スコア35658
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
もし切り替えるのが複数のカメラの映像であればと理解して回答します。
Pythonではまだ試していませんがC++の環境では、複数のカメラをオープンして、またwaitKey関数での入力値でどの映像をimshowするかの切替は容易です。
またimshowして映像を表示する際、imashowだけでなく必ずwaitKeyを呼ばないと適切に描画されません。
よって回答として①どの映像を描画するか?②そのためにどの映像を描画しているかのフラッグを持って映像の取得後の処理を行う。
といった流れになります。
投稿2018/06/27 00:20
総合スコア3747
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/06/27 06:30
2018/06/27 11:47
退会済みユーザー
2018/06/27 13:45
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。