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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

1256閲覧

OpenCVを使って動画の書き出しができない

退会済みユーザー

退会済みユーザー

総合スコア0

OpenCV

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2017/11/16 06:11

aviファイルを読み込み,1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変えるプログラムを作っています.
0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き来させたいです.
ビルドはできるのですが,処理速度が大幅にかかった挙句,書き出せれたaviファイルを見ると157KBしかなく再生できません.

環境は,Windows10,OpenCV3-3-0,Visual Studio2015,C++です.

C++

1#include "stdafx.h" 2 3#include "opencv2/highgui.hpp" 4#include "opencv2/Videoio.hpp" 5#include <opencv2/core.hpp> 6 7 8#include <Windows.h> 9 10#include <stdio.h> 11#include <iostream> 12 13 14using namespace std; 15using namespace cv; 16 17int main() { 18 VideoCapture video("C:\Users\yujin\Desktop\読み込むファイル.avi"); 19 20 VideoWriter writer("C:\Users\yujin\Documents\書き出すファイル.avi", CV_FOURCC_DEFAULT, 30, cv::Size(4096, 2048), true); 21 Mat frame; 22 23 while (1) { 24              25 video >> frame; 26 Sleep(367); 27 // ここから通常速 28 video >> frame; 29 Sleep(33); 30 31 video >> frame; 32 Sleep(33); 33 34 video >> frame; 35 Sleep(33); 36 37 video >> frame; 38 Sleep(33); 39 40 video >> frame; 41 Sleep(33); 42 43 video >> frame; 44 Sleep(33); 45 46 video >> frame; 47 Sleep(33); 48 49 video >> frame; 50 Sleep(33); 51 52 video >> frame; 53 Sleep(33); 54 55 video >> frame; 56 Sleep(33); 57 58 video >> frame; 59 Sleep(33); 60 61 video >> frame; 62 Sleep(33); 63 64 // ここから2倍速 65 video >> frame; 66 Sleep(67); 67 68 video >> frame; 69 Sleep(67); 70 71 video >> frame; 72 Sleep(67); 73 74 video >> frame; 75 Sleep(67); 76 77 video >> frame; 78 Sleep(67); 79 80 video >> frame; 81 Sleep(67); 82 83 video >> frame; 84 Sleep(67); 85 86 video >> frame; 87 Sleep(67); 88 89 video >> frame; 90 Sleep(67); 91 92 video >> frame; 93 Sleep(67); 94 95 video >> frame; 96 Sleep(67); 97 98 video >> frame; 99 Sleep(67); 100 101 video >> frame; 102 Sleep(67); 103 104 // 3倍速 105 video >> frame; 106 Sleep(100); 107 108 video >> frame; 109 Sleep(100); 110 111 video >> frame; 112 Sleep(100); 113 114 video >> frame; 115 Sleep(100); 116 117 video >> frame; 118 Sleep(100); 119 120 video >> frame; 121 Sleep(100); 122 123 video >> frame; 124 Sleep(100); 125 126 video >> frame; 127 Sleep(100); 128 129 video >> frame; 130 Sleep(100); 131 132 video >> frame; 133 Sleep(100); 134 135 video >> frame; 136 Sleep(100); 137 138 video >> frame; 139 Sleep(100); 140 141 video >> frame; 142 Sleep(100); 143 144 video >> frame; 145 Sleep(100); 146 147 video >> frame; 148 Sleep(100); 149 150 video >> frame; 151 Sleep(100); 152 153 video >> frame; 154 Sleep(100); 155 156 // 4倍速 157 video >> frame; 158 Sleep(133); 159 160 video >> frame; 161 Sleep(133); 162 163 video >> frame; 164 Sleep(133); 165 166 video >> frame; 167 Sleep(133); 168 169 video >> frame; 170 Sleep(133); 171 172 video >> frame; 173 Sleep(133); 174 175 video >> frame; 176 Sleep(133); 177 178 video >> frame; 179 Sleep(133); 180 181 video >> frame; 182 Sleep(133); 183 184 video >> frame; 185 Sleep(133); 186 187 video >> frame; 188 Sleep(133); 189 190 video >> frame; 191 Sleep(133); 192 193 video >> frame; 194 Sleep(133); 195 196 video >> frame; 197 Sleep(133); 198 199 video >> frame; 200 Sleep(133); 201 202 video >> frame; 203 Sleep(133); 204 205 video >> frame; 206 Sleep(133); 207 208 video >> frame; 209 Sleep(133); 210 211 video >> frame; 212 Sleep(133); 213 214 video >> frame; 215 Sleep(133); 216 217 video >> frame; 218 Sleep(133); 219 220 video >> frame; 221 Sleep(133); 222 223 video >> frame; 224 Sleep(133); 225 226 video >> frame; 227 Sleep(133); 228 229 video >> frame; 230 Sleep(133); 231 232 video >> frame; 233 Sleep(133); 234 235 video >> frame; 236 Sleep(133); 237 238 video >> frame; 239 Sleep(133); 240 241 video >> frame; 242 Sleep(133); 243 244 video >> frame; 245 Sleep(133); 246 247 video >> frame; 248 Sleep(133); 249 250 video >> frame; 251 Sleep(133); 252 253 video >> frame; 254 Sleep(133); 255 256 video >> frame; 257 Sleep(133); 258 259 video >> frame; 260 Sleep(133); 261 262 video >> frame; 263 Sleep(133); 264 265 266 267 ///////////////////////////////////////////////// 268 269 // 5倍速 270 video >> frame; 271 Sleep(167); 272 273 ///////////////////////////////////////////////// 274 275 // 4倍速 276 video >> frame; 277 Sleep(133); 278 279 video >> frame; 280 Sleep(133); 281 282 video >> frame; 283 Sleep(133); 284 285 video >> frame; 286 Sleep(133); 287 288 video >> frame; 289 Sleep(133); 290 291 video >> frame; 292 Sleep(133); 293 294 video >> frame; 295 Sleep(133); 296 297 video >> frame; 298 Sleep(133); 299 300 video >> frame; 301 Sleep(133); 302 303 video >> frame; 304 Sleep(133); 305 306 video >> frame; 307 Sleep(133); 308 309 video >> frame; 310 Sleep(133); 311 312 video >> frame; 313 Sleep(133); 314 315 video >> frame; 316 Sleep(133); 317 318 video >> frame; 319 Sleep(133); 320 321 video >> frame; 322 Sleep(133); 323 324 video >> frame; 325 Sleep(133); 326 327 video >> frame; 328 Sleep(133); 329 330 video >> frame; 331 Sleep(133); 332 333 video >> frame; 334 Sleep(133); 335 336 video >> frame; 337 Sleep(133); 338 339 video >> frame; 340 Sleep(133); 341 342 video >> frame; 343 Sleep(133); 344 345 video >> frame; 346 Sleep(133); 347 348 video >> frame; 349 Sleep(133); 350 351 video >> frame; 352 Sleep(133); 353 354 video >> frame; 355 Sleep(133); 356 357 video >> frame; 358 Sleep(133); 359 360 video >> frame; 361 Sleep(133); 362 363 video >> frame; 364 Sleep(133); 365 366 video >> frame; 367 Sleep(133); 368 369 video >> frame; 370 Sleep(133); 371 372 video >> frame; 373 Sleep(133); 374 375 video >> frame; 376 Sleep(133); 377 378 video >> frame; 379 Sleep(133); 380 381 video >> frame; 382 Sleep(133); 383 384 // 3倍速 385 video >> frame; 386 Sleep(100); 387 388 video >> frame; 389 Sleep(100); 390 391 video >> frame; 392 Sleep(100); 393 394 video >> frame; 395 Sleep(100); 396 397 video >> frame; 398 Sleep(100); 399 400 video >> frame; 401 Sleep(100); 402 403 video >> frame; 404 Sleep(100); 405 406 video >> frame; 407 Sleep(100); 408 409 video >> frame; 410 Sleep(100); 411 412 video >> frame; 413 Sleep(100); 414 415 video >> frame; 416 Sleep(100); 417 418 video >> frame; 419 Sleep(100); 420 421 video >> frame; 422 Sleep(100); 423 424 video >> frame; 425 Sleep(100); 426 427 video >> frame; 428 Sleep(100); 429 430 video >> frame; 431 Sleep(100); 432 433 video >> frame; 434 Sleep(100); 435 436 // ここから2倍速 437 video >> frame; 438 Sleep(67); 439 440 video >> frame; 441 Sleep(67); 442 443 video >> frame; 444 Sleep(67); 445 446 video >> frame; 447 Sleep(67); 448 449 video >> frame; 450 Sleep(67); 451 452 video >> frame; 453 Sleep(67); 454 455 video >> frame; 456 Sleep(67); 457 458 video >> frame; 459 Sleep(67); 460 461 video >> frame; 462 Sleep(67); 463 464 video >> frame; 465 Sleep(67); 466 467 video >> frame; 468 Sleep(67); 469 470 video >> frame; 471 Sleep(67); 472 473 video >> frame; 474 Sleep(67); 475 476 // ここから通常速 477 video >> frame; 478 Sleep(33); 479 480 video >> frame; 481 Sleep(33); 482 483 video >> frame; 484 Sleep(33); 485 486 video >> frame; 487 Sleep(33); 488 489 video >> frame; 490 Sleep(33); 491 492 video >> frame; 493 Sleep(33); 494 495 video >> frame; 496 Sleep(33); 497 498 video >> frame; 499 Sleep(33); 500 501 video >> frame; 502 Sleep(33); 503 504 video >> frame; 505 Sleep(33); 506 507 video >> frame; 508 Sleep(33); 509 510 video >> frame; 511 Sleep(33); 512 513 514 // 停止 515 video >> frame; 516 Sleep(367); 517 //フレームが空か、ボタンが押された時か一周したときに出る。 518 if (frame.empty() || waitKey(30) >= 0 || video.get(CV_CAP_PROP_POS_AVI_RATIO) == 1) { 519 break; 520 } 521 } 522 writer <<frame; 523 imshow("Video", frame); 524 waitKey(1); 525 } 526

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

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

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

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

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

guest

回答3

0

ちょっとこれは... 一から勉強しなおせって回答はダメですかね?

  • 延々と続くコピペコード

for文って見たことないですか?

  • 毎度上書きされるframe

最後のwriter << frame;は『おまじない』ではないのですが...

  • 『処理速度が大幅にかかった挙句』

Sleep関数は処理をいったん停止させる機能ですから、当然です。

  • 『書き出せれたaviファイルを見ると157KBしかなく再生できません.』

writer << frame;が一回しか実行されていないので、画像一枚分しか保存されていません。

保存時にフレームレートを変える方法は、私は知りません。
しかし、このコードをちょっと書き換えたところで絶対に上手くいかないことは断言できます。

(解決法に関しては、前回質問でChironianさんに有益な助言を受けていたはず。)


0倍速,等倍速,2倍速,3倍速,4倍速,5倍速の速度を行き来させたい

0倍速だと動画として成立しないのでは?


まずは簡単なプログラムから試すべきです。
読み込んだaviファイルのフレームレートを半減させて出力するコードとか。

投稿2017/11/16 06:22

編集2017/11/16 06:32
LouiS0616

総合スコア35660

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

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

0

1フレームずつ間隔をSleep関数を用いて変化させて再生速度を変える

致命的な誤解だけ指摘します。Sleep関数は「そのプログラム実行時に該当プログラムの実行を一時停止させる」だけであり、OpenCV経由で出力した「動画ファイルに保持される再生速度」には全く影響しません。まずは両者の違いを正しく認識されるべきです。あとは LouiS0616 さん回答内容に同意見です。

私が知る限り、残念ながら、OpenCVではあなたの望む動画ファイルを出力することは不可能と思います。ただし「一定周期でフレームを間引く(捨てる)」もしくは「同じフレームを複製(繰り返す)する」ことで、似たような挙動を実現することは可能です。

投稿2017/11/16 07:22

yohhoy

総合スコア6191

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

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

0

ベストアンサー

倍速間引いて取得するという考えでよいと思います。また0倍速=静止と解釈しました。
以下は、概念コードです。
読込元と書込先のフレーム番号を出力しています。

C++

1#include <iostream> 2 3// ダミーのクラス群 4class Mat{ 5public: 6 int m_frame; 7 Mat(int frame=-1):m_frame(frame){} 8}; 9class VideoCapture{ 10public: 11 int m_frame; 12 VideoCapture():m_frame(0){} 13 VideoCapture& operator>>( Mat &m){ m = m_frame++; return *this;} 14}; 15class VideoWriter{ 16public: 17 int m_frame; 18 VideoWriter():m_frame(0){} 19 VideoWriter & operator<<(const Mat &m){ 20 std::cout << "dst[" << m_frame << "],src[" << m.m_frame << "]" << std::endl; 21 m_frame++; 22 return *this; 23 } 24}; 25 26// ratio倍速のフレーム画像を取得 27Mat getImage( VideoCapture &src, int ratio) 28{ 29 // 倍速=間引いて取得する 30 Mat frame(-1); 31 for( int i = 0; i < ratio; i++){ 32 src >> frame; 33 } 34 return frame; 35} 36 37int main() { 38 VideoCapture video; 39 VideoWriter writer; 40 Mat frame = getImage( video, 1); 41 for( int i = 0; i < 60; i++){ 42 // 10frameごとに0,1,2...倍速の画像を書き込む 43 int ratio = i / 10; 44 if( i % 10 == 0){ 45 std::cout << "ratio=" << ratio << std::endl; 46 } 47 if( ratio > 0){ // 0倍速=取得不要 48 frame = getImage( video, ratio); 49 } 50 writer << frame; 51 } 52 return 0; 53}

投稿2017/11/16 07:27

can110

総合スコア38266

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

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

退会済みユーザー

退会済みユーザー

2017/11/16 08:12

大変ご丁寧な回答ありがとうございます. 0倍速=静止でございます. 読み込むファイルと書き出しを指定するファイルはどこに書き加えるといいでしょうか?
can110

2017/11/16 08:53

理解を助けるための概念コードですので、単純に書き加えることでは完成(動作)はしません。 まずは他の回答者の方が指摘されている点について学び、理解する必要があります。 そのうえでご自身の書いたコードに組み込んでください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問