前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >视频光流

视频光流

作者头像
裴来凡
发布2022-05-29 09:21:20
7100
发布2022-05-29 09:21:20
举报
文章被收录于专栏:图像处理与模式识别研究所
代码语言:javascript
复制
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#跟踪轨迹长度
        self.detect_interval=5
        self.tracks=[]#储存跟踪点
        self.cam=cv2.VideoCapture('C:/Users/xpp/Desktop/2021091.avi')
        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))
            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='video.flv'
    App(video_src).run()
    cv2.destroyAllWindows()
if __name__=='__main__':
    main()

http://mpvideo.qpic.cn/0bf2amaakaaalmaadnbxpvqvaa6daubqabia.f10002.mp4?

视频光流是视频亮度的运动信息描述,对视频中运动对象轨迹进行标记的一种常用方法。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 图像处理与模式识别研究所 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档