HOME/Articles/

pil example play movie nokia5110 (snippet)

Article Outline

Python pil example 'play movie nokia5110'

Functions in program:

  • def readVideo(filename):

Modules used in program:

  • import time
  • import threading
  • import pcd8544.lcd as lcd
  • import sys
  • import cv2
  • import numpy as np

python play movie nokia5110

Python pil example: play movie nokia5110

# -*- coding: utf-8 -*-

import numpy as np
import cv2
import sys
import pcd8544.lcd as lcd
from PIL import Image
import threading
from Queue import Queue
import time

frameQueue_ = Queue()

def readVideo(filename):
    # 動画を開く
    cap = cv2.VideoCapture(filename)

    while(cap.isOpened()):
        try:
            # フレーム読み込み
            ret, frame = cap.read()
            # グレイスケールに変換
            gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        except:
            # 終了
            cap.release()
            cv2.destroyAllWindows()
            quit()

        # リサイズする
        # 先にリサイズしたほうが、二値化後が綺麗
        gray_resized = cv2.resize(gray, (84, 48))
        # ガウス分布を用いたしきい値より二値化
        resize_first = cv2.adaptiveThreshold(gray_resized,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)

        # プレビュー表示用
        # cv2.imshow("resize first", resize_first)

        # PCD9544ライブラリがもとめる画像形式に変換
        PIL_data = Image.fromarray(resize_first)
        im = Image.new('1',(84,48))
        im.paste(PIL_data, (0,0) + PIL_data.size)

        frameQueue_.put(im)



argvs = sys.argv
argc = len(argvs)

# 動画の指定は引数から行う
if (argc != 2):
    print('Usage: # python2.7 %s filename' % argvs[0])
    quit()

# LCDを初期化
lcd.init()
lcd.backlight(0)    # 1:OFF 0:ON
lcd.set_contrast(0xBF)  # Sparkfunのモジュール(LCD-10168)はこの値が一番見やすい

# 読み込みを別スレッドで行う
t = threading.Thread(target=readVideo, args=(argvs[1],))
t.setDaemon(True)
t.start()

lcd.text("now loading...")

# 500フレーム先読み
while frameQueue_.qsize() < 500:
    time.sleep(1)

# 読み込みが完了し、キューの中身が空になるまで繰り返す
while t.isAlive() or (not frameQueue_.empty()):
    # imageメソッド内でポジション移動等全部やるので余計な処理はいらない
    lcd.image(frameQueue_.get(),reverse=True)