无人驾驶 OpenCV(9)

作者: zidea | 来源:发表于2019-08-21 20:15 被阅读48次

我们通过一个没有景深的摄像机来获取视频资源,我们通过视频资源在 AE 或者视频编辑软件中可以反推测摄像机,以及在拍摄时候的摄像机的参数。通过影像资料来还原周围的环境。当然最后是双摄像头。

做个 3D 相关工作,例如将游戏中人物的进行 UV 拆分,所以对于 UV 坐标并不会感到陌生。在用 Vray 渲染效果图时候也接触过摄像机的基本原理。如图在真实世界中的 p 点会投射到视觉平面上 UV 的点。F 为照相机的点。

在图像测量过程以及机器视觉应用中,为确定空间物体表面某点的三维几何位置与其在图像中对应点之间的相互关系,必须建立相机成像的几何模型,这些几何模型参数就是相机参数。


其中R 为 3*3 的旋转矩阵,t 为3*1的平移矢量,(xc,yc,zc,1)T(xc,yc,zc,1)T为相机坐标系的齐次坐标,(xw,yw,zw,1)T(xw,yw,zw,1)T为世界坐标系的齐次坐标。

在大多数条件下这些参数必须通过实验与计算才能得到,这个求解参数的过程就称之为相机标定(或摄像机标定)。这里我们可以根据图像来获取摄像机

我们需要查找图像的特征值(features), 所谓特征值是可以描述一张图片,可能是边,拐角部分。

orb = cv2.ORB_create()
kp1, des1 = orb.detectAndCompute(img,None)
    for p in kp1:
        u,v = map(lambda x: int(round(x)),p.pt)
        print(u,v)
        cv2.circle(img,(u,v),3,(0,255,0),1)

使用 opencv 我们可以得到一些图片的特征也就是树的边缘的特征。不过这些特征值并不能很好表现也可以说是描述这张图我们需要进一步进行优化来找到能够正确反映这张图的特征。

class Extracrator(object):
    GX = 16 // 2
    GY = 12 // 2

    def __init__(self):
        self.orb = cv2.ORB_create(1000)
    def extract(self,img):
        sy = img.shape[0] // self.GY
        sx = img.shape[1] // self.GX

        for ry in range(0,img.shape[0],sy):
            for rx in range(0,img.shape[1],sx):
                img_chuck = img[ry:ry+sy,rx:rx+sx]
                kp = self.orb.detect(img_chuck,None)
                    print(p)

我们将图片进行切分成 16 x 12 个小格,然后对每一个小格进行特征点的侦测。

def extract(self,img):
        sy = img.shape[0] // self.GY
        sx = img.shape[1] // self.GX
        akp = []
        for ry in range(0,img.shape[0],sy):
            for rx in range(0,img.shape[1],sx):
                img_chuck = img[ry:ry+sy,rx:rx+sx]
                kp = self.orb.detect(img_chuck,None)
                for p in kp:
                    p.pt = (p.pt[0] + rx, p.pt[1] + ry)
                    akp.append(p)
p.pt = (p.pt[0] + rx, p.pt[1] + ry)

将位置补偿回去,以便可以在原图像(未分割前图像)上观察到检测的特征点。

def process_frame(img):
    
    img = cv2.resize(img,(W,H))
    kp = ex.extract(img)
    for p in kp:
        u, v = map(lambda x: int(round(x)),p.pt)
        cv2.circle(img,(u,v),color=(0,255,0),radius=3)
    
    display.paint(img)

虽然有所改善,不过我们效果不算好,跟踪点还是以一簇一簇的。

def extract(self,img):
        feats = cv2.goodFeaturesToTrack(np.mean(img,axis=2).astype(np.uint8),3000,qualityLevel=0.01,minDistance=3)
        print(feats)
        return feats
    kp = ex.extract(img)

    for p in kp:
        u, v = map(lambda x: int(round(x)),p[0])
        cv2.circle(img,(u,v),color=(0,255,0),radius=3)
    def extract(self,img):
        feats = cv2.goodFeaturesToTrack(np.mean(img,axis=2).astype(np.uint8),3000,qualityLevel=0.01,minDistance=3)
        kps = [cv2.KeyPoint(x=f[0][0],y=f[0][1],_size=20) for f in feats]
        des = self.orb.compute(img,kps)
        return kps,des
    kps, des = ex.extract(img)

    for p in kps:
        u, v = map(lambda x: int(round(x)),p.pt)
        cv2.circle(img,(u,v),color=(0,255,0),radius=3)

相关文章

  • 无人驾驶 OpenCV(9)

    我们通过一个没有景深的摄像机来获取视频资源,我们通过视频资源在 AE 或者视频编辑软件中可以反推测摄像机,以及在拍...

  • 无人驾驶 OpenCV(10)

    SLAM (simultaneous localization and mapping) 其实我们一直在搞得的就是...

  • 实战anaconda2/3同时安装opencv

    最近在学习无人驾驶汽车的课程,需要安装Anaconda3+opencv,因为平时Python2用的也比较多...

  • 无人驾驶 OpenCV (8) 真正开始无人驾驶

    初始化 sdl 程序。然后创建一个 sdl 窗口,设置标题为 hello zidea, 随后参数设置宽度和高度,p...

  • 无人驾驶 OpenCV (7) 车辆上道

    感谢 sentdex 分享《TensorFlow 基础》 今天开始学习如何通过深度学习来驾驶无人汽车在路上正常驾驶...

  • 无人驾驶 OpenCV (6) 仿真系统

    简单地了解一下无人驾驶技术,从技术层面上还是太初级了,其实我们没有硬件在整个无人驾驶中我们只关心可以应用深度学习的...

  • 无人驾驶 OpenCV (5) 识别行人

    其实一切都是从简单开始,当然无人驾驶需要人工智能对周围环境了如指掌。一切尽在掌握,需要尽可能将周围的所有物体都识别...

  • 无人驾驶 OpenCV (1) 识别车道线

    分享通过简单实例介绍无人驾驶是如何识别图像中有助于驾驶的车道线,比较基础主要目的让大家熟悉 opencv。 电动汽...

  • OpenCV3 -跨平台+相机处理

    什么是OpenCV http://baike.baidu.com/link?url=9No0mr9XSltLqwG...

  • mex调用opencv

    date: 2018-9-21最近在学习opencv3,突然想到matlab能不能用opencv,下面是笔记。 使...

网友评论

    本文标题:无人驾驶 OpenCV(9)

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