Android 使用opencv 拼接图片
这是两个图片,红色区域是两个图片相同的地方,箭头右边是拼接后结果,相同的地方融合,有一个缺点就是相同面积要在百分之三十左右(没有具体测试),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);