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渲染出来的界面。 之所以成为双向…

计算机网络实验8

实验目的&#xff1a; 通过实验掌握下列知识&#xff1a; 掌握小型园区网络综合设计。 实验过程分析&#xff1a;配置命令 1&#xff09; 罗列步骤2&#xff09;中各设备的配置命令。 Internet: interface ser1/0 ip address 100.1.1.1 24 quit RTA: sysname RTA_LXL interfa…

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…

002_SSL routines:ssl3_get_record:wrong version number问题解决小记_FINISH

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;GitHub开源&…

【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;可以通过围绕这一原理进行…

代码随想录-刷题第二十三天

669.修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 思路&#xff1a;确定递归函数定义&#xff0c;根据定义去构造二叉搜索树。 class Solution {// 定义&#xff1a;删除 BST 中小于 low 和大于 high 的所有节点&#xff0c;返回结果 BSTpublic TreeNode trimBS…

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;…

算法通关村第十八关 | 青铜 | 回溯

1.回溯 回溯可以视为递归的拓展&#xff0c;有着明确的解题模板。 很大的不同之处是有一个撤销处理结果的操作&#xff0c;但是大框架就是遍历 N 叉树。 回溯主要解决暴力枚举都解决不了的问题。 回溯模板&#xff1a; void backtracking(参数) {if (终止条件) {存放结果;…

金融密钥管理方案:DUKPT

文章目录 DUKPT体系基本密钥KSNBDKIPEKFKTKDEK 资料来源 DUKPT体系 Dukpt&#xff08;Derived Unique Key Per Transaction&#xff09;是一种密钥管理方案&#xff0c;旨在提供对称加密密钥的安全生成和管理。它通常用于保护金融交易和其他安全关键的数据传输。Dukpt 最初是为…

Windows删除文件的时候提示有其他程序使用文件,无法删除,如何找到是谁再使用?

在Windows中&#xff0c;当你尝试删除一个文件时&#xff0c;如果系统提示该文件正在被其他程序使用&#xff0c;你可以通过以下步骤找到是哪个程序在使用该文件&#xff1a; 记下文件名&#xff1a;首先&#xff0c;记下无法删除的文件的完整路径和文件名。 使用"资源监…

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; 翔云 人工智能开放…

Ansible变量是什么?如何实现任务的循环?

Ansible 利用变量存储整个 Ansible 项目文件中可重复使用的值&#xff0c;从而可以简化项目的创建和维护&#xff0c;并减少错误的发生率。在定义Ansible变量时&#xff0c;通常有如下三种范围的变量&#xff1a; global范围&#xff1a;从命令行或Ansible配置中设置的变量&am…