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

如上图所示,找到相应的jar包,这里讲一下如何这个jar如何导入Maven仓库
mvn install:install-file -Dfile=D:\opencv-3.0.\opencv\build\java\opencv-.jar
-DgroupId=com.suibian -DartifactId=opencv- -Dversion=3.3. -Dpackaging=jar -DgeneratePom=true -DcreateChecksum=true

<groupId>com.suibian</groupId>
<artifactId>opencv-</artifactId>
<version>3.3.</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 -;
}
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() == )
return ;
//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=;
String url="";
for (int i=;i<=length;i++){
if (i==){
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命令
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() == ) 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全景图合成的更多相关文章
- java实现,使用opencv合成全景图,前端使用krpano展示
这周花三天做了一demo,算上之前的,怎么也有五天,上一篇是opencv介绍,以及定义native方法,通过本地图片路径传参,底层调用Opencv图像库合成,有兴趣的可以看看,这篇重点在于krpano ...
- Java基于opencv实现图像数字识别(五)—投影法分割字符
Java基于opencv实现图像数字识别(五)-投影法分割字符 水平投影法 1.水平投影法就是先用一个数组统计出图像每行黑色像素点的个数(二值化的图像): 2.选出一个最优的阀值,根据比这个阀值大或小 ...
- Java基于opencv实现图像数字识别(四)—图像降噪
Java基于opencv实现图像数字识别(四)-图像降噪 我们每一步的工作都是基于前一步的,我们先把我们前面的几个函数封装成一个工具类,以后我们所有的函数都基于这个工具类 这个工具类呢,就一个成员变量 ...
- Java基于opencv实现图像数字识别(三)—灰度化和二值化
Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...
- Java基于opencv实现图像数字识别(二)—基本流程
Java基于opencv实现图像数字识别(二)-基本流程 做一个项目之前呢,我们应该有一个总体把握,或者是进度条:来一步步的督促着我们来完成这个项目,在我们正式开始前呢,我们先讨论下流程. 我做的主要 ...
- 基于OpenCv和swing的图片/视频展示Java实现
基于OpenCv和swing实现图片/视频的展示 图片的展示 swing展示图片,多为操作BufferedImage,这里要关注的核心是将Mat转为BufferedImage. 代码如下: publi ...
- Java基于opencv实现图像数字识别(一)
Java基于opencv实现图像数字识别(一) 最近分到了一个任务,要做数字识别,我分配到的任务是把数字一个个的分开:当时一脸懵逼,直接百度java如何分割图片中的数字,然后就百度到了用Buffere ...
- 基于opencv将视频转化为字符串Java版
基于opencv将视频转化为字符串Java版 opencv java 先上一个效果图吧 首先,弄清一下原理 我们要将视频转化为字符画,那么就需要获取画面的每一帧,也就是每一张图片,然后将图片进行转化 ...
- Canny边缘检测算法(基于OpenCV的Java实现)
目录 Canny边缘检测算法(基于OpenCV的Java实现) 绪论 Canny边缘检测算法的发展历史 Canny边缘检测算法的处理流程 用高斯滤波器平滑图像 彩色RGB图像转换为灰度图像 一维,二维 ...
随机推荐
- 2020Pycharm安装教程!最新2020pycharm安装!如何安装Pycharm2020版本!如何安装Pycharm!如何安装2020Pycharm!2020Pycharm永久激活!
本教程仅用作个人学习,请勿用于商业获利,造成后果自负!!! Pycharm安装 在这插一个小话题哈,Pycharm只是一个编译器,并不能代替Python,如果要使用Python,还是需要安装Pytho ...
- Apache和Tomcat 配置负载均衡(mod-proxy方式)-无session共享、无粘性session
转:https://blog.csdn.net/wangjunjun2008/article/details/38268483 mod-proxy方式实现负载均衡是利用了Apache 2.x版本自带的 ...
- Maven 梳理-安装配置
项目构建过程包括[清理项目]→[编译项目]→[测试项目]→[生成测试报告]→[打包项目]→[部署项目]这几个步骤,这六个步骤就是一个项目的完整构建过程. 下载后解压 配置环境变量 F:\jtDev ...
- python——成语接龙小游戏
小试牛刀的简易成语接龙. 思路—— 1.网上下载成语字典的txt版本 2.通过python进行处理得到格式化的成语,并整理成字典(python字典查找速度快) 3.python程序,查找 用户输入的最 ...
- 地图的标注Marker
(1)在point处添加标注:var marker = new BMap.Marker(point); (2)添加覆盖物:map.addOverlay(marker); (3)激活标注的拖拽功能:ma ...
- 从零开始入门 K8s | 应用存储和持久化数据卷:存储快照与拓扑调度
作者 | 至天 阿里巴巴高级研发工程师 一.基本知识 存储快照产生背景 在使用存储时,为了提高数据操作的容错性,我们通常有需要对线上数据进行 snapshot ,以及能快速 restore 的能力.另 ...
- svg foreignObject的作用(文本换行,生成图片)
SVG内部利用foreignObject嵌入XHTML元素 <foreignObject>元素的作用是可以在其中使用具有其它XML命名空间的XML元素,换句话说借助<foreignO ...
- 卷积神经网络CNN识别MNIST数据集
这次我们将建立一个卷积神经网络,它可以把MNIST手写字符的识别准确率提升到99%,读者可能需要一些卷积神经网络的基础知识才能更好的理解本节的内容. 程序的开头是导入TensorFlow: impor ...
- 02-20 kd树(鸢尾花分类)
[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...
- B-线性代数-距离公式汇总
目录 距离公式汇总 一.欧式距离 二.曼哈顿距离 三.闵可夫斯基距离(Minkowski distance) 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬 ...