大佬教程收集整理的这篇文章主要介绍了生成一个多维 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_pts
和new_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)方法来生成两点列表?
我认为应该做的是:
我需要的示例:
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,请注明来意。