深度学习

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

2020-09-04  本文已影响0人  zidea
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()

上一篇下一篇

猜你喜欢

热点阅读