Exemple #1
0
 def getWriter(self, name, codec):
     width = int(self.reader.get(cv2api_delegate.prop_frame_width))
     height = int(self.reader.get(cv2api_delegate.prop_frame_height))
     fourcc = cv2api_delegate.get_fourcc(codec) if codec != 'RAW' else 0
     return VideoPluginWriter(cv2api_delegate.videoWriter(
         name, fourcc, (self.reader.get(cv2api_delegate.prop_fps)),
         (width, height)),
                              clip=self.use_16)
def createMovie(name, generator, size):
    from maskgen.cv2api import cv2api_delegate
    f = generator()
    w = cv2api_delegate.videoWriter(name,
                                    cv2api_delegate.get_fourcc('mp4v'),
                                    10,
                                    f.shape[0:2][::-1],
                                    isColor=1)
    try:
        for i in range(size):
            w.write(f)
            f = generator()

    finally:
        w.release()
Exemple #3
0
def createOutput(in_file, out_file, timeManager, codec=None):
    """

    :param in_file:
    :param out_file:
    :param timeManager:
    :param codec:
    :return:
    @type in_file: str
    @type out_file: str
    @type timeManager: VidTimeManager
    """
    logger = logging.getLogger('maskgen')
    cap = cv2api_delegate.videoCapture(in_file)
    fourcc = cv2api_delegate.get_fourcc(
        str(codec)) if codec is not None else cap.get(
            cv2api_delegate.fourcc_prop)
    fps = cap.get(cv2api_delegate.prop_fps)
    height = int(np.rint(cap.get(cv2api_delegate.prop_frame_height)))
    width = int(np.rint(cap.get(cv2api_delegate.prop_frame_width)))
    out_video = cv2api_delegate.videoWriter(out_file,
                                            fourcc,
                                            fps, (width, height),
                                            isColor=1)
    if not out_video.isOpened():
        err = out_file + " fourcc: " + str(fourcc) + " FPS: " + str(fps) + \
              " H: " + str(height) + " W: " + str(width)
        raise ValueError('Unable to create video ' + err)
    try:
        writecount = 0
        dropcount = 0
        while (cap.grab()):
            ret, frame = cap.retrieve()
            elapsed_time = float(cap.get(cv2api_delegate.prop_pos_msec))
            timeManager.updateToNow(elapsed_time)
            if timeManager.isBeforeTime() or timeManager.isPastTime():
                out_video.write(frame)
                writecount += 1
            else:
                dropcount += 1
        logger.debug('Drop {} frames; Wrote {} frames'.format(
            dropcount, writecount))
    finally:
        cap.release()
        out_video.release()
    return dropcount
Exemple #4
0
 def paste(self, video_file, object, codec):
     vfi = cv2api_delegate.videoCapture(video_file)
     width = int(vfi.get(cv2api_delegate.prop_frame_width))
     height = int(vfi.get(cv2api_delegate.prop_frame_height))
     fourcc = fourccs[codec]
     video_prefix = video_file[:video_file.rfind('.')]
     video_file_output = video_prefix + '_paste.' + suffices[codec]
     video_file_output = os.path.split(video_file_output)[1]
     vfo = cv2api_delegate.videoWriter(video_file_output, fourcc, (vfi.get(cv2api_delegate.prop_fps)), (width, height))
     if not vfo.isOpened():
         raise ValueError('VideoWriter failed to open.')
     try:
         while vfi.isOpened() and vfo.isOpened():
             r,f = vfi.read()
             if not r:
                 break
             i = ImageWrapper(self.paste_in(f,object),mode='BGR')
             vfo.write(i.image_array)
     finally:
         vfi.release()
         vfo.release()
         self.addFileToRemove(video_file_output)
     return video_file_output
Exemple #5
0
def copyFrames(in_file,
               out_file,
               start_time,
               end_time,
               paste_time,
               codec=None):
    """
    :param in_file: is the full path of the video file from which to drop frames
    :param out_file: resulting video file
    :param start_time: (milli,frame no) to start to fill
    :param end_time: (milli,frame no) end fil
    :param codec:
    :return:
    """
    import time
    logger = logging.getLogger('maskgen')
    frames_to_write = []
    frames_to_copy = []
    cap = cv2api_delegate.videoCapture(in_file)
    fourcc = cv2api_delegate.get_fourcc(
        str(codec)) if codec is not None else cap.get(
            cv2api_delegate.fourcc_prop)
    fps = cap.get(cv2api_delegate.prop_fps)
    height = int(np.rint(cap.get(cv2api_delegate.prop_frame_height)))
    width = int(np.rint(cap.get(cv2api_delegate.prop_frame_width)))
    out_video = cv2api_delegate.videoWriter(out_file,
                                            fourcc,
                                            fps, (width, height),
                                            isColor=1)
    if not out_video.isOpened():
        err = out_file + " fourcc: " + str(fourcc) + " FPS: " + str(fps) + \
              " H: " + str(height) + " W: " + str(width)
        raise ValueError('Unable to create video ' + err)
    copy_time_manager = VidTimeManager(startTimeandFrame=start_time,
                                       stopTimeandFrame=end_time)
    paste_time_manager = VidTimeManager(startTimeandFrame=paste_time)
    write_count = 0
    try:
        while (not copy_time_manager.isPastTime() and cap.grab()):
            ret, frame = cap.retrieve()
            elapsed_time = float(cap.get(cv2api_delegate.prop_pos_msec))
            copy_time_manager.updateToNow(elapsed_time)
            paste_time_manager.updateToNow(elapsed_time)
            if not copy_time_manager.isBeforeTime(
            ) and not copy_time_manager.isPastTime():
                frames_to_copy.append(frame)
            if not paste_time_manager.isBeforeTime():
                frames_to_write.append(frame)
            else:
                out_video.write(frame)
                write_count += 1
        if logger.isEnabledFor(logging.DEBUG):
            logger.debug("First to copy {}".format(
                hashlib.sha256(frames_to_copy[0]).hexdigest()))
            logger.debug("Last to copy {}".format(
                hashlib.sha256(frames_to_copy[-1]).hexdigest()))
            ImageWrapper(frames_to_copy[0]).save('first_' + str(time.clock()) +
                                                 '.png')
            ImageWrapper(frames_to_copy[-1]).save('last_' + str(time.clock()) +
                                                  '.png')
        if len(frames_to_write) > 0:
            # paste prior to copy
            for copy_frame in frames_to_copy:
                out_video.write(copy_frame)
            for write_frame in frames_to_write:
                out_video.write(write_frame)
        else:
            # paste after to copy
            frame = None
            while (paste_time_manager.isBeforeTime() and cap.grab()):
                ret, frame = cap.retrieve()
                elapsed_time = float(cap.get(cv2api_delegate.prop_pos_msec))
                paste_time_manager.updateToNow(elapsed_time)
                if paste_time_manager.isBeforeTime():
                    out_video.write(frame)
                    write_count += 1
            for copy_frame in frames_to_copy:
                out_video.write(copy_frame)
            if frame is not None:
                out_video.write(frame)
        while (cap.grab()):
            ret, frame = cap.retrieve()
            out_video.write(frame)
    finally:
        cap.release()
        out_video.release()
    return write_count
Exemple #6
0
def smartAddFrames(in_file,
                   out_file,
                   start_time,
                   end_time,
                   codec=None,
                   direction='forward',
                   audio=False):
    """
    :param in_file: is the full path of the video file from which to drop frames
    :param out_file: resulting video file
    :param start_time: (milli,frame no) start to fill
    :param end_time: (milli,frame no) end to fill
    :param codec:
    :return:
    """
    logger = logging.getLogger('maskgen')
    if audio:
        audioProcessor = maskgen.maskgen_audio.SilenceProcessor(in_file)
        #Potention Add strategy if you'd want
        audio_file = audioProcessor.original
        maskgen.maskgen_audio.export_audio(
            audio_file,
            os.path.splitext(out_file)[0] + '.wav')
    import time
    cap = cv2api_delegate.videoCapture(in_file)
    fourcc = cv2api_delegate.get_fourcc(
        str(codec)) if codec is not None else cap.get(
            cv2api_delegate.fourcc_prop)
    fps = cap.get(cv2api_delegate.prop_fps)
    height = int(np.rint(cap.get(cv2api_delegate.prop_frame_height)))
    width = int(np.rint(cap.get(cv2api_delegate.prop_frame_width)))
    out_video = cv2api_delegate.videoWriter(out_file,
                                            fourcc,
                                            fps, (width, height),
                                            isColor=1)
    time_manager = VidTimeManager(startTimeandFrame=start_time,
                                  stopTimeandFrame=end_time)
    if not out_video.isOpened():
        err = out_file + " fourcc: " + str(fourcc) + " FPS: " + str(fps) + \
              " H: " + str(height) + " W: " + str(width)
        raise ValueError('Unable to create video ' + err)
    try:
        last_frame = None
        frame_analyzer = FrameAnalyzer(start_time, end_time, fps)
        written_count = 0
        while (cap.grab()):
            ret, frame = cap.retrieve()
            frame_analyzer.addFrame(frame)
            elapsed_time = float(cap.get(cv2api_delegate.prop_pos_msec))
            time_manager.updateToNow(elapsed_time)
            if not time_manager.isBeforeTime():
                break
            out_video.write(frame)
            written_count += 1
            last_frame = frame
        next_frame = frame
        if logger.isEnabledFor(logging.DEBUG):
            logger.debug('Written {} frames '.format(written_count))
            logger.debug('Smart Add Frames ' + str(start_time) + '  to ' +
                         str(end_time))
            logger.debug("Selected Before {}".format(
                hashlib.sha256(last_frame).hexdigest()))
            logger.debug("Selected After {}".format(
                hashlib.sha256(next_frame).hexdigest()))
            ImageWrapper(last_frame).save('before_' + str(time.clock()) +
                                          '.png')
            ImageWrapper(next_frame).save('after_' + str(time.clock()) +
                                          '.png')
            logger.debug("STD after and before {}".format(
                np.std(last_frame - next_frame)))
        frame_analyzer.updateFlow(last_frame, next_frame, direction)
        opticalFlow = kdtreeOpticalFlow(last_frame, next_frame,
                                        frame_analyzer.jump_flow,
                                        frame_analyzer.back_flow)
        frames_to_add = frame_analyzer.framesToAdd()
        lf = last_frame
        written_count = 0
        for i in range(1, int(frames_to_add + 1)):
            frame_scale = i / (1.0 + frames_to_add)
            frame = opticalFlow.setTime(frame_scale)
            if logger.isEnabledFor(logging.DEBUG):
                logger.debug("frame {}".format(np.std(frame - lf)))
            out_video.write(frame)
            lf = frame
        out_video.write(next_frame)
        written_count += 1
        while (cap.grab()):
            ret, frame = cap.retrieve()
            out_video.write(frame)
            written_count += 1
        logger.debug('Written additioning {} frames '.format(written_count))
    finally:
        cap.release()
        out_video.release()
    if audio:
        logger.debug('Recombining Audio and Video')
        import maskgen.ffmpeg_api as ffmpeg
        tmpvid = os.path.splitext(out_file)[0] + 'tmp' + os.path.splitext(
            out_file)[1]
        os.rename(out_file, tmpvid)
        ffmpeg.run_ffmpeg([
            '-i', tmpvid, '-i',
            os.path.splitext(out_file)[0] + '.wav', '-c:v', 'rawvideo', '-c:a',
            'pcm_s32le', '-r',
            str(fps), out_file, '-y'
        ])
        os.remove(tmpvid)
        os.remove(os.path.splitext(out_file)[0] + '.wav')
    return frames_to_add, frames_to_add * (1000.0 / fps)