前提・実現したいこと
pythonでpcのカメラで動画を撮影しながら、勾配計算をした画像(laplacian)と背景差分計算をした画像(fgmask)に縦横16pxごとに分けるプログラムを作っています。
背景の画像は、黒でマスクしてエッジを赤色にしています。
下記のエラーメッセージが出てきますが、どうして30が範囲外になってしまうのかがわかりません。
そこを解説していただきたいです。
発生している問題・エラーメッセージ
if fgmask_sum[x][y] >= fgmask_mean: IndexError: index 30 is out of bounds for axis 0 with size 30
該当のソースコード
python
1import numpy as np 2import cv2 3 4REGION_WIDTH=16 5REGION_HIGH=16 6 7cap = cv2.VideoCapture(0) 8cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640) 9cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480) 10fgbg = cv2.createBackgroundSubtractorMOG2(history=500, varThreshold=16, detectShadows=True) 11red_mask = np.full((1, 1, 3), (0,0,255), dtype=np.uint8) 12white_mask = np.full((REGION_HIGH, REGION_WIDTH, 3), (255,255,255), dtype=np.uint8) 13 14while(True): 15 ret, frame = cap.read() 16 rows, cols, channels = frame.shape 17 # maskを定義 18 laplacian_mask = np.zeros((rows, cols, channels), dtype=np.uint8) 19 fgmask_mask = np.zeros((rows, cols, channels), dtype=np.uint8) 20 21 #エッジを赤くする 22 frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 23 laplacian = cv2.Laplacian(frame_gray, cv2.CV_64F) 24 for y in range(rows): 25 for x in range(cols): 26 if laplacian[y,x] > 10: 27 laplacian_mask[y,x] = np.copy(red_mask) 28 29 #マスクしない(白色でマスク)部分を組み込む 30 fgmask = fgbg.apply(frame) 31 fgmask_sum = np.zeros((30,40))#16*16 ごとに領域分けした時の領域の数 32 for i in range(int(rows/REGION_HIGH)):#30 33 for j in range(int(cols/REGION_WIDTH)):#40 34 for y in range(REGION_HIGH):#16 35 for x in range(REGION_WIDTH):#16 36 if (fgmask[i*16+y][j*16+x]==255):#1画素ずつ白かどうかの判定 37 fgmask_sum[i,j] += 1 38 fgmask_mean = np.mean(fgmask_sum)#全領域の白の要素の平均 39 for y in range(int(rows/REGION_HIGH)):#30 40 for x in range(int(cols/REGION_WIDTH)):#40 41 if fgmask_sum[x][y] >= fgmask_mean:#エラーが発生している行 42 fgmask_mask[16*y:16*y+16,16*x:16*x+16] = np.copy(white_mask) 43 44 #表示 45 mask_or = cv2.bitwise_or(laplacian_mask, fgmask_mask) 46 masked_frame = cv2.bitwise_and(frame, mask_or) 47 cv2.imshow('frame', masked_frame) 48 49 k = cv2.waitKey(30) & 0xff 50 if k == 27: 51 break # 'ESC' key is pressed 52cap.release() 53cv2.destroyAllWindows()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/23 13:04
2021/11/23 13:06
2021/11/23 13:10
2021/11/23 13:18