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)
私はそれを考え出した:
# 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)
別の方法、
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
@Andy Rosenblumの作品であり、古いcv python API(vs。cv2)を使用する場合は最良の解決策かもしれません。
ただし、この質問は最新バージョンのユーザーにとっても同様に興味深いため、次の解決策をお勧めします。以下のサンプルコードは、受け入れられているソリューションよりも優れている可能性があります。
これは、ファイルオブジェクトから直接、またはファイルオブジェクトから読み取られたバイトバッファからデコードされた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 = '...'フラグで遊ぶことができます。
これは私のために働きます(最近):
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 [〜#〜]画像を読み取ります。
(あなたの質問は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としてロードされます。