web-dev-qa-db-ja.com

メモリバッファー(StringIO)またはopencv python libraryを使用してurlから画像を読み取る方法

パフォーマンスを向上させるために、メモリバッファー内またはURLからopencv画像オブジェクトを作成する方法を共有するだけです。

追加のファイルIOを回避するために、URLからイメージバイナリを取得する場合がありますimreadこのイメージをメモリバッファーまたはURLから取得しますが、imreadはパスを持つファイルシステムからのイメージの読み取りのみをサポートします。

21
evanchin

メモリ内バッファ(StringIO)を使用してOpenCVイメージオブジェクトを作成するには、OpenCVAPIのimdecodeを使用できます。以下のコードを参照してください。

import cv2
import numpy as np
from urllib2 import urlopen
from cStringIO import StringIO

def create_opencv_image_from_stringio(img_stream, cv2_img_flag=0):
    img_stream.seek(0)
    img_array = np.asarray(bytearray(img_stream.read()), dtype=np.uint8)
    return cv2.imdecode(img_array, cv2_img_flag)

def create_opencv_image_from_url(url, cv2_img_flag=0):
    request = urlopen(url)
    img_array = np.asarray(bytearray(request.read()), dtype=np.uint8)
    return cv2.imdecode(img_array, cv2_img_flag)
36
evanchin

受け入れられた回答へのコメントで指摘されているように、それは時代遅れであり、もはや機能していません。

幸いなことに、私は最近この問題をOpenCV 4.0でPython 3.7を使用して解決する必要がありました。

URLまたはメモリ内バッファからの画像の読み込みを処理するために、次の2つの関数を定義しました。

import urllib.request
import cv2
import numpy as np

def get_opencv_img_from_buffer(buffer, flags):
    bytes_as_np_array = np.frombuffer(buffer.read(), dtype=np.uint8)
    return cv2.imdecode(bytes_as_np_array, flags)

def get_opencv_img_from_url(url, flags):
    req = urllib.request.Request(url)
    return get_opencv_img_from_buffer(urllib.request.urlopen(req), flags)

ご覧のとおり、一方は他方に依存しています。

最初のget_opencv_img_from_bufferは、メモリ内バッファから画像オブジェクトを取得するために使用できます。バッファにreadメソッドがあり、 バッファプロトコル を実装するオブジェクトのインスタンスを返すことを前提としています。

2番目のget_opencv_img_from_urlは、URLから直接画像を生成します。

Flags引数はcv2.imdecodeに渡されます。cv2.imdecodeには、cv2で事前定義された次の定数があります。

  • cv2.IMREAD_ANYCOLOR-設定されている場合、画像は可能な任意のカラー形式で読み取られます。
  • cv2.IMREAD_ANYDEPTH-設定されている場合、入力に対応する深さがある場合は16ビット/ 32ビットの画像を返します。それ以外の場合は、8ビットに変換します。
  • cv2.IMREAD_COLOR-設定されている場合、常に画像を3チャンネルBGRカラー画像に変換します。
  • cv2.IMREAD_GRAYSCALE-設定されている場合、常に画像を単一チャネルのグレースケール画像に変換します(コーデック内部変換)。
  • cv2.IMREAD_IGNORE_ORIENTATION-設定されている場合、EXIFの方向フラ​​グに従って画像を回転させません。
  • cv2.IMREAD_LOAD_GDAL-設定されている場合、gdalドライバーを使用してイメージをロードします。
  • cv2.IMREAD_REDUCED_COLOR_2-設定されている場合、常に画像を3チャンネルBGRカラー画像に変換し、画像サイズを1/2に縮小します。
  • cv2.IMREAD_REDUCED_COLOR_4-設定されている場合、画像を常に3チャネルBGRカラー画像に変換し、画像サイズを1/4に縮小します。
  • cv2.IMREAD_REDUCED_COLOR_8-設定されている場合、常に画像を3チャンネルBGRカラー画像に変換し、画像サイズを1/8に縮小します。
  • cv2.IMREAD_REDUCED_GRAYSCALE_2-設定されている場合、常に画像をシングルチャネルグレースケール画像に変換し、画像サイズを1/2に縮小します。
  • cv2.IMREAD_REDUCED_GRAYSCALE_4-設定されている場合、画像を常に単一チャネルのグレースケール画像に変換し、画像サイズを1/4に縮小します。
  • cv2.IMREAD_REDUCED_GRAYSCALE_8-設定されている場合、常に画像をシングルチャネルグレースケール画像に変換し、画像サイズを1/8に縮小します。
  • cv2.IMREAD_UNCHANGED-設定されている場合、ロードされた画像をそのまま返します(アルファチャネルを使用する場合、そうでない場合はトリミングされます)。
9
Pärt Johanson