Android 使用opencv 拼接图片

这是两个图片,红色区域是两个图片相同的地方,箭头右边是拼接后结果,相同的地方融合,有一个缺点就是相同面积要在百分之三十左右(没有具体测试),opencv自己导入,

Android 使用opencv 拼接图片

private ImageView ivImage;//用来显示拼接好的图片
ivImage = (ImageView)findViewById(R.id.ivImage);
ArrayList<Mat> clickedImages = new ArrayList<Mat>();//需要拼接的图片放到这个集合里
InputStream is = getResources().openRawResource(R.drawable.panorama_1);
Bitmap mBitmap = BitmapFactory.decodeStream(is);
Mat src = new Mat(mBitmap.getHeight(), mBitmap.getWidth(), CvType.CV_8UC4);
Imgproc.resize(src, src, new Size(src.rows()/4, src.cols()/4));
Utils.bitmapToMat(mBitmap, src);
Imgproc.cvtColor(src, src, Imgproc.COLOR_BGR2RGB);
clickedImages.add(src);

 

private void createPanorama(){

    new AsyncTask<Void, Void, Bitmap>() {
        ProgressDialog dialog;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(StitchingActivity.this, "Building Panorama", "请稍后");
        }

        @Override
        protected Bitmap doInBackground(Void... params) {
            Mat srcRes = new Mat();

            int success = StitchPanorama(clickedImages.toArray(), clickedImages.size(), srcRes.getNativeObjAddr());
            Log.d("StitchingActivity", srcRes.rows()+" "+srcRes.cols()+" "+success);
            if(success==0){
                return null;
            }
          
            Imgproc.cvtColor(srcRes, srcRes, Imgproc.COLOR_BGR2RGBA);
            Bitmap bitmap = Bitmap.createBitmap(srcRes.cols(), srcRes.rows(), Bitmap.Config.ARGB_8888);
            Utils.matToBitmap(srcRes, bitmap);

            return bitmap;
        }

        @Override
        protected void onPostExecute(Bitmap bitmap) {
            super.onPostExecute(bitmap);
            dialog.dismiss();
            if(bitmap!=null) {
                ivImage.setImageBitmap(bitmap);
            }
        }
    }.execute();
}
public native int StitchPanorama(Object images[], int size, long addrSrcRes);