В течение последних нескольких недель я использовал 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 ищу его.
Есть предложения?