ある表面の動画を20秒とって、その20秒の動画の標準偏差をpixel by pixelでplotする
python
1# -*- coding: utf-8 -*- 2import cv2 3import matplotlib.pyplot as plt 4from numpy import * 5import pandas as pd 6from scipy import signal 7 8video_path = "2cropcut.mkv" 9cap = cv2.VideoCapture(video_path) 10 11count = cap.get(cv2.CAP_PROP_FRAME_COUNT) 12fps = cap.get(cv2.CAP_PROP_FPS) 13 14width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) 15height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) 16print(width) 17print(height) 18 19numS=raw_input("start frame: ") 20numS=int(numS) 21 22numE=raw_input("end frame: ") 23numE=int(numE) 24#numE=count 25print(numE) 26 27# 場所を決める 28#点滅の場所 29x1min=raw_input("点滅1左上のx座標:") 30y1min=raw_input("点滅1左上のy座標:") 31x1max=raw_input("点滅1右下のx座標:") 32y1max=raw_input("点滅1右下のy座標:") 33 34X1min=int(x1min) 35Y1min=int(y1min) 36X1max=int(x1max) 37Y1max=int(y1max) 38 39 40 41#ノイズの場所 42xnoisemin=raw_input("左上ノイズx座標:") 43ynoisemin=raw_input("左上ノイズy座標:") 44xnoisemax=raw_input("右下ノイズx座標:") 45ynoisemax=raw_input("右下ノイズy座標:") 46 47Xnoisemin=int(xnoisemin) 48Ynoisemin=int(ynoisemin) 49Xnoisemax=int(xnoisemax) 50Ynoisemax=int(ynoisemax) 51 52# フレーム [numS,numE] の範囲で各フレームの [ymin, ymax]x[xmin, xmax] の画素の平均を計算する。 53frame_no = arange(numS,numE) 54intensity1 = [] 55intensity2=[] 56intensity3=[] 57intensitynoise=[] 58sdMap=zeros((Y1max-Y1min,X1max-X1min)) # the standard deviation MAP 59totFrames=(Y1max-Y1min)*(X1max-X1min) 60import time as t 61XX=range(X1min,X1max) 62YY=range(Y1min,Y1max) 63print("XX:",XX) 64print("YY:",YY) 65for x in XX: 66 for y in YY: 67 print("x:%d y:%d"%(x,y)) 68 pixVal=[] # the pixel values for all frames! 69 t0=t.time() 70 for i in frame_no: 71 # フレーム frame_no を取得する。 72 cap.set(cv2.CAP_PROP_POS_FRAMES, i) 73 ret, frame = cap.read() #getFrame "i" 74 if not ret: 75 print('Failed to grab frame.') 76 break 77 pixVal=append(pixVal,frame[y,x]) 78 t1=t.time() # finish time 79 dt=t1-t0 # time in seconds 80 est=dt*totFrames # estimated time 81 sdMap[y,x]=pixVal.std() 82 print("filled x=%d y=%d sd=%4.2g Est: %d"%(x,y,pixVal.std(),est)) 83 84 85tPoints=arange(len(intensity1))*(1/fps) 86plt.grid(True) 87plt.xlim(X1min,X1max)#開始時間、終了時間の設定 88plt.ylim(Y1min,Y1max) 89plt.pcolor(sdMap,cmap="RdBu") 90plt.colorbar() 91plt.title("standard deviation Map") 92plt.show()
例えばフレーム数を5にしてこの5フレームの標準偏差をplotすると以下のようにplotされます
5フレームで測定すると測定時間が30秒ほどかかりますが、20秒の動画(約900フレーム)を測定すると1日ほどかかります。また測定領域を広くしても読み込むピクセルが大きくなるので測定時間も大幅に大きくなります。
このような問題を改善するために何かよいコマンドなどは存在するのでしょうか?何か知っている方いらっしゃいましたら教えてください。よろしくお願いします
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2019/07/30 03:39
2019/07/30 05:51
退会済みユーザー
2019/07/30 09:16
2019/07/30 09:40
退会済みユーザー
2019/07/30 09:55