MATLAB 全景图切割及盒图显示的实现步骤

 参考:MATLAB 全景图切割及盒图显示的实现步骤 | w3cschool笔记

在摄像领域中全景图是一种可以将周围360度景象全部收录的一种拍照技术,但全景图的实际观感并不是那么好(可以看下文的全景图的样例)。我们可以通过matlab来进行全景图的切割,然后转化为盒图的方式显示出来。

part1 全景图切割

原图:

全景图

切割效果:

切割效果

切割

以下是切割部分步骤:
举这张图为例,图片格式hdr,jpg啥的都行:

全景图

1.1 边缘剔除

有些全景图会自带白灰色边缘,若是直接进行切割便会出现如下效果:

边缘剔除

这时候我们首先要对原图进行白边剔除,代码如下:

oriPic=imread('test.hdr');
[rows,cols,~]=size(oriPic);for i=cols:-1:1tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(:,i,:)=[];elsebreak;end
end
oriPic=oriPic(:,end:-1:1,:);
for i=size(oriPic,2):-1:1tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(:,i,:)=[];elsebreak;end
end
oriPic=oriPic(:,end:-1:1,:);
for i=rows:-1:1tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(i,:,:)=[];elsebreak;end
end
oriPic=oriPic(end:-1:1,:,:);
for i=size(oriPic,1):-1:1tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(i,:,:)=[];elsebreak;end
end
oriPic=oriPic(end:-1:1,:,:);

1.2 图像裁剪

我们要让完成的就是如下的变换和裁剪:

图像变换和裁剪

盒图

这部分其实已经有较为成熟的原理和代码:
代码参考:https://stackoverflow.com/questions/29678510/convert-21-equirectangular-panorama-to-cube-map

原理参考:
http://paulbourke.net/panorama/cubemaps/#1

http://paulbourke.net/panorama/cubemaps/

原理参考文章中更加清晰的变化图:

图像变换

另:
在参考代码的基础上,对映射像素进行了插值处理,可以使图像更加平滑,原理如下:

插值处理

原理公式

主要函数代码:

function resultPic=createCubeMapFace(oriPic,id,height,width)[M,N,~]=size(oriPic);resultPic=zeros([height,width,3]);an=sin(pi/4);ak=cos(pi/4);faceTransform=[0,0;pi/2,0;pi,0;-pi/2,0;0,-pi/2;0,pi];ftu=faceTransform(id,1);ftv=faceTransform(id,2);for y=0:height-1for x=0:width-1nx=y/height-0.5;ny=x/width-0.5;nx=nx*2*an;ny=ny*2*an;if (ftv == 0)u=atan2(nx, ak);v=atan2(ny*cos(u),ak);u=u+ftu;elseif(ftv>0)d=sqrt(nx*nx+ny*ny);v=pi/2-atan2(d,ak);u=atan2(ny,nx);elsed=sqrt(nx*nx+ny*ny);v=-pi/2+atan2(d,ak);u=atan2(-ny,nx);endu=u/(pi);v=v/(pi/2);while(v<-1)v=v+2;u=u+1;endwhile(v>1)v=v-2;u=u+1;endwhile(u<-1)u=u+2;endwhile(u>1)u=u-2;endu=u/2+0.5;v=v/2+0.5;u=u*(N-1)+1;v=v*(M-1)+1;fv=floor(v);fv1=floor(v)+1;pv=v-fv;fv1(fv1>M)=M;fu=floor(u);fu1=floor(u)+1;pu=u-fu;fu1(fu1>N)=N;resultPic(x+1,y+1,:)=double(oriPic(fv,fu,:)).*(1-pv).*(1-pu)+...double(oriPic(fv1,fu,:)).*(pv).*(1-pu)+...double(oriPic(fv,fu1,:)).*(1-pv).*(pu)+...double(oriPic(fv1,fu1,:)).*(pv).*(pu);endendresultPic=uint8(resultPic);
end

函数调用及图像存储:
这里后面长宽数值可以任意设定,但是要求长宽数值一致,如果按照当前写法,结果被存储至result文件夹:

if ~exist('result','dir')mkdir('result');
endfor i=1:6resultPic=createCubeMapFace(oriPic,i,500,500);figure(i)imshow(resultPic)imwrite(resultPic,['result',num2str(i),'.jpg'])
end

另: 如图所示
图片序号[1,2,3,4,5,6]分别对应图片[右,后,左,前,上,下]

盒图结构

1.3 完整代码

function panoramic2box
oriPic=imread('889027-884424860.jpg');
[rows,cols,~]=size(oriPic);for i=cols:-1:1tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(:,i,:)=[];elsebreak;end
end
oriPic=oriPic(:,end:-1:1,:);
for i=size(oriPic,2):-1:1tempListR=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListG=oriPic(floor(rows/4):ceil(3*rows/4),i,1);tempListB=oriPic(floor(rows/4):ceil(3*rows/4),i,1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(:,i,:)=[];elsebreak;end
end
oriPic=oriPic(:,end:-1:1,:);
for i=rows:-1:1tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(i,:,:)=[];elsebreak;end
end
oriPic=oriPic(end:-1:1,:,:);
for i=size(oriPic,1):-1:1tempListR=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListG=oriPic(i,floor(cols/4):ceil(3*cols/4),1);tempListB=oriPic(i,floor(cols/4):ceil(3*cols/4),1);if all(round(tempListR-mean(tempListR))==0)&&all(tempListR==tempListG)&&all(tempListR==tempListB)oriPic(i,:,:)=[];elsebreak;end
end
oriPic=oriPic(end:-1:1,:,:);
% =========================================================================
if ~exist('result','dir')mkdir('result');
endfor i=1:6resultPic=createCubeMapFace(oriPic,i,500,500);figure(i)imshow(resultPic)imwrite(resultPic,['result',num2str(i),'.jpg'])
end% =========================================================================
function resultPic=createCubeMapFace(oriPic,id,height,width)[M,N,~]=size(oriPic);resultPic=zeros([height,width,3]);an=sin(pi/4);ak=cos(pi/4);faceTransform=[0,0;pi/2,0;pi,0;-pi/2,0;0,-pi/2;0,pi];ftu=faceTransform(id,1);ftv=faceTransform(id,2);for y=0:height-1for x=0:width-1nx=y/height-0.5;ny=x/width-0.5;nx=nx*2*an;ny=ny*2*an;if (ftv == 0)u=atan2(nx, ak);v=atan2(ny*cos(u),ak);u=u+ftu;elseif(ftv>0)d=sqrt(nx*nx+ny*ny);v=pi/2-atan2(d,ak);u=atan2(ny,nx);elsed=sqrt(nx*nx+ny*ny);v=-pi/2+atan2(d,ak);u=atan2(-ny,nx);endu=u/(pi);v=v/(pi/2);while(v<-1)v=v+2;u=u+1;endwhile(v>1)v=v-2;u=u+1;endwhile(u<-1)u=u+2;endwhile(u>1)u=u-2;endu=u/2+0.5;v=v/2+0.5;u=u*(N-1)+1;v=v*(M-1)+1;fv=floor(v);fv1=floor(v)+1;pv=v-fv;fv1(fv1>M)=M;fu=floor(u);fu1=floor(u)+1;pu=u-fu;fu1(fu1>N)=N;resultPic(x+1,y+1,:)=double(oriPic(fv,fu,:)).*(1-pv).*(1-pu)+...double(oriPic(fv1,fu,:)).*(pv).*(1-pu)+...double(oriPic(fv,fu1,:)).*(1-pv).*(pu)+...double(oriPic(fv1,fu1,:)).*(pv).*(pu);endendresultPic=uint8(resultPic);
end
end

1.4 其他几组切割结果

图片源自:https://www.cgmodel.com/article/9004.html

全景图


 

切割效果


 

在这里插入图片描述


 

在这里插入图片描述


 

在这里插入图片描述

在这里插入图片描述

part2 盒图展示

2.1 曲面绘制

使用surf绘制各个曲面后,并为各个曲面贴图:

for i=1:6oriPic.(['p',num2str(i)])=imread(['result',num2str(i),'.jpg']);   
end
[rows,cols,~]=size(oriPic.p1);
[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);ax=gca;hold(ax,'on')surf(baseXY(:,end:-1:1)-(1+rows)/2,-(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')
surf(-(rows-1)./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')
surf(baseXY-(1+rows)/2,(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')
surf((rows-1)./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,ones(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows-1+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')

在这里插入图片描述

在这里插入图片描述

2.2 视角调整

通过设置axes属性将视角调整至盒子里面

ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')
ax.ZLim=[0,rows+1];
ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.Color=[0 0 0];
ax.CameraPosition=[0,0,rows/2];
ax.CameraPositionMode='manual';
ax.DataAspectRatio=[1,1,1];
ax.DataAspectRatioMode='manual';
ax.Projection='perspective';
ax.CameraTargetMode='manual';
ax.CameraViewAngle = 7;
ax.View=[-2.7391 90.0000];
ax.CameraTarget=[0 0 (rows-1)/2];
ax.Toolbar.Visible='on';

 

运行后点击那个三位旋转按钮即可开始漫游

在这里插入图片描述

此时的盒图是无缝隙版本,有缝隙版放在后面

在这里插入图片描述

2.3 完整代码

无缝隙版:

function showBox
for i=1:6oriPic.(['p',num2str(i)])=imread(['result',num2str(i),'.jpg']);   
end
[rows,cols,~]=size(oriPic.p1);
[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);fig=figure('units','pixels','position',[300 80 500 500],...'Numbertitle','off','menubar','none','resize','off',...'name','box');ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')
ax.ZLim=[0,rows+1];
ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.Color=[0 0 0];
ax.CameraPosition=[0,0,rows/2];
ax.CameraPositionMode='manual';
ax.DataAspectRatio=[1,1,1];
ax.DataAspectRatioMode='manual';
ax.Projection='perspective';
ax.CameraTargetMode='manual';
ax.CameraViewAngle = 7;
ax.View=[-2.7391 90.0000];
ax.CameraTarget=[0 0 (rows-1)/2];
ax.Toolbar.Visible='on';surf(baseXY(:,end:-1:1)-(1+rows)/2,-(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')
surf(-(rows-1)./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')
surf(baseXY-(1+rows)/2,(rows-1)./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')
surf((rows-1)./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,ones(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows-1+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')end

在这里插入图片描述

有缝隙版:

function showBox2
for i=1:6oriPic.(['p',num2str(i)])=imread(['result',num2str(i),'.jpg']);   
end
[rows,cols,~]=size(oriPic.p1);
[baseXY,baseZ]=meshgrid(1:cols,rows:-1:1);fig=figure('units','pixels','position',[300 80 500 500],...'Numbertitle','off','menubar','none','resize','off',...'name','box');ax=axes('parent',fig,'position',[-0.45 -0.45 1.9 1.9]);hold(ax,'on')
ax.ZLim=[0,rows+1];
ax.XLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.YLim=[0-(1+rows)/2,rows+1-(1+rows)/2];
ax.Color=[0 0 0];
ax.CameraPosition=[0,0,rows/2];
ax.CameraPositionMode='manual';
ax.DataAspectRatio=[1,1,1];
ax.DataAspectRatioMode='manual';
ax.Projection='perspective';
ax.CameraTargetMode='manual';
ax.CameraViewAngle = 7;
ax.View=[-2.7391 90.0000];
ax.CameraTarget=[0 0 (rows+1)/2];
ax.Toolbar.Visible='on';surf(baseXY(:,end:-1:1)-rows/2,-rows./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p1,'EdgeColor','none','FaceColor','interp')
surf(-rows./2.*ones(size(baseXY)),baseXY-(1+rows)/2,baseZ,'CData',oriPic.p2,'EdgeColor','none','FaceColor','interp')
surf(baseXY-(1+rows)/2,rows./2.*ones(size(baseXY)),baseZ,'CData',oriPic.p3,'EdgeColor','none','FaceColor','interp')
surf(rows./2.*ones(size(baseXY)),baseXY(:,end:-1:1)-(1+rows)/2,baseZ,'CData',oriPic.p4,'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,zeros(size(baseXY)),'CData',oriPic.p6(end:-1:1,end:-1:1,:),'EdgeColor','none','FaceColor','interp')
surf(baseXY'-(1+rows)/2,baseXY-(1+rows)/2,rows+ones(size(baseXY)),'CData',oriPic.p5(:,end:-1:1,:),'EdgeColor','none','FaceColor','interp')end

在这里插入图片描述

在这里插入图片描述

以上就是MATLAB 全景图切割及盒图显示的详细内容

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

4.CentOS7安装MySQL5.7

CentOS7安装MySQL5.7 2023-11-13 小柴你能看到嘛 哔哩哔哩视频地址 https://www.bilibili.com/video/BV1jz4y1A7LS/?vd_source9ba3044ce322000939a31117d762b441 一.解压 tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz1.在/usr/local解压 tar -xvf mysql-5.7.44-…

R语言——taxize(第一部分)

ropensci 系列之 taxize &#xff08;中译手册&#xff09; taxize 包1. taxize支持的网络数据源简介目前支持的API&#xff1a;针对Catalogue of Life&#xff08;COL&#xff09; 2. 浅尝 taxize 的一些使用例子2.1. **从NCBI上获取唯一的分类标识符**2.2. **获取分类信息**2…

list复制出新的list后修改元素,也更改了旧的list?

例子 addAll() Testpublic void CopyListTest(){Student student Student.builder().id(1).name("张三").age(23).classId(1).build();Student student2 Student.builder().id(2).name("李四").age(22).classId(1).build();List<Student> student…

ElasticSearch的文档、字段、映射和高级查询

1. 文档&#xff08;Document&#xff09; 在ES中一个文档是一个可被索引的基础信息单元&#xff0c;也就是一条数据 比如&#xff1a;你可以拥有某一个客户的文档&#xff0c;某一个产品的一个文档&#xff0c;当然&#xff0c;也可以拥有某个订单的一个文档。文档以JSON&…

[文件读取]lanproxy 文件读取 (CVE-2021-3019)

1.1漏洞描述 漏洞编号CVE-2021-3019漏洞类型文件读取漏洞等级⭐漏洞环境VULFOCUS攻击方式 描述: Lanproxy 路径遍历漏洞通过../绕过读取任意文件。该漏洞允许目录遍历读取/../conf/config.properties来获取到内部网连接的凭据。 1.2漏洞等级 高危 1.3影响版本 Lanproxy 1.4漏洞…

块设备的工作模式

块设备的mknod 还是会创建在 /dev 路径下面&#xff0c;这一点和字符设备一样。/dev 路径下面是 devtmpfs 文件系统。这是块设备遇到的第一个文件系统。我们会为这个块设备文件&#xff0c;分配一个特殊的 inode&#xff0c;这一点和字符设备也是一样的。只不过字符设备走 S_IS…

Linux C 目录编程

目录编程 前言目录编程函数mkdir  创建目录rmdir  删除目录opendir  打开目录readdir  读取目录stat  获取文件信息chdir  跳转目录closedir  关闭目录 判断文件类型的宏遍历指定目录及子目录下所有.c文件示例 前言 相较于文件编程&#xff0c;目录编程也有一套自…

主题讲座:全球增材制造现状与未来(暨香港科技大学广州|智能制造学域2024博士学位全额奖学金项目)

时间&#xff1a;2023 年11月16日&#xff08;星期四&#xff09;14:30 地点&#xff1a;合肥工业大学 学术会议中心三楼报告厅 主讲嘉宾&#xff1a;陈模军 助理教授 https://facultyprofiles.hkust-gz.edu.cn/faculty-personal-page/CHEN-Mojun/mjchen 报名表直达&#xff1…

uniapp打包安卓app获取包名

uniapp打包安卓app获取包名的两种方式 1.uniapp云打包 这上面直接可以看到包名&#xff0c;可以修改&#xff0c;也可以在 manifest.json 文件中配置修改 package配置的就是包名&#xff0c;要确保唯一性 2.使用aapt工具获取 1.下载aapt工具&#xff0c;然后添加到环境变量…

如何更好的使用Copilot

Copilot从诞生到现在过去了挺长时间了&#xff0c;大家对Copilot的评价算是褒贬不一吧。有些人觉得Copilot高效且神奇&#xff0c;可以对自己的工作大大提效&#xff1b;有些觉得也就那样&#xff0c;为什么要花那么多钱做这个事情&#xff0c;钱它不香吗&#xff1f; 从最开始…

学习samba

文章目录 一、samba介绍二、samba的主要进程三、配置文件四、例子 一、samba介绍 1、SMB&#xff08;Server Message Block&#xff09;协议实现文件共享&#xff0c;也称为CIFS&#xff08;Common Internet File System&#xff09;。 2、是Windows和类Unix系统之间共享文件的…

Java 入门基础题

目录 1.输出一个整数的每一位 2.判定素数 3.求最大值方法的重载 4.输出闰年 5.打印 X 图形 6.数字9 出现的次数 7.计算分数的值 8. 模拟登陆 9.使用函数求最大值 10.斐波那契数列 星光不负赶路人&#xff0c;加油铁子们&#xff01;&#xff01;&#xff01; 1…

vscode使用flake8设置单行最长字符限制设置失败的问题

vscode使用flake8设置单行最长字符限制设置失败的问题 问题描述解决方案 问题描述 如图所示&#xff0c;使用flake8单行字数过长&#xff0c;就会有有红色底的波浪线 一般情况下很多教程都会让你在setting.json里面设置 但是我打开我的setting.json&#xff0c;发现我已经进…

基于SSM的供电所档案管理系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6)

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图&#xff0c;Kotlin&#xff08;6&#xff09; Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图&#xff0c;Kotlin&#xff08;5&#xff09;-CSDN博客文章浏览阅读1.3k次。&#xfeff;&#xfeff;Android Dyna…

服务器中了locked勒索病毒怎么处理,locked勒索病毒解密,数据恢复

近几年&#xff0c;网络应用技术得到了迅速发展&#xff0c;越来越多的企业开始走向数字化办公&#xff0c;极大地为企业的生产运营提供了帮助&#xff0c;但是网络技术的发展也为网络安全埋下隐患。最近&#xff0c;locked勒索病毒非常嚣张&#xff0c;几乎是每隔两个月就会对…

Python---集合中的交集 、并集 | 与差集 - 特性

用 & 来求两个集合的交集&#xff1a;-----键盘上的7上的符号&#xff0c;shift 7 同时按 用 | 来求两个集合的并集&#xff1a; -----键盘上的7上的符号&#xff0c;shift 同时按&#xff08;就是enter键上面那个|\ &#xff09; 用 - 来求两个集合的差集&#xff…

在IDEA中使用maven项目总结

一 什么是maven Maven本身也是Java写的&#xff0c;他是一款服务于Java平台的自动化构建工具 Maven是一个项目管理工具&#xff0c;旨在简化软件项目的构建、依赖管理和项目信息管理。它使用基于项目对象模型&#xff08;Project Object Model&#xff0c;POM&#xff09;的…

excel表的筛选后自动求和

一般都使用subtotal函数。 通过看一个大佬的视频&#xff0c;发现可以有更简单的方法。 首先任意筛选数据(ctrlshiftl)&#xff0c; 然后选中需要求和的列的最下方的空白单元格&#xff0c;再按alt。 回车即可。 实质它还是用的subtotal函数

拍摄视频的时候相机断电导致视频文件损坏,怎么修复

3-4 现在好多人都有自己的相机&#xff0c;但是专业用来录像的机器应该是不太可能都有的&#xff0c;相机的稳定性会比专业的机器差一些&#xff0c;如果用于比较重要的场景&#xff0c;比如婚庆、会议录像、家庭录像使用等&#xff0c;有较少的概率会出现一些奇怪的情况&…