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
就是绘制单通道图片。
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()