web-dev-qa-db-ja.com

python opencvの配列から生のpngを読み取る方法は?

IPhoneからMacBookにTCP経由でpng画像をストリーミングしています。 MacBookのコードは http://docs.python.org/library/socketserver.html#requesthandler-objects からのものです。 OpenCVで使用するために画像を変換するにはどうすればよいですか? pngは効率的であるため選択されましたが、他の形式を使用することもできます。

ファイルからrawImageを読み取るテストプログラムを作成しましたが、変換方法がわかりません。

# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()

# Not sure how to convert rawImage
npImage = np.array(rawImage)
matImage = cv2.imdecode(rawImage, 1)

#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0)
12
Andy Rosenblum

私はそれを考え出した:

# Read rawImage from a file, but in reality will have it from TCPServer
f = open('frame.png', "rb")
rawImage = f.read()
f.close()

# Convert rawImage to Mat
pilImage = Image.open(StringIO(rawImage));
npImage = np.array(pilImage)
matImage = cv.fromarray(npImage)

#show it
cv.NamedWindow('display')
cv.MoveWindow('display', 10, 10)
cv.ShowImage('display', matImage)
cv. WaitKey(0) 
2
Andy Rosenblum

別の方法、

with open(image_full_path, 'rb') as img_stream:
    file_bytes = numpy.asarray(bytearray(img_stream.read()), dtype=numpy.uint8)
    img_data_ndarray = cv2.imdecode(file_bytes, cv2.CV_LOAD_IMAGE_UNCHANGED)
    img_data_cvmat = cv.fromarray(img_data_ndarray) #  convert to old cvmat if needed
15
Noam Geffen

@Andy Rosenblumの作品であり、古いcv python API(vs。cv2)を使用する場合は最良の解決策かもしれません。

ただし、この質問は最新バージョンのユーザーにとっても同様に興味深いため、次の解決策をお勧めします。以下のサンプルコードは、受け入れられているソリューションよりも優れている可能性があります。

  1. 新しいOpenCVと互換性がありますpython API(cv2 vs. cv)。このソリューションはopencv3.0およびpython 3.0でテストされています。些細な変更だけで十分だと思います。 opencv2.xおよび/またはpython 2.7x)に必要です。
  2. 輸入が少ない。これはすべて、numpyとopencvを使用して直接実行でき、StringIOとPILは必要ありません。

これは、ファイルオブジェクトから直接、またはファイルオブジェクトから読み取られたバイトバッファからデコードされたopencvイメージを作成する方法です。

import cv2
import numpy as np

#read the data from the file
with open(somefile, 'rb') as infile:
     buf = infile.read()

#use numpy to construct an array from the bytes
x = np.fromstring(buf, dtype='uint8')

#decode the array into an image
img = cv2.imdecode(x, cv2.IMREAD_UNCHANGED)

#show it
cv2.imshow("some window", img)
cv2.waitKey(0)

Opencv 3.0では、さまざまな定数/フラグの命名規則が変更されたため、opencv 2.xを使用する場合は、フラグcv2.IMREAD_UNCHANGEDを​​変更する必要があることに注意してください。このコードサンプルは、標準の8ビットイメージをロードしていることも前提としていますが、そうでない場合は、np.fromstringのdtype = '...'フラグで遊ぶことができます。

12
svohara

これは私のために働きます(最近):

import cv2
import numpy as np

data = open('016e263c726a.raw').read()
x = np.frombuffer(data, dtype='uint8').reshape(2048,2448)
cv2.imshow('x',x); cv2.waitKey(); cv2.destroyAllWindows()

ただし、特定の形式なしで保存された[〜#〜] raw [〜#〜]画像を読み取ります。

0
jno

(あなたの質問はobjective-cとタグ付けされているようですが、Pythonであり、あなたの例もそうなので、それを使用します。)Stack Overflowに関する私の最初の投稿!

Cv.LoadImageMメソッドはあなたが探しているもののようです。

http://opencv.willowgarage.com/documentation/python/reading_and_writing_images_and_video.html

使用例: http://opencv.willowgarage.com/wiki/PythonInterface/

LoadImage(ファイル名、iscolor = CV_LOAD_IMAGE_COLOR)→なし

Loads an image from a file as an IplImage.
Parameters:   

    filename (str) – Name of file to be loaded.
    iscolor (int) –

    Specific color type of the loaded image:
        CV_LOAD_IMAGE_COLOR the loaded image is forced to be a 3-channel color image
        CV_LOAD_IMAGE_GRAYSCALE the loaded image is forced to be grayscale
        CV_LOAD_IMAGE_UNCHANGED the loaded image will be loaded as is.

関数cvLoadImageは、指定されたファイルから画像をロードし、ロードされた画像へのポインタを返します。現在、次のファイル形式がサポートされています。

Windows bitmaps - BMP, DIB
JPEG files - JPEG, JPG, JPE
Portable Network Graphics - PNG
Portable image format - PBM, PGM, PPM
Sun rasters - SR, RAS
TIFF files - TIFF, TIF

現在の実装では、アルファチャネルがある場合は、出力画像から削除されることに注意してください。 4チャンネルRGBA画像はRGBとしてロードされます。

0
genetix