Сбой videowriter при запуске с использованием pyinstaller - PullRequest
0 голосов
/ 23 апреля 2020

В течение последних нескольких недель я использовал videowriter.write (), и он работал нормально. Мне нужно было отдать программу нескольким сотрудникам, у которых были случайные установки python, поэтому я упаковал ее в pyinstaller, который я успешно использовал в других проектах.

Почти все работает нормально при запуске под pyinstaller Я могу читать изображения, захватывать изображения с камеры, показывать их на экране и записывать отдельные изображения. Проблема в том, что когда я использую videowriter.write () где-то в недрах кода, он вылетает, жалуясь, что изображения имеют неправильный размер. Это происходит только при запуске под pyinstaller, а не при запуске его непосредственно из python.

Ниже приведен фрагмент кода, который я извлек с помощью сгенерированного тестового образа. Сотрудник попытался запустить тот же пример, используя свою копию opencv, python, и pyinstaller и его исполняемый файл, похоже, работают. Я провел последние несколько дней, пытаясь дублировать эту настройку, но я не получаю те же результаты. Я полностью удалил python 3 (у меня есть копия 2.7, предназначенная специально для других тестов), очистил кэш пипса, очистил переменные среды и убедился, что все каталоги python были удалены перед переустановкой. Я попытался python вернуться к 3.7, различные версии OpenCV 4.1 через текущий, и все ведут себя одинаково. Я также попытался использовать виртуальную среду и настроить ядро ​​python, находящееся в Program Files.

Текущая версия opencv_videoio_ffmpeg: opencv_videoio_ffmpeg420_64.dll. Версией, которую успешно использовал мой коллега, является opencv_ffmpeg410_64.dll

Хотя это не имеет большого значения, команда, которую я использовал для создания исполняемого файла:

pyinstaller videowriter_test.py --onefile

I также пробовал без параметра --onefile, он работает так же, но найти исполняемый файл немного сложнее.

В установке python установлено следующее: opencv- python, opencv-contrib - python, imutils, pynput, клавиатура, virtualenv, pyinstaller. Все они были установлены с помощью pip.

pyinstaller stats:

129 INFO: PyInstaller: 3.6 
129 INFO: Python: 3.7.7 
131 INFO: Platform: Windows-10-10.0.18362-SP0 
133 INFO: wrote C:\Users\tbray\Desktop\MyProjects\Python3\Play\videowriter\videowriter_test.spec
137 INFO: UPX is not available. 139 INFO: Extending PYTHONPATH with paths

Тестовый код:

import traceback
import cv2
import numpy as np
import imutils
# the rest are just there to make sure pyinstaller includes the same modules
# as my regular code
import copy
import platform
import pathlib
import select
import argparse
import warnings
import datetime
import json
import time

if __name__ == '__main__':
    w = 640
    h = 480
    currentVideoLogFilename = "test.avi"
    print(os.getenv('temppath'))
    try:
        print("Attempting to open Video Log:", currentVideoLogFilename)
        video_log_file = cv2.VideoWriter(currentVideoLogFilename,
                    cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (w, h),True)
        print("Open Success")
    except:
        traceback.print_exc()

    print("Test Image Shape:", w, h)
    image = np.zeros((w, h, 3))
    try:
        video_log_file.write(image)
    except:
        traceback.print_exc()
    print("Completed")
    video_log_file.release()
    print("file closed/released")
    sys.exit(0)

Если я запускаю с помощью idle или pyCharm, я получаю это результат:

================== RESTART: C:\Users\tbray\Desktop\MyProjects\Python3\Play\videowriter\videowriter_test.py ==================
None
Attempting to open Video Log: test.avi
Open Success
Test Image Shape: 640 480
Completed
file closed/released
>>> 

если я запускаю его из виртуальной среды, я получаю:

C:\Users\tbray\Desktop\MyProjects\Python3\Play\videowriter\dist>videowriter_test.exe
None
Attempting to open Video Log: test.avi
[ERROR:0] global C:\projects\opencv-python\opencv\modules\videoio\src\cap.cpp (415) cv::VideoWriter::open VIDEOIO(CV_IMAGES): raised OpenCV exception:

OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\videoio\src\cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): test.avi in function 'cv::icvExtractPattern'


Open Success
Test Image Shape: 640 480
Traceback (most recent call last):
  File "videowriter_test.py", line 39, in <module>
cv2.error: OpenCV(4.2.0) C:\projects\opencv-python\opencv\modules\videoio\src\cap_mjpeg_encoder.cpp:476: error: (-215:Assertion failed) imgWidth == frameWidth && imgHeight == frameHeight && channels == 3 in function 'cv::mjpeg::MotionJpegWriter::write'

Completed
file closed/released

Одно интересное замечание - это временный каталог, на который ссылается первое сообщение об ошибке , Я понятия не имею, откуда берется каталог и что с ним происходит, он отсутствует, когда я go ищу его.

Есть предложения?

...