找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1652|回复: 0

[求助] joblib.Parallel中遇到的问题

2

主题

2

帖子

2

积分

贫民

积分
2
阿加西 发表于 2019-5-23 19:17:07 | 显示全部楼层 |阅读模式
import cv2
import os
import numpy as np
from numba import jit
from joblib import Parallel
from joblib import delayed

frame_path = 'data/ucf101_frames111111'
video_path = 'data/ucf101'
@jit
def extract_flow_img(video_full_name, frame_path1 ,i, j):
    cap = cv2.VideoCapture(video_full_name)
    video_frames = int(cap.get(7))
    success, prev = cap.read()
    rgb_img_ = os.path.join(frame_path1, 'img_{:05d}.jpg'.format(1))
    cv2.imwrite(rgb_img_, prev)
    prev = cv2.cvtColor(prev, cv2.COLOR_BGR2GRAY)
    # durance = video_frames//num_frames
    for k in range(video_frames - 1):
        success, last = cap.read()
        if success:
            rgb_img_ = os.path.join(frame_path1, 'img_{:05d}.jpg'.format(k + 2))
            cv2.imwrite(rgb_img_, last)
            last = cv2.cvtColor(last, cv2.COLOR_BGR2GRAY)
            flow = cv2.calcOpticalFlowFarneback(prev, last, None, 0.5, 3, 15, 3, 5, 1.2, 0)
            flow = np.byte((flow - flow.min()) / (flow.max() - flow.min()) * 255)
            flow_x = os.path.join(frame_path1, 'flow_x_{:05d}.jpg'.format(k + 1))
            flow_y = os.path.join(frame_path1, 'flow_y_{:05d}.jpg'.format(k + 1))
            cv2.imwrite(flow_x, flow[:, :, 0])
            cv2.imwrite(flow_y, flow[:, :, 1])
            prev = last

    print('The {} class, {}th video, done!!'.format(i, j))

subname1 = os.listdir(video_path)
count = 0
for i, f in enumerate(subname1):
    rootname = os.path.join(video_path, f)        #目前只到每个类的文件夹,还没到每个视频
    video_name = os.listdir(rootname)
    Parallel(n_jobs=50)(delayed(extract_flow_img)(os.path.join(rootname, v), os.path.join(frame_path, v), i, j)for j, v in enumerate(video_name))
这是我设计的程序,ucf101是一个视频数据集,data/ucf101是根目录,下面还有视频类的子目录,每个子目录下面存放很多视频,同一个子目录里面的视频是同一类。我想把所有视频的视频帧和光流全部提取出来,存放在data/ucf101_frames根目录下,同一个视频帧存放在以该视频名为文件名的子目录下面。可现在遇到问题了,由于计算光流图像很费时间,所以我不得不选择用 joblib.Parallel进行并行处理,可如果n_jobs取值为1,也就是说不用并行计算,这样就不会报错,可一旦我将这个值设置得大于1,就会报global name 'cv2' is not defined的错误,由于提取视频帧用到了opencv,可为啥不用并行计算就不出错,用了就出错。请大神指点。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表