HNU计算机视觉作业三

前言

选修的是蔡mj老师的计算机视觉,上课还是不错的,但是OpenCV可能需要自己学才能完整把作业写出来。由于没有认真学,这门课最后混了80多分,所以下面作业解题过程均为自己写的,并不是标准答案,仅供参考

任务1

修改test-3.py的task_one()函数,基于pedestrian.avi进行稀疏光流估计,对行人轨迹进行跟踪。具体输出要求如下:

(1)对视频中跟踪的轨迹进行可视化,将所有的轨迹重叠显示在视频的最后一张图像上,可视化结果保存为trajectory.png。

请添加图片描述

def task_one():"""sparse optical flow and trajectory tracking"""cap = cv2.VideoCapture("pedestrian.avi")# --------Your code--------# cap = cv2.VideoCapture("images/kk 2022-01-23 18-21-21.mp4")#cap = cv2.VideoCapture(0)# 定义角点检测的参数feature_params = dict(maxCorners=100,  # 最多多少个角点qualityLevel=0.3,  # 品质因子,在角点检测中会使用到,品质因子越大,角点质量越高,那么过滤得到的角点就越少minDistance=7  # 用于NMS,将最有可能的角点周围某个范围内的角点全部抑制)# 定义 lucas kande算法的参数lk_params = dict(winSize=(10, 10),  # 这个就是周围点临近点区域的范围maxLevel=2  # 最大的金字塔层数)# 拿到第一帧的图像ret, prev_img = cap.read()prev_img_gray = cv2.cvtColor(prev_img, cv2.COLOR_BGR2GRAY)# 先进行角点检测,得到关键点prev_points = cv2.goodFeaturesToTrack(prev_img_gray, mask=None, **feature_params)# 制作一个临时的画布,到时候可以将新的一些画的先再mask上画出来,再追加到原始图像上mask_img = np.zeros_like(prev_img)while True:ret, curr_img = cap.read()if curr_img is None:print("video is over...")breakcurr_img_gray = cv2.cvtColor(curr_img, cv2.COLOR_BGR2GRAY)# 光流追踪下curr_points, status, err = cv2.calcOpticalFlowPyrLK(prev_img_gray,curr_img_gray,prev_points,None,**lk_params)# print(status.shape)  # 取值都是1/0, 1表示是可以追踪到的,0表示失去了追踪的。good_new = curr_points[status == 1]good_old = prev_points[status == 1]# 绘制图像for i, (new, old) in enumerate(zip(good_new, good_old)):a, b = new.ravel()c, d = old.ravel()mask_img = cv2.line(mask_img, pt1=(int(a), int(b)), pt2=(int(c), int(d)), color=(0, 0, 255), thickness=1)mask_img = cv2.circle(mask_img, center=(int(a), int(b)), radius=2, color=(255, 0, 0), thickness=2)# 将画布上的图像和原始图像叠加,并且展示img = cv2.add(curr_img, mask_img)#cv2.imshow("desct", img)if cv2.waitKey(60) & 0xFF == ord('q'):print("Bye...")break# 更新下原始图像,以及重新得到新的点prev_img_gray = curr_img_gray.copy()prev_points = good_new.reshape(-1, 1, 2)if len(prev_points) < 5:# 当匹配的太少了,就重新获得当前图像的角点prev_points = cv2.goodFeaturesToTrack(curr_img_gray, mask=None, **feature_params)mask_img = np.zeros_like(prev_img)  # 重新换个画布cv2.imwrite("trajectory.png", img)

请添加图片描述

任务2

修改test-3.py的task_two()函数,基于frame01.png和frame02.png进行稠密光流估计,并基于光流估计对图像中的行人进行图像分割。具体输出要求如下:

(1)将稠密光流估计的结果进行可视化,可视化结果保存为frame01_flow.png

(2)对行人分割结果进行可视化,得到一个彩色掩码图,每个行人的分割区域用单一的颜色表示(例如red,green,blue),可视化结果保存为frame01_person.png

请添加图片描述
请添加图片描述

第二题的第一问的可视化我不清楚题目要问的是什么意思,所以跑出了两种结果。

第一种结果是背景人物分割,移动的人物会被标记为白色,背景会被标记为黑色的
第二种就是frame02图片原照片

def task_two():"""dense optical flow and pedestrian segmentation"""img1 = cv2.imread('frame01.png')img2 = cv2.imread('frame02.png')# --------Your code--------#cap = cv.VideoCapture(cv.samples.findFile("vtest.avi"))fgbg = cv2.createBackgroundSubtractorMOG2()frame1 = img1prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)hsv = np.zeros_like(frame1)hsv[..., 1] = 255frame2 = img2fgmask = fgbg.apply(frame2)next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])hsv[..., 0] = ang * 180 / np.pi / 2hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)#cv2.imshow('frame2', bgr)cv2.imwrite('frame01_flow.png', fgmask)cv2.imwrite('frame01_person.png', bgr)# cv2.imwrite("frame01_flow.png", img_flow)# cv2.imwrite("frame01_person.png", img_mask)

请添加图片描述
请添加图片描述

源代码

# -*- coding: utf-8 -*-
"""
Created on Mon May 29 15:30:41 2023@author: cai-mj
"""import numpy as np
import cv2
from matplotlib import pyplot as plt
import argparsedef task_one():"""sparse optical flow and trajectory tracking"""cap = cv2.VideoCapture("pedestrian.avi")# --------Your code--------# cap = cv2.VideoCapture("images/kk 2022-01-23 18-21-21.mp4")#cap = cv2.VideoCapture(0)# 定义角点检测的参数feature_params = dict(maxCorners=100,  # 最多多少个角点qualityLevel=0.3,  # 品质因子,在角点检测中会使用到,品质因子越大,角点质量越高,那么过滤得到的角点就越少minDistance=7  # 用于NMS,将最有可能的角点周围某个范围内的角点全部抑制)# 定义 lucas kande算法的参数lk_params = dict(winSize=(10, 10),  # 这个就是周围点临近点区域的范围maxLevel=2  # 最大的金字塔层数)# 拿到第一帧的图像ret, prev_img = cap.read()prev_img_gray = cv2.cvtColor(prev_img, cv2.COLOR_BGR2GRAY)# 先进行角点检测,得到关键点prev_points = cv2.goodFeaturesToTrack(prev_img_gray, mask=None, **feature_params)# 制作一个临时的画布,到时候可以将新的一些画的先再mask上画出来,再追加到原始图像上mask_img = np.zeros_like(prev_img)while True:ret, curr_img = cap.read()if curr_img is None:print("video is over...")breakcurr_img_gray = cv2.cvtColor(curr_img, cv2.COLOR_BGR2GRAY)# 光流追踪下curr_points, status, err = cv2.calcOpticalFlowPyrLK(prev_img_gray,curr_img_gray,prev_points,None,**lk_params)# print(status.shape)  # 取值都是1/0, 1表示是可以追踪到的,0表示失去了追踪的。good_new = curr_points[status == 1]good_old = prev_points[status == 1]# 绘制图像for i, (new, old) in enumerate(zip(good_new, good_old)):a, b = new.ravel()c, d = old.ravel()mask_img = cv2.line(mask_img, pt1=(int(a), int(b)), pt2=(int(c), int(d)), color=(0, 0, 255), thickness=1)mask_img = cv2.circle(mask_img, center=(int(a), int(b)), radius=2, color=(255, 0, 0), thickness=2)# 将画布上的图像和原始图像叠加,并且展示img = cv2.add(curr_img, mask_img)#cv2.imshow("desct", img)if cv2.waitKey(60) & 0xFF == ord('q'):print("Bye...")break# 更新下原始图像,以及重新得到新的点prev_img_gray = curr_img_gray.copy()prev_points = good_new.reshape(-1, 1, 2)if len(prev_points) < 5:# 当匹配的太少了,就重新获得当前图像的角点prev_points = cv2.goodFeaturesToTrack(curr_img_gray, mask=None, **feature_params)mask_img = np.zeros_like(prev_img)  # 重新换个画布cv2.imwrite("trajectory.png", img)def task_two():"""dense optical flow and pedestrian segmentation"""img1 = cv2.imread('frame01.png')img2 = cv2.imread('frame02.png')# --------Your code--------#cap = cv.VideoCapture(cv.samples.findFile("vtest.avi"))fgbg = cv2.createBackgroundSubtractorMOG2()frame1 = img1prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)hsv = np.zeros_like(frame1)hsv[..., 1] = 255frame2 = img2fgmask = fgbg.apply(frame2)next = cv2.cvtColor(frame2, cv2.COLOR_BGR2GRAY)flow = cv2.calcOpticalFlowFarneback(prvs, next, None, 0.5, 3, 15, 3, 5, 1.2, 0)mag, ang = cv2.cartToPolar(flow[..., 0], flow[..., 1])hsv[..., 0] = ang * 180 / np.pi / 2hsv[..., 2] = cv2.normalize(mag, None, 0, 255, cv2.NORM_MINMAX)bgr = cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)#cv2.imshow('frame2', bgr)cv2.imwrite('frame01_flow.png', fgmask)cv2.imwrite('frame01_person.png', bgr)# cv2.imwrite("frame01_flow.png", img_flow)# cv2.imwrite("frame01_person.png", img_mask)if __name__ == '__main__':task_one()task_two()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/216691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发之状态管理@State

1、视图数据双向绑定 鸿蒙开发采用的声明式UI&#xff0c;利用状态驱动UI的更新。其中State被称作装饰器&#xff0c;是一种状态管理的方式。 状态&#xff1a;指的是被装饰器装饰的驱动视图更新的数据。 视图&#xff1a;是指用户看到的UI渲染出来的界面。 之所以成为双向…

Go性能分析工具

前言 作为后端研发&#xff0c;性能分析是我们在研发过程中必然会会遇到的环节&#xff0c;接口耗时、堆栈溢出、内存泄露等等。所谓工欲善其事必先利其器&#xff0c;之前在java中我们是使用arthas这一大神器&#xff0c;不得不说确实好用&#xff0c;想了解arthas的可以看下…

Stm32-使用TB6612驱动电机及编码器测速

这里写目录标题 起因一、电机及编码器的参数二、硬件三、接线四、驱动电机1、TB6612电机驱动2、定时器的PWM模式驱动电机 五、编码器测速1、定时器的编码器接口模式2、定时器编码器模式测速的原理3、编码器模式的配置4、编码器模式相关代码5、测速方法 六、相关问题以及解答1、…

Python自动化测试工具selenium使用指南

概述 selenium是网页应用中最流行的自动化测试工具&#xff0c;可以用来做自动化测试或者浏览器爬虫等。官网地址为&#xff1a;相对于另外一款web自动化测试工具QTP来说有如下优点&#xff1a; 免费开源轻量级&#xff0c;不同语言只需要一个体积很小的依赖包支持多种系统&a…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含python、JS工程源码)+数据集+模型(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境微信开发者工具OneNET云平台 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架&#xff0c;引入CNN进行模型训练&#xff0c;采用Dropout梯度…

鸿蒙系统最近删除文件夹的路径

鸿蒙手机上删除文件&#xff0c;会将文件移动到类似回收站的路径下&#xff0c;如何找到这个路径&#xff1f; 先找用文件管理器找到一个文件 比如aaa.jpg &#xff0c;这时在调试的shell下面运行 find . -name aaaa.jpg 得到如下 这时再删除该文件 再次运行 find . -name a…

【JUC】二十五、ThreadLocal内存泄漏问题(强软弱虚四种引用)

文章目录 1、引用之强软弱虚2、强引用3、软引用4、弱引用5、虚引用6、ThreadLocal回顾7、ThreadLocal使用弱引用的原因8、清除脏Entry9、最佳实践 不再会被使用的对象或者变量占用的内存不能被回收&#xff0c;就是内存泄露&#xff08;累积可能导致OOM&#xff09;。 1、引用之…

InnoDB在SQL查询中的关键功能和优化策略

文章目录 前言存储引擎介绍存储引擎是干嘛的InnoDB的体系结构 InnoDB的查询操作InnoDB的查询原理引入 Buffer Pool引入数据页Buffer Pool 的结构数据页的加载Buffer Pool 的管理Buffer Pool 的优化 总结 前言 通过上篇文章《MySQL的体系结构与SQL的执行流程》了解了SQL语句的执…

【LSM tree 】Log-structured merge-tree 一种分层、有序、面向磁盘的数据结构

文章目录 前言基本原理读写流程写流程读流程 写放大、读放大和空间放大优化 前言 LSM Tree 全称是Log-structured merge-tree, 是一种分层&#xff0c;有序&#xff0c;面向磁盘的数据结构。其核心原理是磁盘批量顺序写比随机写性能高很多&#xff0c;可以通过围绕这一原理进行…

scala表达式

1.8 表达式&#xff08;重点&#xff09; # 语句(statement)&#xff1a;一段可执行的代码# 表达式(expression)&#xff1a;一段可以被求值的代码&#xff0c;在Scala中一切都是表达式 - 表达式一般是一个语句块&#xff0c;可包含一条或者多条语句&#xff0c;多条语句使用“…

Android BluetoothAdapter 使用(二)

Android BluetoothAdapter 使用(二) 本篇文章主要讲下蓝牙设备的配对. 1: 蓝牙设备列表展示 下 面是蓝牙设备adapter的代码: package com.test.bluetooth;import android.bluetooth.BluetoothDevice; import android.content.Context; import android.view.LayoutInflater;…

Linux中的堡垒机搭建以及使用

JumpServer搭建 安装应用包 curl -sSL https://resource.fit2cloud.com/jumpserver/jumpserver/releases/latest/download/quick_start.sh | bash 一路回车即可安装完毕&#xff08;可根据需求更改&#xff09; JumpServer的 配置文件路径 /opt/jumpserver/config/config.tx…

【智能家居】九、停车场车牌识别功能点(回调、解耦)

一、翔云 人工智能开放平台&#xff08;车牌识别&#xff09; 二、cJSON 库 三、实现代码 四、回调函数 五、人脸识别和车牌识别获取数据的区别 六、异步网络请求和同步网络请求的区别 七、解耦 一、翔云 人工智能开放平台&#xff08;车牌识别&#xff09; 翔云 人工智能开放…

.NET 反射优化的经验分享

比如针对 GetCustomAttributes 通过反射获取属性的优化,以下例子 // dotnet run -c Release -f net7.0 --filter "*" --runtimes net7.0 net8.0public class Tests{public object[] GetCustomAttributes() => typeof(C).GetCustomAttributes(typeof(MyAttribute…

坑爹的奥数(枚举法)

枚举法是一种解决问题的基本方法&#xff0c;它通过列举问题的所有可能情况来找到问题的解。这种方法适用于问题的解空间相对较小&#xff0c;可以通过穷举所有可能的解来找到最优解或满足特定条件的解。 以下是枚举法的一般步骤&#xff1a; 定义问题&#xff1a; 确定问题的…

Cypress安装与使用教程(2)—— 软测大玩家

&#x1f60f;作者简介&#xff1a;博主是一位测试管理者&#xff0c;同时也是一名对外企业兼职讲师。 &#x1f4e1;主页地址&#xff1a;【Austin_zhai】 &#x1f646;目的与景愿&#xff1a;旨在于能帮助更多的测试行业人员提升软硬技能&#xff0c;分享行业相关最新信息。…

数据库字段名和sql关键字冲突报错解决方法

1、修改实体类字段映射。注解里加反引号 2、sql字段上加反引号 3、问题解决

ue5材质预览界面ue 变黑

发现在5.2和5.1上都有这个bug 原因是开了ray tracing引起的&#xff0c;这个bug真是长时间存在&#xff0c;类似的bug还包括草地上奇怪的影子和地形上的影子等等 解决方法也很简单&#xff0c;就是关闭光追&#xff08;不是…… 就是关闭预览&#xff0c;在材质界面preview sc…

C# WPF上位机开发(会员充值软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在软件开发中&#xff0c;有一种很重要的控件&#xff0c;那就是表格。大家可以想象下&#xff0c;办公软件里面是不是就有一个专门做表格的软件&a…

路由器的转换原理--ENSP实验

目录 一、路由器的工作原理 二、路由表的形成 1、直连路由 2、非直连路由 2.1静态路由 2.2动态路由 三、静态路由和默认路由 1、静态路由 1.1静态路由的缺点 1.2路由的配置--结合ensp实验 2、默认路由--特殊的静态路由 2.1概念 2.2格式 2.3默认路由的配置--ens…