【问题标题】:generating a multidimensional numpy array such that a[x,y] = [x,y] (calculating essential matrix from dense optical flow)生成一个多维 numpy 数组,使得 a[x,y] = [x,y] (从密集光流计算基本矩阵)
【发布时间】:2021-02-13 18:01:58
【问题描述】:

我需要获取通过此计算得到的密集光流的输出flow (shape (cols,rows,2)):

flow = cv2.calcOpticalFlowFarneback(im0, im1, None, 0.5, 3, 15, 3, 5, 1.2, 0)

并生成2个点old_ptsnew_pts的一维列表,这样:

  • old_pts 是像素坐标列表[[y,x],...]
  • new_pts 是校正后的像素坐标列表:[[y+flow[y,x][1],x+flow[y,x][0]],...]

这两个列表以相同的方式排序至关重要,这样 old_pts[i] 与 new_pts[i] 引用相同的像素
即 old_pts1 = [0,1] => new_pts1 = [0+flow0,1,1+flow[0,1][0]]

opencv docs reference

把他们喂到这个:
E,_ = cv2.findEssentialMat(old_pts,new_pts,ch.K)

我有以下可行的解决方案(但它非常慢 [~15" 在 4k 图像上]):

    old_pts = []
    new_pts = []
    for y in range(cols):
        for x in range(rows):
            old_pts.append([y,x])
            new_pts.append([y+flow[y,x][1],x+flow[y,x][0]])
    
    old_pts = np.array(old_pts)
    new_pts = np.array(new_pts)

有没有更好的(numpythonic)方法来生成两个点列表?

我认为应该做的是:

  • 生成和填充图像形状的数组“a”,使得 a[x,y] = [x,y]
  • 翻转流轴2
  • 向翻转的流程添加一个
  • 重塑和转置 a 和结果以生成两个点列表

我需要的示例:

this is `flow` (in real life is 3000x4000):  
| y,x |         0        |       1        |        2       |
|-----|------------------|----------------|----------------|
|   0 | [[[-0.81,-0.55], | [0.73,0.83],   | [-0.3,-0.86]], |
|   1 | [[-0.33,-0.71],  | [0.86,-0.27],  | [0.11,-0.03]], |
|   2 | [[0.46,-0.51],   | [-0.35,-0.88], | [0.4,-0.7]]]   |

this is what i need:  
| old_pts |        new_pts      |
|---------|---------------------|
| [[0,0], | [[0+-0.55,0+-0.81], |
| [1,0],  | [1+-0.71,0+-0.33],  |
| [2,0],  | [2+-0.51,0+0.46],   |
| [0,1],  | [0+0.83,1+0.73],    |
| [1,1],  | [1+-0.27,1+0.86],   |
| [2,1],  | [2+-0.88,1+-0.35],  |
| [0,2],  | [0+-0.86,2+-0.3],   |
| [1,2],  | [1+-0.03,2+0.11],   |
| [2,2]]  | [2+-0.7,2+0.4]]     |

【问题讨论】:

  • 对我来说有点难以理解,为什么不将流作为新轴添加到转换为数组的图像中,然后从数组本身获取所需的两个列表?
  • 添加了一个例子。 (对不起使用“代码标签”它不会让我添加表格出于某些原因)
  • 你确定你的流量输出吗?? stackoverflow.com/questions/38131822/…
  • 好的,它无法读取您的表格
  • 试图理解 ho cv2calcOpticalFlowFarneback 工作不幸的是,我不再禁止 stackoverflow,你如何应对 [[y+flow[y,x][1],x+flow[y, x][0]],...] 给出我们正在谈论的 int 像素坐标和流向量返回浮动?

标签: python numpy opencv opticalflow


【解决方案1】:

找到了一个更快的解决方案:

    xes = np.tile(np.arange(im0.shape[1]),(im0.shape[0],1))
    yes = np.tile(np.arange(im0.shape[0])[:,None],(1,im0.shape[1]))

    nxes = xes + flow[:,:,0]
    nyes = yes + flow[:,:,1]

    xy  = np.stack((yes,xes),axis = 2)
    nxy = np.stack((nyes,nxes),axis = 2)

    old_pts = np.reshape(xy,(-1, xy.shape[-1]))
    new_pts = np.reshape(nxy,(-1, nxy.shape[-1]))

【讨论】:

  • 所以你基本上是对数组求和,而不是对数组元素进行迭代并对每个元素进行求和。 4K 图像的速度有多快?
  • 尚未正确测量,但现在肯定小于 1"(因此至少快 15 倍)
猜你喜欢
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2013-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多