Python 视频帧曼哈顿距离计算的优化

Python 视频帧曼哈顿距离计算的优化,python,opencv,image-processing,optimization,video-processing,Python,Opencv,Image Processing,Optimization,Video Processing,我试图为视频的每一帧的特定裁剪部分生成曼哈顿距离,与视频的第一帧相比。这些是高帧率视频,每个视频约5000多帧。目前,每个视频大约需要120秒才能完成此分析,并生成帧列表及其相关的曼哈顿距离。我有两件事可以优化速度-使用内置的scipy.space.distancecdist函数,使用np.linalg.norm尝试欧几里德距离,并在循环外进行灰度转换作为视频预处理步骤。所有这些变化都没有对计算时间产生重大影响。是否有任何方法可以显著加快此过程(下面函数中的while循环) 我想你能做的不多。欧

我试图为视频的每一帧的特定裁剪部分生成曼哈顿距离,与视频的第一帧相比。这些是高帧率视频,每个视频约5000多帧。目前,每个视频大约需要120秒才能完成此分析,并生成帧列表及其相关的曼哈顿距离。我有两件事可以优化速度-使用内置的
scipy.space.distance
cdist函数,使用
np.linalg.norm
尝试欧几里德距离,并在循环外进行灰度转换作为视频预处理步骤。所有这些变化都没有对计算时间产生重大影响。是否有任何方法可以显著加快此过程(下面函数中的while循环)


我想你能做的不多。欧几里德距离比曼哈顿要贵一点。如果你有一个像样的多核CPU,你可能会使用多处理将帧分布在多个核之间进行并行处理。谢谢你的建议!Chris/Mark,有没有其他算法/方法可以用来量化可能更快的图像帧之间的差异?马克,我是图像分析/处理的新手。你能提供一些关于如何实现这个的帮助吗?你有什么CPU?什么操作系统?多少公羊?您是否尝试过逐帧读取整个视频并在不进行处理的情况下丢弃这些帧,以了解从磁盘获取视频的速度?我有一个运行macOS Mojave 10.14.5的2.3 GHz Core i5(i5-7360U)双核处理器。实际上,一帧一帧地解压视频需要30秒,而不需要对其执行任何处理步骤。有什么建议吗?
def compare_images_master():
    current_frame = 0
    numFrames = count_frames_automatic(resized_videocap)
    GrayOriginalFrame = cv2.cvtColor(DetectionPlate, cv2.COLOR_BGR2GRAY)
    originalFrameMap = GrayOriginalFrame.astype(float)
    m_norm_list = [0] * numFrames
    frame_num_list = list(range(numFrames))
    start_compare_images = time.time()
    print("calculating Manhattan distances...")
    for current_frame in frame_num_list:
        resized_videocap.set(1, current_frame) #set current frame to the frame to be computed
        ret, currentFrameImage = resized_videocap.read() #read video file and open current
        currentFrameImageCropped = currentFrameImage[ref_pts[0][1]:ref_pts[1][1], ref_pts[0][0]: ref_pts[1][0]] #crop image to detection plate
        GrayCurrentFrame = cv2.cvtColor(currentFrameImageCropped, cv2.COLOR_BGR2GRAY) #convert to grayscale
        currentFrameMap = GrayCurrentFrame.astype(float) #convert from image to pixel frame map
        diff = originalFrameMap - currentFrameMap
        m_norm = np.sum(np.abs(diff))  # Manhattan norm
        m_norm_list[current_frame] = m_norm
    end_compare_images = time.time()
    print("Completed calculating Manhattan distances...")
    print ('time taken to generate manhattan distances', end_compare_images - start_compare_images)
    # time taken - 120seconds
    return m_norm_list, frame_num_list