• 12 KLT算法


    1 去除多余模块的

    #-*- coding:utf-8 -*-
    
    '''
    Lucas-Kanade tracker
    ====================
    
    Lucas-Kanade sparse optical flow demo. Uses goodFeaturesToTrack
    for track initialization and back-tracking for match verification
    between frames.
    
    Lucas Kanade稀疏光流Demo。使用goodfeaturestotrack
    用于轨迹初始化和跟踪跟踪的匹配验证
    帧间。
    
    Usage
    -----
    lk_track.py [<video_source>]
    
    
    Keys
    ----
    ESC - exit
    '''
    
    # Python 2/3 compatibility
    
    
    import numpy as np
    import cv2
    
    
    lk_params = dict( winSize  = (15, 15),
                      maxLevel = 3,
                      criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
    
    feature_params = dict( maxCorners = 800,
                           qualityLevel = 0.3,
                           minDistance = 7,
                           blockSize = 7 )
    
    
    class App:
        def __init__(self, video_src):
            self.track_len = 10          #跟踪轨迹长度10
            self.detect_interval = 5
            self.tracks = []             #储存跟踪点
            self.cam = cv2.VideoCapture(video_src)
            self.frame_idx = 0
    
        def run(self):
            while True:
                ret, frame = self.cam.read()
                frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
                vis = frame.copy()
    
                if len(self.tracks) > 0:
                    img0, img1 = self.prev_gray, frame_gray
                    p0 = np.float32([tr[-1] for tr in self.tracks]).reshape(-1, 1, 2)
                    p1, st, err = cv2.calcOpticalFlowPyrLK(img0, img1, p0, None, **lk_params)
                    p0r, st, err = cv2.calcOpticalFlowPyrLK(img1, img0, p1, None, **lk_params)
                    d = abs(p0-p0r).reshape(-1, 2).max(-1)
                    good = d < 1
                    new_tracks = []
                    for tr, (x, y), good_flag in zip(self.tracks, p1.reshape(-1, 2), good):
                        if not good_flag:
                            continue
                        tr.append((x, y))
                        if len(tr) > self.track_len:
                            del tr[0]
                        new_tracks.append(tr)
                        cv2.circle(vis, (x, y), 2, (0, 255, 0), -1)
                    self.tracks = new_tracks
                    cv2.polylines(vis, [np.int32(tr) for tr in self.tracks], False, (0, 255, 0))
                   # draw_str(vis, (20, 20), 'track count: %d' % len(self.tracks))
    
                if self.frame_idx % self.detect_interval == 0:
                    mask = np.zeros_like(frame_gray)
                    mask[:] = 255
                    for x, y in [np.int32(tr[-1]) for tr in self.tracks]:
                        cv2.circle(mask, (x, y), 5, 0, -1)
                    p = cv2.goodFeaturesToTrack(frame_gray, mask = mask, **feature_params)
                    if p is not None:
                        for x, y in np.float32(p).reshape(-1, 2):
                            self.tracks.append([(x, y)])
    
    
                self.frame_idx += 1
                self.prev_gray = frame_gray
                cv2.imshow('lk_track', vis)
    
    
                ch = cv2.waitKey(1)
                if ch == 27:
                    break
    
    def main():
        video_src = 'traffic.flv'
        App(video_src).run()
        cv2.destroyAllWindows()
    
    if __name__ == '__main__':
        main()

    2。还原成普通函数

    #-*- coding:utf-8 -*-
    import numpy as np
    import cv2
    
    #ShiTomasi 角检测的参数
    lk_params = dict( winSize  = (15, 15),
                      maxLevel = 3,
                      criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 0.03))
    
    # l-k 光流参数
    feature_params = dict( maxCorners = 800,
                           qualityLevel = 0.3,
                           minDistance = 7,
                           blockSize = 7 )
    
    track_len = 10  # 跟踪轨迹长度10
    detect_interval = 5
    tracks = []  # 储存跟踪点
    frame_idx = 0
    
    # 1,定义一个对象,存储读取的视频
    video_src = 'traffic.flv'
    cam = cv2.VideoCapture(video_src)
    
    while True:
        ret, frame = cam.read()
        frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        vis = frame.copy()
    
        if len(tracks) > 0:
            img0, img1 = prev_gray, frame_gray
            p0 = np.float32([tr[-1] for tr in tracks]).reshape(-1, 1, 2)
            p1, st, err = cv2.calcOpticalFlowPyrLK(img0, img1, p0, None, **lk_params)
            p0r, st, err = cv2.calcOpticalFlowPyrLK(img1, img0, p1, None, **lk_params)
            d = abs(p0 - p0r).reshape(-1, 2).max(-1)
            good = d < 1
            new_tracks = []
            for tr, (x, y), good_flag in zip(tracks, p1.reshape(-1, 2), good):
                if not good_flag:
                    continue
                tr.append((x, y))
                if len(tr) > track_len:
                    del tr[0]
                new_tracks.append(tr)
                cv2.circle(vis, (x, y), 2, (0, 255, 0), -1)
            tracks = new_tracks
            cv2.polylines(vis, [np.int32(tr) for tr in tracks], False, (0, 255, 0))
            # draw_str(vis, (20, 20), 'track count: %d' % len(self.tracks))
    
        if frame_idx % detect_interval == 0:
            mask = np.zeros_like(frame_gray)
            mask[:] = 255
            for x, y in [np.int32(tr[-1]) for tr in tracks]:
                cv2.circle(mask, (x, y), 5, 0, -1)
            p = cv2.goodFeaturesToTrack(frame_gray, mask=mask, **feature_params)
            if p is not None:
                for x, y in np.float32(p).reshape(-1, 2):
                    tracks.append([(x, y)])
    
        frame_idx += 1
        prev_gray = frame_gray
        cv2.imshow('lk_track', vis)
    
        ch = cv2.waitKey(1)
        if ch == 27:
            break
    
    
    cv2.destroyAllWindows()
    cam.release()

    3。效果图

     

    4

    5.

  • 相关阅读:
    还有为window.close()方法弹出的询问窗口烦?
    ValidateTextBox发布绝对实用
    面向对象设计的11个原则
    关于建立控件、组件开发团队,有兴趣的网友请留言
    存储过程和触发器要使用链接服务器时要注意的一点
    “这块布的艺术成分都几高唧!”“有几高啊?”“三、四层楼那么高啦。”
    有没有人用过负离子发生器?
    摇滚你的页面。Free:RockUControl控件发布,开源:RevealTransitionImage
    控件开发团队序言及加入说明
    一些平时能用到的CSS效果(ZT+YC)
  • 原文地址:https://www.cnblogs.com/venicid/p/8120382.html
Copyright © 2020-2023  润新知