程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了生成一个多维 numpy 数组,使得 a[x,y] = [x,y](从密集光流计算基本矩阵)大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决生成一个多维 numpy 数组,使得 a[x,y] = [x,y](从密集光流计算基本矩阵)?

开发过程中遇到生成一个多维 numpy 数组,使得 a[x,y] = [x,y](从密集光流计算基本矩阵)的问题如何解决?下面主要结合日常开发的经验,给出你关于生成一个多维 numpy 数组,使得 a[x,y] = [x,y](从密集光流计算基本矩阵)的解决方法建议,希望对你解决生成一个多维 numpy 数组,使得 a[x,y] = [x,y](从密集光流计算基本矩阵)有所启发或帮助;

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

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

并生成点old_ptsnew_pts的2个一维列表,使得:

  • 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)

我有以下可行的解决方案(但速度非常慢 [4k 图像上大约 15 英寸]):

    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][0]])
    
    old_pts = np.array(old_pts)
    new_pts = np.array(new_pts)

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

我认为应该做的是:

  • 生成并填充图像形状的数组“a”,使得 a[x,y] = [x,y]
  • 翻转流轴 2
  • 将 a 添加到翻转流
  • 对 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,| [1+-0.71,0+-0.33],|
| [2,| [2+-0.51,0+0.46],|
| [0,1],| [0+0.83,1+0.73],| [1+-0.27,1+0.86],| [2+-0.88,1+-0.35],2],| [0+-0.86,2+-0.3],| [1+-0.03,2+0.11],2]]  | [2+-0.7,2+0.4]]     |

解决方法

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

    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,nxy.shape[-1]))

大佬总结

以上是大佬教程为你收集整理的生成一个多维 numpy 数组,使得 a[x,y] = [x,y](从密集光流计算基本矩阵)全部内容,希望文章能够帮你解决生成一个多维 numpy 数组,使得 a[x,y] = [x,y](从密集光流计算基本矩阵)所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。