从Web请求调用时,OpenCV imread挂起

时间:2012-07-03 16:15:35

标签: python django apache opencv

这可能是我在使用OpenCV时遇到的最奇怪的错误之一。有很多事情要发生,所以让我尽力解释这个问题。

  1. 我正在使用Django Web框架和OpenCV(cv2)。我正试图从Django的视图中读取磁盘上的文件。

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

    基本上,在与views.py文件相同的路径中,有一个名为“1.jpg”的文件。这就是所有这些代码正在做的事情。很容易。但下一步是事情变得疯狂。

  2. 现在,我想阅读位于'imagePath'的图像文件。这需要调用cv2.imread

    image = cv2.imread(imagePath)
    

    但这是我的问题开始的地方。不知何故,Apache(或者甚至OpenCV,我无法分辨)开始挂起,文件永远不会被加载。没有错误消息,没有任何消息。

  3. 做一些侦探工作我决定尝试使用旧版本的OpenCV(import 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悬挂的事实真的让我烦恼。

    有没有人遇到过这个?

    编辑:使用Python shell中的cv.imread工作正常,它只是来自发出挂起的Apache请求。

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

2 个答案:

答案 0 :(得分:6)

我遇到了类似的问题并找到了解决方法 - >只需添加到您的apache配置:

WSGIScriptAlias application-group=%{GLOBAL}

显然,如果您的扩展模块不是设计用于子解释器,则会发生这种情况。以上迫使它在主翻译中运行。

来源: django apache mod-wsgi hangs on importing a python module from .so file http://blog.rtwilson.com/how-to-fix-flask-wsgi-webapp-hanging-when-importing-a-module-such-as-numpy-or-matplotlib/

答案 1 :(得分:3)

错误

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

from os.path import abspath, join, dirname

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