11

を使用して動作するコードがあります

my_surface = pygame.image.load('some_image.png')

これは pygame サーフェスを返します。どこでも同じコードを使用したいのですが、代わりに numpy 配列を渡します。(実際には、配列または画像へのパスがあるかどうかを判断する if ステートメントを使用します。どちらの場合でも、関数は同じタイプのオブジェクト、pygame サーフェスを返す必要があります。上記を使用して既に動作しています。スクリプトが別の方法で使用されている場合、同じオブジェクトを生成する 2 つ目の方法を追加する必要があります)。

my_surface = pygame.pixelcopy.make_surface(my_array)

しかし問題は、この関数が INTEGER 配列を必要とすることです。私の配列は float32 です。そのように配列を渡すことで強制的に通過させることができます

(my_array*10000).astype(int)

しかし、後で表示すると、ゴミのように見えます (私の驚きを想像してみてください)。だから私の質問は、フロートのnumpy配列からpygameサーフェスをエレガントに作成するにはどうすればよいですか?

4

4 に答える 4

3

簡単にするために、値が [0,1] しかないとします。それ以外の場合は、値を固定範囲に切り捨てて、0,5 などの float 値で常に同じ色の出力が得られるようにすることをお勧めします。
入力例として単純な水平グラデーションを使用します。

W = 300
H = 200
# generate simple gradient in float
F0 = numpy.linspace(0, 1, num = W)
F = numpy.tile(F0, (H, 1))

現在、それを表示するにはいくつかの方法があります。この場合、おそらく8ビットサーフェスで表示します。この場合、Pygame 形式でカラー パレットを定義するためにこれが必要になります。

def make_palette (C1, C2):
    palR = numpy.linspace(C1[0], C2[0], num = 256, dtype = "uint8")
    palG = numpy.linspace(C1[1], C2[1], num = 256, dtype = "uint8")
    palB = numpy.linspace(C1[2], C2[2], num = 256, dtype = "uint8")
    return zip(palR,palG,palB)

そして、これはデータを配列から表面にコピーします:

def put_arr(Dest, Src):                 
    buf = Dest.get_buffer()
    buf.write(Src.tostring(), 0)

プログラムの最初に、配列と同じサイズのサーフェスを初期化し、パレットを適用します。

I_surf = pygame.Surface((W, H), 0, 8)           # Pygame surface 
C1 = (0,0,250)
C2 = (250,0,0)
palRGB = make_palette (C1, C2)
I_surf.set_palette(palRGB)

そして、メインループには次のようなものがあります:

I = numpy.rint( F*255 ).astype("uint8")
put_arr(I_surf, I)
...
DISPLAY.blit(I_surf, (100, 100))

配列と面のタイプに注意してください。この場合、どちらも 8 ビットでなければなりません。
すべてが機能する場合は、ウィンドウに次のように表示されます。

ここに画像の説明を入力

于 2016-12-23T01:36:09.700 に答える
0

OpenCV イメージ (Numpy ndarray) があるとします。pygame でロードするには、次のことを行う必要がありました。

# I suppose that the image source is a camera of something else, so we already have it as a numpy array.
# Convert the numpy image into a pygame.Surface
pygame_img = pygame.image.frombuffer(your_image.tostring(), your_image.shape[1::-1], "RGB")
your_screen.blit(pygame_img, (pos_x, pos_y))
于 2021-01-26T14:43:12.930 に答える