【问题标题】:How to convert image file object to numpy array in with openCv python?如何使用openCv python将图像文件对象转换为numpy数组?
【发布时间】:2020-01-24 16:21:08
【问题描述】:

我正在开发 API 以使用 Flask 上传图像。上传后我想使用openCV修改图像,因为openCV需要numpy数组对象我有文件对象,我如何转换为numpy数组? 这是我的代码

@app.route('/upload', methods=['POST'])
def enroll_user():
    file = request.files['fileName']
    # file.save(os.path.join(file.filename))
    return response

编辑:更新代码

@app.route('/upload', methods=['POST'])
    def enroll_user():
        file = request.files['fileName']
        response = file.read()
        # file.save(os.path.join(file.filename))
        return response

我想用下面的代码将文件转换为 cv2 帧

ret, frame = cv2.imread(file)

一种方法是将图像写入磁盘并使用 cv2.imread 再次读取,但我不想这样做,因为这会很耗时。那么有没有办法从文件对象转换为 cv2 帧呢?

谢谢

【问题讨论】:

  • 类似this?
  • 能分享一下发送http请求的代码吗?
  • OpenCV图像对象 numpy对象,一般dtype为np.uint8
  • @QuangHoang 你说得对,OpenCV 图像对象是 numpy 对象,但我想将上传的 jpg 文件转换为 OpenCV 图像对象。

标签: python numpy opencv flask


【解决方案1】:

如果您在名为response 的变量中有效地拥有 JPEG/PNG 文件的内容,我认为您可以这样做:

frame = cv2.imdecode(response)

或者,您可能需要这样做:

frame = cv2.imdecode(np.fromstring(response, np.uint8), cv2.IMREAD_COLOR)

否则,另一种方式是这样的:

from io import BytesIO
from scipy import misc

frame = misc.imread(BytesIO(response))

【讨论】:

  • 感谢您的回复,我已尝试使用 imdecode,但它需要标志作为第二个参数,因此我已通过 cv2.IMREAD_COLOR 但现在我收到错误:frame = cv2.imdecode(file, cv2. IMREAD_COLOR) TypeError: buf 不是 numpy 数组,也不是标量
  • 我也试过你的第二种方法,它给了我以下错误:frame = misc.imread(BytesIO(img)) TypeError: a bytes-like object is required, not 'FileStorage'
  • 我更新了我的答案,请尝试新的第二个选项。谢谢。
  • 谢谢,更新的选项对我有用,但在此之前我需要阅读我没有完成的文件。就像我更新的问题一样。
  • 酷。很高兴我们让您启动并运行 - 抱歉花了我这么长时间。祝你的项目好运!
【解决方案2】:

如果在您的情况下 file 处于读取字节模式(这意味着 mode='rb'),那么 numpy.frombuffer() 也可以工作,例如:

file = request.files['fileName']
frame = cv2.imdecode(np.frombuffer(file.read(), numpy.uint8), cv2.IMREAD_COLOR)

【讨论】:

    猜你喜欢
    • 2014-12-28
    • 2018-09-05
    • 1970-01-01
    • 2016-03-17
    • 2017-05-10
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    相关资源
    最近更新 更多