2019年4月19日金曜日

めげない pythonで動画を表示

HPのアクセスが少ないので、めげてしまう。

でも、めげたときは
・まー何とかなるさと楽天的に
・他の良いことをクローズアップして自信を回復
・最後に、これを機会にを多角的に考える

どうかな~

◆パイソンで、ウインドウズ画面をキャプチャするものを作成しました。
ついでに再生もつくりました。



pythonで動画を表示します。
使い方 
play.py  動画ファイル

※cv2,npを使いますので、インストールしてください
 cv2.waitKey(20)で再生スピードを調整


play.py
#-*- coding:utf-8 -*-
import cv2
import numpy as np
import sys

width  = 1280
height =  720
fname  = sys.argv[1]
#fname  = "capture5.mov"

def main():

    # 動画の読み込み
    cap = cv2.VideoCapture( fname)

    # 動画終了まで繰り返し
    while(cap.isOpened()):

        # フレームを取得
        ret, frame = cap.read()
        if ret != True:
            break

        #frame = cv2.resize(frame, dsize=(width/2, height/2))
        # フレームを表示
        cv2.imshow("Flame", frame)
        cv2.waitKey(20)

        # qキーが押されたら途中終了
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
        
    cap.release()
    cv2.destroyAllWindows()


if __name__ == "__main__":
    main()











pythonでPC上の画面をキャプチャします。
ウインドウズ版になります。
かなり、ソースが汚いですがごめんなさい。

使い方 
capture.py  動画ファイル名( cap.mov等)

※何かキー入力で終了です

※importしているファイルは、インストールされていなければ
してください。



capture.py
# -*- coding: utf-8 -*-

import sys
import win32gui
import win32ui
import win32con
from PIL import Image

import cv2
import numpy as np



SCREEN_WIDTH = 2160
SCREEN_HEIGHT = 1440
SCREEN_SCALING_FACTOR = 1.5

""" スクリーンショット撮ってそれを(Pillow.Imageで)返す """
window = win32gui.GetDesktopWindow()
window_dc = win32ui.CreateDCFromHandle(win32gui.GetWindowDC(window))
compatible_dc = window_dc.CreateCompatibleDC()


width  = 1280
height =  720
sx = 10
sy = 10

# Define the codec and create VideoWriter object
#fourcc = cv2.VideoWriter_fourcc(*'XVID')


#fourcc = cv2.cv.CV_FOURCC(*'XVID')
fourcc = cv2.cv.CV_FOURCC(*"H264")
#out = cv2.VideoWriter('video.avi', fourcc, 20.0, (width, height))
#out = cv2.VideoWriter('output123.mp4',0x00000021,15.0,(1280,360))
#out = cv2.VideoWriter('output.avi',fourcc, 20.0, (width,height))
fname = sys.argv[1]
#fname = "cap6.mov"
out = cv2.VideoWriter( fname, cv2.cv.CV_FOURCC(*'mp4v'),25, (width, height))
#out = cv2.VideoWriter('capture123.mp4', cv2.cv.CV_FOURCC(*'mp4v'),30, (width, height))

bmp = win32ui.CreateBitmap()
bmp.CreateCompatibleBitmap(window_dc, width, height)
compatible_dc.SelectObject(bmp)


def screenshot():

    compatible_dc.BitBlt((0, 0), (width, height), window_dc, (sx, sy), win32con.SRCCOPY)

    curFlags, curH, (curX, curY) = win32gui.GetCursorInfo()
    compatible_dc.DrawIcon((curX, curY), curH)
    
    img = Image.frombuffer('RGB', (width, height), bmp.GetBitmapBits(True), 'raw', 'BGRX', 0, 1)
    return img





#img.show()

def main():

    while(1):
        #im = ImageGrab.grab((90, 90, 800, 400)) # デスクトップの始点(0,0),横400, 縦300の矩形部分をキャプチャ
        im =screenshot()
        im = np.asarray(im)                     # OpenCVで扱うためにNumpy配列に変換
        im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB) # BGR→RGB
        out.write(im)

        im2 = cv2.resize(im, dsize=(width/2, height/2))
        cv2.imshow("desktop", im2)               # 画面表示
        # write the flipped frame

        if cv2.waitKey(1) > 0:                  # キー入力があれば終了
            out.write(im)
            cv2.destroyAllWindows()
            break

if __name__ == "__main__":
    main()