質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1221閲覧

cv2.moveWindowに代わるウィンドウの結合(統合?)方法

P5_USER

総合スコア73

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/05/09 09:00

編集2018/05/09 11:04

いつもお世話になっております。

前提・実現したいこと

表題の通りです。
OpenCVで動画ウィンドウを連結させたい。
のように前にも、私と同じような方が質問していました。

このベストアンサーの方の回答なのですが
>こちらは各動画のフレームを統合(同一フレーム上に配置描画)するだけです。
というのは、具体的にはどのような方法で達成されるのでしょうか。

###コード
以下にコードを追記します。
c_frame:生のカメラ映像
g_frame:c_frame に ガウシアン平滑化
gray_frame:c_frame に グレースケール
img_color:c_frame に 黄色のみを抽出するフィルタ

結果だけ申しますと、縦2段に配置された映像があり、
上半分:グレースケール & 左右反転 & 反時計回りに90度回転
下半分:上半分 + ガウシアン平滑化(?)
となっていました。

Python

1import cv2 2import numpy as np 3 4def cv_fourcc(c1,c2,c3,c4): 5 return (ord(c1) & 255) + ((ord(c2) & 255) << 8) + \ 6 ((ord(c3) & 255) << 16) + ((ord(c4) & 255) << 24) 7 8def vconcat_resize_min(im_list, interpolation = cv2.INTER_CUBIC): 9 w_min = min(im.shape[1] for im in im_list) 10 im_list_resize = [cv2.resize(im,(w_min, int(im.shape[0] * w_min / im.shape[1])), interpolation = interpolation) for im in im_list] 11 return cv2.vconcat(im_list_resize) 12 13def hconcat_resize_min(im_list,interpolation = cv2.INTER_CUBIC): 14 h_min = min(im.shape[0] for im in im_list) 15 im_list_resize = [cv2.resize(im,(int(im.shape[1] * h_min / im.shape[0]),h_min),interpolation = interpolation) for im in im_list] 16 return cv2.hconcat(im_list_resize) 17 18def concat_title_resize(im_list_2d,interpolation = cv2.INTER_CUBIC): 19 im_list_v = [hconcat_resize_min(im_list_h, interpolation = cv2.INTER_CUBIC) for im_list_h in im_list_2d] 20 return vconcat_resize_min(im_list_v, interpolation = cv2.INTER_CUBIC) 21 22if __name__ == '__main__': 23 # 定数定義 24 ESC_KEY = 27 # Escキー 25 INTERVAL = 33 # 待ち時間 26 FRAME_RATE = 30 # fps 27 28 ORG_WINDOW_NAME = "org" 29 GAUSSIAN_WINDOW_NAME = "gaussian" 30 GRAY_WINDOW_NAME = "gray" 31 YELLOW_WINDOW_NAME = "yellow" 32 33 #GAUSSIAN_FILE_NAME = "gaussian.avi" 34 #GRAY_FILE_NAME = "gray.avi" 35 36 DEVICE_ID = 0 37 38 # カメラ映像取得 39 cap = cv2.VideoCapture(DEVICE_ID) 40 41 # 保存ビデオファイルの準備 42 end_flag, c_frame = cap.read() 43 #height, width, channels = c_frame.shape 44 #rec = cv2.VideoWriter(GAUSSIAN_FILE_NAME, \ 45 # cv_fourcc('X', 'V', 'I', 'D'), \ 46 # FRAME_RATE, \ 47 # (width, height), \ 48 # True) 49 50 # ウィンドウの準備 51 #cv2.namedWindow(ORG_WINDOW_NAME) 52 #cv2.namedWindow(GAUSSIAN_WINDOW_NAME) 53 #cv2.namedWindow(GRAY_WINDOW_NAME) 54 #cv2.namedWindow(YELLOW_WINDOW_NAME) 55 56 # 変換処理ループ 57 while end_flag == True: 58 # ガウシアン平滑化 59 g_frame = cv2.GaussianBlur(c_frame, (15, 15), 10) 60 61 #グレースケール化 62 gray_frame = cv2.cvtColor(c_frame,cv2.COLOR_RGB2GRAY) 63 64 #フレームをHSVに変換 65 hsv = cv2.cvtColor(c_frame,cv2.COLOR_BGR2HSV) 66 67 #取得する色の範囲を指定する 68 lower_yellow = np.array([20,50,50]) 69 upper_yellow = np.array([100,255,255]) 70 71 #指定した色に基づいたマスク画像の生成 72 img_mask = cv2.inRange(hsv,lower_yellow,upper_yellow) 73 74 #フレーム画像とマスク画像の共通の領域を抽出する 75 img_color = cv2.bitwise_and(c_frame,c_frame,mask = img_mask) 76 77 # フレーム表示 78 #cv2.imshow(ORG_WINDOW_NAME, c_frame) 79 #cv2.moveWindow(ORG_WINDOW_NAME,100,200) 80 81 #cv2.imshow(GAUSSIAN_WINDOW_NAME, g_frame) 82 #cv2.moveWindow(GAUSSIAN_WINDOW_NAME,800 ,200) 83 84 #cv2.imshow(GRAY_WINDOW_NAME,gray_frame) 85 #cv2.imshow(YELLOW_WINDOW_NAME,img_color) 86 87 #合成フレームを作成 88 im_title_resize = concat_title_resize([c_frame, g_frame],[gray_frame, img_color]) 89 90 #合成フレームを表示 91 cv2.imshow(ORG_WINDOW_NAME, im_title_resize) 92 93 # フレーム書き込み 94 #rec.write(g_frame) 95 96 # Escキーで終了 97 key = cv2.waitKey(INTERVAL) 98 if key == ESC_KEY: 99 break 100 101 # 次のフレーム読み込み 102 end_flag, c_frame = cap.read() 103 104 # 終了処理 105 cv2.destroyAllWindows() 106 cap.release() 107 #rec.release()

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

動画と言えど各フレームは静止画ですから、そちらを毎度結合させれば良いです。
Python, OpenCVで画像を縦・横に連結 (hconcat, vconcat, np.tile)

投稿2018/05/09 09:04

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

P5_USER

2018/05/09 11:07

早速の回答ありがとうございます。 試してみたところ、教えていただいたサイトのように 隣接されず、私が意図していない動きを見せました。 関数も何回もチェックしたのですが...
LouiS0616

2018/05/09 11:31 編集

いきなり動画で試さずに、段階的に調整してみてはいかがですか。 サイズが揃った静止画 ⇒ サイズが揃った動画 ⇒ サイズが揃っていない静止画 ⇒ サイズが揃っていない動画 ⇒ 完成
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問