30秒の動画において、、ある1ピクセルを指定し、他の全てのピクセルの強度の相関係数を算出し、ヒートマップで可視化する作業を行ってます。ピクセルの個数が300×300=90000なので計算時間がものすごいかかってしまいます。
python
1# -*- coding: utf-8 -*- 2import cv2 3import matplotlib.pyplot as plt 4import numpy as np 5 6cap = cv2.VideoCapture("test.mkv") 7count = cap.get(cv2.CAP_PROP_FRAME_COUNT) 8fps = cap.get(cv2.CAP_PROP_FPS) 9 10# 先に全フレームを読み込む。 11frames = [] 12while True: 13 ret, frame = cap.read() 14 if not ret: 15 break 16 17 18 frames.append(frame) 19 20frames = np.array(frames) 21numE=count 22print(numE) 23######################################################################## 24# 場所を決める 25#点滅の場所 26xpx=int(raw_input("点滅1 X:")) 27ypx=int(raw_input("点滅1 Y:")) 28######################################################################## 29# フレーム [numS,numE] の範囲で各フレームの [ymin, ymax]x[xmin, xmax] の画素の平均を計算する。 30frame_no = np.arange(count) 31print("frame number",count) 32########## read the target pixel intensity 33intGt=np.zeros((0)) # the target intensity 34print("read target position x=%d y=%d intensity"%(xpx,ypx)) 35for i in frame_no: 36 # フレーム frame_no を取得する。 37 cap.set(cv2.CAP_PROP_POS_FRAMES, i) 38 ret, frame = cap.read() 39 if not ret: 40 print('Failed to grab frame.') 41 break 42 # 平均画素値を計算する。 43 G=np.average(frame[xpx,ypx]) 44 intGt=np.append(intGt,G) 45 46print("read the target intensity!") 47 48# read first frame (frame zero) 49# フレーム frame_no を取得する。 50cap.set(cv2.CAP_PROP_POS_FRAMES, 0) 51ret, frame = cap.read() 52XS=np.shape(frame)[0] 53YS=np.shape(frame)[1] 54# show the target pixel intesity 55fig, ax = plt.subplots() 56ax.invert_yaxis() 57#im=ax.imshow(std,cmap="gray") 58ax.set_title("(water)") 59plt.plot(intGt,".") 60plt.ylim([0,255]) 61#plt.imshow(std, cmap="jet",vmin=0,vmax=32) 62#plt.imshow(std, cmap="jet") 63#plt.colorbar() 64plt.show() 65 66 67 68raw_input("stop") 69import time as t 70corrMap=np.zeros((0)) 71 72x=y=0 73for y in range(YS): 74 for x in range(XS): 75 t0=t.time() # start clock 76 intG = np.zeros((0)) # reset intensity 77 for i in frame_no: 78 # フレーム frame_no を取得する。 79 cap.set(cv2.CAP_PROP_POS_FRAMES, i) 80 ret, frame = cap.read() 81 if not ret: 82 print('Failed to grab frame.') 83 break 84 # 平均画素値を計算する。 85 G=np.average(frame[x,y]) 86 intG=np.append(intG,G) 87 # correlation between target and current pixel 88 CC=np.corrcoef(intGt,intG) # correlation coefficient 89 print(np.shape(CC),CC[0,1]) 90 print("now at position x=%d y=%d, cc=%4.2g"%(x,y,CC[0,1])) 91 corrMap=np.append(corrMap,CC[0,1]) 92 print("it took %4.2g secs"%(t.time()-t0)) 93 print("you need %4.2g mins"%((t.time()-t0)*XS*YS/60)) 94 95########### 96corrMap=corrMap.reshape(shape(frame)) 97raw_input("stop") 98# ヒートマップで描画する。 99fig, ax = plt.subplots() 100ax.invert_yaxis() 101im=ax.imshow(corrMap,cmap="gray") 102ax.set_title("(water)") 103#plt.plot(intG,".") 104#plt.imshow(std, cmap="jet",vmin=0,vmax=32) 105#plt.imshow(std, cmap="jet") 106#plt.colorbar() 107plt.show()
上記のようなプログラムを書いて、シミュレーション時間を計算してみましたが多分20日くらい?かかる感じです。強度はRGBの平均値としています。
何か解決策はあるのでしょうか?
ちなみに求めたいヒートマップのイメージは添付の通りです。よろしくお願いします