0

私の全体的な目標は、Raspberry Pi HQ Camera でビデオをキャプチャすることです。端末と標準の raspivid コマンドを使用するとraspivid -w 640 -h 480 -fps 90 -t 10000 -o video.h264、結果のビデオのような fps (および frame_count) に関する正しい情報が保存されませんでした。次のコードでopenCVとpythonを使用して確認しました:

import cv2

cap = cv2.VideoCapture('video.h264')

if cap.isOpened():

    fps = cap.get(cv2.CAP_PROP_FPS)

    print('fps:', fps)  # float `fps`

    frame_count = cap.get(cv2.CAP_PROP_FRAME_COUNT)

    print('frames count:', frame_count)  # float `frame_count`

fps: 90.0、frame_count: 900.0 と予想していたのですが、fps: 25.0、frame_count: -192153584101141.0 でした。

いくつかの調査の後、.h264 は正しい fps 値を保存するのではなく、デフォルト値 (私の場合は 25.0 fps) を保存するという結論に達しました。

私の次の試みは、openCV と python を使用して、HQ カメラでビデオをキャプチャすることでした。私は次のコードでそうしようとしました(openCVでビデオをキャプチャしようとするとき、これはかなり標準的です):

import numpy as np
import cv2

#had to use (-1,cv2.CAP_V4L) instead of (0) for it to find my HQ Camera
cap = cv2.VideoCapture(-1,cv2.CAP_V4L)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('video_out.avi', fourcc, 30.0, (640, 480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        out.write(frame)
        cv2.imshow('frame', frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break
cap.release()
out.release()
cv2.destroyAllWindows()

今約10秒を記録するとき。長いビデオを作成し、以前と同じ方法を使用して後で分析した結果、期待どおりの fps: 30.0 および frame_count: (およそ) 300.0 でした。

ここで、8 行目で fps を 30 から 60 に変更し、約 10 秒を分析しますout = cv2.VideoWriter('video_out.avi', fourcc, 30.0, (640, 480))out = cv2.VideoWriter('video_out.avi', fourcc, 60.0, (640, 480))その後の長いビデオは、結果が予想どおりに異なっていました。fps: 60.0 と frame_count: (およそ) 600.0 の代わりに、結果は fps: 60.0 と frame_count: (およそ) 300.0 でした。また、ビデオはわずか5秒になりました。10秒ではなく長い。

私は、ビデオがまだ 30 fps で 10 秒で記録されているという結論に達しました。300フレームの合計数を記録するのは正しいです。しかし、video_out.avi ファイルでは fps が 60 fps に設定されており、合計で 300 フレームしか使用できないため、(60 fps) ビデオの長さは半分になります。

さて、まだ残っているのは次の質問です。

上記のコードをどのように変更して、10 秒をキャプチャできるようにしますか。60 fps の長いビデオで合計 600 フレームを取得しますか?

編集#1

@Tiphel はコメントで、 cap.set(cv2.CAP_PROP_FPS, 10) を追加すると問題が解決する可能性があると述べました。そしてそれはうまくいくように見えました。以前に定義された時間 (たとえば 5 秒) を記録してから停止するように、コードを編集しようとしました。これを行うことで、60 fps のビデオが 5 秒かどうかを確認できました。の記録には、実際には 300 フレームがあります。この試行により、次のコードが生成されました。

import numpy as np
import cv2
import time

f=open("fps_and_time_passed.txt", "w")

cap = cv2.VideoCapture(-1,cv2.CAP_V4L)
cap.set(cv2.CAP_PROP_FPS, 30)

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('vid_out.avi', fourcc, 30.0, (640, 480))

capture_time=5.0
start_time=time.time()

while(time.time() - start_time < capture_time):
    
    #print time passed in console
    #print('time passed: ' + str(time.time()-start_time))
    
    #write time passed in .txt file
    f.write('time passed: ' + str(time.time()-start_time) + ' ')
    
    fps=cap.get(cv2.CAP_PROP_FPS)
    
    #print fps in console
    #print('fps: ',fps)
    
    #write fps in .txt file
    f.write('fps: ' + str(fps) + '\n')
    ret, frame = cap.read()
    if ret==True:
        out.write(frame)
        cv2.imshow('frame', frame)       
        #if cv2.waitKey(1) & 0xFF == ord('q'):
        #    break
    else:
        break
f.close()
cap.release()
out.release()
cv2.destroyAllWindows()

結果の "vid_out.avi" ファイルを分析した後、fps: 30.0 および frame_count 150.0 であると予想していましたが、fps: 30.0 および frame_count: 115.0 でした。次に、「fps_and_time_passed.txt」ファイルを調べたところ、驚いたことに、約 1.4 秒あることに気付きました。最初の遅延:

time passed: 1.1682510375976562e-05 fps: 30.0
time passed: 1.4038400650024414 fps: 30.0
time passed: 1.4290287494659424 fps: 30.0
time passed: 1.4499273300170898 fps: 30.0
...
time passed: 4.89248514175415 fps: 30.0
time passed: 4.925801515579224 fps: 30.0
time passed: 4.9621946811676025 fps: 30.0
time passed: 4.995436191558838 fps: 30.0

ご覧のとおり、遅延は最初の出力と 2 番目の出力の間にあります。

だから私の新しい質問は:

この遅延を解消するにはどうすればよいですか?

4

1 に答える 1