Opencv 光流箭头
Posted
技术标签:
【中文标题】Opencv 光流箭头【英文标题】:Open cv Optical Flow Arrowed 【发布时间】:2021-06-16 14:56:43 【问题描述】:opencv 方面的高手来帮忙!! 我需要绘制箭头来可视化 lukas kanade 方法的光流,我为此使用了arrowedline,但箭头的方向不正确,它们看起来也不正确。
这是部分代码:
for i,(old,new) in enumerate(zip(p0,p1)):
a, b = ravel(old)
c, d = ravel(new)
#displacement
v_x = int((c - a)/dt)
v_y = int((b - d)/dt)
scale = 100
v_x = int((c-a)/dt*scale)
v_y = int((b-d)/dt*scale)
mask = cv2.arrowedLine(mask, (int(a),int(b)),(v_x,v_y), color[i].tolist(), 1)
image = cv2.rotate(mask, cv2.ROTATE_180)
这是输出:
我得到了这个:
但是在这种情况下我必须使用箭头线,请如果有专家可以帮助解决这个问题。 一段时间以来一直在尝试解决它,但还没有结果。
【问题讨论】:
【参考方案1】:cv2.arrowedLine 的参数是cv.arrowedLine(img, pt1, pt2, color)
而不是cv.arrowedLine(img, pt1, vx_vy, color)
。
pt1
- 箭头的起点。
pt2
- 箭头指向的点。
您可以将v_x
和v_y
添加到a
和b
:
mask = cv2.arrowedLine(mask, (int(a),int(b)), (int(a)+v_x, int(b)+v_y), (255, 255, 255), 1)
我不知道还有没有其他问题,因为你没有贴出p0
、p1
、dt
、scale
的值,我不知道格式运动矢量和点。
下一次,请发布一个可执行代码示例。
我创建了以下(可执行)代码示例用于测试:
import cv2
import numpy as np
mask = np.zeros((100, 100, 3), np.uint8)
p0 = [np.array([50, 50])]
p1 = [np.array([60, 60])]
dt = 100
for i, (old,new) in enumerate(zip(p0,p1)):
a, b = np.ravel(old)
c, d = np.ravel(new)
#displacement
v_x = int((c - a)/dt)
v_y = int((b - d)/dt)
scale = 100
v_x = int((c-a)/dt*scale)
v_y = int((b-d)/dt*scale)
mask = cv2.arrowedLine(mask, (int(a),int(b)), (int(a)+v_x, int(b)+v_y), (255, 255, 255), 1)
image = cv2.rotate(mask, cv2.ROTATE_180)
cv2.imshow('image', image)
cv2.waitKey()
cv2.destroyAllWindows()
【讨论】:
以上是关于Opencv 光流箭头的主要内容,如果未能解决你的问题,请参考以下文章