15

这可能是我在使用 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,我不知道)开始挂起并且文件永远不会加载。没有错误信息,什么也没有。

做一些侦探工作,我决定尝试旧版本的 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 挂起的事实真的让我很困扰。

有没有人遇到过这个?

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

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

2 回答 2

8

我有一个类似的问题并找到了一个修复 -> 只需添加到您的 apache 配置中:

WSGIScriptAlias application-group=%{GLOBAL}

显然,当您有一个扩展模块不是设计为在子解释器中工作时会发生这种情况。以上强制它在主解释器中运行。

资料来源: django apache mod-wsgi 挂起从 .so 文件导入 python 模块 http://blog.rtwilson.com/how-to-fix-flask-wsgi-webapp-hanging-when-importing-a-module-such -as-numpy 或 matplotlib/

于 2017-03-21T13:56:49.543 回答
3

错误的

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

正确的

from os.path import abspath, join, dirname

imagePath = abspath( join(dirname(__file__), "1.jpg") )
于 2012-07-26T05:19:48.407 回答