我在OSX上的python中使用OpenCV (10.10.5)。我对OpenCV相当陌生。现在我只是想找出视频中某个特定事件发生的帧号。我在用轨迹栏导航视频。
我遇到的问题是,OpenCV正在报告非整数帧号。我的程序应该将帧号设置为轨迹栏位置。trackbar的位置总是一个整数,但是帧号不是。对于较长的视频,问题似乎更严重:视频越短,当轨迹栏位置为254个时,帧数(如果不是整数)大约是253.99999999999994。然而,对于较长的视频,帧号从整数值得到越来越远(例如,当轨迹栏位置为11212时为11212.20588235294,当轨迹栏位置为26631时为26631.529411764703 )。请注意,这些数字并不总是与trackbar位置相同的整数。
每个视频的总帧数也不是整数: 1547.9999999999998是我测试过的较短的视频,92651.38235294117是我测试的长视频。较短的视频是.mov文件,较长的视频是.mp4文件,我使用ffmpeg从.mpg中转换了该文件。
为什么会发生这种情况?我怎么才能算出帧号?谢谢你的帮助!下面是我一直使用的测试代码(注意,它基于http://giusedroid.blogspot.com/2015/05/python-opencv-frame-grabber.html的框架抓取器):
代码语言:javascript复制import numpy as np
import cv2
video_path = '#set video path here'
# grab a VideoCapture object
cap = cv2.VideoCapture(video_path)
#set some shorthand names
current_frame_flag = cv2.cv.CV_CAP_PROP_POS_FRAMES
total_frames_flag = cv2.cv.CV_CAP_PROP_FRAME_COUNT
win_name = "Frameshift calculator"
pos_trackbar='pos_trackbar'
cv2.namedWindow(win_name)
def seek_callback(x):
# we want to change the value of the frame variable globally
global frame
# by getting the position of the trackbar
i = cv2.getTrackbarPos(pos_trackbar, win_name)
# and skipping to the selected frame
cap.set(current_frame_flag, i)
_, frame = cap.read()
# and then update the window
cv2.imshow(win_name, frame)
#print out the current frame flag and the trackbar position
print(cap.get(current_frame_flag), i)
cv2.createTrackbar(pos_trackbar, win_name, 0, int(cap.get(total_frames_flag)), seek_callback)
while True:
# shows the image
cv2.imshow(win_name, frame)
# waits for keystroke
if cv2.waitKey(0) & 0xFF == ord('q'):
break
key = cv2.waitKey(0)
cap.release
cv2.destroyAllWindows()一些样本(帧号、轨迹杆位置)对:
较短视频(.mov):(1.0,0) (171.99999999999997,172个) (842.9999999999999,843) (1141.0,1141) (1330.0,1330) (111.99999999999999,112) (235.99999999999997,236) (590.9999999999999,591) (1546.9999999999998,1547)
长视频(.mp4):(1.0,0) (6642.911764705882,6642) (27496.11764705882,27496) (49707.529411764706,49707) (64786.294117647056,64786) (84065.38235294117,84065)