NDK43_OpenCV

NDK开发汇总


OpenCV下载地址

一 简介

​ OpenCV是一个基于BSD许可开源发行的跨平台计算机视觉库。拥有C++,Python和Java接口,并且支持Windows, Linux, Mac OS, iOS 和 Android系统。实现了图像处理和计算机视觉方面的很多通用算法。

模块功能
Core核心基础模块,定义了被所有其他模块和基本数据结构(包括重要的多维数组Mat)使用的基本函数、底层数据结构和算法函数
Imgproc图像处理模块,包括:滤波、高斯模糊、形态学处理、几何变换、颜色空间转换及直方图计算等
Highgui高层用户交互模块,包括:GUI、图像与视频I\O等
Video视频分析,,运动分析及目标跟踪。
Calib3d3D模块,包括:摄像机标定、立体匹配、3D重建等
Features2d二维特征检测与描述模块,包括:图像特征检测、描述、匹配等
Objdetect目标检测模块,如:人脸检测等
MI机器学习模块,包括:支持向量机、神经网络等
Flann最近邻开源库。包含一系列查找算法,自动选取最快算法的机制。
Imgcodecs图像编解码模块,图像文件的读写操作
Photo图像计算(处理)模块,图像修复及去噪。
Shape形状匹配算法模块。描述形状、比较形状
Stitching图像拼接
Superres超分辨率模块
Videoio视频读写模块,视频文件包括摄像头的输入。
Videostab解决拍摄的视频稳定
Dnn深度神经网络
contrib可以引入额外模块

二 人脸定位

人脸定位是人脸检测、识别等一系列后续功能的基础。比如,美颜相机的贴纸、大眼等功能都需要先定位到人脸才能进行后续的处理,否则你放大的就不是眼睛。另外在人脸识别方面,比如支付宝刷脸支付、张学友演唱会抓逃犯都运用到了人脸定位然后识别的功能。

三 LBP

LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子,具有多分辨率、灰度尺度不变、旋转不变等特性。主要用于特征提取中的纹理提取。

使用LBP作为人脸检测的特征提取方式具有以下特点:

  • 计算量小;
  • 存储空间小;
  • 计算过程简单,没有复杂的除法和特殊运算,便于硬件实现;
  • 检测的时间短,检测的实时性好。

LBP的核心思想
以中心像素的灰度值作为阈值,与他的领域相比较得到相对应的二进制码来表示局部纹理特征。

基本LBP

在这里插入图片描述
原始的LBP算子定义为在3*3的窗口内,处理83这个像素点的lbp值:

将83与包围83的8个位置进行比较。如果大于83则取值为1,否则为0,然后将这些数据顺时针组合在一起,这样的到一个01111100,即:0x7C(124)。这就是83位置的lbp值。顺序并无硬性要求,只要在同一处理中保持相同的顺序即可。提取的LBP算子在每个像素点都可以得到一个LBP值,对一幅图像提取其原始的LBP算子之后,得到的原始LBP特征依然是“一幅图片”(记录的是每个像素点的LBP值)这种图片称之为lbp图谱。

/**
 * 原始lbp:应该是3x3的src(先不管3x3)
 * src: 原图
 * dst: 计算出的lbp图谱
 *
*/
void processLBP(Mat src, Mat &dst){
    // 循环处理图像数据
    for(int i=1; i < src.rows-1;i++) {
        for(int j=1;j < src.cols-1;j++) {
            uchar lbp = 0;
            uchar center = src.at<uchar>(i,j);
            //取出对应 高、宽位置的像素 与 中心点位置进行比较
            if(src.at<uchar>(i-1,j-1)>center) { lbp += 1 << 7;}
            if(src.at<uchar>(i-1,j  )>center) { lbp += 1 << 6;}
            if(src.at<uchar>(i-1,j+1)>center) { lbp += 1 << 5;}
            if(src.at<uchar>(i  ,j+1)>center) { lbp += 1 << 4;}
            if(src.at<uchar>(i+1,j+1)>center) { lbp += 1 << 3;}
            if(src.at<uchar>(i+1,j  )>center) { lbp += 1 << 2;}
            if(src.at<uchar>(i+1,j-1)>center) { lbp += 1 << 1;}
            if(src.at<uchar>(i  ,j-1)>center) { lbp += 1 << 0;}
            dst.at<uchar>(i-1,j-1) = lbp;
        }
    }
}
//读取一张图片
Mat img = imread("/path/x.png");
cvtColor(img, img, COLOR_BGR2GRAY);
//计算lbp图谱
Mat lbp = Mat(img.rows-2, img.cols-2,CV_8UC1);
processLBP(img,lbp);

从lBP定义可以看出LBP是灰度不变的,简单来说就是对图像的灰度值根据一个系数X进行修改,得出的LBP值不变。

圆形LBP

基本的 LBP算子的最大缺陷在于它只覆盖了一个固定3x3范围内的小区域,为了满足不同尺寸的需要,并达到灰度和旋转不变性的要求,对 LBP 算子进行了改进,将 3×3邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域。以某个像素点为中心,以一个任意大小半径R画一个圆,将落在圆内的P个像素与中心点像素比较得到LBP算子。

在这里插入图片描述

旋转不变LBP

​ LBP 算子是灰度不变的,但却不是旋转不变的,图像的旋转就会得到不同的 LBP值。

在这里插入图片描述

为了解决这个问题,将 LBP算子进行了扩展具有旋转不变性。LBP的旋转不变模式,即不断旋转圆形邻域得到一系列初始定义的 LBP值,取其最小值作为该邻域的 LBP 值。

旋转

首先获得LBP值为: 11100001 (255),进过旋转分别得到8中不同的LBP值,最终得到的具有旋转不变性的 LBP值为 15。

等价LBP

对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生2^P(0和1的排列组合)种模式。随着邻域集内采样点数的增加,二进制模式的种类是以指数形式增加的。这么多的二进制模式导致在人脸检测时候LBP模式统计直方图过于稀疏(见下面检测原理部分)。因此需要对原始的LBP模式进行降维,也就是减少数据量。

​ 等价模式(均匀模式)就是解决这个问题的。 在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。 因此,等价模式定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类,除等价模式类以外的模式都归为另一类,称为混合模式类。

00000000(0次跳变)
00000111(1次从0到1的跳变)
10001111(1到0,0到1,两次跳变)是等价模式类。

10010111(共四次跳变)是混合模式类。

​ 通过这样的改进,二进制模式数量由原来的2^P种减少为 P* ( P-1)+2种。

比如:3x3的8采样本来有256种,现在变成58(等价模式)+1种(混合模式)。即本来lbp值为0-255,也就是256种结果,转化为了59种。混合模式编码为0,等价模式根据值大小编码为1—58。

00000000 : 1

00000001 : 2

00000010 : 3

00000101 : 0 (跳变3次)

58种情况如下:

0次跳变:

11111111 00000000

1次跳变(14个):
01111111 00111111 00011111 00001111 00000111 00000011 00000001

2次跳变(42个)

1:

01000000 00100000 00010000 00001000 00000100 00000010

2:

01100000 00110000 00011000 00001100 00000110

3:

01110000 00111000 00011100 00001110

4:

01111000 00111100 00011110

4:

01111100 00111110

6:

01111110

五 检测原理

​ 将一幅图片划分为若干的子区域,对每个子区域内的每个像素点都提取LBP特征,然后,在每个子区域内建立LBPH(LBP特征的统计直方图)。 每个子区域就可以用一个统计直方图来进行描述;整个图片就由若干个统计直方图组成 之后,将图片和人脸的直方图进行相似性比较。

直方图:

把图片的亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。用横轴代表0-255的亮度数值。竖轴代表照片中对应亮度的像素数量,这个函数图像就被称为直方图。

简单来说,图像的直方图是用来表现图像中亮度分布的情况,给出的是图像中某个亮度或者某个范围亮度下共有几个像素

 [外链图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值