blob: a4c208bf9ca6aa22773f6b2f07e803e3cd8a1d60 [file] [log] [blame]
#!/usr/bin/env python
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
# http://www.apache.org/licenses/LICENSE-2.0
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
import cv2
import ntpath
import numpy as np
print("cv2.__version__", cv2.__version__)
CV_FRAME_COUNT = None
if hasattr(cv2, "cv"):
CV_FRAME_COUNT = cv2.cv.CV_CAP_PROP_FRAME_COUNT
else:
CV_FRAME_COUNT = cv2.CAP_PROP_FRAME_COUNT
def _get_image_from_array(image_array):
# JPG to support tensorflow
byte_arr = cv2.imencode(".jpg", image_array)[1]
return "".join(map(chr, byte_arr))
def _path_leaf(path):
"""
Returns file name from path. Path should not end with slash(/)
"""
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
def get_center_frame(video_path):
"""
Traverse till half of video and saves center snapshot
@param video_path: Path to video file on system
"""
cap = cv2.VideoCapture(video_path)
length = int(cap.get(CV_FRAME_COUNT))
success, image = cap.read()
count = 0
while success and count < length / 2:
success, image = cap.read()
count += 1
return _get_image_from_array(image)
def get_frames_interval(video_path, frame_interval):
"""
Selects one frames after every frame_interval
@param video_path: Path to video file on system
@param frame_interval: Interval after which frame should be picked. If frame_interval=10 then every 10th frame will be extracted
"""
cap = cv2.VideoCapture(video_path)
length = int(cap.get(CV_FRAME_COUNT))
success, image = cap.read()
count = 0
image_arr = []
while success and count < length:
success, image = cap.read()
if count % frame_interval == 0:
image = _get_image_from_array(image)
image_arr.append(image)
count += 1
return image_arr
def get_n_frames(video_path, num_frame):
"""
Get N frames equidistant to each other in a video
@param video_path: Path to video file on system
@param num_frame: Number of frames to be extracted from video. If num_frame=10 then 10 frames equally distant from each other will be extracted
"""
cap = cv2.VideoCapture(video_path)
length = int(cap.get(CV_FRAME_COUNT))
op_frame_idx = set(np.linspace(0, length - 2, num_frame, dtype=int))
success, image = cap.read()
count = 0
image_arr = []
while success and count < length:
success, image = cap.read()
if success and count in op_frame_idx:
image = _get_image_from_array(image)
image_arr.append(image)
count += 1
return image_arr