android opencv

这篇博客介绍了图像处理的基础概念,包括OpenCV中的BGR三通道矩阵、边界填充、图像融合和阈值处理。讨论了图像平滑技术如均值滤波、高斯滤波和中值滤波,以及形态学操作如腐蚀、膨胀和梯度运算。还提到了Canny边缘检测算法和图像金字塔的概念。此外,博客涵盖图像轮廓检测、模板匹配和直方图分析等主题。

1.图像定义:

注意在opencv里面是BGR三通道的矩阵。

2.

边界填充:复制法-反射法-外包装法-常量法

图像融合:R=权重 x1(图像输入)+权重x2+b(偏置项) b亮度微调 shape要一致才可以融合。

图像阈值:超过阈值的处理。

图像平滑处理(去噪音)

均值滤波->淡化噪音点;

方框滤波->类似均值滤波 阈值为255

高斯滤波->权重矩阵

中值滤波->取中值

形态学-腐蚀操作(线条)

腐蚀操作/膨胀操作-> 缩小/增大线条 黑白

开闭运算->腐蚀/膨胀的先后顺序

梯度运算->膨胀-腐蚀=边界

礼貌=原始输入-开运算 毛刺

黑帽=闭运算-原始输入 原始轮廓

图像梯度-Sobel算子

Sobel算子-水平(右减左)或垂直(下减上)的差异大小-负值取绝对值-边缘检测

Scharr 算子-类似Sobel算子,数值比较大 噪音点比较敏感,线条比较丰富

laplacian算子-与周围比较,不需要分别求x y,噪音点不敏感

Canny边缘检测

1.使用高斯滤波器,平滑图像

2.计算图像每个像素点的梯度强度和方向

3.非极大值抑制 与相邻的点比较大小

4.应用双阈值 梯度值 阈值越小,效果就越细

图像金字塔

高斯金字塔:向下(缩小)/向上(放大)采样 1.高斯内核卷积 2.去掉偶数行和列

拉普拉斯金字塔 mg- (down up)

图像轮廓检测

模板匹配 模板跟图像窗口的像素点之间进行比较大小

直方图:图片分解成像素点

### Android 平台上 OpenCV 的使用教程及相关常见问题 #### 导入 OpenCVAndroid 项目中的Android 中集成 OpenCV 可以通过多种方式实现。其中最常用的方之一是导入 OpenCV 的 JAR 文件以及其对应的原生库文件 (`.so`),并通过 Android OpenCV Manager 来简化库的管理分发过程[^1]。 另一种常见的做是直接使用 OpenCV Android SDK,这种方可以减少依赖项的数量,并允许开发者更灵活地控制 OpenCV 功能模块的选择加载[^2]。 对于需要高性能计算的应用场景,还可以利用 Android NDK CMake 工具链来调用 OpenCV 提供的 `.so` 库文件,从而充分发挥底层硬件加速的优势[^3]。 --- #### 创建支持 Native OpenCVAndroid Studio 项目 为了创建一个能够充分利用 OpenCV 原生命令功能的 Android 项目,需按照以下流程操作: 1. **下载并安装必要的工具** 确保已安装最新版本的 Android Studio、NDK CMake 插件。这些组件可以通过 Android Studio 的 SDK Manager 获取。 2. **设置新的 Native 项目结构** 在新建项目时选择 “Include C++ Support”,这会自动配置好 Gradle 构建脚本以便于后续编译 C/C++ 源码。 3. **引入 OpenCV 库资源** 将官方发布的 OpenCV Android SDK 解压后复制到指定目录下;或者手动链接至 `jniLibs` 文件夹内的对应架构下的动态链接库 (.so)。 4. **编写 Java/Native 接口代码** 使用 JNI 技术定义接口函数,在 cpp 文件里完成图像处理逻辑部分后再返回给主线程显示结果。 --- #### 关键注意事项与调试技巧 当遇到运行错误或性能瓶颈时,请注意以下几个方面可能存在的隐患及其解决方案: - 如果发现某些设备无正常启动应用,则可能是由于缺少兼容的目标 ABI(应用程序二进制接口),建议检查 build.gradle 文件中是否遗漏了 arm64-v8a/x86_64 等主流体系结构的支持声明。 - 对于初次接触JNI编程的朋友来说,可能会被复杂的指针传递机制搞晕头转向——此时推荐借助 logcat 输出详细的堆栈跟踪信息辅助定位具体位置处发生的异常状况。 - 当尝试访问摄像头流数据却总是失败的时候,除了确认权限清单外还需要留意 SurfaceView/LivePreview 是否已被正确初始化完毕再发起请求帧捕获动作。 --- ```java // 示例:Java 层调用本地方 public class MainActivity extends AppCompatActivity { static { System.loadLibrary("native-lib"); } public native Mat processImage(Mat input); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ImageView imageView = findViewById(R.id.imageView); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.sample_image); Mat mat = new Mat(); Utils.bitmapToMat(bitmap, mat); // Convert from Bitmap to Mat format Mat result = processImage(mat); Utils.matToBitmap(result, bitmap); // Convert back to Bitmap after processing imageView.setImageBitmap(bitmap); } } ``` ```cpp // 示例:C++ 实现图像灰度化转换 extern "C" JNIEXPORT jlong JNICALL Java_com_example_myapp_MainActivity_processImage(JNIEnv *env, jobject thiz, jlong addrInput) { cv::Mat& img_input= *(cv::_InputArray((void*)addrInput).getMat()); cv::Mat img_gray; cvtColor(img_input, img_gray, COLOR_BGR2GRAY); return reinterpret_cast<jlong>(img_gray.data); } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值