teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

コードの追加

2018/05/09 11:04

投稿

P5_USER
P5_USER

スコア73

title CHANGED
File without changes
body CHANGED
@@ -7,4 +7,126 @@
7
7
 
8
8
  このベストアンサーの方の回答なのですが
9
9
  >こちらは各動画のフレームを統合(同一フレーム上に配置描画)するだけです。
10
- というのは、具体的にはどのような方法で達成されるのでしょうか。
10
+ というのは、具体的にはどのような方法で達成されるのでしょうか。
11
+
12
+ ###コード
13
+ **以下にコードを追記します。**
14
+ c_frame:生のカメラ映像
15
+ g_frame:c_frame に ガウシアン平滑化
16
+ gray_frame:c_frame に グレースケール
17
+ img_color:c_frame に 黄色のみを抽出するフィルタ
18
+
19
+ 結果だけ申しますと、縦2段に配置された映像があり、
20
+ 上半分:グレースケール & 左右反転 & 反時計回りに90度回転
21
+ 下半分:上半分 + ガウシアン平滑化(?)
22
+ となっていました。
23
+
24
+ ```Python
25
+ import cv2
26
+ import numpy as np
27
+
28
+ def cv_fourcc(c1,c2,c3,c4):
29
+ return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \
30
+ ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24)
31
+
32
+ def vconcat_resize_min(im_list, interpolation = cv2.INTER_CUBIC):
33
+ w_min = min(im.shape[1] for im in im_list)
34
+ im_list_resize = [cv2.resize(im,(w_min, int(im.shape[0] * w_min / im.shape[1])), interpolation = interpolation) for im in im_list]
35
+ return cv2.vconcat(im_list_resize)
36
+
37
+ def hconcat_resize_min(im_list,interpolation = cv2.INTER_CUBIC):
38
+ h_min = min(im.shape[0] for im in im_list)
39
+ im_list_resize = [cv2.resize(im,(int(im.shape[1] * h_min / im.shape[0]),h_min),interpolation = interpolation) for im in im_list]
40
+ return cv2.hconcat(im_list_resize)
41
+
42
+ def concat_title_resize(im_list_2d,interpolation = cv2.INTER_CUBIC):
43
+ im_list_v = [hconcat_resize_min(im_list_h, interpolation = cv2.INTER_CUBIC) for im_list_h in im_list_2d]
44
+ return vconcat_resize_min(im_list_v, interpolation = cv2.INTER_CUBIC)
45
+
46
+ if __name__ == '__main__':
47
+ # 定数定義
48
+ ESC_KEY = 27 # Escキー
49
+ INTERVAL = 33 # 待ち時間
50
+ FRAME_RATE = 30 # fps
51
+
52
+ ORG_WINDOW_NAME = "org"
53
+ GAUSSIAN_WINDOW_NAME = "gaussian"
54
+ GRAY_WINDOW_NAME = "gray"
55
+ YELLOW_WINDOW_NAME = "yellow"
56
+
57
+ #GAUSSIAN_FILE_NAME = "gaussian.avi"
58
+ #GRAY_FILE_NAME = "gray.avi"
59
+
60
+ DEVICE_ID = 0
61
+
62
+ # カメラ映像取得
63
+ cap = cv2.VideoCapture(DEVICE_ID)
64
+
65
+ # 保存ビデオファイルの準備
66
+ end_flag, c_frame = cap.read()
67
+ #height, width, channels = c_frame.shape
68
+ #rec = cv2.VideoWriter(GAUSSIAN_FILE_NAME, \
69
+ # cv_fourcc('X', 'V', 'I', 'D'), \
70
+ # FRAME_RATE, \
71
+ # (width, height), \
72
+ # True)
73
+
74
+ # ウィンドウの準備
75
+ #cv2.namedWindow(ORG_WINDOW_NAME)
76
+ #cv2.namedWindow(GAUSSIAN_WINDOW_NAME)
77
+ #cv2.namedWindow(GRAY_WINDOW_NAME)
78
+ #cv2.namedWindow(YELLOW_WINDOW_NAME)
79
+
80
+ # 変換処理ループ
81
+ while end_flag == True:
82
+ # ガウシアン平滑化
83
+ g_frame = cv2.GaussianBlur(c_frame, (15, 15), 10)
84
+
85
+ #グレースケール化
86
+ gray_frame = cv2.cvtColor(c_frame,cv2.COLOR_RGB2GRAY)
87
+
88
+ #フレームをHSVに変換
89
+ hsv = cv2.cvtColor(c_frame,cv2.COLOR_BGR2HSV)
90
+
91
+ #取得する色の範囲を指定する
92
+ lower_yellow = np.array([20,50,50])
93
+ upper_yellow = np.array([100,255,255])
94
+
95
+ #指定した色に基づいたマスク画像の生成
96
+ img_mask = cv2.inRange(hsv,lower_yellow,upper_yellow)
97
+
98
+ #フレーム画像とマスク画像の共通の領域を抽出する
99
+ img_color = cv2.bitwise_and(c_frame,c_frame,mask = img_mask)
100
+
101
+ # フレーム表示
102
+ #cv2.imshow(ORG_WINDOW_NAME, c_frame)
103
+ #cv2.moveWindow(ORG_WINDOW_NAME,100,200)
104
+
105
+ #cv2.imshow(GAUSSIAN_WINDOW_NAME, g_frame)
106
+ #cv2.moveWindow(GAUSSIAN_WINDOW_NAME,800 ,200)
107
+
108
+ #cv2.imshow(GRAY_WINDOW_NAME,gray_frame)
109
+ #cv2.imshow(YELLOW_WINDOW_NAME,img_color)
110
+
111
+ #合成フレームを作成
112
+ im_title_resize = concat_title_resize([c_frame, g_frame],[gray_frame, img_color])
113
+
114
+ #合成フレームを表示
115
+ cv2.imshow(ORG_WINDOW_NAME, im_title_resize)
116
+
117
+ # フレーム書き込み
118
+ #rec.write(g_frame)
119
+
120
+ # Escキーで終了
121
+ key = cv2.waitKey(INTERVAL)
122
+ if key == ESC_KEY:
123
+ break
124
+
125
+ # 次のフレーム読み込み
126
+ end_flag, c_frame = cap.read()
127
+
128
+ # 終了処理
129
+ cv2.destroyAllWindows()
130
+ cap.release()
131
+ #rec.release()
132
+ ```