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...")
            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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

leetcode:643. 子数组最大平均数 I(滑动窗口)

一、题目 链接&#xff1a;643. 子数组最大平均数 I - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a; double findMaxAverage(int* nums, int numsSize, int k) 二、思路 滑动窗口&#xff1a; 先计算数组前k个元素总和&#xff0c;作为第一个窗口&#xff0c;默…

软件设计之组合模式

组合模式&#xff1a;将对象组合成树形结构。 案例&#xff1a;公司管理。一个公司可以分总公司和分公司&#xff0c;无论是总公司还是分公司都有自己的部门&#xff0c;如人力资源管理部门、财务部门。分公司可以建立自己在不同地域的办事处。请使用组合模式打印出某个公司的…

苹果笔记本网络恢复系统方法

1、开机时按下Option键&#xff0c;进行网络连接&#xff1b; 2、重新开机的同时然后按Command R键&#xff0c;Mac自动联网恢复并进入“MacOS X实用工具”&#xff1b; 3、进入“磁盘工具”&#xff1b; 4、在左边选择磁盘&#xff0c;选取“分区”标签&#xff0c;选择“分区…

dToF直方图之美_deadtime死区时间

上节在激光雷达多目标测距中有个问题为什么激光雷达不用做pile up算法,有人会有疑问,我看过很多人的简历,都把pile up量产校正算法写为最为自豪重要的算法攻坚,可能会吸引一波人的眼球。这要是在两三年前是值得被肯定的,但是如今随着dToF非常多量产项目落地,pile up研究不…

如何本地搭建开源分布式任务调度系统DolphinScheduler并远程访问

文章目录 前言1. 安装部署DolphinScheduler1.1 启动服务 2. 登录DolphinScheduler界面3. 安装内网穿透工具4. 配置Dolphin Scheduler公网地址5. 固定DolphinScheduler公网地址 前言 本篇教程和大家分享一下DolphinScheduler的安装部署及如何实现公网远程访问&#xff0c;结合内…

java简述springboot内置数据库 并举例启动h2内存数据环境

在前面 我们讲了 springboot 给我们提供了 默认的 数据源 默认 HikariCP 以及其他两种内置数据源 持久化技术 JdbcTemplate 那么 说起来很多人难以置信 不过 springboot 也真的给我们内置了数据库技术 而且不止一种 是三种 这三个数据库的特点在于 它们都是用java语言写的 就表…

YOLOv8-DeepSort/ByteTrack-PyQt-GUI:全面解决方案,涵盖目标检测、跟踪和人体姿态估计

YOLOv8-DeepSort/ByteTrack-PyQt-GUI是一个多功能图形用户界面&#xff0c;旨在充分发挥YOLOv8在目标检测/跟踪和人体姿态估计/跟踪方面的能力&#xff0c;与图像、视频或实时摄像头流进行无缝集成。支持该应用的Python脚本使用ONNX格式的YOLOv8模型&#xff0c;确保各种人工智…

C++笔记之重载和重写辨别

C笔记之重载和重写辨别 code review! 文章目录 C笔记之重载和重写辨别重载&#xff08;overloading&#xff09;重写&#xff08;Overriding&#xff09; 在C中&#xff0c;重载&#xff08;overloading&#xff09;和重写&#xff08;overriding&#xff09;是面向对象编程中…

Excel COUNT类函数使用

目录 一. COUNT二. COUNTA三. COUNTBLANK四. COUNTIF五. COUNTIFS 一. COUNT ⏹用于计算指定范围内包含数字的单元格数量。 基本语法 COUNT(value1, [value2], ...)✅统计A2到A7所有数字单元格的数量 ✅统计A2到A7&#xff0c;B2到B7的所有数字单元格的数量 二. COUNTA ⏹计…

Spring IoC和DI

目录 一. Spring是什么 IoC DI 二. IoC&DI的使用 IoC 1.Controller&#xff08;控制器存储&#xff09; 2.Service&#xff08;服务存储&#xff09; 3.Repository&#xff08;仓库存储&#xff09; 4.Componemt&#xff08;组件存储&#xff09; 5.Configuratio…

电机:有刷直流电机的原理

一、什么是有刷直流电机 直流有刷电机&#xff08;Brushed DC Motor&#xff09;&#xff0c;定子是用永磁铁或者线圈做成&#xff0c;以形成固定磁场。在定子一端上有固定碳刷&#xff0c;或者铜刷&#xff0c;负责把外部电流引入转子线圈。而转子是由线圈构成&#xff0c;线…

散列卡片悬停变为整齐列表

效果展示 CSS 知识点 transform 属性运用 页面整体布局 <ul><li><div class"box"><img src"./user1.jpg" /><div class"content"><h4>Hamidah</h4><p>commented on your photo.<br />…

036.Python面向对象_self_cls_super

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…

了解一下分治算法

文章目录 分治算法 分治算法 分治算法基本介绍 分治法&#xff08;Divide-and-Conquer&#xff09;是一种很重要的算法。字面上的解释是"分而治之"&#xff0c;就是把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直…

vue2 cron表达式组件

vue2 cron表达式组件 1. 先上图 2. 代码目录 3. 直接上代码 &#xff08;组件代码太多&#xff0c;直接上压缩包&#xff0c;解压后直接用&#xff0c;压缩包再博客顶部&#xff09; 4. 使用注&#xff1a;示例代码中使用了element-ui // HomeView.vue<template><…

ubuntu16.04升级openssl

Ubuntu16.04 默认带的openssl版本为1.0.2 查看&#xff1a;openssl version 1.下载openssl wget https://www.openssl.org/source/openssl-1.1.1.tar.gz 编译安装 tar xvf openssl-1.1.1.tar.gz cd openssl-1.1.1 ./config make sudo make install sudo ldconfig 删除旧版本 su…

UDP 协议

UDP协议 1.UDP的基本特点2.UDP协议格式 1.UDP的基本特点 无连接:知道源端口号和目的端口号就可以进行传输,不需要进行连接不可靠:没有任何的安全机制,发送端发送完数据后,接收端是否会因为网络故障等其原因而没有接收到数据,UDP协议不会返回任何信息给应用层.面向数据报:应用层…

1、初识 llvm源码编译 及virtualbox和ubuntu环境搭建

很久没更新了&#xff0c;最近准备研究逆向和加固&#xff0c;于是跟着看雪hanbing老师学习彻底搞懂ollvm&#xff0c;终于把所有流程跑通了&#xff0c;中间遇到了太多的坑&#xff0c;所以必须记录一下&#xff0c;能避免自己和帮助他人最好。 环境搭建太重要了&#xff0c;…

软件测试相关

软件测试是什么&#xff1f; 使用人工和自动手段来运行或测试某个系统的过程&#xff0c;其目的在于验证它是否满足规定的需求或弄清预期结果与实际结果的差别。 为什么做软件测试&#xff1f;目的是什么&#xff1f; 发现软件存在的代码或业务逻辑错误 检验产品是否符合用户需…

基于ssm化妆品配方及工艺管理系统的设计与实现论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本化妆品配方及工艺管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的…