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

devtools/2024/11/27 0:15:31/





Android 集成OpenCV-CSDN博客

import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgcodecs.Imgcodecs;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.widget.ImageView;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;public class ImageStitchingActivity extends AppCompatActivity {private static final String TAG = "ImageStitchingActivity";@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); // 你的布局文件ImageView imageView = findViewById(R.id.imageView); // 你的ImageViewtry {Bitmap bitmap1 = loadBitmapFromResource(R.drawable.image1); // 替换成你的资源IDBitmap bitmap2 = loadBitmapFromResource(R.drawable.image2); // 替换成你的资源IDif (bitmap1 == null || bitmap2 == null) {Log.e(TAG, "图像加载失败");return;}Mat mat1 = convertBitmapToMat(bitmap1);Mat mat2 = convertBitmapToMat(bitmap2);if (mat1 == null || mat2 == null) {Log.e(TAG, "Bitmap 转 Mat 失败");return;}Mat stitchedMat = stitchImages(mat1, mat2);if (stitchedMat == null) {Log.e(TAG, "图像拼接失败");return;}Bitmap stitchedBitmap = convertMatToBitmap(stitchedMat);if (stitchedBitmap == null) {Log.e(TAG, "Mat 转 Bitmap 失败");return;}imageView.setImageBitmap(stitchedBitmap);// 释放资源mat1.release();mat2.release();stitchedMat.release();bitmap1.recycle();bitmap2.recycle();} catch (Exception e) {Log.e(TAG, "拼接过程中出现错误: " + e.getMessage());// 处理异常,例如显示错误消息}}private Bitmap loadBitmapFromResource(int resourceId) {InputStream inputStream = getResources().openRawResource(resourceId);try {return BitmapFactory.decodeStream(inputStream);} catch (Exception e) {Log.e(TAG, "资源加载失败", e);return null;} finally {try {inputStream.close();} catch (IOException e) {Log.e(TAG, "流关闭失败", e);}}}private Mat convertBitmapToMat(Bitmap bitmap) {Mat mat = new Mat();Utils.bitmapToMat(bitmap, mat);return mat;}private Bitmap convertMatToBitmap(Mat mat) {Bitmap bitmap = Bitmap.createBitmap(mat.cols(), mat.rows(), Bitmap.Config.ARGB_8888);Utils.matToBitmap(mat, bitmap);return bitmap;}private Mat stitchImages(Mat mat1, Mat mat2) {if (mat1.rows() != mat2.rows()) {Log.e(TAG, "图像高度不一致,无法拼接");return null;}List<Mat> mats = new ArrayList<>();mats.add(mat1);mats.add(mat2);Mat stitchedMat = new Mat();Core.hconcat(mats, stitchedMat);return stitchedMat;}
}

代码说明:

  • 错误处理: 代码中加入了大量的错误检查,例如图像加载失败、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) 错误。


http://www.ppmy.cn/devtools/137255.html

相关文章

【论文解析】HAQ: Hardware-Aware Automated Quantization With Mixed Precision

作者及发刊详情 inproceedings{haq, author {Wang, Kuan and Liu, Zhijian and Lin, Yujun and Lin, Ji and Han, Song}, title {HAQ: Hardware-Aware Automated Quantization With Mixed Precision}, booktitle {IEEE Conference on Computer Vision and Pattern Recognit…

基于FPGA的2FSK调制-串口收发-带tb仿真文件-实际上板验证成功

基于FPGA的2FSK调制 前言一、2FSK储备知识二、代码分析1.模块分析2.波形分析 总结 前言 设计实现连续相位 2FSK 调制器&#xff0c;2FSK 的两个频率为:fI15KHz&#xff0c;f23KHz&#xff0c;波特率为 1500 bps,比特0映射为f 载波&#xff0c;比特1映射为 载波。 1&#xff09…

大学课程项目中的记忆深刻 Bug —— 一次意外的数组越界

开头 在编程的世界里&#xff0c;每一行代码都像是一个小小的宇宙&#xff0c;承载着开发者的心血与智慧。然而&#xff0c;即便是最精心编写的代码&#xff0c;也难免会遇到那些突如其来的 bug&#xff0c;它们就像是潜伏在暗处的小怪兽&#xff0c;时不时跳出来捣乱。 在我…

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议&#xff0c;其设计的目的是在Web浏览器和Web服务器之间进行实时通信&#xff08;实时Web&#xff09; WebSocket协议的优点包括&#xff1a; 1. 更高效的网络利用率&#xff1a;与HTTP相比&#xff0c;WebSocket的握手只…

Web开发:ABP框架7——前端请求头的读取

一、前端请求头的读取 1.注入 高层代码使用注入&#xff0c;IHttpContextAccessor 是 ASP.NET Core 中的一个接口&#xff0c;用于在服务层中获取与当前 HTTP 请求相关的信息&#xff0c;比如请求的头部、Cookie、用户身份等。 private readonly IHttpContextAccessor _http…

性能监控利器:Ubuntu 22.04 上的 Zabbix 安装与配置指南

简介 今天我们来聊聊如何在 Ubuntu 22.04 上安装和配置 Zabbix。我们会用到 PostgreSQL 作为数据库后端&#xff0c;Nginx 作为 Web 服务器&#xff0c;并用 Let’s Encrypt SSL 证书来保驾护航。 什么是 Zabbix&#xff1f; Zabbix 是一个开源的网络监控和管理解决方案&…

【人工智能】Python与Scikit-learn的模型选择与调参:用GridSearchCV和RandomizedSearchCV提升模型性能

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在机器学习建模过程中,模型的表现往往取决于参数的选择与优化。Scikit-learn提供了便捷的工具GridSearchCV和RandomizedSearchCV,帮助我们在参数空间中搜索最佳组合以提升模型表现。本文将从理论和实践两个角度…

计算机网络——第3章 数据链路层(自学笔记)

本文参考【王道计算机考研 计算机网络】 数据链路层的功能 主要任务&#xff1a;实现帧在一段链路上或在一个网络中进行传输。 基本原则&#xff1a;封装成帧、透明传输和差错检测。 信道&#xff1a;点对点信号和广播信道。 数据链路层所处地位 数据进入路由器后&#x…