質問編集履歴

7

誤字

2024/04/14 14:39

投稿

pyt
pyt

スコア5

test CHANGED
File without changes
test CHANGED
@@ -21,6 +21,7 @@
21
21
 
22
22
  from datetime import timedelta
23
23
  time_list=time_list/timedelta(seconds=1)#1秒を基準
24
+ print(time_list)
24
25
  print(type(time_list))
25
26
 
26
27
  #実行結果

6

プログラムを間違えたため

2024/04/14 14:35

投稿

pyt
pyt

スコア5

test CHANGED
File without changes
test CHANGED
@@ -20,7 +20,7 @@
20
20
  #0 days 00:00:02.088479997 この時のtime_listの中身のデータ,一部他の行は省略
21
21
 
22
22
  from datetime import timedelta
23
- print(time_list/timedelta(seconds=1))#1秒を基準
23
+ time_list=time_list/timedelta(seconds=1)#1秒を基準
24
24
  print(type(time_list))
25
25
 
26
26
  #実行結果

5

誤字

2024/04/14 13:00

投稿

pyt
pyt

スコア5

test CHANGED
File without changes
test CHANGED
@@ -17,7 +17,7 @@
17
17
  ```time_listの中身
18
18
  #time_listの作成
19
19
  #time_list= pd.to_datetime(UNIX TIME)で計算されたデータ
20
- #0 days 00:00:02.088479997 この時のtime_listの中身のデータ一部他の行は省略
20
+ #0 days 00:00:02.088479997 この時のtime_listの中身のデータ,一部他の行は省略
21
21
 
22
22
  from datetime import timedelta
23
23
  print(time_list/timedelta(seconds=1))#1秒を基準

4

誤字

2024/04/14 12:55

投稿

pyt
pyt

スコア5

test CHANGED
File without changes
test CHANGED
@@ -17,7 +17,7 @@
17
17
  ```time_listの中身
18
18
  #time_listの作成
19
19
  #time_list= pd.to_datetime(UNIX TIME)で計算されたデータ
20
- #0 days 00:00:02.088479997 この時のtime_listの中身の最初のデータ、次データ以降は省略
20
+ #0 days 00:00:02.088479997 この時のtime_listの中身のデータの一部他の行は省略
21
21
 
22
22
  from datetime import timedelta
23
23
  print(time_list/timedelta(seconds=1))#1秒を基準
@@ -39,7 +39,7 @@
39
39
  <class 'pandas.core.series.Series'>
40
40
 
41
41
  #0から5743は行数ですリストの中には入っていません
42
- #0day などが邪魔だったため消しました、ここまではエラーは出ていません。
42
+ #0days 00:00 などが邪魔だったため消しました、ここまではエラーは出ていません。
43
43
 
44
44
 
45
45
 

3

質問とコードの変更

2024/04/14 12:47

投稿

pyt
pyt

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,5 +1,6 @@
1
1
  ### 実現したいこと
2
- 動画像をリストの中にある指定の時間にフレームを切り出して保存したいです。リストには時間が入っており、その時間に合わせてフレームを切り出して保存したいのですがやり方がよく分からないです。動画はおよそ30秒ほどでリストは5744行の時間のデータが入っています。
2
+ 動画像をリストの中にある指定の時間にフレームを切り出して保存したいです。リストには時間が入っており、その時間に合わせてフレームを切り出して保存したいのですがリストの小数関連?のエラーの対処がよく分からないです。動画はおよそ30秒ほどでリストは5744行の時間のデータが入っています。また、小数点以下の時刻も守ってフレームを切り出して保存したいです。
3
+
3
4
  リストには以下のように計算されたデータが入っています。
4
5
  0 2.088480
5
6
  1 2.092519
@@ -9,6 +10,39 @@
9
10
  ...
10
11
 
11
12
  ```
13
+
14
+
15
+
16
+
17
+ ```time_listの中身
18
+ #time_listの作成
19
+ #time_list= pd.to_datetime(UNIX TIME)で計算されたデータ
20
+ #0 days 00:00:02.088479997 この時のtime_listの中身の最初のデータ、次のデータ以降は省略
21
+
22
+ from datetime import timedelta
23
+ print(time_list/timedelta(seconds=1))#1秒を基準
24
+ print(type(time_list))
25
+
26
+ #実行結果
27
+ 0 2.088480
28
+ 1 2.092519
29
+ 2 2.096480
30
+ 3 2.100537
31
+ 4 2.108488
32
+ ...
33
+ 5739 34.027863
34
+ 5740 34.035860
35
+ 5741 34.039846
36
+ 5742 34.043850
37
+ 5743 34.047793
38
+ Name: time_list Length: 5744, dtype: float64
39
+ <class 'pandas.core.series.Series'>
40
+
41
+ #0から5743は行数ですリストの中には入っていません
42
+ #0day などが邪魔だったため消しました、ここまではエラーは出ていません。
43
+
44
+
45
+
12
46
  #変更したプログラム
13
47
  import cv2
14
48
  import os
@@ -44,30 +78,6 @@
44
78
  save_frame_range_sec('動画のパス',
45
79
  '保存先のパス', 'sample_img')
46
80
 
47
-
48
-
49
- ```time_listの中身
50
- #time_listの作成
51
- #time_list= pd.to_datetime(UNIX TIME)で計算されたデータ
52
- #0 days 00:00:02.088479997 この時のtime_listの中身の最初のデータ、次のデータはほとんど同じ為省略
53
-
54
- from datetime import timedelta
55
- print(time_list/timedelta(seconds=1))#1秒を基準
56
- print(type(time_list))
57
-
58
- 0 2.088480
59
- 1 2.092519
60
- 2 2.096480
61
- 3 2.100537
62
- 4 2.108488
63
- ...
64
- 5739 34.027863
65
- 5740 34.035860
66
- 5741 34.039846
67
- 5742 34.043850
68
- 5743 34.047793
69
- #0から5743は行数ですリストの中には入っていません
70
- #0day などが邪魔だったため消した
71
81
  ```
72
82
 
73
83
  ### 試したこと・調べたこと

2

実現したいことの文章の修正

2024/04/14 12:37

投稿

pyt
pyt

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 実現したいこと
2
2
  動画像をリストの中にある指定の時間にフレームを切り出して保存したいです。リストには時間が入っており、その時間に合わせてフレームを切り出して保存したいのですがやり方がよく分からないです。動画はおよそ30秒ほどでリストは5744行の時間のデータが入っています。
3
- リストには以下のようにpd.to_datetimeで計算されたデータが入っています。
3
+ リストには以下のように計算されたデータが入っています。
4
4
  0 2.088480
5
5
  1 2.092519
6
6
  2 2.096480

1

time_listの中身を変更

2024/04/14 12:36

投稿

pyt
pyt

スコア5

test CHANGED
File without changes
test CHANGED
@@ -1,34 +1,19 @@
1
1
  ### 実現したいこと
2
2
  動画像をリストの中にある指定の時間にフレームを切り出して保存したいです。リストには時間が入っており、その時間に合わせてフレームを切り出して保存したいのですがやり方がよく分からないです。動画はおよそ30秒ほどでリストは5744行の時間のデータが入っています。
3
3
  リストには以下のようにpd.to_datetimeで計算されたデータが入っています。
4
- 00:00:02.088479
4
+ 0 2.088480
5
- 00:00:02.092518
5
+ 1 2.092519
6
- 00:00:02.096479
6
+ 2 2.096480
7
- 00:00:02.100536
7
+ 3 2.100537
8
- 00:00:02.108487
8
+ 4 2.108488
9
-
9
+ ...
10
-
11
-
12
- 00:00:34.047792
13
10
 
14
- ### 発生している問題・分からないこと
15
- [時間(秒数)で指定](https://note.nkmk.me/python-opencv-video-to-still-image/)
16
- のプログラムを参考に自分なりに変更したのですが実行はできるのですがずっとループを繰り返しています。
17
-
18
- time_listは(pd.to_datetime(時刻)-pd.to_datetime(時刻)).dt.timeで計算された時刻が入っています
19
-
20
-
21
-
22
-
23
- ### 該当のソースコード
24
-
25
- ```Python
11
+ ```
12
+ #変更したプログラム
26
13
  import cv2
27
14
  import os
28
15
 
29
-
30
- def save_frame_range_sec(video_path, start_sec, stop_sec,
16
+ def save_frame_range_sec(video_path, dir_path, basename, ext='jpg'):
31
- dir_path, basename, ext='jpg'):
32
17
  cap = cv2.VideoCapture(video_path)
33
18
 
34
19
  if not cap.isOpened():
@@ -42,43 +27,47 @@
42
27
  fps = cap.get(cv2.CAP_PROP_FPS)
43
28
  fps_inv = 1 / fps
44
29
 
45
- sec = start_sec
46
- while sec < stop_sec:
30
+ for sec in time_list:
47
- n = round(fps * sec)
31
+ n = round(fps * sec)
48
- cap.set(cv2.CAP_PROP_POS_FRAMES, n)
32
+ cap.set(cv2.CAP_PROP_POS_FRAMES, n)
49
- ret, frame = cap.read()
33
+ ret, frame = cap.read()
50
- if ret:
34
+ if ret:
51
- cv2.imwrite(
35
+ cv2.imwrite(
52
- '{}_{}_{:.9f}.{}'.format(
36
+ '{}_{}_{:.9f}.{}'.format(
53
- base_path, str(n).zfill(digit), n * fps_inv, ext
37
+ base_path, str(n).zfill(digit), n * fps_inv, ext
54
38
  ),
55
39
  frame
56
40
  )
57
- else:
41
+ else:
58
- return
42
+ return
59
- for i in time_list:
43
+
60
- sec = time_list[i]#time_listは切り取りたい時間
44
+ save_frame_range_sec('動画',
45
+ '保存先のパス', 'sample_img')
61
46
 
62
47
 
63
48
 
49
+ ```time_listの中身
50
+ #time_listの作成
64
- save_frame_range_sec('動画像のパス',
51
+ #time_list= pd.to_datetime(UNIX TIME)で計算されたデータ
65
- 2.00000, 34.047792997,
66
- '保存するファイルパス', 'sample_video_img')
52
+ #0 days 00:00:02.088479997 こ時のtime_listの中身の最初のデータ、次のデータはほとんど同じ為省略
67
- ```
68
53
 
54
+ from datetime import timedelta
55
+ print(time_list/timedelta(seconds=1))#1秒を基準
69
- ```time_listの中身
56
+ print(type(time_list))
57
+
70
- 0 00:00:02.088479
58
+ 0 2.088480
71
- 1 00:00:02.092518
59
+ 1 2.092519
72
- 2 00:00:02.096479
60
+ 2 2.096480
73
- 3 00:00:02.100536
61
+ 3 2.100537
74
- 4 00:00:02.108487
62
+ 4 2.108488
75
- ...
63
+ ...
76
- 5739 00:00:34.027862
64
+ 5739 34.027863
77
- 5740 00:00:34.035859
65
+ 5740 34.035860
78
- 5741 00:00:34.039845
66
+ 5741 34.039846
79
- 5742 00:00:34.043849
67
+ 5742 34.043850
80
- 5743 00:00:34.047792
68
+ 5743 34.047793
81
69
  #0から5743は行数ですリストの中には入っていません
70
+ #0day などが邪魔だったため消した
82
71
  ```
83
72
 
84
73
  ### 試したこと・調べたこと
@@ -88,9 +77,25 @@
88
77
  - [ ] その他
89
78
 
90
79
  ##### 上記の詳細・結果
80
+ エラー文
81
+ TypeError Traceback (most recent call last)
82
+ <ipython-input-3-fbffaa21dda2> in <cell line: 32>()
91
- while文をずっとループしています
83
+ 30 return
84
+ 31
85
+ ---> 32 save_frame_range_sec('動画のパス',
86
+ 33 '保存先のファイルのパス', 'sample_img')
87
+
88
+ <ipython-input-3-fbffaa21dda2> in save_frame_range_sec(video_path, dir_path, basename, ext)
89
+ 17
90
+ 18 for sec in time_list:
91
+ ---> 19 n = round(fps * sec)
92
+ 20 cap.set(cv2.CAP_PROP_POS_FRAMES, n)
93
+ 21 ret, frame = cap.read()
94
+
95
+ TypeError: type Timedelta doesn't define __round__ method
92
96
 
93
97
  ### 補足
94
98
  google colaboratoryで実行しました。
99
+ 動画とファイルのパスに問題はなかったです。
95
100
 
96
101