質問編集履歴
1
コードの追加
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
|
+
```
|