欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java如何實(shí)現(xiàn)基于opencv全景圖合成實(shí)例代碼

 更新時(shí)間:2018年07月02日 10:55:52   作者:期待華麗轉(zhuǎn)身  
全景圖相信大家應(yīng)該都不陌生,下面這篇文章主要給大家介紹了關(guān)于java如何實(shí)現(xiàn)基于opencv全景圖合成的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

全景圖概述

每當(dāng)一個(gè)平面圖像映射到一個(gè)彎曲的表面就會(huì)發(fā)生圖象投影,反之亦然,這中現(xiàn)象特別常見于全景攝影。例如地球的球面可以映射到一塊平坦的紙張。由于在我們周圍的整個(gè)視場(chǎng)的可以被認(rèn)為是作為球體的表面(對(duì)于所有觀測(cè)角度),我們需要一種能將球形投影到2-D平面以便照片打印的方法。

小的視角相對(duì)容易進(jìn)行形變并投影到平坦的紙上。但是,當(dāng)試圖把一個(gè)球形圖像映射到一個(gè)平面上,有些變形是不可避免的。因此,每一種類型的投影僅僅嘗試避免一種類型的失真,這是以犧牲其他失真為代價(jià)的。隨著視場(chǎng)角增大,觀測(cè)?。╲iewing arc)變得更彎曲,從而全景投影類型之間的差異變得更加顯著。什么時(shí)候使用那一種投影,在很大程度上取決于每個(gè)投影應(yīng)用。 在這里,我們集中介紹在幾個(gè)最常用。

前言

因項(xiàng)目需要,自己做了demo,從中學(xué)習(xí)很多,所以分享出來(lái),希望有這方面需求的少走一些彎路,opencv怎么安裝網(wǎng)上教程多多,這里不加詳細(xì)說(shuō)明,我安裝的opencv-3.3.0

如上圖所示,找到相應(yīng)的jar包,這里講一下如何這個(gè)jar如何導(dǎo)入Maven倉(cāng)庫(kù)

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可以通過(guò)這個(gè)jar操作opencv,那我們看一下,當(dāng)然你能這樣想,說(shuō)明你很單純,讓我們看一下opencv 中includ中的路徑和jar中包的對(duì)比

哈哈,全景圖的關(guān)鍵stitching并沒有,而且面向java的2015以后就一直沒有更新,如下圖所示一個(gè)全景圖(傻瓜)合成的關(guān)鍵類沒有,但是C++給我提供了

那怎么辦呢,如何用java調(diào)用C++的代碼,我們知道和操作系統(tǒng)打交道,C/C++無(wú)疑比Java更合適,opencv圖形處理的這方面的應(yīng)用,大多數(shù)是C++開發(fā)比較多,java中的一個(gè)關(guān)鍵字native大家都不陌生吧,然而我們想點(diǎn)進(jìn)去,想看看是怎么實(shí)現(xiàn)的,怎么也點(diǎn)不進(jìn)去,因?yàn)樗筒皇莏ava寫的,可能是C/C++,native對(duì)應(yīng)都是java中jre下bin目錄的XXX.dll文件,所以把我們要使用的C++代碼打包成dll格式的文件放到bin目錄即可,當(dāng)然這涉及到方法的參數(shù)和返回值,廢話不多說(shuō),安裝visual studio 2017,安裝教程網(wǎng)上教程很多

點(diǎn)擊 文件-->新建--->項(xiàng)目--->windows桌面-->動(dòng)態(tài)鏈接庫(kù)(Dll),這樣項(xiàng)目就新建成功,接下來(lái)上代碼

這是全景圖合成的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函數(shù)進(jìn)行拼接
 Mat pano;
 Stitcher::Status status = stitcher.stitch(imgs, pano);
 imwrite(result_name, pano);
 Mat pano2 = pano.clone();
 // 顯示源圖像,和結(jié)果圖像
 //imshow("全景圖像", pano);
 if (waitKey() == 27)
 return 0;
 //imwrite(result_name, pano);
}

那么java如何和C++進(jìn)行交互呢,通過(guò)java中jni技術(shù)

讓我們了解一下java中JNI

Java Native Interface(簡(jiǎn)稱JNI),Java是跨平臺(tái)語(yǔ)言,有時(shí)候需要調(diào)用本地代碼,Sun公司提供JNI接口,通過(guò)這個(gè)接口與操作系統(tǒng)本地代碼相互調(diào)用,如下圖所示是Java中native的調(diào)用原理

脈絡(luò)都理通了,那就開始吧

public class OpenCVUtil {
 static {
  //這里的system.load用來(lái)加載C++生成的動(dòng)態(tài)鏈接庫(kù),加載實(shí)際自己也可以決定不一定非的是靜態(tài)的。
  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文件

進(jìn)入cmd命令窗口,打開對(duì)應(yīng)編譯好的class文件目錄執(zhí)行javah命令

生成對(duì)應(yīng)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方法處理了,復(fù)制該文件,到vs 2017項(xiàng)目所在的位置

#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) {
 //這是接收過(guò)來(lái)的字符串,多個(gè)路徑
 const char* str;
//....................................................................

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


 //imgs.push_back(img6);
 Stitcher stitcher = Stitcher::createDefault(try_use_gpu);
 // 使用stitch函數(shù)進(jìn)行拼接
 Mat pano;
 Stitcher::Status status = stitcher.stitch(imgs, pano);
 imwrite(result_name, pano);
 Mat pano2 = pano.clone();
 // 顯示源圖像,和結(jié)果圖像
 //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()));
}

上面就是對(duì)應(yīng)C++代碼

點(diǎn)擊生成--->重新生成解決方案 生成對(duì)應(yīng)的dll文件,然后放到JDK的jre/bin目錄里

運(yùn)行java程序,結(jié)果如下

看一下合成的全景圖吧

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • mybatis模糊查詢like語(yǔ)句該如何寫

    mybatis模糊查詢like語(yǔ)句該如何寫

    MyBatis模糊查詢通常使用LIKE關(guān)鍵字,結(jié)合concat函數(shù)拼接通配符%實(shí)現(xiàn),在MyBatis配置文件中,通過(guò)#{keyword}傳遞參數(shù),生成帶有通配符的查詢語(yǔ)句,MyBatis-Plus中,通過(guò)LambdaQueryWrapper類和like方法構(gòu)建模糊查詢條件,簡(jiǎn)化查詢操作
    2024-09-09
  • 深入分析Java異常

    深入分析Java異常

    本篇文章給大家詳細(xì)分享了關(guān)于Java異常的相關(guān)知識(shí)點(diǎn),對(duì)此有需要的朋友跟著學(xué)習(xí)下吧。
    2018-05-05
  • intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x)

    intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x)

    這篇文章主要介紹了intellij idea修改maven配置時(shí)總是恢復(fù)默認(rèn)配置的解決方法idea版本(2020.2.x),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Alibaba?Fastjson之超好用的JOSN解析庫(kù)

    Alibaba?Fastjson之超好用的JOSN解析庫(kù)

    這篇文章主要介紹了Alibaba?Fastjson之超好用的JOSN解析庫(kù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 使用Java獲取html中Select,radio多選的值方法

    使用Java獲取html中Select,radio多選的值方法

    以下是對(duì)使用Java獲取html中Select,radio多選值的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • Java實(shí)現(xiàn)4種微信搶紅包算法(小結(jié))

    Java實(shí)現(xiàn)4種微信搶紅包算法(小結(jié))

    微信紅包是大家經(jīng)常使用的,到現(xiàn)在為止仍然有很多紅包開發(fā)的需求,實(shí)現(xiàn)搶紅包算法也是面試??碱},本文就詳細(xì)的來(lái)介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2021-12-12
  • 為什么在重寫 equals方法的同時(shí)必須重寫 hashcode方法

    為什么在重寫 equals方法的同時(shí)必須重寫 hashcode方法

    Object 類是所有類的父類,其 equals 方法比較的是兩個(gè)對(duì)象的引用指向的地址,hashcode 是一個(gè)本地方法,返回的是對(duì)象地址值。他們都是通過(guò)比較地址來(lái)比較對(duì)象是否相等的
    2016-07-07
  • Java使用迭代器Iterator遍歷集合

    Java使用迭代器Iterator遍歷集合

    Iterator對(duì)象稱為迭代器(設(shè)計(jì)模式的一種),主要用于遍歷 Collection 集合中的元素。本文就來(lái)和大家詳細(xì)聊聊Java如何使用迭代器Iterator實(shí)現(xiàn)遍歷集合,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-12-12
  • Java實(shí)時(shí)獲取基金收益項(xiàng)目源碼分享

    Java實(shí)時(shí)獲取基金收益項(xiàng)目源碼分享

    這篇文章主要介紹了Java實(shí)時(shí)獲取基金收益項(xiàng)目源碼分享,主要包括JAVA爬取天天基金網(wǎng)數(shù)據(jù)使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),需要的朋友可以參考下
    2021-03-03
  • 入門Java線程基礎(chǔ)一篇就夠了

    入門Java線程基礎(chǔ)一篇就夠了

    線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源
    2021-06-06

最新評(píng)論