Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在opencv中将视频捕获分为两部分以更快地处理视频?_Python_Python 3.x_Multithreading_Opencv_Python Multithreading - Fatal编程技术网

Python 如何在opencv中将视频捕获分为两部分以更快地处理视频?

Python 如何在opencv中将视频捕获分为两部分以更快地处理视频?,python,python-3.x,multithreading,opencv,python-multithreading,Python,Python 3.x,Multithreading,Opencv,Python Multithreading,我试图启动2个进程来读取opencv中的相同视频,每个进程将读取视频并设置开始帧 例如: 过程1->读取视频并读取文件0-4000 process2->再次读取相同的视频,并将帧设置为4000-8000 我的问题是,当第二个进程将视频帧设置为4xxx时,进程1完成您的工作,看起来两个进程使用的是相同的视频捕获实例 我的简化代码是这样的,您可以在您的计算机中复制并通过它,它将运行: 导入cv2 来自多处理导入池 #Process frame是将在每个处理器中执行的方法 def processF

我试图启动2个进程来读取opencv中的相同视频,每个进程将读取视频并设置开始帧

例如:

  • 过程1->读取视频并读取文件0-4000
  • process2->再次读取相同的视频,并将帧设置为4000-8000
我的问题是,当第二个进程将视频帧设置为4xxx时,进程1完成您的工作,看起来两个进程使用的是相同的视频捕获实例

我的简化代码是这样的,您可以在您的计算机中复制并通过它,它将运行:

导入cv2
来自多处理导入池
#Process frame是将在每个处理器中执行的方法
def processFrames(参数):
#所有参数都正确,包括startAt和endAt
processId,startAt,endAt,url=params
cap=cv2.VideoCapture(url)
#[问题在这里]
#问题就在这里,当我将第一个视频剪辑设置为1-4xxx时
#帧,它中断,但第二个处理器裁剪视频
#by(4xxx-8xxx)工作正常
cap.set(startAt,endAt-1)#如果我去掉这条线,一切正常
#打印处理器在帧中工作的内容
while(cap.isOpened()):
打印(进程ID)
完成,img=cap.read()
如果没有这样做:
#当处理器2将帧设置为>4000时,处理器1结束
打印(‘完成’)
打破
第1章释放()
url='./video.mkv'
#获取视频中的总帧数
cap=cv2.VideoCapture(url)
总计=整数(cap.get(cv2.cap\u PROP\u FRAME\u COUNT))
第1章释放()
#定义流程将使用的框架
startAt=1
halfMovie=总计//2
#每个进程都有一个ID
id1=0
id2=1
#进程参数
参数=[]
params.append((id1,startAt,halfMovie,url))
附加参数((id2,半电影+1,总计,url))
#下水过程
池=池(进程=2)
pool.map_async(processFrames,params)
pool.close()
pool.join()
因为我正在为每个帧打印处理器的ID(0或1),所以当我运行此代码时,我必须得到如下结果:

0
0
1.
0
1.
0
1.
1.
0
但我得到了这个结果:

0 #the processor 0 starts
1 # the processor 1 starts
1
1
1
1
done  # the processor 0 finish your job because don't have more frames to read (I guess)
1
1
1
1
1
... # Only processor 1 works

我已经尝试使用
池.map
池.map\u async
池.apply\u async
线程.start
线程对象
,但所有实现都得到了相同的结果