【发布时间】: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_pts和new_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]]
把他们喂到这个: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