opencv:对光流估计的改进

qq_41689596 2019-08-27 11:35:29
# -*- coding: utf-8 -*-
"""
Created on Sun Aug 25 18:36:47 2019

@author: mybaby
"""

import cv2
import numpy as np
import time

#定义参数
#创建角点检测参数
feature_params=dict(maxCorners=10,#最多返回关键点的数量
qualityLevel=0.3,#一个像素点成为关键点的强度条件
minDistance=7,#关键点之间的最小像素点距离
blockSize=7)#一个像素点是否为关键点时所取区域大小
#Lucase-Kanade光流估计参数
lk_params=dict(winSize=(15,15),#搜索窗口大小
maxLevel=2,#最大金字塔层数
criteria=(cv2.TERM_CRITERIA_EPS|cv2.TERM_CRITERIA_COUNT,10,0.03))#可选标识
#定义卷积核
kernal=cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))
#创建混合高斯模型
fgbg=cv2.createBackgroundSubtractorMOG2()

#随机选择颜色
color=np.random.randint(0,255,(100,3))
#打开摄像头
cap=cv2.VideoCapture(0)
#读取第一帧图像
ret,old_frame=cap.read()
#创建一个蒙版用来画轨迹
mask=np.zeros_like(old_frame)
#转灰度图
#old_gray=cv2.cvtColor(old_frame,cv2.COLOR_BGR2GRAY)
#前景背景分割并且存储图像
#因为灰度图没有办法直接作为光流估计的参数,所以用的是先存储到rom中再以读进来
photo_old=fgbg.apply(old_frame.copy())
cv2.imwrite('E:/other_files/python_files/photo_save/old.jpg',photo_old)
#读取图片,并转灰度图
old_gray=cv2.imread('E:/other_files/python_files/photo_save/old.jpg',0)
old_gray=cv2.flip(old_gray,1)
#读取摄像头信息
while True:
#获取上一帧图像角点
p0=cv2.goodFeaturesToTrack(old_gray,mask=None,**feature_params)
#读取当前图像
ret,frame=cap.read()
frame=cv2.flip(frame,1)
img=frame
#前景背景分割并且存储图像
photo_new=fgbg.apply(frame.copy())
cv2.imwrite('E:/other_files/python_files/photo_save/new.jpg',photo_new)
#读取图像,延时是为了让电脑有足够的时间把图像写入rom中
#延时过短的话读取图像会失败
time.sleep(0.1)
frame=cv2.imread('E:/other_files/python_files/photo_save/new.jpg')

frame_gray=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)
#计算光流
p1,st,err=cv2.calcOpticalFlowPyrLK(old_gray,frame_gray,p0,None,**lk_params)

#选取好的跟踪点
good_new=p1[st==1]
good_old=p0[st==1]

#画出轨迹
for i,(new,old) in enumerate(zip(good_new,good_old)):
a,b=new.ravel()
c,d=old.ravel()
mask=cv2.line(mask,(a,b),(c,d),color[i].tolist(),2)
frame=cv2.circle(frame,(a,b),5,color[i].tolist(),-1)
img=cv2.line(img,(a,b),(c,d),color[i].tolist(),2)
img=cv2.circle(img,(a,b),5,color[i].tolist(),-1)
#img=cv2.add(frame,mask)
cv2.imshow('img',img)
#更新图像和追踪点
old_gray=frame_gray.copy()

p0=good_new.reshape(-1,1,2)
if cv2.waitKey(1)&0xff==ord('q'):
break
#释放摄像头,关闭窗口
cap.release()
cv2.destroyAllWindows()
...全文
135 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_41689596 2019-08-27
  • 打赏
  • 举报
回复
使用了背景前景分割的方法,过滤了静态背景的角点

4,447

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧