import cv2
import numpy as np
def OpticalFlow():
# 第一步,打开usb摄像头,或者读取视频文件,一样
cap = cv2.VideoCapture("1.mp4")
# 第二步:sift特征检测器
sift = cv2.SIFT_create(nfeatures=500, contrastThreshold=0.1, edgeThreshold=50, sigma=1.0)
lk_params = dict(winSize=(15, 15), # lucas kanade参数:搜索窗口、金字塔层数
maxLevel=3)
color = [0,255,0]
# 第三步:拿到第一帧图像并灰度化作为前一帧图片
ret, old_frame = cap.read()
old_gray = cv2.cvtColor(old_frame, cv2.COLOR_BGR2GRAY)
# 第四步:使用SIFT查找关键点key points和描述符descriptors
kp1 = sift.detect(old_gray, None)
p0 = []
for kp in kp1:
p0.append( [[kp.pt[0], kp.pt[1]]] )
p0 = np.array(p0).astype(np.float32)
# 第五步:创建一个mask, 用于进行横线的绘制
mask = np.zeros_like(old_frame)
# 保存视频
fourcc = cv2.VideoWriter_fourcc(*"mp4v")
out = cv2.VideoWriter('output.mp4',fourcc,20.0,(old_frame.shape[1] ,old_frame.shape[0]),True) # 黑白为false,彩色为True
while True:
# 第六步:读取图片灰度化作为后一张图片的输入
ret, frame = cap.read()
if ret == False:
break
frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 第七步:进行金字塔LK光流检测需要输入前一帧和当前图像及前一帧检测到的角点
pl, st, err = cv2.calcOpticalFlowPyrLK(old_gray, frame_gray, p0, None, **lk_params)
if len(pl[st == 1]) <= 1:
kp1 = sift.detect(frame_gray, None)
p0 = []
for kp in kp1:
p0.append( [[kp.pt[0], kp.pt[1]]] )
p0 = np.array(p0).astype(np.float32)
old_gray = frame_gray.copy()
mask = np.zeros_like(old_frame)
continue
# 第八步:读取运动了的角点st == 1表示检测到的运动物体,即v和u表示为0
good_new = pl[st == 1]
good_old = p0[st == 1]
# 第九步:绘制轨迹
for i, (new, old) in enumerate(zip(good_new, good_old)):
a, b = new.ravel().astype(int)
c, d = old.ravel().astype(int)
mask = cv2.line(mask, (a, b), (c, d), color, 2)
frame = cv2.circle(frame, (a, b), 5, color, -1)
img = cv2.add(frame, mask)
cv2.imshow('frame', img)
out.write(img)
k = cv2.waitKey(50) & 0xff
if k == 27:
break
# 第十步:更新前一帧图片和角点的位置
old_gray = frame_gray.copy()
p0 = good_new.reshape(-1, 1, 2)
cv2.destroyAllWindows()
cap.release()
out.release()
if __name__ == '__main__':
OpticalFlow()
python opencv sift光流.zip
版权申诉
5星 · 超过95%的资源 105 浏览量
2022-04-15
15:48:17
上传
评论 1
收藏 24.05MB ZIP 举报
图像处理大大大大大牛啊
- 粉丝: 1w+
- 资源: 79
最新资源
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
- python中matplotlib教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页