Я хочу многопоточность одной строки кода, но код не может быть запущен в - PullRequest
0 голосов
/ 19 апреля 2019

Итак, у меня есть эта папка с 500 изображениями, и я пытаюсь сделать из нее промежуток времени.Я знаю, что большинство программ для редактирования уже могут делать это, но я хотел запрограммировать вызов.

Я нашел это о том, как это сделать Как сделать фильм из изображений в python .Но проза была медленная.Так что теперь я пытаюсь многопоточность.Проблема в том, что код, выполняющий часть рендеринга (часть рендеринга медленная), не может быть запущен в def.Я также использовал этот учебник для многопоточности https://medium.com/@urban_institute/using-multiprocessing-to-make-python-code-faster-23ea5ef996ba

Код:

import cv2
import os
import multiprocessing



def render(video, image):
    print("renderd: " + image)
    video.write(cv2.imread(os.path.join(image_folder, image)))




if __name__ == "__main__":

    image_folder = 'E:/time laps/'
    video_name = 'video.avi'

    images = [img for img in os.listdir(image_folder) if img.endswith(".JPG")]
    frame = cv2.imread(os.path.join(image_folder, images[0]))
    height, width, layers = frame.shape



    video = cv2.VideoWriter(video_name, 0, 1, (width,height))


    print("rendering")

    processes = []
    for image in images:
        p = multiprocessing.Process(target=render, args=(video, image))
        processes.append(p)
        p.start()

    for process in processes:
        process.join()



        print(image)

    cv2.destroyAllWindows()
    video.release()

, когда я запускаю его, я получаю следующее сообщение об ошибке:

Traceback (most recent call last):
  File "E:/timelaps.py", line 34, in <module>
    p.start()
  File "C:\Users\TimKo\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\process.py", line 112, in start
    self._popen = self._Popen(self)
  File "C:\Users\TimKo\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\TimKo\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Users\TimKo\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\popen_spawn_win32.py", line 65, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\TimKo\AppData\Local\Programs\Python\Python37-32\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
TypeError: can't pickle cv2.VideoWriter objects
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...