Android opencv使用Core.hconcat 进行图像拼接

打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

Android 集成OpenCV-CSDN博客

  1. import org.opencv.android.Utils;
  2. import org.opencv.core.Core;
  3. import org.opencv.core.CvType;
  4. import org.opencv.core.Mat;
  5. import org.opencv.imgcodecs.Imgcodecs;
  6. import android.graphics.Bitmap;
  7. import android.graphics.BitmapFactory;
  8. import android.util.Log;
  9. import android.widget.ImageView;
  10. import java.io.IOException;
  11. import java.io.InputStream;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. public class ImageStitchingActivity extends AppCompatActivity {
  15.     private static final String TAG = "ImageStitchingActivity";
  16.     @Override
  17.     protected void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         setContentView(R.layout.activity_main); // 你的布局文件
  20.         ImageView imageView = findViewById(R.id.imageView); // 你的ImageView
  21.         try {
  22.             Bitmap bitmap1 = loadBitmapFromResource(R.drawable.image1); // 替换成你的资源ID
  23.             Bitmap bitmap2 = loadBitmapFromResource(R.drawable.image2); // 替换成你的资源ID
  24.             if (bitmap1 == null || bitmap2 == null) {
  25.                 Log.e(TAG, "图像加载失败");
  26.                 return;
  27.             }
  28.             Mat mat1 = convertBitmapToMat(bitmap1);
  29.             Mat mat2 = convertBitmapToMat(bitmap2);
  30.             if (mat1 == null || mat2 == null) {
  31.                 Log.e(TAG, "Bitmap 转 Mat 失败");
  32.                 return;
  33.             }
  34.             Mat stitchedMat = stitchImages(mat1, mat2);
  35.             if (stitchedMat == null) {
  36.                 Log.e(TAG, "图像拼接失败");
  37.                 return;
  38.             }
  39.             Bitmap stitchedBitmap = convertMatToBitmap(stitchedMat);
  40.             if (stitchedBitmap == null) {
  41.                 Log.e(TAG, "Mat 转 Bitmap 失败");
  42.                 return;
  43.             }
  44.             imageView.setImageBitmap(stitchedBitmap);
  45.             // 释放资源
  46.             mat1.release();
  47.             mat2.release();
  48.             stitchedMat.release();
  49.             bitmap1.recycle();
  50.             bitmap2.recycle();
  51.         } catch (Exception e) {
  52.             Log.e(TAG, "拼接过程中出现错误: " + e.getMessage());
  53.             // 处理异常,例如显示错误消息
  54.         }
  55.     }
  56.     private Bitmap loadBitmapFromResource(int resourceId) {
  57.         InputStream inputStream = getResources().openRawResource(resourceId);
  58.         try {
  59.             return BitmapFactory.decodeStream(inputStream);
  60.         } catch (Exception e) {
  61.             Log.e(TAG, "资源加载失败", e);
  62.             return null;
  63.         } finally {
  64.             try {
  65.                 inputStream.close();
  66.             } catch (IOException e) {
  67.                 Log.e(TAG, "流关闭失败", e);
  68.             }
  69.         }
  70.     }
  71.     private Mat convertBitmapToMat(Bitmap bitmap) {
  72.         Mat mat = new Mat();
  73.         Utils.bitmapToMat(bitmap, mat);
  74.         return mat;
  75.     }
  76.     private Bitmap convertMatToBitmap(Mat mat) {
  77.         Bitmap bitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);
  78.         Utils.matToBitmap(mat, bitmap);
  79.         return bitmap;
  80.     }
  81.     private Mat stitchImages(Mat mat1, Mat mat2) {
  82.         if (mat1.rows() != mat2.rows()) {
  83.             Log.e(TAG, "图像高度不一致,无法拼接");
  84.             return null;
  85.         }
  86.         List<Mat> mats = new ArrayList<>();
  87.         mats.add(mat1);
  88.         mats.add(mat2);
  89.         Mat stitchedMat = new Mat();
  90.         Core.hconcat(mats, stitchedMat);
  91.         return stitchedMat;
  92.     }
  93. }
复制代码
代码阐明:


  • 错误处理: 代码中加入了大量的错误检查,例如图像加载失败、Bitmap 到 Mat 的转换失败、图像高度不一致等情况,并在发生错误时打印日志信息并返回,避免步伐崩溃。
  • 资源释放: mat1.release(), mat2.release(), stitchedMat.release(), bitmap1.recycle(), bitmap2.recycle() 这些语句用于释放资源,防止内存泄漏。
  • 类型转换: convertBitmapToMat 和 convertMatToBitmap 函数封装了 Bitmap 和 Mat 之间的转换,进步代码可读性和可维护性。
  • 图像加载: 使用 loadBitmapFromResource 函数从资源加载图片,并进行错误处理。
  • 高度一致性检查: 在 stitchImages 函数中,添加了对输入图像高度是否一致的检查,这是 Core.hconcat 的须要条件。
使用前请注意:


  • 更换 R.drawable.image1 和 R.drawable.image2 为你实际的图像资源 ID。
  • 确保你的项目已正确设置 OpenCV 库。
  • 在你的结构文件中添加一个 ImageView,并在代码中使用 findViewById 获取其引用。
这个改进后的代码更加坚固,可以更好地避免运行时崩溃,并提供更清晰的错误信息。 纵然出现错误,它也只会打印日志并制止执行,不会导致应用步伐崩溃。 记住,在处理大型图像时,尤其要注意内存管理,避免内存溢出 (OOM) 错误。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

科技颠覆者

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表