OpenCV(imread)操作卡在弹性豆茎中

Posted

技术标签:

【中文标题】OpenCV(imread)操作卡在弹性豆茎中【英文标题】:OpenCV(imread) operation stuck in elastic beanstalk 【发布时间】:2018-12-09 23:11:33 【问题描述】:

我正在尝试读取一个 png 文件并使用服务器上的 opencv 的 imread 函数在终端中输出图像的 numpy 矩阵,如下所示

import cv2
from flask import Flask
import os

@application.route('/readImage',methods=['POST'])
def handleHTTPPostRequest():
    imagePath = f'os.getcwd()/input.png'
    print('image path is', imagePath)
    print(cv2.__version__)
    im = cv2.imread(imagePath,cv2.IMREAD_COLOR)
    print(im)
    return 'success'

无论我执行多少次,这都会在我的本地机器(Ubuntu 18.04)上给出预期的输出。我通过必要的设置将其移至弹性 beantalk(CentOS)。我第一次拨打电话时,请求运行良好(提供正确的日志以及成功)。 但是当我第二次进行 post 调用时,它只输出前两个日志(imagepath 和 cv2 版本)并且卡在那里一段时间。一段时间后,它显示此错误

End of script output before headers: application.py

我在 cv2.imread 之前又添加了一行,以确保文件存在

print('does the file exists',os.path.isfile(imagePath) )

这每次都返回 true。我已经多次重新启动服务器,看起来它只在第一次工作,并且 cv2.imread() 在第一次调用后卡住了。我错过了什么

【问题讨论】:

【参考方案1】:

当您从请求处理程序中 print 时,Flask 会尝试做一些明智的事情,但 print 确实不是您想要做的事情,因为它可能会导致 HTTP 请求/响应簿记失效。

从处理程序中获取诊断信息的一种完全受支持的方法是使用logging 模块。它将需要一些配置。见http://flask.pocoo.org/docs/1.0/logging/

【讨论】:

感谢您告诉我。您认为删除所有打印语句会防止问题发生吗 我问的原因是因为这只会影响 opencv imread 功能,而且也只会在第一次请求之后 尝试删除打印语句。看起来.imread() 可能是问题所在,但它可能是下一次打印尝试。 如果你注释掉 cv2.imread() 行(以及它下面的打印),你会得到一些关于 cv2 是否与问题有关的迹象。【参考方案2】:

对于遇到此问题的任何人,我找到了solution。将此添加到您的 ebextensions 配置文件中

container_commands:  
  AddGlobalWSGIGroupAccess: 
    command: "if ! grep -q 'WSGIApplicationGroup %GLOBAL' ../wsgi.conf ; then echo 'WSGIApplicationGroup %GLOBAL' >> ../wsgi.conf; fi;"

【讨论】:

【参考方案3】:

Saikiran 的最终解决方案对我有用。当我尝试从 opencv-python 库调用方法时,我遇到了这个问题。我在本地运行 Ubuntu 18.04,它在那里运行良好。但是,就像 Saikiran 的原始帖子一样,当部署到 Elastic Beanstalk 时,第一个请求有效,然后第二个请求无效。对于我的 EB 环境,我使用的是基于 Python3.6 的 Amazon Linux 服务器。

【讨论】:

这似乎不是一个完整的独立答案。你可以再看看How to Answer

以上是关于OpenCV(imread)操作卡在弹性豆茎中的主要内容,如果未能解决你的问题,请参考以下文章

芹菜工人在 aws 弹性豆茎中失败 [退出:芹菜工人(退出状态 1;未预期)]

部署到 Elastic beantalk 时 Angular 模块损坏

弹性豆茎需要 python 3.5

弹性豆茎实体太大错误。如何解决这个问题

命令行中的亚马逊弹性豆茎问题[重复]

使用弹性豆茎时是不是需要 git?