前几篇我们大致了解了如何运用OpenCV在Android上进行图片但简单处理,并运用这些知识做了一个文字提取的应用。
Android OpenCV应用篇一:环境搭建,高斯差分
Android OpenCV应用篇二:图片处理
Android OpenCV应用篇三:提取图片中的文字
下面我们继续进行了解OpenCV在Android如何进去一些其他方面的应用:图片特征检测
前言
开始之前,我们需要知道一些在计算机视觉和图像处理 的语境中所谓的图像特征包括哪些:
- 边缘
- 直线
- 圆
- 椭圆
- 色块或轮廓
- 用户定义形状
- 角点
- …
OpenCV中给我们提供来丰富的图像特征信息提取的算法,接下来我们来看一下在Android中如何运用。
边缘和角点检测
边缘检测和角点检测是最为基本而且最为常用的两中特征检测算法,经常用于找出图像中目标图像的边界、角点,或者分析一幅图像的旋转情况,目标在图像序列(视频)中的移动情况等。
边缘检测之高斯差分技术
高斯差分技术我们在Android OpenCV应用篇一:环境搭建,高斯差分篇中有做介绍,这里就不再重复。
边缘检测之Canny边缘检测器
Canny边缘检测器在计算机视觉中被广泛采用,并被认为是边缘检测最优的算法
算法步骤如下:
- 平滑图像
- 计算图像的梯度
- 非最大值抑制
- 用滞后阈值化选择边缘
我们可以直接使用OpenCV提供的方法进行Canny边缘检测:
Canny(Mat image,
Mat edges,
double threshold1, // 低阈值
double threshold2 // 高阈值
)
例:
/**
* Canny边缘检测
*/
fun canny() {
imageBitmap?.apply {
val originalMat = Mat(height, width, CvType.CV_8UC4)
val grayMat = Mat()
val cannyMat = Mat()
Utils.bitmapToMat(imageBitmap, originalMat)
Imgproc.cvtColor(originalMat, grayMat, Imgproc.COLOR_BGR2GRAY)
Imgproc.Canny(grayMat, cannyMat, 10.0, 100.0)
val resultBitmap = Bitmap.createBitmap(cannyMat.cols(), cannyMat.rows(), Bitmap.Config.ARGB_8888)
Utils.matToBitmap(cannyMat, resultBitmap)
imageResult.setImageBitmap(resultBitmap)
}
}
效果图:
边缘检测之Sobel算子
Sobel算子边缘检测与Canny类似,去计算像素的灰度梯度,只不过是换用另一种方式:详情查阅 (百度百科:Sobel算子)
Sobel算子步骤:
- 将图像转换成灰度
- 计算水平方向灰度梯度绝对值
- 计算垂直方向灰度梯度绝对值
- 计算最终梯度
/**
* Sobel滤波
*/
fun sobel() {
imageBitmap?.apply {
val originalMat = Mat(height, width, CvType.CV_8UC4)
val grayMat = Mat()
Utils.bitmapToMat(imageBitmap, originalMat