山东大学增强现实实验四

这篇具有很好参考价值的文章主要介绍了山东大学增强现实实验四。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

注意:本人尚处在opencv的入门学习阶段,本博客仅为个人学习笔记见解,如有不当,欢迎指出

题目

(实验/理论)平面标志物的视觉跟踪,要求:

  1. 选择一个标志物,可以是人工标志物,也可以是自然标志物;实现和实验二相同的效果。
  2. 用手机或摄像头拍摄标志物的影像,建议读取视频流中的影像;
  3. 写一个视觉算法获得标志物与相机的相对位姿;
  4. 测量算法的帧率;
  5. 添加虚拟物体;
  6. 算法自己完成,不得使用ARCore/easyAR等现成SDK。可以使用opencv中自带的函数。
    注:使用OpenCV/OpenGL来实现一些滤波、矩阵运算、优化、画图等低层的算法。

实验思路

步骤:识别标志物→空间注册→跟踪→绘图

识别标志物

可以使用的方法有:模板匹配、前景分离、边缘提取、特征点匹配、训练级联分类器

模板匹配

模板匹配是一种用于在较大图像中搜索和查找模板图像位置的方法。它只是将模板图​​像滑动到输入图像上(就像在2D卷积中一样),然后在模板图像下比较模板和输入图像的拼图。

模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效

前景分离

可以用于车辆识别,就是在视频中有动的物体和静止的物体,通过前景分离,可以把静的物体过滤掉,实现对动的车辆的识别

边缘提取

提取图片的边缘,如果视频背景是纯色的,可以用这个方法提取标志物,但是如果视频中还有其他物体,则还需要再进行处理

特征点匹配(本实验使用)

这是我这次实验使用的方法。因为匹配了特征点后,物体的旋转、平移都是可以检测到的,方便在这个基础上绘制虚拟物体

训练级联分类器

这个方法尝试过,但最后因为匹配结果比较差,就放弃了。这个方法就是对标志物进行样本采集,然后训练一个分类器,在视频中调用该分类器对每帧进行识别,很多人脸识别、车辆识别是用的这个方法

空间注册

将视频第一帧的图像与标志物图像进行特征匹配,找到标志物特征点对应在相机图像上的坐标,跟踪这些坐标的移动

跟踪

本实验采用的是Meanshift跟踪方法,因为它比较简单,而且可以实现想要的效果

原理:
由于相邻两帧之间目标的偏移量非常小,而当前帧F1的目标框B1已知,所以一种启发式的做法是在下一帧F2中依旧框选已知的B1区域,根据F2中B1区域和F1中B1区域的相似性推断出目标框所需的偏移量,进而得到F2的目标框B2,这就是MeanShift算法所需要解决的事

资料:MeanShift跟踪算法

绘图

本实验只是绘制了一个半透明矩形在标志物上方,因为找不到使用opencv绘制3D物体的方法,好像用openGL可以
山东大学增强现实实验四
另外,如果使用相机校准棋盘格的方法,也可以绘制出一个立体图形,参考:Docs » 相机校准和3D重建 » 7_2_姿态估计

代码

import numpy as np
import cv2 as cv

if __name__ == '__main__':
    # 视频的位置
    cap = cv.VideoCapture(r"C:\Users\ccy\Desktop\video3.mp4")
    # 拍摄第一帧
    ret, first_frame = cap.read()
    # 对第一帧进行特征匹配
    if ret:
        img1 = cv.cvtColor(first_frame, cv.COLOR_BGR2GRAY)
        # 训练图像
        img_train = cv.imread(r'C:\Users\ccy\Desktop\1.png')  
        img2 = cv.cvtColor(img_train, cv.COLOR_BGR2GRAY)
        # 初始化ORB检测器
        orb = cv.ORB_create()
        # 基于ORB找到关键点和检测器
        kp1, des1 = orb.detectAndCompute(img1, None)
        kp2, des2 = orb.detectAndCompute(img2, None)

        # 创建BF匹配器的对象
        # 第一个参数normType表示距离度量方法
        # 第二个参数crossCheck是布尔型变量,如果为true,表示进行双向匹配,这样就可以增强匹配鲁棒性
        bf = cv.BFMatcher(cv.NORM_HAMMING, crossCheck=True)
        # 匹配描述符,返回最佳匹配
        matches = bf.match(des1, des2)
        leftQueryIdx = matches[0].queryIdx
        bottomQueryIdx = matches[0].queryIdx
        for mat in matches:
            # Get the matching keypoints for each of the images
            img1_idx = mat.queryIdx
            img2_idx = mat.trainIdx
            # x - columns
            # y - rows
            # Get the coordinates
            (x1, y1) = kp1[img1_idx].pt
            # 找到矩形最左上角的点和最右下角的点,这个可能得根据不同的标志物稍作调整
            if y1 < kp1[leftQueryIdx].pt[1]:
                leftQueryIdx = img1_idx
            if x1 > kp1[bottomQueryIdx].pt[0]:
                bottomQueryIdx = img1_idx
            # (x2, y2) = kp2[img2_idx].pt
            # print("kp1[img1_idx].pt[0]:", kp1[img1_idx].pt[0])
            # print("kp1[img1_idx].pt[1]:", kp1[img1_idx].pt[1])
            # print("(x2,y2):", (x2, y2))
            # -1是thickness参数,即CV_FILL,其结果是使用与边一样的颜色填充圆内部
            # 下面这行代码会标记出匹配到的特征点
            # first_frame = cv.circle(first_frame, (int(x1), int(y1)), 5, (255, 0, 0), -1)

        # print("kp1[leftQueryIdx].pt", kp1[leftQueryIdx].pt)
        # print("kp1[bottomQueryIdx].pt", kp1[bottomQueryIdx].pt)

        leftIntCd = tuple(map(lambda x: int(x), kp1[leftQueryIdx].pt))
        bottomIntCd = tuple(map(lambda x: int(x), kp1[bottomQueryIdx].pt))

        # 对后面每帧进行meanshift跟踪
        (x, y) = leftIntCd
        w = bottomIntCd[0] - leftIntCd[0]
        h = bottomIntCd[1] - leftIntCd[1]
        track_window = (x, y, w, h)
        # 设置初始ROI来追踪
        roi = first_frame[y:y + h, x:x + w]
        hsv_roi = cv.cvtColor(roi, cv.COLOR_BGR2HSV)
        mask = cv.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
        roi_hist = cv.calcHist([hsv_roi], [0], mask, [180], [0, 180])
        cv.normalize(roi_hist, roi_hist, 0, 255, cv.NORM_MINMAX)
        # 设置终止条件,可以是10次迭代,也可以至少移动1 pt
        term_crit = (cv.TERM_CRITERIA_EPS | cv.TERM_CRITERIA_COUNT, 10, 1)
        while (1):
            retOtherFrame, frame = cap.read()
            if retOtherFrame:
                # 测量帧率
                loop_start = cv.getTickCount()
                # 灰度处理
                hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
                dst = cv.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
                # 应用meanshift来获取新位置
                ret, track_window = cv.meanShift(dst, track_window, term_crit)
                # 在图像上绘制
                x, y, w, h = track_window
                # 绘制半透明矩形
                blk = np.zeros(frame.shape, np.uint8)
                cv.rectangle(blk, (x, y), (x + w, y + h), (0, 255, 0), -1)  # 注意在 blk的基础上进行绘制;
                cv.putText(blk, 'virtural', (x, y), cv.FONT_HERSHEY_COMPLEX_SMALL, 1.3, (0, 255, 0), 1)
                img2 = cv.addWeighted(frame, 1.0, blk, 0.8, 1)
                # 中间测帧率的代码段
                loop_time = cv.getTickCount() - loop_start
                total_time = loop_time / (cv.getTickFrequency())  # 使用getTickFrequency()更加准确
                running_FPS = int(1 / total_time)  # 帧率取整
                print("running_FPS:", running_FPS)
                # 显示图片
                cv.namedWindow('img2', cv.WINDOW_FREERATIO)
                cv.imshow('img2', img2)
                k = cv.waitKey(1) & 0xff
                if k == 27:
                    break
            else:
                break

效果

山东大学增强现实实验四

参考资料

OpenCV中文官方文档文章来源地址https://www.toymoban.com/news/detail-478728.html

到了这里,关于山东大学增强现实实验四的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 山东大学单片机原理与应用实验 3.4 矩阵键盘扫描实验

    目录   一、实验题目 二、实验要求 三、实验过程及结果记录 1. 在Proteus 环境下建立图1所示原理图,并将其保存为keyscan_self.DSN 文件。 2. 编写控制源程序,将其保存为keyscan_self.asm 或keyscan_self.c。 3. 将源程序添加到U1 中,并构造(build)该程序,将asm文件编译成hex文件,将可

    2024年02月05日
    浏览(33)
  • 山东大学计算机组成与设计实验四 移位器

    山东大学计算机组成与设计实验四移位器, 山东大学计算机组成与设计实验, 山东大学计算机组成与设计实验报告, 计算机组成原理实验报告, 山东大学计算机组成原理实验报告 本实验要求采用传送方式实现二进制数的移位电路。图4.4给出了可对四位二进制数实现左移1位(×

    2024年02月12日
    浏览(31)
  • 山东大学单片机原理与应用实验 3.8 ADC0808/9信号采集实验

    目录 一、实验题目 二、实验要求 三、实验过程及结果分析 四、实验流程图 五、实验源代码 3.8 ADC0808信号采集实验 1、画出实验的流程图 2、编写源程序并进行注释 3、记录实验过程 4、记录程序运行结果截图 利用LCD1602和AD0808实现简单的交流信号过零检测与频率分析。要求信

    2024年02月07日
    浏览(36)
  • 山东大学数据结构课设第一部分实验二——外排序

    题目要求: 应用输者树结构模拟实现外排序。 基本要求: 1. 设计并实现 最小输者树 结构 ADT , ADT 中应包括初始化、返回赢者,重构等基本操作。 2. 应用最小输者树设计实现外排序,外部排序中的生成最初归并串以及 K 路归并都应用最小输者树结构实现; 3. 验证你所实现

    2024年04月26日
    浏览(19)
  • 山东大学计算机组成与设计实验七 节拍脉冲发生器时序电路

    山东大学计算机组成与设计实验七 节拍脉冲发生器时序电路实验, 山东大学计算机组成与设计实验, 山东大学计算机组成与设计实验报告, 计算机组成原理实验报告, 山东大学计算机组成原理实验报告 掌握节拍脉冲发生器的设计方法,理解节拍脉冲发生器的工作原理。 连续节

    2023年04月15日
    浏览(55)
  • 山东大学单片机原理与应用实验 4.5 8255并行I/O扩展及交通信号灯控制实验

    目录 一、实验题目 二、实验要求 三、实验过程及结果分析 四、实验流程图 五、实验源代码 4.5 8255并行I/O扩展及交通信号灯控制实验 1、画出实验的流程图 2、编写源程序并进行注释 3、记录实验过程 4、记录程序运行结果截图 本实验利用 8255 实现可编程的并行 IO 扩展功能

    2024年02月05日
    浏览(66)
  • 山东大学计算机网络期末

    内容仅供参考。如有错误之处,敬请指正! 第一章 概述 第二章 物理层 第三章 数据链路层 第四章 介质访问子层 第五章 网络层 第六章 传输层 第七章 应用层 1.基本概念 计算机网络定义: 表示一组通过单一技术相互连接起来的自主计算机集合。 分布式系统: 是建立在网络

    2024年02月03日
    浏览(44)
  • 2021山东大学众智期末复习笔记

    目录 社交网络 同质性 正负关系 小世界 搜索引擎 博弈论 市场 权力 从众 新事物的扩散 信息不对称 流⾏病和线粒体夏娃 强连通图:有向图G中,任意两点可以相互到达。 有向图的强连通分量:有向图中的极大强连通子图。 三元闭包:如果两个互不相识的人有了一个共同的朋

    2023年04月08日
    浏览(43)
  • 整数序列(山东大学考研机试题)

    题目链接:3717. 整数序列 - AcWing题库

    2024年02月13日
    浏览(43)
  • 【山东大学】web数据管理——复习笔记

    写在前面 若有图片加载失败,请 科学上网 。 本文为对软件学院连老师的PPT课件总结所得的复习笔记,仅供参考。不保证对考点的全覆盖,以PPT为主。 对往年考过的题相关知识点前面都标注了“考过”,并高亮,供参考。 写的比较匆忙,有遗漏、错误之处敬请指正。 笔记中

    2024年02月08日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包