图像处理实战-光流估计

光流是空间运动物体在观测成像平面上的像素运动的“瞬时速度”,根据各个像素点的速度矢量特征,可以对图像进行动态分析,例如目标跟踪。

**完整代码:https://github.com/YvanYan/image_processing/tree/master/ofe
**

流程:
1.读取视频
2.设置角点检测参数和lucas kanade参数
3.逐帧对图像进行灰度处理、检测
4.绘制行动轨迹


import cv2
import numpy as np

cap = cv2.VideoCapture('test.avi')
# 角点检测参数
feature_params = dict(maxCorners=100, qualityLevel=0.3, minDistance=7)

# lucas kanade参数
lk_params = dict(winSize=(15, 15), maxLevel=2)

color = np.random.randint(0, 255, (100, 3))

ret, first_frame = cap.read()
first_gray = cv2.cvtColor(first_frame, cv2.COLOR_BGR2GRAY)

p0 = cv2.goodFeaturesToTrack(first_gray, mask=None, **feature_params)

mask = np.zeros_like(first_frame)

while (True):
    ret, cur_frame = cap.read()
    cur_frame_gray = cv2.cvtColor(cur_frame, cv2.COLOR_BGR2GRAY)

    p1, st, err = cv2.calcOpticalFlowPyrLK(first_gray, cur_frame_gray, p0, None, **lk_params)

    good_cur = p1[st == 1]
    good_first = p0[st == 1]

    for i, (new, old) in enumerate(zip(good_cur, good_first)):
        a, b = new.ravel()
        c, d = old.ravel()
        mask = cv2.line(mask, (a, b), (c, d), color[i].tolist(), 2)
        frame = cv2.circle(cur_frame, (a, b), 5, color[i].tolist(), -1)
    img = cv2.add(cur_frame, mask)

    cv2.imshow('frame', img)
    k = cv2.waitKey(150) & 0xff
    if k == 27:
        break

    # 更新
    first_gray = cur_frame_gray.copy()
    # p0 = good_cur.reshape(-1,1,2)
    p2 = cv2.goodFeaturesToTrack(first_gray, mask=None, **feature_params)
    if abs(len(p2) - len(p0)) >= 5:
        p0 = p2
    else:
        p0 = p1

cv2.destroyAllWindows()
cap.release()
  • goodFeaturesToTrack(image, corners, maxCorners, qualityLevel, minDistance, mask, blockSize, useHarrisDetector, k)
    image是输入图像。
    corners是检测到的所有角点。maxCorners表示检测的点数的最大值。
    qualityLevel表示检测到的角点的质量水平(通常是0.0.-0.1之间,不能大于1.0)。
    minDistance表示两个相邻角点的最小距离,小于这个距离的将进行合并。
    mask在指定的mask为0的地方不进行检测。
    blockSize计算角点时参与计算的区域大小,常用值为3。
    useHarrisDetector指定角点检测的方法,如果是true则使用Harris角点检测,false则使用Shi Tomasi算法。
    k在使用Harris算法时使用,最好使用默认值0.04。

  • calcOpticalFlowPyrLK(prevImage, nextImage, prevPts, winSize, maxLevel)
    prevImage前一帧图像。
    nextImage当前帧图像。
    prevPts待跟踪的特征点向量。
    winSize搜索窗口的大小。
    maxLevel最大的金字塔层数。
    返回值:nextPts 输出跟踪特征点向量。status表示特征点是否找到,找到的状态为1,未找到的状态为0。err为错误信息。

由于原代码中,只能检测第一帧画面画面中的人物轨迹,因此我将角点更新那里进行了简单的修改。


result.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343