java怎么实现基于opencv全景图合成的示例

  介绍

小编给大家分享一下java怎么实现基于opencv全景图合成的示例,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!

<强>全景图概述

每当一个平面图像映射到一个弯曲的表面就会发生图象投影,反之亦然,这中现象特别常见于全景摄影,例如地球的球面可以映射到一块平坦的纸张。由于在我们周围的整个视场的可以被认为是作为球体的表面(对于所有观测角度),我们需要一种能将球形投影到二维平面以便照片打印的方法。

癹ava怎么实现基于opencv全景图合成的示例"

小的视角相对容易进行形变并投影到平坦的纸上。但是,当试图把一个球形图像映射到一个平面上,有些变形是不可避免的。因此,每一种类型的投影仅仅尝试避免一种类型的失真,这是以牺牲其他失真为代价的。随着视场角增大,观测弧(查看弧)变得更弯曲,从而全景投影类型之间的差异变得更加显着。什么时候使用那一种投影,在很大程度上取决于每个投影应用。在这里,我们集中介绍在几个最常用。

<强>前言

因项目需要,自己做了演示,从中学习很多,所以分享出来,希望有这方面需求的少走一些弯路,opencv怎么安装网上教程多的多,这里不加详细说明,我安装的opencv-3.3.0

癹ava怎么实现基于opencv全景图合成的示例"

如上图所示,找到相应的jar包,这里讲一下如何这个jar如何导入Maven仓库

mvn 安装:install-file  -Dfile=D: \ opencv-3.0.0 \ opencv \制造\ java \ opencv - 300. - jar    -DgroupId=com.suibian  -DartifactId=opencv - 300, -Dversion=3.3.0  -Dpackaging=jar  -DgeneratePom=true  -DcreateChecksum=true

癹ava怎么实现基于opencv全景图合成的示例"

& lt; groupId> com.suibian   ,& lt; artifactId> opencv - 300 & lt;/artifactId>   ,& lt; version> 3.3.0

好了,这样java可以通过这个jar操作opencv,那我们看一下,当然你能这样想,说明你很单纯,让我们看一下opencv中萤火虫中的路径和jar中包的对比

癹ava怎么实现基于opencv全景图合成的示例"

哈哈,全景图的关键缝合并没有,而且面向java的2015年以后就一直没有更新,如下图所示一个全景图(傻瓜)合成的关键类没有,但是c++给我提供了

癹ava怎么实现基于opencv全景图合成的示例"

那怎么办呢,如何用java调用c++的代码,我们知道和操作系统打交道,C/c++无疑比java更合适,opencv图形处理的这方面的应用,大多数是c++开发比较多,java中的一个关键字本地大家都不陌生吧,然而我们想点进的去,想看看是怎么实现的,怎么也点不进的去,因为他就不是java写的,可能是C/c++,本地对应都是java中jre下本目录的XXX。dll文件,所以把我们要使用的c++代码打包成dll格式的文件放到本目录即可,当然这涉及到方法的参数和返回值,废话不多说,安装visual studio 2017中,安装教程网上教程很多

癹ava怎么实现基于opencv全景图合成的示例"

点击文件——在新建——→项目——→windows桌面——在动态链接库(dll),这样项目就新建成功,接下来上代码

这是全景图合成的c++代码

# include “stdafx.h"   # include  & lt; iostream>   # include  & lt; opencv2/核心/core.hpp>   # include  & lt; opencv2/highgui/highgui.hpp>   # include  & lt; opencv2/imgproc/imgproc.hpp>   # include  & lt; opencv2/opencv.hpp>   using  namespace 性传播疾病;   using  namespace 简历;   bool  try_use_gpu =,假;   vector,一个;   string  result_name =,“D:/result1.jpg";   命令行参数个数,int  _tmain (int  char  *, argv [])   {   ,Mat  img1 =, imread (“D:/quanjingtu/hh/1. jpg");   ,Mat  img2 =, imread (“D:/quanjingtu/hh/2. jpg");   ,Mat  img3 =, imread (“D:/quanjingtu/hh/3. jpg");   ,Mat  img4 =, imread (“D:/quanjingtu/hh/4. jpg");   ,Mat  img5 =, imread (“D:/quanjingtu/hh/5. jpg");   ,Mat  img6 =, imread (“D:/quanjingtu/hh/6. jpg");   ,Mat  img7 =, imread (“D:/quanjingtu/hh/7. jpg");   ,Mat  img8 =, imread (“D:/quanjingtu/hh/8. jpg");   ,Mat  img9 =, imread (“D:/quanjingtu/hh/9. jpg");   ,Mat  img10 =, imread (“D:/quanjingtu/hh/10. jpg");   ,   ,//Mat  img6 =, imread (“6. jpg");   ,if  (img1.empty (), | |, img2.empty ())   ,{   ,cout  & lt; & lt;“停下来# 39;t  read  image", & lt; & lt;, endl;   ,return  1;   ,}   ,imgs.push_back (img1);   ,imgs.push_back (img2);   ,imgs.push_back (img3);   ,imgs.push_back (img4);   ,imgs.push_back (img5);   ,imgs.push_back (img6);   ,imgs.push_back (img7);   ,imgs.push_back (img8);   ,imgs.push_back (img9);   ,imgs.push_back (img10);   ,      ,   ,//imgs.push_back (img6);   ,Stitcher  Stitcher =,订书机:createDefault (try_use_gpu);//大敌;使用针函数进行拼接   ,Mat 帕诺人;   ,订书机:Status  Status =, stitcher.stitch(一个,帕诺人);   ,imwrite (result_name,帕诺人);   ,Mat  pano2 =, pano.clone ();   ,//显示源图像,和结果图像   ,//imshow(“全景图像,,,帕诺人);   ,if  (waitKey (),==, 27)   ,return  0;   ,//imwrite (result_name,帕诺人);   }

java怎么实现基于opencv全景图合成的示例