首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将cv2图像转换为PySDL2表面,以便快速显示在屏幕上

将cv2图像转换为PySDL2表面,以便快速显示在屏幕上
EN

Stack Overflow用户
提问于 2013-08-26 06:24:31
回答 3查看 2K关注 0票数 1

我正在使用新的PySDL2包,试图将其与我现有的OpenCV代码接口。我想通过OpenCV的cv2 python接口从网络摄像头捕获一张图像,并使用PySDL2将其显示在屏幕上的窗口中。我想我知道如何正确地将cv2图像格式转换为PySDL2表面,但在下面的代码末尾,我得到的只是一个黑色窗口。如果你能指出我的错误之处,我将不胜感激!

代码语言:javascript
运行
复制
#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()
EN

回答 3

Stack Overflow用户

发布于 2013-10-24 07:29:26

解决了!

代码语言:javascript
运行
复制
#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窗口就永远不会出现。

票数 3
EN

Stack Overflow用户

发布于 2019-08-21 23:33:56

下面这一行可能会对您有所帮助:

windowArray:,:,0:3 = img.swapaxes(0,1)

代码语言:javascript
运行
复制
#!python3
import cv2
import sdl2
import sdl2.ext

def process_frame(img):
    # --- initialize
    sdl2.ext.init()
    window = sdl2.ext.Window("sdl",size=('width','height'))
    window.show()
    events = sdl2.ext.get_events()
    for event in events:
        if event.type == sdl2.SDL_QUIT:
            exit(0)
    # --- initialize
    windowArray = sdl2.ext.pixels3d(window.get_surface()) 

    # --- convert cv2 frame to sdl windowArray
    windowArray[:,:,0:3] = img.swapaxes(0,1)


vc = cv2.VideoCapture(0)     
while vc.isOpened():
    ret,frame = cap.read()
    if ret == True:
        process_frame(frame)
    else:
        break
票数 2
EN

Stack Overflow用户

发布于 2018-08-23 16:31:47

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

您可以为窗口创建添加标志

window = sdl2.ext.Window("test", size=windowSize, flag=sdl2.SDL_WINDOW_SHOWN)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18434348

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档