在Android中使用OpenCv 来处理图片

本文介绍如何使用OpenCV在Android平台上进行图片处理,包括特征点检测等操作,并提供了详细的步骤和示例代码。

最近在研究在用C来处理图片,后来再网上找了一下,有的说用libjpeg和opencv来处理图片。先研究一下,opencv来处理图片,

这是网上一位友人写的代码http://blogold.chinaunix.net/u1/57901/showart.php?id=2512389

 

开始之前,先编译opencv得到 libandroid-opencv.so库 ,请参考这位牛人的博客http://blog.youkuaiyun.com/hellogv/archive/2011/01/21/6157316.aspx

 

 

 

1、创建一个android工程,工程名为opencvtest,包名为com.opencvtest

在工程的根目录下创建一个jni文件夹,然后分别创建Android.mk和hello-jni.cpp两个文件
Android.mk的内容如下:
 
2、hello-jni.cpp
3、ActivityMain.java
 
4、把这个工程编译了,工程结构
 
5、效果如图:原图
效果图:
6、注意,如果处理大的图片的时候会出现异常。没有响应,不知道是什么问题!求高手解答。
Android使用 OpenCV 进行图像处理是一种非常强大的方式,OpenCV 提供了丰富的图像处理算法,如边缘检测、模糊、滤波、图像增强等。以下是使用 OpenCV 实现图像处理的完整流程。 --- ## 一、集成 OpenCVAndroid 项目 ### 1. 下载 OpenCV Android SDK 前往 OpenCV 官网:[https://opencv.org/releases/](https://opencv.org/releases/) 下载最新的 OpenCV Android SDK(例如 `opencv-4.x.x-android-sdk.zip`)。 ### 2. 导入 OpenCVAndroid 项目 1. 解压下载的 OpenCV SDK。 2. 打开 Android Studio,选择 `File > New > Import Module`。 3. 选择 `opencv-4.x.x-android-sdk\OpenCV-android-sdk\sdk\build` 目录。 4. 将模块命名为 `opencv`。 5. 在你的 `app` 模块的 `build.gradle` 中添加依赖: ```gradle dependencies { implementation project(":opencv") } ``` ### 3. 加载 OpenCV 库 在 `MainActivity.java` 中加载 OpenCV 库: ```java static { if (!OpenCVLoader.initDebug()) { Log.e("OpenCV", "Initialization error"); } else { Log.d("OpenCV", "Initialized successfully"); } } ``` --- ## 二、使用 OpenCV 实现图像处理 下面是一个使用 OpenCV 实现图像灰度化和边缘检测的示例。 ### 示例代码:灰度化 + Canny 边缘检测 ```java public class OpenCVActivity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_opencv); imageView = findViewById(R.id.imageView); // 加载资源图片 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_image); imageView.setImageBitmap(processImageWithOpenCV(bitmap)); } private Bitmap processImageWithOpenCV(Bitmap bitmap) { // 转换为 Mat 格式 Mat src = new Mat(); Utils.bitmapToMat(bitmap, src); // 转为灰度图 Mat grayMat = new Mat(); Imgproc.cvtColor(src, grayMat, Imgproc.COLOR_BGR2GRAY); // 边缘检测(Canny) Mat edgesMat = new Mat(); Imgproc.Canny(grayMat, edgesMat, 50, 150); // 将 Mat 转回 Bitmap Bitmap resultBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); Utils.matToBitmap(edgesMat, resultBitmap); return resultBitmap; } } ``` #### 布局文件 `activity_opencv.xml` 示例: ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/imageView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:adjustViewBounds="true" /> </LinearLayout> ``` --- ## 三、解释代码 1. **Mat 类型**: - `Mat` 是 OpenCV 中表示图像的核心类,类似于二维数组。 - 图像处理通常在 `Mat` 上进行。 2. **Utils.bitmapToMat / Utils.matToBitmap**: - Android 提供的工具类,用于在 `Bitmap` 和 `Mat` 之间转换。 3. **Imgproc.cvtColor**: - 将图像从 BGR 转换为灰度图。 4. **Imgproc.Canny**: - 使用 Canny 算法进行边缘检测,参数 `50` 和 `150` 是高低阈值。 --- ## 四、其他常用图像处理操作(OpenCV) ### 1. 高斯模糊 ```java Mat blurredMat = new Mat(); Imgproc.GaussianBlur(grayMat, blurredMat, new Size(5, 5), 0); ``` ### 2. 图像二值化 ```java Mat binaryMat = new Mat(); Imgproc.threshold(grayMat, binaryMat, 128, 255, Imgproc.THRESH_BINARY); ``` ### 3. Sobel 边缘检测 ```java Mat gradX = new Mat(); Imgproc.Sobel(grayMat, gradX, CvType.CV_16S, 1, 0, 3, 1, 0, Core.BORDER_DEFAULT); Core.convertScaleAbs(gradX, gradX); ``` --- ##
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值