java 实现基于opencv全景图合成

基于JAVA JNI的opencv全景图的拼接 最近做图像的处理这块,但是大多数对图像的处理都是使用c++去做的,比如opencv就是用c/c++去做的。网上对用java去做图像的拼接的资料倒是不多,于是我写这篇文章给大家提供一个思路。软件vs2017及eclipse 首先新建一个Java项目  new一个类  在类里定义native方法 package com.ws.study; public class JavaPano... 阅读详情

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

 

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

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

 

<groupId>com.suibian</groupId>
  <artifactId>opencv-300</artifactId>
  <version>3.3.0</version>

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

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

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

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

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

复制代码
#include "stdafx.h"
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
bool try_use_gpu = false;
vector<Mat> imgs;
string result_name = "D:/result1.jpg";
int _tmain(int argc, 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 << "Can't read image" << 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 = Stitcher::createDefault(try_use_gpu);
    // 使用stitch函数进行拼接
    Mat pano;
    Stitcher::Status status = stitcher.stitch(imgs, pano);
    imwrite(result_name, pano);
    Mat pano2 = pano.clone();
    // 显示源图像,和结果图像
    //imshow("全景图像", pano);
    if (waitKey() == 27)
        return 0;
    //imwrite(result_name, pano);
}
复制代码

那么java如何和C++进行交互呢,通过java中jni技术

 让我们了解一下java中JNI

  Java Native Interface(简称JNI),Java是跨平台语言,有时候需要调用本地代码,Sun公司提供JNI接口,通过这个接口与操作系统本地代码相互调用,如下图所示是Java中native的调用原理

脉络都理通了,那就开始吧

复制代码
public class OpenCVUtil {
    static {
     //这里的system.load用来加载C++生成的动态链接库,加载实际自己也可以决定不一定非的是静态的。
        System.loadLibrary("OpenCVUtil");
    }

    public static native String changeArrValue(String str);
    public static void main(String[] args) throws UnsupportedEncodingException {
        String base="D:/quanjingtu/gg"+"/";
        int length=5;
        String url="";

        for (int i=1;i<=length;i++){
            if (i==1){
                url=url+base+i+".jpg";
            }else {
                url=url+","+base+i+".jpg";
            }

        }
        //System.out.println(url);
        String temp =new String(changeArrValue(url).getBytes(),"GBK");
        System.out.println(temp); ;

    }
}
复制代码

定义native方法,将该java文件编译成.class文件

进入cmd命令窗口,打开对应编译好的class文件目录执行javah命令

1
javah  -classpath <生成XX.h文件存放位置>  -jni <包路径.类名>

 

 生成对应com_lianxi_securitytest_opencv_OpenCVUtil.h文件

复制代码
#include <jni.h>
/* Header for class com_lianxi_securitytest_opencv_OpenCVUtil */

#ifndef _Included_com_lianxi_securitytest_opencv_OpenCVUtil
#define _Included_com_lianxi_securitytest_opencv_OpenCVUtil
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_lianxi_securitytest_opencv_OpenCVUtil
 * Method:    changeArrValue
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_lianxi_securitytest_opencv_OpenCVUtil_changeArrValue
  (JNIEnv *, jclass, jstring);

#ifdef __cplusplus
}
#endif
#endif
复制代码

只把native方法处理了,复制该文件,到vs 2017项目所在的位置

  

复制代码
#include "stdafx.h"
#include "com_lianxi_securitytest_opencv_OpenCVUtil.h"
#include<iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
#include <string>
using namespace std;
using namespace cv;
bool try_use_gpu = false;
vector<Mat> imgs;
string result_name = "D:/result.jpg";

JNIEXPORT jstring JNICALL Java_com_lianxi_securitytest_opencv_OpenCVUtil_changeArrValue
(JNIEnv *env, jclass obj, jstring prompt) {
    //这是接收过来的字符串,多个路径
    const char* str;
//....................................................................

//...........................


    //imgs.push_back(img6);
    Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
    // 使用stitch函数进行拼接
    Mat pano;
    Stitcher::Status status = stitcher.stitch(imgs, pano);
    imwrite(result_name, pano);
    Mat pano2 = pano.clone();
    // 显示源图像,和结果图像
    //imshow("全景图像", pano);
    if (waitKey() == 27)


        if (status != Stitcher::OK) {
            return env->NewStringUTF("picture failure!!!");
            
        }

    //return env->NewStringUTF(result_name.c_str);
    string newstr = "picture success!!!URL=" + result_name;
    return env->NewStringUTF(const_cast<char*>(newstr.c_str()));
    
}
复制代码

上面就是对应C++代码

点击生成--->重新生成解决方案    生成对应的dll文件,然后放到JDK的jre/bin目录里

 运行java程序,结果如下

 

 看一下合成的全景图吧

 

 


Java服务器部署基于OpenCV的C++图像处理项目(二)编译篇 Java服务器部署基于OpenCV的C++图像处理项目(二) 部署好环境之后,本篇记录编译的详细步骤。部署环境篇 1.创建文件 在native.cpp中写入以下代码。 #include &amp;amp;amp;amp;amp;amp;amp;amp;lt;jni.h&amp;amp;amp;amp;amp;amp;amp;amp;gt; #include &amp;amp;amp;amp;amp;amp;amp;amp;lt;string&amp;amp;am 阅读详情

相关推荐

SIFT图像拼接实战:OpenCV全景图生成指南

计算机视觉中的特征匹配是图像处理的核心技术之一,SIFT(尺度不变特征变换)算法因其尺度不变性成为经典解决方案。该算法通过检测关键点并生成描述符,实现不同视角图像的精准匹配。在OpenCV等成熟框架支持下,开发者无需深入数学原理即可快速实现图像拼接。工程实践中,特征点检测、误匹配剔除、透视变换和图像融合构成完整技术链路,广泛应用于全景摄影、卫星影像拼接等场景。针对内存优化和误匹配等实际问题,合理设置contrastThreshold参数和RANSAC算法能显著提升SIFT的稳定性与效率。

weixin_30603633的博客 386

使用Java api 和 jni混合方式调用OpenCV

from: http://blog.youkuaiyun.com/lingyun_blog/article/details/50733331 [java] view plain copy "font-family:'Helvetica Neue';font-size:14px;">"code" class="java">"code" class="java">"code" class

凌风探梅的专栏 2057

OpenCV 图像拼接

图像拼接是图像处理的重要任务之一,OpenCV提供了强大且易于使用的功能来实现这一目标。它在多种实际应用中证明了其有效性和重要性。

走向CTO的路上... 947

java 全景_java实现,使用opencv合成全景图,前端使用krpano展示

这周花三天做了一demo,算上之前的,怎么也有五天,上一篇是opencv介绍,以及定义native方法,通过本地图片路径传参,底层调用Opencv图像库合成,有兴趣的可以看看,这篇重点在于krpano的全景图展示,话说刚才上传了22张片照片合成全景图,感觉有半个小时也没有合成完,我这电脑是有多垃圾那我们代码走一走(都说不上代码是老流氓)这是demo的目录结构@Controllerpublic cl...

weixin_34755543的博客 1504

java如何实现基于opencv全景图合成实例代码

全景图相信大家应该都不陌生,下面这篇文章主要给大家介绍了关于java如何实现基于opencv全景图合成的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧

泛微E10 eBuilder低代码平台避坑指南:新手最容易犯的5个错误及解决方案

本文针对泛微E10 eBuilder低代码平台的新手开发者,总结了5个最常见错误及解决方案,包括表单联动配置、流程设计权限、动作流时序、数据加工类型转换和权限管理过度配置等问题。通过实战经验和代码示例,帮助开发者避开常见陷阱,提升开发效率。

weixin_30919429的博客 540

java实现,使用opencv合成全景图,前端使用krpano展示

这周花三天做了一demo,算上之前的,怎么也有五天,上一篇是opencv介绍,以及定义native方法,通过本地图片路径传参,底层调用Opencv图像库合成,有兴趣的可以看看,这篇重点在于krpano的全景图展示,话说刚才上传了22张片照片合成全景图,感觉有半个小时也没有合成完,我这电脑是有多垃圾 那我们代码走一走(都说不上代码是老流氓) 这是demo的目录结构 @Controlle...

weixin_30784501的博客 575

机器学习参数寻优:方法、实例与分析

机器学习模型的性能很大程度上依赖于其参数的选择。参数寻优(Hyperparameter Tuning)是提升模型表现的关键步骤之一。本文将详细介绍主流的参数寻优方法,包括网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesian Optimization)、和超参数优化库(如Optuna和Hyperopt)等,并探讨它们的优缺点及适用场景。

甜盐的博客 2843

在java中使用OpenCV 进行全景图切割与拼接

参考资料 http://blog.youkuaiyun.com/qq_30832659/article/details/52494713 环境配置 下载opencv3.0 http://nchc.dl.sourceforge.net/project/opencvlibrary/opencv-win/3.0.0/opencv-3.0.0.exe 配置系统环境变量 将上一步下载文件解压后,大概得到2....

李鬼989的专栏 5172

CS算法实战:用MATLAB从零实现SAR点目标成像(附完整代码)

本文详细介绍了如何使用MATLAB从零实现SAR点目标CS成像算法,涵盖Chirp Scaling(CS)算法的核心理论、距离徙动校正(RCMC)和方位压缩等关键步骤。通过完整的代码示例和实战技巧,帮助读者掌握SAR成像处理算法,提升遥感图像处理能力。

weixin_29211309的博客 180

LBS之五:时空索引--空间邻域搜索的高效实践

时空索引的原理及最佳实践

whascj的博客 1368

【JAVA】将多个相关图片智能拼接成一个全景图

通过无人机/相机等拍摄设备,对某一建筑拍摄多个影像,通过后期将这些图像合成一个全景图像。网上查阅很多资料,发现通过纯java实现的方案比较少,所以记录此篇文章,供有相同需求的朋友参考。

qq_43448388的博客 948

python调用hypermesh调用tcl_TclTk如何调用HyperMesh运行tcl脚本文件

#Tcl/Tk编写界面部分set t [toplevel .tp]focus $tgrab $tset Filename "E:/CAE_Tech/process_files/88/Example.tcl"set Font "Times 12 bold"wm title $t "Call HyperMesh"wm attribute $t -topmost 1wm withdraw $tset t...

weixin_39541681的博客 1601

Java整合OpenCV实现全景图切割合并

一共分为三步实现: 1,windows安装OpenCV 2,springboot整合OpenCV 3,实现全景图切割合并 windows安装OpenCV 下载OpenCV 官网下载地址:https://opencv.org/releases/ 这里下载的是windows版本的,如需下载安装lunix版本,请移步: Lunix安装/编译/部署OpenCV4.5.2生成so文件 下载完成后得到exe程序安装包 运行exe安装包后得到 到这一步其实就已经完成了,特别简单!!! 但是我当时在网上看的时候好多

技术交流,进来交个朋友 5272

逆向实战:喜马拉雅新版xm-sign算法解析与本地化生成方案

本文深入解析了喜马拉雅新版xm-sign算法的逆向过程与本地化生成方案。通过详细拆解browserid和sessionid的生成机制,提供了基于Node.js的核心代码实现,帮助开发者在不依赖官方环境的情况下生成有效签名。文章还涵盖了参数获取技巧、常见问题排查及性能优化建议,为爬虫开发者提供了实用的技术参考。

weixin_29256771的博客 299

docker拉取镜像报错:Error response from daemon: Get “https://registry-1.docker.io/v2/“: dial tcp

docker拉取镜像报错:Error response from daemon: Get “https://registry-1.docker.io/v2/“: dial tcp

m0_55333789的博客 1559

java 实现全景图切割算法 (生成krpano可用文件)

废话不说,上代码 package com.hgj.exhibition.imagehandel; import com.google.common.util.concurrent.*; import org.opencv.core.*; import org.opencv.imgproc.Imgproc; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.HashMap; import

qq_33620771的博客 1495

Linux----Ubuntu系统官网下载iso镜像文件

Linux----Ubuntu系统官网下载iso镜像文件

MQ0522的博客 5万+

SpringBoot整合opencv实现全景图切割

SpringBoot整合openCV实现360全景相机拍摄的全景图切割,话不多说,直接上代码 1、获取opencv-452.jar 首先,切割全景图需要使用到openCV的依赖jar,这个jar可以通过安装openCV,在openCV的安装目录获取,安装教程请看这里,安装好openCV后,依赖jar在openCV的安装目录下opencv\build\java\opencv-452.jar。 2、代码 引入依赖 实现全景图切割的工具类 调用方法,企切割 openCV需要依赖的源文件,区分为windows环境和

xiaoxiaosu2的博客 1006

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

OpenCV学习记录——2.使用OpenCV的Stitcher类来实现Android平台上的全景图拼接

文章目录1.前言2.常见的坑3.代码实现4.效果展示 1.前言 现在回看起来,距离之前的那篇博客,竟然已经整整隔了一个月!在这一个月里,为了编写这个完全没有接触过的跨平台程序,作者踩了许多(超级多)的坑,这里就简单记录一下,希望能帮助到读者 2.常见的坑 安装OpenCV建议直接引入第三方.so,若想引入.a文件的话极其麻烦,集成的教程建议以下博客: https://www.jianshu.c...

赈川 2071

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

纯java实现全景图切割(无需opencv)

每个面再进行切割成不同层级和像素。获取像素点上的三色数组。

liuwenmin_123的博客 561

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OpenCV图像拼接项目指南

图像拼接(Image Stitching)是将多张有重叠区域的图像通过一定的算法拼接成一张全景图的过程。特征检测:在每张图像中检测出关键点(Key Points)。特征匹配:找到不同图像中相同的关键点。图像配准:根据匹配的关键点,计算图像之间的变换矩阵。图像融合:将配准后的图像进行融合,消除拼接缝。OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。

2401_82355416的博客 1659

将 OpenCV Java 与 Eclipse 结合使用

现在,我们将 OpenCV 定义为 Eclipse 中的用户库,因此我们可以在任何项目中重用该配置。就是这样,每当您开始一个新项目时,只需将您定义的 OpenCV 用户库添加到您的项目中,您就可以开始了。获取 OpenCV 的新版本,并将其解压缩到一个简单的位置,例如 .我使用的是 2.4.6 版,但其他版本的步骤或多或少相同。在“Java 设置”步骤的“库”选项卡下,选择“添加库...”并选择 OpenCV-2.4.6,然后单击 Finish。现在选择您的新用户库,然后单击添加外部 JAR...。

2301_81888214的博客 2469

告别拼接烦恼:JavaCV让普通照片秒变360度全景图

你是否遇到过拍摄风景时镜头装不下壮阔全景的尴尬?旅行中想记录完整会场却只能拍到局部画面?一文掌握JavaCV图像拼接技术,无需专业设备也能制作媲美商业软件的全景照片,甚至扩展到360度视频应用。读完本文你将获得:全景图拼接核心原理、30行代码实现图像融合、常见拼接错误解决方案、从照片到视频的无缝升级路径。 ## 全景拼接的技术基石 图像拼接本质是将多张重叠图像通过算法合成一张宽视角画面。Jav...

gitblog_01179的博客 907
上一篇: n级阶梯,每次走一步或两步,问最多有多少种走法 二叉树实现(面试题)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值