Ошибка OpenCV инициализация завершена

Я запускал скрипт python с nodejs с использованием пакета python-shell .. и получаю эту ошибку:

Error: init done

at PythonShell.parseError (F:\github\pythonShellDemo\node_modules\python-shell\index.js:191:17)
at terminateIfNeeded (F:\github\pythonShellDemo\node_modules\python-shell\index.js:98:28)
at ChildProcess.<anonymous> (F:\github\pythonShellDemo\node_modules\python-shell\index.js:89:9)
at emitTwo (events.js:126:13)
at ChildProcess.emit (events.js:214:7)
at Process.ChildProcess._handle.onexit (internal/child_process.js:198:12)

после некоторой отладки и исследования я узнал, что эта ошибка связана с opencv, но я не могу найти никакого решения ..

вот код:

import cv2
import zbar
from PIL import Image
import sys

video = cv2.VideoCapture(0)
count=0
qrcode=[]
while True:
  ret, frame = video.read()
  cv2.imshow('Camera', frame)
  if cv2.waitKey(1) & 0xFF == ord('q'):
    break
  grayscale = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  image = Image.fromarray(grayscale)
  width, height = image.size
  zbarimage = zbar.Image(width, height,'Y800', image.tobytes())
  scanner = zbar.ImageScanner()
  scanner.scan(zbarimage)
  for x in zbarimage:
    if count == 0:
      qrcode=x.data
      count=count+1
  if qrcode:
    break
video.release()
cv2.destroyAllWindows()

print(qrcode)
sys.stdout.flush()

Я использую Python 2.7

ОБНОВИТЬ: Код nodejs для вызова скрипта Python:

PythonShell.run('python/scan.py', options, function (err, results) {
  if (err) {
    console.info(err)
    reject(err)
  }
  // results is an array consisting of messages collected during execution
  console.info(results)
  resolve(results)
})

ОБНОВИТЬ: я пробовал запустить opencv только без zbar .. все равно ошибка

import cv2

cap = cv2.VideoCapture(0)

while(True):
    ret, frame = cap.read()

    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

    cv2.imshow('frame',gray)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

Этот сценарий работает правильно сам по себе? Выводит ли он что-нибудь подобное сообщению об ошибке "init done"? Может быть, это просто какое-то предупреждение, который вы могли бы отключить (не похоже ни на что, что я видел вывод OpenCV, может быть, zbar делает это)? В противном случае уменьшите этот сценарий до минимальный воспроизводимый пример, который все еще воспроизводит ошибку, и обновите свой вопрос.

Dan Mašek 11.04.2018 17:07

@ DanMašek, да, он отлично работает сам по себе ... и я попытался отключить эти предупреждения, но безуспешно

Harkirat Singh 11.04.2018 17:09

@ DanMašek, я попытался удалить код opencv и запустить скрипт со всем тем же .. он работает отлично, без ошибок ..

Harkirat Singh 11.04.2018 17:11

@ DanMašek, я обновил свой вопрос

Harkirat Singh 11.04.2018 17:15

Круто, я думаю, у вас есть два возможных виновника - либо VideoCapture, либо код highgui (imshow и родственные ему). Попробуйте еще немного уменьшить;) | Кстати, где этот код работает, когда вы вызываете его из node.js? Просто спрашиваю, потому что иногда люди пытаются использовать highgui на стороне сервера.

Dan Mašek 11.04.2018 17:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Библиотека OpenCV выводит init done на стандартный вывод ошибок. Это не ошибка, а просто отладочный отпечаток. python-shell затем превращает это в ошибку. Из документации python-shell:

If the script writes to stderr or exits with a non-zero code, an error will be thrown.

Подавление вывода возможно только с помощью перекомпиляция библиотеки с набором параметров.

Интересно. На какой платформе это работает, на каком бэкенде с поддержкой Highgui? Например. Я еще не видел, чтобы это происходило в окнах. | Однако, если вывод в stderr является фатальным, тогда OpenCV может быть проблемой, поскольку даже пойманные и обработанные исключения в конечном итоге печатаются в stderr (в следующем выпуске будет способ избежать этого).

Dan Mašek 11.04.2018 18:52

Другие вопросы по теме