OpenCV是啥?能干啥?原理是啥?
1 OpenCV 是啥
OpenCV是一款开源的计算机视觉框架,封装了超过1000个常见的图形处理算法,其SDK语言支持Java、C++、Python等。接触OpenCV提供的SDK,ANdroid开发者可以实现OCR识别、图像处理、人脸检测、相机矫正、实时视频分析与处理、AR增强等移动端应用开发。
2 Mat
Mat 是OpenCV中用来存储图像信息的内存对象,可以通过Imgcodecs.imread()读入一个图像文件,也可以Utils.bitmapToMat(),Utils.matToBitmap与Bitmap相互转化。
基础图形绘制
可以通过Imgproc.putText,rectangle,circle,line等方法绘制文字和各类几何图形。
3 Mat像素操作
可以通过Mat.put()方法对图像的任意像素进行操作。
Mat mat = Imgcodecs.imread(file.getPath());
int channels = mat.channels();
byte[] data = new byte[channels]
int width = mat.cols();
int height = mat.rows();
data[0] = 1;
data[1] = 2;
data[2] = 3;
map.put(row,col,data);
通过Mat可以
- 可以实现通道分离,通道合并,
- 求图像的均方差,调整图片亮度与对比度,
- 对图像进行权重叠加
4 图像操作
卷积模糊
卷积 + 相同系数卷积核 -> 均值模糊。主要用于降低图像噪声、模糊图像、降低图像对比度。
卷积 + 高斯分布权重洗漱 -> 高斯模糊
统计排序滤波
用来消除图像噪声或抑制图像像素极小值与极大值
保留边缘滤波
实现人脸美化、图像梅花的效果。
5 基本特征检测
梯度计算
图像边缘部分,像素梯度比较大。据此可以从图像中找到物体的边缘。
Canny边缘检测
Canny边缘检测算法可以用来检测图像边缘。
Canny(Mat image, Mat edges, ...)
再配合霍夫直线检测、圆形检测可以检测出图像中的直线和圆形。
轮廓发现
通过Canny边缘提取或者二值化结果作为输入图像可以实现轮廓发现与绘制。
模板匹配
模板匹配是最贱的模式识别算法之一,其在图像处理中根据输入模板图像,从待检测图像中找到高相似度的子图像区域。
Imgproc.matchTemplate(Mat image, Mat templ, Mat result, int method)
6 特征检测与匹配
简单的说,图像的特征就是边缘、角点、纹理等。
Harris角点检测
SURF特征检测
特征检测是从图像中自动提取对象特征以泳衣表述该对象,同时还可以利用得到的特征数据描述在不同的图像中发现相同的对象,而且特征对对象的旋转、缩放、光照等具有不变性。
SURF(Speedued Up Robus Feature)特征是图像最常见的特征之一。
Mat textImage = Imgcodecs.imread(file);
SURF surf_detector = SURF.create(...)
MatOfKeyPoint keyPoints_text = new MatOfKeyPoint()
MatOfKeyPoint keyPoints_scene = new MatOfKeyPoint()
检测关键点
surf_detector.detect(textImage, keyPoints_text)
surf_detector.detect(src, keyPoints_scene )
获取描述子
surf_detector.compute(textImage, keyPoints_txt, descriptor_txt)
匹配
DescriptorMatcher descriptorMather = DescriptorMatcher.create()
descriptorMather.match(Mat descriptor_txt,Mat descriptor_scene, MatOfDMatch matchs)
SIFT特征检测
Feature2D中的检测器与描述子
ORB检测器与描述子
BRISK检测器与描述子
AKAZE检测器与描述子