美文网首页深度学习
2020 无人驾驶特斯拉视觉(1)

2020 无人驾驶特斯拉视觉(1)

作者: zidea | 来源:发表于2020-09-04 20:18 被阅读0次
    tesla_001.jpg

    看到了特斯拉通过视觉感知周围

    • 激光雷达
    • 超声波
    • 视觉感知器

    开始编写程序,作为程序员有时候我们更相信 code,看见 code 我们才踏实。我们现在手头有一段行车录像,记录车在道路上行驶,路况很简单就看见一辆从对面行驶过来车辆。那么我们相同视频绘制出 slam 的点云来还原真实场景。

    要做这一切,摆在我们面前首要任务将视频读取,显示出来。操作图片和视频我还是喜欢用 opencv ,显示视频或图片可以用 opencv、pygame 或者是 sdl2 这里根据自己熟悉情况,学习时候作者用的是 sdl2,跟着 coding 也就用了,随后我们可以做一版的 pygame 的。

    if __name__ == "__main__":
        cap = cv2.VideoCapture("test.mp4")
    
        while cap.isOpened():
            ret, frame = cap.read()
            # frame = cv2.resize(frame,(W,H),cv2.INTER_AREA)
            if ret == True:
                process_frame(frame)
            else:
                break
    

    读取视频这部分代码我就一带而过了,没有什么好说,我默认您是对 opencv 库有所了解的。如果连着代码读起来有些吃力,那还是先去补一补基础知识吧。

    class Display(object):
        def __init__(self,W, H):
            super().__init__()
            sdl2.ext.init()
    
            self.W = W
            self.H = H
    
            self.window = sdl2.ext.Window("The Slam Video",size=(W,H),position=(100,100))
            self.window.show()
    
    
        def paint(self,img):
            events = sdl2.ext.get_events()
            for event in events:
                if event.type == sdl2.SDL_QUIT:
                    exit(0)
    
            surf = sdl2.ext.pixels3d(self.window.get_surface())
            surf[:,:,0:3] = img.swapaxes(0,1)
            self.window.refresh()
    

    有关 sdl2 库这里还是有必要说一说,我们要将图像显示出来需要做两件事,有一个画布也就是一个窗口,然后将image 绘制到画布上。
    首先初始化一个sdl2.ext对象

    sdl2.ext.init()
    

    然后定义窗口,为窗口指定名称,指定窗口大小以及窗口在屏幕上位置,通过指定窗口左上角距离屏幕左上角的距离来指定位置。

    self.window = sdl2.ext.Window("The Slam Video",size=(W,H),position=(100,100))
    self.window.show()
    

    sdl2.ext通过监听事件,当感兴趣的事件发生时候给出对应处理,这部分代码应该不难理解。在退出程序时候进行一系列处理。

    events = sdl2.ext.get_events()
    for event in events:
        if event.type == sdl2.SDL_QUIT:
            exit(0)
    

    然后就是将我们图像绘制到画布上的工作了

    surf = sdl2.ext.pixels3d(self.window.get_surface())
    surf[:,:,0:3] = img.swapaxes(0,1)
    

    在 sdl2 中我们获取窗口的画布(surface),然后将图片放到画布上,刷新窗口就完成显示视频工作,这里如果使用pixels2d就是绘制单通道图片。

    pygame.png
    import cv2
    import time,sys
    
    import pygame
    from pygame.locals import *
    
    
    if __name__ == "__main__":
        cap = cv2.VideoCapture("test.mp4")
        FPS = int(round(cap.get(cv2.CAP_PROP_FPS)))
        FramePerSec = pygame.time.Clock()
    
        Width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
        Height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
        scale_ratio = 2
    
        pygame.init()
        pygame.display.set_caption('OpenCV Video')
        screen =  pygame.display.set_mode((Width//scale_ratio,Height//scale_ratio),0,32)
    
        screen.fill([0,0,0])
        num = 0
    
        while cap.isOpened():
            ret, frame = cap.read()
            if num == 0:
                T0 = time.time()
            if time.time()-T0 > num*(1./FPS):
                ret, frame = cap.read()
    
                frame = cv2.resize(frame,(Width//2,Height//2),interpolation = cv2.INTER_AREA)
                TimeStamp = cap.get(cv2.CAP_PROP_POS_MSEC)
                if ret == False:
                    print('Total Time:', time.time()-T0)
                    pygame.quit()
                    sys.exit()
    
                frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
                frame = cv2.transpose(frame)
                frame = pygame.surfarray.make_surface(frame)
                screen.blit(frame, (0,0))
                
                pygame.display.update()
                
                num += 1
            for event in pygame.event.get():
                if event.type == QUIT:
                    sys.exit()
    
    

    相关文章

      网友评论

        本文标题:2020 无人驾驶特斯拉视觉(1)

        本文链接:https://www.haomeiwen.com/subject/fpstektx.html