use*_*301 8 python opencv pickle multiprocessing
我正在尝试创建一个独立的进程来处理从相机获取的图像。但多处理似乎很难从 opencv 中提取视频捕获模块。任何人都可以建议解决方法吗?我正在使用 python 3.7.1
from multiprocessing import Process
import multiprocessing as mp
import time
import logging
import logging.handlers
import sys
import logging
from enum import Enum
import cv2
class Logger():
@property
def logger(self):
component = "{}.{}".format(type(self).__module__, type(self).__name__)
#default log handler to dump output to console
return logging.getLogger(component)
class MyProcess(Logger):
def __init__(self, ):
self.process = Process(target = self.run, args=())
self.exit = mp.Event()
self.logger.info("initialize class")
self.capture = cv2.VideoCapture(0)
def run(self):
while not self.exit.is_set():
pass
print("You exited!")
def shutdown(self):
print("Shutdown initiated")
self.exit.set()
if __name__ == "__main__":
p = MyProcess()
p.process.start()
print( "Waiting for a while")
time.sleep(3)
p.shutdown()
time.sleep(3)
print("Child process state: {}".format(p.process.is_alive()))
Run Code Online (Sandbox Code Playgroud)
返回错误具体表示视频捕获对象无法被腌制。
文件“C:\Program Files (x86)\Microsoft Visual Studio\Shared\Anaconda3_64\lib\multiprocessing\reduction.py”,第 60 行,转储 ForkingPickler(file, protocol).dump(obj)
类型错误:无法腌制 cv2.VideoCapture 对象
小智 3
我不是专家,但我遇到了同样的问题,并以这种方式解决了。
而不是在 init 函数中使用 cv2.VideoCapture(0)
def __init__(self, ):
self.process = Process(target = self.run, args=())
self.exit = mp.Event()
self.logger.info("initialize class")
self.capture = cv2.VideoCapture(0)
Run Code Online (Sandbox Code Playgroud)
我将初始化移至运行函数
def run(self):
self.capture = cv2.VideoCapture(0)
while not self.exit.is_set():
Run Code Online (Sandbox Code Playgroud)
这对我有用。或许对你也有帮助
归档时间: |
|
查看次数: |
8567 次 |
最近记录: |