AR(Augmented Reality)是计算机视觉方面一个重要的研究方向,原来听说过,感觉很有意思,故究其原理,用一定的视觉算法加以实现。

这里主要用到相机标定和一些图像的投影透视变换的技术,标定的目的是获取相机的内外参,从而获得投影矩阵P,然后进行下面的点映射之间的关系。一般情况下的相机标定是非常成熟不过的东西了,技术文章也是铺天盖地,目前绝大数标定方法都属于张正友的方法,OpenCV和Matlab官方都是采用张正友的,在此不具体阐述,如有需要,请参考官方文档。但在现实应用中,张正友方法并非总是合适,要适合自己的场合使用,就需要掌握额外的高等数学知识,尤其是对相机矩阵P的理解。本篇博客不深入透析标定原理,坐标关系,只做简单说明。透视变换可参考我这篇博客原理。

一、基于AR的Demo

直接上动态gif图,把一部电影片段加进去了:),(限于CSDN只能上传小于5M的图片,没办法长传完整的( ▼-▼ ))

二、代码实现

运行以下代码前,需要实现对相机进行标定,简单标定可参考这里。“mydata.mat”为标定后存储的参数。为了提高速度,程序基本上没有循环,尽量采用矩阵向量运算。

function main()
% AR demo
% author:cuixingxing
% email: cuixingxing150@gmail.com
% 2018.8.4
%close all;
clear;clc;%% 导入各类参数,AR增强现实,加入图片
load('mydata.mat')% 相机标定的数据,保存相机cameraParameters对象,图像点和世界坐标点集
logo = imread('demo.png');% 读入自己的图片,图片任意%%
movingPts = [1,1;size(logo,2),1;1,size(logo,1);size(logo,2),size(logo,1)];
cap1 = webcam(3);
squareSize = 38.72;% 标定版方格宽度 mmv = VideoWriter('my_AR.avi');% save
open(v);
colors = randi(255,12,3);% 12 条棱线颜色
player1 = vision.DeployableVideoPlayer('Location', [20, 400]);
frame1 = snapshot(cap1);
step(player1, frame1);while player1.isOpen()logo = imresize(logo,[200,320]);% 电影图像frame1 = snapshot(cap1);drawImg = frame1;[imagePoints,boardSize,isused]=detectCheckerboardPoints(frame1);if all(isused)&& size(imagePoints,1)==size(worldPoints1,1)rows = boardSize(1)-1;cols = boardSize(2) - 1;% 世界坐标中4个角点坐标,这个定义好point3D_1 = [0,0,0];point3D_2 = [cols*squareSize,point3D_1(2),0];point3D_3 = [point3D_1(1),rows*squareSize,0];point3D_4 = [point3D_1(1),point3D_1(2),-220];% 单位毫米% 抠图到长方体顶面[rotMat,transVec] = extrinsics(imagePoints,worldPoints1,cameraParams1);projectMat = cameraMatrix(cameraParams1,rotMat,transVec);[lines,points2D] = GetSquareEdge(point3D_1,point3D_2,point3D_3,point3D_4,projectMat);tform = fitgeotrans(movingPts,points2D(4:7,:),'projective');logo_tf = imwarp(logo,tform);[x,y,Height,Width] = GetHW(points2D(4:7,:),frame1);if isempty(x)continue;endlogo_tf = imresize(logo_tf,[Height,Width]);ROI = frame1(y:y+Height-1,x:x+Width-1,:);ROI(logo_tf~=0) = logo_tf(logo_tf~=0);frame1(y:y+Height-1,x:x+Width-1,:) = ROI;% 在图像上画轴drawImg = insertShape(frame1,'Line',lines,'LineWidth',8,'Color',colors);step(player1, drawImg);elsestep(player1, drawImg);end writeVideo(v,drawImg);
end
close(v);
release(player1);

一些子函数:

注意点顺序关系图为:

function [lines,points2D] = GetSquareEdge(point3D_1,point3D_2,point3D_3,point3D_4,projectMat)
% 功能:根据相邻的4个角点,获取正方形的棱边
% 输入:point3D_1,1*3 double ,[x,y,z],坐标原点世界坐标
%      point3D_2,1*3 double ,[x,y,z],相邻角点世界坐标
%      point3D_3,1*3 double ,[x,y,z],相邻角点世界坐标
%      point3D_4,1*3 double ,[x,y,z],相邻角点世界坐标
%      projectMat,4*3 double,相机投影矩阵,注意有的地方是3*4,有个转置关系
% 输出: lines, 12*4 double,形如[x1,y1,x2,y2; x3,y3,x4,y4,...]每行为每条线的起始点和终点坐标
%       points2D, 8*2 double,图像上顶点坐标
%
% author:cuixingxing
% email: cuixingxing150@gmail.com
% 2018.8.4
%point3D_5 = [point3D_2(1),point3D_1(2),point3D_4(3)];point3D_6 = [point3D_1(1),point3D_3(2),point3D_4(3)];point3D_7 = [point3D_2(1),point3D_3(2),point3D_4(3)];point3D_8 = [point3D_2(1),point3D_3(2),point3D_1(3)];points3D = [point3D_1;point3D_2;point3D_3;point3D_4;point3D_5;point3D_6;point3D_7;point3D_8];%% points2Dpoints2D = [points3D,ones(8,1)]*projectMat;points2D = points2D./points2D(:,3);points2D = points2D(:,1:2);lines = [points2D(1,:),points2D(2,:);points2D(1,:),points2D(3,:);points2D(2,:),points2D(8,:);points2D(3,:),points2D(8,:);points2D(1,:),points2D(4,:);points2D(3,:),points2D(6,:);points2D(2,:),points2D(5,:);points2D(7,:),points2D(8,:);points2D(4,:),points2D(6,:);points2D(4,:),points2D(5,:);points2D(5,:),points2D(7,:);points2D(6,:),points2D(7,:)];
function [minx,miny,Height,Width] = GetHW(points,frame)
% 功能:获取二维图像上n个平面点集points的最小平行于轴的矩形
% 输入:points, n*2 double ,[x,y]点集坐标,像素坐标
%      frame,原图像
%输出: minWidth,矩形宽度,1*1 double
%      minHeight,矩形高度,1*1 double
%
% author:cuixingxing
% email: cuixingxing150@gmail.com
% 2018.8.4
%minx = round(min(points(:,1)));
maxx = round(max(points(:,1)));
miny = round(min(points(:,2)));
maxy = round(max(points(:,2)));Width = maxx-minx;
Height = maxy-miny;if minx<=0||miny<=0||minx+Width>=size(frame,2)||miny+Height>=size(frame,1)minx =[];miny = [];Width = [];Height = [];
end

基于AR的实时算法在虚拟屏幕上播放视频及实现相关推荐

  1. Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]

    1.图片演示 2.视频演示 [项目分享]Python基于OpenCV的实时疲劳检测[源码&演示视频&部署教程]_哔哩哔哩_bilibili 3.检测方法 1)方法 与用于计算眨眼的传统 ...

  2. android 行车记录仪分析,基于Android架构行车记录仪的异常掉电可播放视频方法与流程...

    本发明涉及摄录像视频技术领域,特别涉及一种基于Android架构行车记录仪的异常掉电可播放视频方法. 背景技术: 随着车联网概念的兴起和技术的积累,越来越多的智能设备被接入到车辆上.行车记录仪作为非常 ...

  3. HDR视频能不能在非HDR屏幕上播放呢

    不少朋友尝试过在非HDR屏幕上播放HDR视频发现会变灰吧,另外4K显示1080和1080屏幕相比有没有差别呢? 实际上这里面水可深得很.HDR和非HDR是两套亮度/色度体系,就像是语言体系上的差别那么 ...

  4. 怎样录制电脑屏幕上播放的影视视频

    如今好看的电影或者电视视频越来越多了,每年甚至每个季度都会有几部精彩的影视被发布出来.而在这些影视上映出来之后,很多人都会将这些影视中的一些精彩的片段给录制下来,然后经过一些后期处理制作成一个影视类的 ...

  5. 基于FPGA的实时图像边缘检测系统设计(上)

    今天给大侠带来基于FPGA的实时图像边缘检测系统设计,由于篇幅较长,分三篇.今天带来第一篇,上篇,话不多说,上货. 导读 随着科学技术的高速发展,FPGA在系统结构上为数字图像处理带来了新的契机.图像 ...

  6. java中arSigal_基于AR模型谱估计算法(Yule-Walker方法与Burg方法)的C++实现

    头文件: /* * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com * * This program is free so ...

  7. Android 使用 ADB 命令录制屏幕上的视频

    ADB 录制使用使用到的 screenrecord  顺便提一下截图使用的是screencap 关于截图可以看这篇文章,点击可以查看 首先需要我们确保adb devices 输入有显示内容 然后在终端 ...

  8. [SimplePlayer] 2. 在屏幕上显示视频图像

    我们这里采用SDL(本文所用版本为SDL2.0.5)来进行图像输出,SDL在进行图像渲染时一般采用的会是direct3D或者opengl,SDL对它们进行了封装,不过我们这里只讨论SDL的使用,并不会 ...

  9. 一文全面了解基于内容的推荐算法

    作者丨gongyouliu 来源 | 转载自大数据与人工智能(ID:ai-big-data) 这篇文章我们主要关注的是基于内容的推荐算法,它也是非常通用的一类推荐算法,在工业界有大量的应用案例. 本文 ...

最新文章

  1. hdu2870暴力或者dp优化
  2. 用css、html编写一个两列布局的网页,名称为css.html ,要求左侧宽度为200px ,右侧自动扩展...
  3. Java SecurityManager checkAccess()方法与示例
  4. 一个不会言谈的程序猿,惊奇发现自己能力的多么的优秀
  5. 单变量求解C语言,二分法求解单变量非线性方程及其应用与实现.doc
  6. 用户列表 html,用户列表.html
  7. NB-IoT窄带物联网技术项目开发教程--技术简介(一)
  8. VS2015安装教程及卸载教程
  9. cobar mysql部署方案_阿里巴巴分布式数据库解决方案——Cobar中间件配置详解 (转)...
  10. mysql获取记录的插入时间_mysql 自动记录数据插入及最后修改时间
  11. 自下而上与自上而下的归并排序
  12. python 打开xls文件写数据
  13. 聚观早报 | 苹果2024年放弃高通;腾讯回应进军类 ChatGPT
  14. 微信和抖音都到十亿级用户了,作为产品经理的你们觉得哪个产品更成功?
  15. Hive相关(概述、环境搭建、命令、API、JDBC、HBase整合等)
  16. Html 使用svg图标、iconfont的使用方法
  17. 2022湖南最新消防设施操作员模拟试题题库及答案
  18. Pytorch 查看模型参数
  19. 天线测试常见问题汇总和解答
  20. Kubernetes(四) - Pod和Deployment

热门文章

  1. 程序员应该懂的九件事
  2. java旅游管理开题答辩ppt,旅游管理开题报告
  3. Socket通信原理(多线程)
  4. EMAIL的客户端程序
  5. 【转】“纯洁的微笑”博主既然发广告了,《长投学堂》是怎么火起来的?
  6. 为什么苹果要移除YouTube应用
  7. MySQL各种优化基于《高性能MySQL第三版》
  8. 阅读与准备作业 吴昊阳
  9. How to Using exploits.
  10. 试一下JAVAMAIL