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_xv_y 添加到ab

mask = cv2.arrowedLine(mask, (int(a),int(b)), (int(a)+v_x, int(b)+v_y), (255, 255, 255), 1)

我不知道还有没有其他问题,因为你没有贴出p0p1dtscale的值,我不知道格式运动矢量和点。

下一次,请发布一个可执行代码示例。


我创建了以下(可执行)代码示例用于测试:

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 光流箭头的主要内容,如果未能解决你的问题,请参考以下文章

运动目标检测——光流法与opencv代码实现

OpenCV 密集光流矩阵

OpenCV 中的光流颜色图

OpenCV 接触光流的时间

OpenCV中的光流及视频特征点追踪

opencv光流法