Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将cv2图像转换为PySDL2曲面,以便在屏幕上显示_Python_Opencv_Sdl_Pysdl2 - Fatal编程技术网

Python 将cv2图像转换为PySDL2曲面,以便在屏幕上显示

Python 将cv2图像转换为PySDL2曲面,以便在屏幕上显示,python,opencv,sdl,pysdl2,Python,Opencv,Sdl,Pysdl2,我正在使用新的PySDL2包,试图将其与现有的OpenCV代码进行接口。我想通过cv2 python接口将从网络摄像头捕获的图像拍摄到OpenCV,并使用PySDL2在屏幕上的窗口中显示它。我想我知道了如何将cv2图像格式正确地转换为PySDL2曲面,但在下面的代码末尾,我得到的只是一个黑色窗口。任何关于我哪里出错的指点都将不胜感激 #grab a frame from a webcam import cv2 vc = cv2.VideoCapture(0) junk,image = vc.re

我正在使用新的PySDL2包,试图将其与现有的OpenCV代码进行接口。我想通过cv2 python接口将从网络摄像头捕获的图像拍摄到OpenCV,并使用PySDL2在屏幕上的窗口中显示它。我想我知道了如何将cv2图像格式正确地转换为PySDL2曲面,但在下面的代码末尾,我得到的只是一个黑色窗口。任何关于我哪里出错的指点都将不胜感激

#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()
解决了

#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窗口就不会出现。

解决了这个问题

#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窗口就不会出现。

我没有足够的声誉来添加评论,尽管这已经很久了, 希望这能帮助一些人

可以为窗口创建添加标志


window=sdl2.ext.window(“test”,size=windowSize,flag=sdl2.SDL\u window\u显示)

我没有足够的声誉来添加评论,尽管这是很久以前的事了, 希望这能帮助一些人

可以为窗口创建添加标志


window=sdl2.ext.window(“test”,size=windowSize,flag=sdl2.SDL\u显示的窗口)

这一行可能会帮助您:

windowArray[:,:,0:3]=img.swapax(0,1)



这一行可以帮助您:

windowArray[:,:,0:3]=img.swapax(0,1)



您忘记每帧轮询事件,导致窗口无法显示
对于sdl2.ext.get_events()中的事件:如果event.type==sdl2.SDL_QUIT:exit()
您忘记了每帧轮询事件,导致窗口无法显示<代码>用于sdl2.ext.get_events()中的事件:如果event.type==sdl2.SDL_退出:退出()