python – 无法pickle:属性查找cv2.BRISK失败
发布时间:2020-12-20 11:52:31 所属栏目:Python 来源:网络整理
导读:我正在尝试同时运行多个 CMT trackers.出于这个原因,我正在设置一个线程池: import argparseimport cv2from multiprocessing import Poolimport numpy as npimport osimport sysimport timeimport VARtrackerimport utilCMT1 = VARtracker.CMT()... # code
我正在尝试同时运行多个
CMT trackers.出于这个原因,我正在设置一个线程池:
import argparse import cv2 from multiprocessing import Pool import numpy as np import os import sys import time import VARtracker import util CMT1 = VARtracker.CMT() ... # code lines removed # Clean up cv2.destroyAllWindows() if args.inputpath is not None: # If a path to a file was given,assume it is a single video file if os.path.isfile(args.inputpath): cap = cv2.VideoCapture(args.inputpath) # Skip first frames if required if args.skip is not None: cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES,args.skip) # Otherwise assume it is a format string for reading images else: cap = util.FileVideoCapture(args.inputpath) # Skip first frames if required if args.skip is not None: cap.frame = 1 + args.skip # Check if videocapture is working if not cap.isOpened(): print 'Unable to open video input.' sys.exit(1) # Read first frame status,im0 = cap.read() im_gray0 = cv2.cvtColor(im0,cv2.COLOR_BGR2GRAY) im_draw = np.copy(im0) # Getting initial bounding boxes tl1 = [405,160] br1 = [450,275] VARtracker.initialise(CMT1,im_gray0,tl1,br1) frame = 1 while True: pool = Pool(processes=4) print frame # Read image status,im = cap.read() if not status: break im_gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) im_draw = np.copy(im) tic = time.time() # Serial approach #res1 = VARtracker.process_frame(CMT1,im_gray) # Parallel approach res1 = pool.apply_async(VARtracker.process_frame,(CMT2,im_gray)) pool.close() pool.join() res1 = res1.get() toc = time.time() # Display results if res1.has_result: cv2.line(im_draw,res1.tl,res1.tr,(255,0),4) cv2.line(im_draw,res1.br,res1.bl,4) if not args.quiet: cv2.imshow('main',im_draw) cv2.waitKey(pause_time) # Remember image im_prev = im_gray frame += 1 每当我评论串行方法并尝试使用线程(Parallel aproach)时,我都会遇到以下错误:
解决方法
我设法解决了它.感谢@Matt和@Yamaneko.
基本上,我将读取图像的块移动到worker函数中.因此,如果池大小= 6并且有六个边界框,则每个帧将被读取六次(在每个工作者内).这是我发现让它发挥作用的唯一方法. 当前版本可以找到here. import cv2 as cv import multiprocessing as mp import time def worker(folder_path,list_name,top_left,bot_right,index): frame_path = folder_path + '/' + list_name[0] image_0 = cv.imread(frame_path) gray_0 = cv.cvtColor(image_0,cv.COLOR_BGR2GRAY) cmt = VARtracker.CMT() cmt.initialise(gray_0,bot_right) box_queue = mp.Queue() for name in list_name: frame_path = folder_path + '/' + name image_now = cv.imread(frame_path) gray_now = cv.cvtColor(image_now,cv.COLOR_BGR2GRAY) cmt.process_frame(gray_now) if cmt.has_result: print index,name,zip(cmt.tl,cmt.br) output.put((index,cmt.br))) print 'Process {} finished'.format(index) def VARmethod(folder_path,final_frame,bot_right): tic = time.time() if len(top_left) == len(bot_right): list_frame = [index for index in range(1,final_frame + 1)] list_name = [str(index) + '.jpg' for index in list_frame] pool = mp.Pool(5) for index in range(0,len(top_left)): pool.apply_async(worker,args=(folder_path,top_left[index],bot_right[index],index)) pool.close() pool.join() print 'Finished with the script' toc = time.time() print output.qsize() print (toc - tic) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |