OpenCV imread висит при вызове из веб-запроса

Это, вероятно, одна из самых странных ошибок, с которыми я столкнулся при использовании OpenCV. Происходит много, поэтому позвольте мне попытаться объяснить это, насколько это возможно.

  • Я использую веб-фреймворк Django и OpenCV (cv2) вместе. Я пытаюсь прочитать файл с моего диска из представления в Django.

    imagePath = os.path.dirname(__file__) + "/1.jpg"
    

    В принципе, в том же пути, что и файл views.py, есть файл под названием "1.jpg". Это все, что делает этот код. Достаточно легко. Но следующий шаг - это то, где все становится сумасшедшим.

  • Теперь я хочу прочитать файл изображения, расположенный в 'imagePath'. Для этого требуется вызов cv2.imread

    image = cv2.imread(imagePath)
    

    Но это то, где начинаются мои проблемы. Как-то Apache (или, может быть, даже OpenCV, я не могу сказать) начинает висит, и файл никогда не загружается. Нет сообщения об ошибке, ничего нет.

Выполняя некоторые детективные работы, я решил попробовать старую версию OpenCV (импорт cv). Как ни странно, когда я вызываю cv.LoadImage(imagePath), Apache не зависает, и мое изображение загружается просто отлично. Я понятия не имею, почему.

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

from PIL import Image
import numpy as np
image = Image.open(imagePath)
image = np.asarray(image)

Один раз, используя PIL Apache, он не зависает, и я могу нормально работать с моим изображением, представленным в виде массива numpy, и применять к нему любую из функций cv2.

Тем не менее, я не из тех, кто подходит к обходным решениям, и тот факт, что cv2.imread висит, действительно беспокоит меня.

Кто-нибудь сталкивался с этим раньше?

EDIT: использование cv.imread из оболочки Python отлично работает, это просто из запроса Apache, что происходит зависание.

>>> import cv2
>>> image = cv2.imread("1.jpg")
>>> image.shape
(400, 344, 3)
>>> 

Ответ 1

У меня была аналогичная проблема, и я нашел исправление → просто добавляю к вашей конфигурации apache:

WSGIScriptAlias application-group=%{GLOBAL}

По-видимому, это происходит, когда у вас есть модуль расширения, не предназначенный для работы в суб-интерпретаторе. Вышеуказанное заставляет его работать в основном интерпретаторе.

Источники: django apache mod-wsgi зависает при импорте модуля python из .so файла http://blog.rtwilson.com/how-to-fix-flask-wsgi-webapp-hanging-when-importing-a-module-such-as-numpy-or-matplotlib/

Ответ 2

Неправильный

imagePath = os.path.dirname(__file__) + "/1.jpg"

Right

from os.path import abspath, join, dirname

imagePath = abspath( join(dirname(__file__), "1.jpg") )