HNU计算机视觉作业三

news2024/11/18 4:19:20

前言

选修的是蔡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...")
            break
        curr_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 = img1
    prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    hsv = np.zeros_like(frame1)
    hsv[..., 1] = 255
    frame2 = img2
    fgmask = 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 / 2
    hsv[..., 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 argparse

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...")
            break
        curr_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 = img1
    prvs = cv2.cvtColor(frame1, cv2.COLOR_BGR2GRAY)
    hsv = np.zeros_like(frame1)
    hsv[..., 1] = 255
    frame2 = img2
    fgmask = 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 / 2
    hsv[..., 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.coloradmin.cn/o/1298757.html

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

相关文章

单臂路由与三层交换机

单臂路由 划分VLAN后同一VLAN的计算机属于同一个广播域&#xff0c;同一VLAN的计算机之间的通信是不成问题的。然而&#xff0c;处于不同VLAN的计算机即使是在同一交换机上&#xff0c;它们之间的通信也必须使用路由器。 图&#xff08;a&#xff09;是一种实现VLAN间路由的方…

ubuntu上搭建bazel编译环境,构建Android APP

背景是github上下载的工程&#xff0c;说明仅支持bazel编译&#xff0c;折腾了一天Android studio&#xff0c;失败。 不得不尝试单价bazel编译环境&#xff0c;并不复杂&#xff0c;过程记录如下 说明&#xff1a;ubuntu环境是20.04&#xff0c;pve虚拟机安装 1.安装jdk sudo…

docker-compose安装教程

1.确认docker-compose是否安装 docker-compose -v如上图所示表示未安装&#xff0c;需要安装。 如上图所示表示已经安装&#xff0c;不需要再安装&#xff0c;如果觉得版本低想升级&#xff0c;也可以继续安装。 2.离线安装 下载docker-compose安装包&#xff0c;上传到服务…

如何将html网页免费转为excel?

一、直接复制。 直接复制是最简单有效、快捷的解决方案&#xff0c;操作方法如下&#xff1a; 1、用鼠标像平常复制文本一样&#xff0c;将整个网页表格选中。 2、点击右键&#xff0c;点击“复制”。 3、打开excel软件&#xff0c;鼠标点击任意单元格。 4、点击右键&#…

leetcode7 移除列表中特定元素

给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新长度后面…

【Cisco Packet Tracer】路由器 NAT实验

NAT的实现方式有三种&#xff0c;即静态转换Static Nat、动态转换Dynamic Nat和端口多路复用OverLoad。 静态转换是指内部本地地址一对一转换成内部全局地址&#xff0c;相当内部本地的每一台PC都绑定了一个全局地址。一般用于在内网中对外提供服务的服务器。 [3] 动态转换是指…

springboot+java医保付费绩效管理平台ssm

随着社会的飞速发展&#xff0c;特别是信息技术的迅猛发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势。当然&#xff0c;也不能排除医保付费及绩效管理行业。随着网络技术的不断成熟&#xff0c;医保付费及绩效管理的发展得到了促…

Wireshark添加自定义协议解析

最终效果如下&#xff1a; 参考文档&#xff1a;https://mika-s.github.io/topics/ 此参考文档中7个例子教我们如何编写lua脚本去识别我们自定义的协议 安装Wireshark https://www.wireshark.org/上下载安装包安装即可。我的安装路径是D:\Install\Wireshark&#xff0c;在W…

nodejs+vue+微信小程序+python+PHP北京地铁票务APP-计算机毕业设计推荐 -安卓

根据现实中在北京地铁票务方面的需求&#xff0c;并对该系统进行了仔细的研究&#xff0c;将系统权限按照管理者和用户这两种类型进行了区分。 &#xff08;1&#xff09;用户功能需求   用户进入APP可以进行系统首页、地铁线路、我的等操作&#xff0c;在我的页面可以对我的…

解释Spring中一个bean的注入过程

目录 1、定义Bean&#xff1a; XML配置方式&#xff1a; 2、注入方式&#xff1a; 构造器注入&#xff08;Constructor Injection&#xff09;&#xff1a; Setter方法注入&#xff08;Setter Injection&#xff09;&#xff1a; 字段注入&#xff08;Field Injection&…

Linux数据库修改密码的三种方式

1、正常修改密码 [rootzaotounan ~]# mysqladmin -uroot -p原密码 password 新密码 2、忘记mysql root用户密码 更改 vim /etc/my.cnf //进入my.cnf文件 skip-grant-tables //添加语句&#xff0c;跳过授权表 systemctl restar…

VisualSVN Server的安装全过程

目录 背景: 安装过程&#xff1a; 步骤1&#xff1a; 步骤2&#xff1a; 步骤3&#xff1a; 步骤4&#xff1a; 步骤5&#xff1a; 安装出现的bug&#xff1a; 问题: 解决办法: 总结: 背景: VisualSVN Server 是一款免费的 SVN (Subversion) 服务器软件&#xff0c…

【智能家居】智能家居项目

智能家居项目目录 项目目录结构 完整而典型的项目目录结构 CMake模板 CMake编译运行 README.md 项目说明文档 智能家居项目目录 【智能家居】面向对象编程OOP和设计模式(工厂模式) 【智能家居】一、工厂模式实现继电器灯控制 【智能家居】二、添加火灾检测模块&#xff08;…

用python 网络自动化统计交换机有多少端口UP

用python统计交换机有多少端口UP 用python统计交换机有多少端口UP&#xff0c;可以间接的反馈有多少个用户在线。我们使用上次的脚本将可达的网络设备ip统计到reachable_ip.txt中&#xff0c;这次我们使用reachable_ip.txt来登陆设备来统计多少端口是UP的 云配置 拓扑 交换机…

创建dockerSwarm nfs挂载

创建dockerSwarm nfs挂载 nfs高可用部署(lsyncd两主机双向同步) nfs高可用部署(lsyncd三主机三向同步) 1. 通过 Volume 1.1 创建 Docker Volume 每个 swarm 节点均创建相同名称的 Docker Volume&#xff08;名称为 nfs120&#xff09; docker volume create --driver local …

PyTorch实现逻辑回归

最终效果 先看下最终效果&#xff1a; 这里用一条直线把二维平面上不同的点分开。 生成随机数据 #创建训练数据 x torch.rand(10,1)*10 #shape(10,1) y 2*x (5 torch.randn(10,1))#构建线性回归参数 w torch.randn((1))#随机初始化w&#xff0c;要用到自动梯度求导 b …

[Linux] Apache的配置与运用

一、web虚拟主机的构台服务器上运行多个网站&#xff0c;每个网站实际上并不独立占用整个服务器&#xff0c;因此称为"虚拟"虚拟主机的虚拟主机服务可以让您充分利用服务器的硬件资源&#xff0c;大大降低了建立和运营网站的成本 Httpd服务使构建虚拟主机服务器变得容…

[LeetCode周赛复盘] 第 119 场双周赛20231209

[LeetCode周赛复盘] 第 119 场双周赛20231209 一、本周周赛总结100130. 找到两个数组中的公共元素1. 题目描述2. 思路分析3. 代码实现 100152. 消除相邻近似相等字符1. 题目描述2. 思路分析3. 代码实现 100147. 最多 K 个重复元素的最长子数组1. 题目描述2. 思路分析3. 代码实…

数据结构之归并排序及排序总结

目录 归并排序 归并排序的时间复杂度 排序的稳定性 排序总结 归并排序 归并排序大家只需要掌握其递归方法即可&#xff0c;非递归方法由于在某些特殊场景下边界难控制&#xff0c;我们一般很少使用非递归实现归并排序。那么归并排序的递归方法我们究竟是怎样实现呢&#xff…

蓝桥杯航班时间

蓝桥杯其他真题点这里&#x1f448; //飞行时间 - 时差 已过去的时间1 //飞行时间 时差 已过去的时间2 //两个式子相加会发现 飞行时间 两段时间差的和 >> 1import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public cl…