Python Bokeh: получить изображение с веб-камеры и показать его в приборной панели - PullRequest
0 голосов
/ 20 сентября 2018

Я хочу отобразить изображение - например, с помощью веб-камеры - в боке.Я пробовал image_url и image_rgba, но оба не работают.Image_url ничего не показывает, image_rgb показывает что-то, но, кажется, есть некоторый сдвиг индекса.

    # -*- coding: utf-8 -*-

from bokeh.plotting import figure, show
import scipy.misc
import cv2
import matplotlib.pyplot as plt
import os

# capture video frame from webcam
#vc = cv2.VideoCapture(1)
vc = cv2.VideoCapture(-0)
rval, frame = vc.read()
vc.release()

# show captured image (figure 1)
fig = plt.figure()
ax = plt.Axes(fig,[0,0,1,1])
ax.set_axis_off()
fig.add_axes(ax)
ax.imshow(frame)
plt.show()

# save captured image
scipy.misc.imsave('outfile.jpg', frame)
mypath = os.path.join(os.getcwd(),'outfile.jpg')

# 1. try using image_url ... not working (figure 2)
p = figure()
p.image_url(url=[mypath],x=[0],y=[1],w=[10],h=[10])
show(p)

# 2. try using image_rgba ... also not working (figure 3)
p = figure(x_range=(0,10), y_range=(0,10))
p.image_rgba(image=[frame], x=0, y=0, dw=10, dh=10)
show(p)

# 3. solution provided by @bigreddot ... flipped but also not working (figure4)
img = scipy.misc.imread(mypath)[::-1] # flip y-direction for Bokeh
p = figure(x_range=(0,10), y_range=(0,10))
p.image_rgba(image=[img], x=0, y=0, dw=10, dh=10)
show(p)

обновление: согласно комментарию @bigreddot

цифра 1

figure 1

рисунок 2 figure 2

рисунок 3 figure 3

рисунок 4 figure 4

версия боке, которую я использую, - 0.13, версия python 3.6.0

1 Ответ

0 голосов
/ 21 сентября 2018

После исследования возвращаемый результат из OpenCV представляет собой массив байтов Numpy с формой (M, N, 3) , то есть RGB кортежи .Боке ожидает, что массив Numpy имеет форму (M, N) 32-битные целые числа, представляющие значения RGBA.Так что вам нужно конвертировать из одного формата в другой.Вот полный пример:

from bokeh.plotting import figure, show
import scipy.misc
import cv2
import os
import numpy as np

#vc = cv2.VideoCapture(1)
vc = cv2.VideoCapture(-0)
rval, frame = vc.read()
vc.release()

M, N, _ = frame.shape
img = np.empty((M, N), dtype=np.uint32)
view = img.view(dtype=np.uint8).reshape((M, N, 4))
view[:,:,0] = frame[:,:,0] # copy red channel
view[:,:,1] = frame[:,:,1] # copy blue channel
view[:,:,2] = frame[:,:,2] # copy green channel
view[:,:,3] = 255

img = img[::-1] # flip for Bokeh

p = figure()
p.image_rgba(image=[img],x=0,y=0, dw=10, dh=10)
show(p)

Генерирует:

enter image description here

...