15

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)
4

6 に答える 6

20

@Andy Rosenblumの作品であり、古いcv python API(vs. cv2)を使用する場合は、これが最善の解決策になる可能性があります。

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

  1. 新しいOpenCVpythonAPI(cv2とcv)と互換性があります。このソリューションは、opencv3.0およびpython3.0でテストされています。opencv2.xやpython2.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='...'フラグで遊ぶことができます。

于 2015-12-26T21:09:40.643 に答える
16

別の方法、

また、実際のファイルを読み取る場合、これはユニコードパス(Windowsでテスト済み)で機能します

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
于 2013-07-09T11:50:46.710 に答える
2

私はそれを考え出した:

# 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) 
于 2012-07-22T15:17:56.440 に答える
1

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

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画像を読み取ります。

于 2019-11-01T09:51:34.850 に答える
0

(あなたの質問は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としてロードされます。

于 2012-07-19T06:20:18.050 に答える
-2

ファイルからロードする必要がある場合、この単純なソリューションは(でテストされたopencv-python-3.2.0.6)仕事をします:

import cv2

img = cv2.imread(somefile)
于 2017-02-12T21:18:44.523 に答える