Android 使用opencv 拼接图片

这篇博客详细介绍了如何在Android中使用OpenCV库进行图片拼接。核心代码涉及到了OpenCV的Stitcher类,包括不同的拼接算法设置,如特征匹配器、调整器、缝合查找器和曝光补偿器。博主提供了两种不同的拼接算法实现,并给出了关键代码示例。
摘要由CSDN通过智能技术生成

这是两个图片,红色区域是两个图片相同的地方,箭头右边是拼接后结果,相同的地方融合。

源码地址:https://download.csdn.net/download/hadkfhkdh/11130858

拼接图片的核心代码在 stitcher.cpp中 ,代码中带着一种拼接算法(参考:《深入OpenCV Android 应用开发》电子工业出版社,需要的也可以找一本参考一下)。

后来在网上找了两种不同的拼接算法,感觉拼出来的效果差不多,下面附上代码只需要将stitcher.cpp中的代码替换就行

一、

#include <jni.h>
#include <vector>

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/stitching/stitcher.hpp>

using namespace cv;
using namespace std;

char filepath1[100] = "/storage/emulated/0/Download/PacktBook/Chapter6/panorama_stitched.jpg";

cv::Mat finalMat;

extern "C"
JNIEXPORT jintArray JNICALL
Java_com_fimi_gh2_tracker_ImagesStitchUtil_stitchImages(JNIEnv *env, jclass type,
                                                        jobjectArray paths) {

    jstring jstr;
    jsize len = env->GetArrayLength(paths);
    std::vector<cv::Mat> mats;
    for (int i = 0; i < len; i++) {
        jstr = (jstring) env->GetObjectArrayElement(paths, i);
        const char *path = (char *) env->GetStringUTFChars(jstr, 0);
        LOGI("path %s", path);
        cv::Mat mat = cv::imread(path);
//        cvtColor(mat, mat, CV_RGBA2RGB);
        mats.push_back(mat);
    }

    LOGI("开始拼接......");
    cv::Stitcher stitcher = cv::Stitcher::createDefault(false);

    //stitcher.setRegistrationResol(0.6);
   // stitcher.setWaveCorrection(false);
    /*=match_conf默认是0.65,我选0.8,选太大了就没特征点啦,0.8都失败了*/
    detail::BestOf2NearestMatcher *matcher = new detail::BestOf2NearestMatcher(false, 0.5f);
    stitcher.setFeaturesMatcher(matcher);
    stitcher.setBundleAdjuster(new detail::BundleAdjusterRay());
    stitcher.setSeamFinder(new detail::NoSeamFinder);
    stitcher.setExposureCompensator(new detail::NoExposureCompensator());//曝光补偿
    stitcher.setBlender(new detail::FeatherBlender());

    Stitcher::Status state = stitcher.stitch(mats, finalMat);

    //此时finalMat是bgr类型

    LOGI("拼接结果: %d", state);
//        finalMat = clipping(finalMat);
    jintArray jint_arr = env->NewIntArray(3);
    jint *elems = env->GetIntArrayElements(jint_arr, NULL);
    elems[0] = state;//状态码
    elems[1] = finalMat.cols;//宽
    elems[2] = finalMat.rows;//高

    if (state == cv::Stitcher::OK){
        LOGI(

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋风落叶黄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值