2013-08-25 2 views
1

Я использую новый пакет PySDL2, пытаясь связать его с моим существующим кодом OpenCV. Я хочу взять изображение, захваченное с веб-камеры через интерфейс pvt cv2, в OpenCV и использовать PySDL2, чтобы показать его в окне на экране. Я думаю, что я понял, как правильно преобразовать формат изображения cv2 в поверхность PySDL2, но в конце кода ниже все, что я получаю, является черным окном. Любые указатели на то, где я пошатнулся, были бы очень благодарны!Преобразование изображений cv2 в поверхности PySDL2 для blitting на экран

#grab a frame from a webcam 
import cv2 
vc = cv2.VideoCapture(0) 
junk,image = vc.read() 

#convert image to sdl format (?) 
import sdl2 
sbuf = image.tostring() 
simage = sdl2.SDL_CreateRGBSurfaceFrom(sbuf,image.shape[0],image.shape[1],24,3*image.shape[0],sdl2.SDL_PIXELFORMAT_BGRA8888,0xff0000, 0x00ff00, 0x0000ff, 0) 

#create a window 
sdl2.SDL_Init(sdl2.SDL_INIT_VIDEO) 
windowSize = (640,480) 
window = sdl2.SDL_CreateWindow(b"Hello World",sdl2.SDL_WINDOWPOS_CENTERED, sdl2.SDL_WINDOWPOS_CENTERED,windowSize[0], windowSize[1], sdl2.SDL_WINDOW_SHOWN) 
windowSurface = sdl2.SDL_GetWindowSurface(window) 

#try to blit the sdl-formatted image to the window 
sdl2.SDL_BlitSurface(simage,None,windowSurface,None) 
sdl2.SDL_UpdateWindowSurface(window) 
sdl2.SDL_FreeSurface(simage) 

# pump events to get the window to show and update 
while True: 
    sdl2.SDL_PumpEvents() 

ответ

2

Решено!

#import necessary modules 
import cv2 
import sdl2 
import sdl2.ext 
import numpy 

windowSize = (640,480) 

#initialize the camera 
vc = cv2.VideoCapture(0) 
vc.set(cv2.cv.CV_CAP_PROP_FRAME_WIDTH, windowSize[0]) 
vc.set(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT, windowSize[1]) 

#grab and show a first frame from the camera 
junk,image = vc.read() 
cv2.imshow('0',image) 

#initialize sdl2 
sdl2.ext.init() 
window = sdl2.ext.Window("test", size=windowSize) 
window.show() 
windowSurf = sdl2.SDL_GetWindowSurface(window.window) 
windowArray = sdl2.ext.pixels3d(windowSurf.contents) 

while True: #keep reading to have a live feed from the cam 
    junk,image = vc.read() 
    image = numpy.insert(image,3,255,axis=2) #add alpha 
    image = numpy.rot90(image) #rotate dims 
    numpy.copyto(windowArray, image) 
    window.refresh() 

Я не уверен, почему, показывающий первый кадр из камеры с помощью cv2.imshow необходимо, но без той части, никогда не появляется окно sdl2.

Смежные вопросы