这是两个图片,红色区域是两个图片相同的地方,箭头右边是拼接后结果,相同的地方融合。
源码地址:
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(