neozhaoliang / surround-view-system-introduction

A full Python implementation for real car surround view system
MIT License
911 stars 316 forks source link

通过 lookup table 和权重矩阵直接获得鸟瞰图的思路可以再详细讲一下吗? #6

Closed hongranfu closed 4 years ago

neozhaoliang commented 4 years ago

抱歉刚注意到这个 issue。马上这个项目会有一个大的更新,到时候会放出新的代码和文档,其中会实现 lookup table 和权重矩阵的直接融合方法。

hongranfu commented 4 years ago

牛,期待更新!!

winterhorse commented 4 years ago

期待早点更新!!

neozhaoliang commented 4 years ago

在写,在写,基本功能都有了,正在琢磨怎么让它运行快一点。

winterhorse notifications@github.com 于2020年7月14日周二 下午2:32写道:

期待早点更新!!

— You are receiving this because you commented. Reply to this email directly, view it on GitHub https://github.com/neozhaoliang/surround-view-system-introduction/issues/6#issuecomment-657996708, or unsubscribe https://github.com/notifications/unsubscribe-auth/AFR2HJUGUYN7WVE66BMI2FTR3P3WJANCNFSM4NOR5PQQ .

winterhorse commented 4 years ago

lookup table 和权重矩阵的直接融合是在哪里实现的呢?

neozhaoliang commented 4 years ago

这个项目里面没有实现 lookup table,主要是考虑用 lookup table 的话涉及 for 循环,而 python 里面 for 循环效率很低。仍然采用的是校正、投影、翻转三步。

winterhorse commented 4 years ago

有实现lookup table 和权重矩阵的直接融合参考实例?

neozhaoliang commented 4 years ago

和权重矩阵的直接融合什么意思

hongranfu commented 4 years ago

大概这样的

先计算两个映射矩阵,第一个M,第二个M1(这里M1=M),

用M计算第一个用于remap的imgx,imgy

在imgx imgy 的基础上,结合M1计算remap 的imgx1,imgy1

则用imgx1,imgy1对原图进行remap的效果 = warpPerspective(warpPerspective(原图,M),M1) 的效果

测试代码写的比较乱。。。插值效果也不太好图像会有锯齿。。。

ImageTransformer 见 https://github.com/eborboihuc/rotate_3d ,略有改动 ` import time import cv2 import numpy as np from image_transformer import ImageTransformer

def inter_linear(points,values): xm,ym=points[0],points[1] x1,x2,y1,y2=int(xm),int(xm)+1,int(ym),int(ym)+1

v11,v12,v21,v22=values[0],values[1],values[2],values[3]

vn2 = (v22 - v12) * (xm - x1) + v12
vn1 = (v21 - v11) * (xm - x1) + v11
vm = (vn2 - vn1) * (ym - y1) + vn1
return vm

src = cv2.imread("0.jpg") rows, cols, channels = src.shape

先计算两个映射矩阵,第一个M,第二个M1(这里M1=M),

用M计算第一个用于remap的imgx,imgy

在imgx imgy 的基础上,结合M1计算remap 的imgx1,imgy1

则用imgx1,imgy1对原图进行remap的效果 = warpPerspective(warpPerspective(原图,M),M1) 的效果

it = ImageTransformer(src) M=it.rotate_along_axis(0,0,10,10,0,1) M1=M img_x = np.zeros((rows, cols), np.float32) img_y = np.zeros((rows, cols), np.float32)

坐标映射

for y in range(rows): for x in range(cols): img_y[y, x] = (M[0][0]y+M[0][1]x+M[0][2])/(M[2][0]y+M[2][1]x+M[2][2]) img_x[y, x] = (M[1][0]y+M[1][1]x+M[1][2])/(M[2][0]y+M[2][1]x+M[2][2])

img_x1 = np.zeros((rows, cols), np.float32) img_y1 = np.zeros((rows, cols), np.float32)

坐标映射

for y in range(rows): for x in range(cols): Ym = (M1[0][0] y + M1[0][1] x + M1[0][2]) / (M1[2][0] y + M1[2][1] x + M1[2][2]) Xm = (M1[1][0] y + M1[1][1] x + M1[1][2]) / (M1[2][0] y + M1[2][1] x + M1[2][2])

    X1, X2, Y1, Y2 = int(Xm) , int(Xm)+1,int(Ym),int(Ym)+1
    if(Xm>0 and Ym>0 and Xm<1999 and Ym<1999):
        V_X22, V_X21, V_X12, V_X11 = img_x[Y2, X2], img_x[Y2, X1], img_x[Y1, X2], img_x[Y1, X1]
        V_Y22, V_Y21, V_Y12, V_Y11 = img_y[Y2, X2], img_y[Y2, X1], img_y[Y1, X2], img_y[Y1, X1]
       ####类似插值
        V_XN1 = (V_X22 - V_X12) * (Xm - X1) + V_X12
        V_XN2 = (V_X21 - V_X11) * (Xm - X1) + V_X11
        V_XM = (V_XN2 - V_XN1) * (Ym - Y1) + V_XN1
        V_YN1 = (V_Y22 - V_Y12) * (Ym - Y1) + V_Y12
        V_YN2 = (V_Y21 - V_Y11) * (Ym - Y1) + V_Y11
        V_YM = (V_YN2 - V_YN1) * (Xm - X1) + V_YN1
        img_y1[y,x]=V_YM
        img_x1[y,x]=V_XM

start=time.time() for i in range(10): dst = cv2.warpPerspective(src.copy(),M, (2000,2000)) dst = cv2.warpPerspective(dst, M, (2000, 2000)) end=time.time() print(end-start)

start=time.time() for i in range(10): dst1 = cv2.remap(src.copy(), img_x1, img_y1, cv2.INTER_LINEAR) end=time.time() print(end-start) cv2.imwrite("warp.jpg",dst) cv2.imwrite("remap1.jpg",dst1)

cv2.imshow('dst', dst) cv2.imshow('dst1', dst1)

cv2.waitKey() cv2.destroyAllWindows() `

winterhorse commented 4 years ago

大概的意思是合并两个map(去畸变和俯视变换),但是合并后丢掉了插值信息,所以有锯齿?

neozhaoliang commented 4 years ago
  1. 我知道怎样制作 lut ,但是不明白和权重矩阵融合是什么意思。在我看来它们是分开的两个表。
  2. 制作 LUT 肯定是扔掉了插值信息的,所以有锯齿,所以需要再做一次缩放。
  3. 在 Python 里面要根据 LUT 遍历查找像素值的话,用纯 Python 写效率达不到,numpy 有什么这样的函数我还没发现。
hongranfu commented 4 years ago

嗯,谢谢提醒,试一下缩放操作能不能改善锯齿

fangchengji commented 2 years ago
  1. 我知道怎样制作 lut ,但是不明白和权重矩阵融合是什么意思。在我看来它们是分开的两个表。
  2. 制作 LUT 肯定是扔掉了插值信息的,所以有锯齿,所以需要再做一次缩放。
  3. 在 Python 里面要根据 LUT 遍历查找像素值的话,用纯 Python 写效率达不到,numpy 有什么这样的函数我还没发现。

可以用numba试试