簡介
OpenCV是一個基于BSD許可(開源)發(fā)行的跨平臺計算機視覺庫瞬痘,可以運行在Linux、Windows喧兄、Android和Mac OS操作系統(tǒng)上狼荞。它輕量級而且高效——由一系列 C 函數(shù)和少量 C++ 類[構(gòu)成],同時提供了Python闽寡、Ruby代兵、MATLAB等語言的接口尼酿,實現(xiàn)了[圖像處理]和計算機視覺方面的很多通用算法。
模塊 | 功能 |
---|---|
Core | 核心基礎(chǔ)模塊奢人,定義了被所有其他模塊和基本數(shù)據(jù)結(jié)構(gòu)(包括重要的多維數(shù)組Mat)使用的基本函數(shù)谓媒、底層數(shù)據(jù)結(jié)構(gòu)和算法函數(shù) |
Imgproc | 圖像處理模塊,包括:濾波何乎、高斯模糊句惯、形態(tài)學(xué)處理、幾何變換支救、顏色空間轉(zhuǎn)換及直方圖計算等 |
Highgui | 高層用戶交互模塊抢野,包括:GUI、圖像與視頻I\O等 |
Video | 視頻分析,各墨,運動分析及目標跟蹤指孤。 |
Calib3d | 3D模塊,包括:攝像機標定贬堵、立體匹配恃轩、3D重建等 |
Features2d | 二維特征檢測與描述模塊,包括:圖像特征檢測黎做、描述叉跛、匹配等 |
Objdetect | 目標檢測模塊,如:人臉檢測等 |
MI | 機器學(xué)習(xí)模塊蒸殿,包括:支持向量機筷厘、神經(jīng)網(wǎng)絡(luò)等 |
Flann | 最近鄰開源庫。包含一系列查找算法宏所,自動選取最快算法的機制酥艳。 |
Imgcodecs | 圖像編解碼模塊,圖像文件的讀寫操作 |
Photo | 圖像計算(處理)模塊爬骤,圖像修復(fù)及去噪充石。 |
Shape | 形狀匹配算法模塊。描述形狀盖腕、比較形狀 |
Stitching | 圖像拼接 |
Superres | 超分辨率模塊 |
Videoio | 視頻讀寫模塊赫冬,視頻文件包括攝像頭的輸入。 |
Videostab | 解決拍攝的視頻穩(wěn)定 |
Dnn | 深度神經(jīng)網(wǎng)絡(luò) |
contrib | 可以引入額外模塊 |
人臉檢測識別
人臉定位是人臉檢測溃列、識別等一系列后續(xù)功能的基礎(chǔ)
LBP
(Local Binary Pattern劲厌,局部二值模式)是一種用來描述圖像局部紋理特征的算子,具有多分辨率、灰度尺度不變听隐、旋轉(zhuǎn)不變等特性补鼻。主要用于特征提取中的紋理提取。
使用LBP作為人臉檢測的特征提取方式具有:計算量小风范;存儲空間凶傻;計算過程簡單硼婿,沒有復(fù)雜的除法和特殊運算锌半,便于硬件實現(xiàn);檢測的時間短寇漫,檢測的實時性好刊殉。
LBP的核心思想就是:以中心像素的灰度值作為閾值,與他的領(lǐng)域相比較得到相對應(yīng)的二進制碼來表示局部紋理特征
基本LBP
原始的LBP算子定義為在33的窗口內(nèi)州胳,處理83這個像素點的lbp值
由一張原始圖片 -> 33 的像素區(qū)域 -> 對每個點進行灰度 -> 以中心點的灰度值 83 作為基準 记焊,處理周圍的像素點,大于 83 值為 1栓撞,否則為 0
最終得到lbp值 01111100 = 124 (注意順時針)
代碼流程如下:
/**
* 原始lbp:3x3的src
* src: 原圖
* dst: 計算出的lbp圖譜
*/
void processLBP(Mat src, Mat &dst){
// 循環(huán)處理圖像數(shù)據(jù)
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);
//取出對應(yīng) 高遍膜、寬位置的像素 與 中心點位置進行比較
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是灰度不變的,簡單來說就是對圖像的灰度值根據(jù)一個系數(shù)X進行修改瓤湘,得出的LBP值不變瓢颅。
另外還有:圓形LBP、旋轉(zhuǎn)不變LBP弛说、 等價LBP 等等是在基本LBP 的基礎(chǔ)上算法優(yōu)化提升
檢測識別的原理:
將一幅圖片劃分為若干的子區(qū)域惜索,對每個子區(qū)域內(nèi)的每個像素點都提取LBP特征,然后剃浇,在每個子區(qū)域內(nèi)建立LBPH(LBP特征的統(tǒng)計直方圖)。 每個子區(qū)域就可以用一個統(tǒng)計直方圖來進行描述猎物;整個圖片就由若干個統(tǒng)計直方圖組成 之后虎囚,將圖片和人臉的直方圖進行相似性比較。
直方圖:
把圖片的亮度分為0到255共256個數(shù)值蔫磨,數(shù)值越大淘讥,代表的亮度越高。其中0代表純黑色的最暗區(qū)域堤如,255表示最亮的純白色蒲列,而中間的數(shù)字就是不同亮度的灰色。用橫軸代表0-255的亮度數(shù)值搀罢。豎軸代表照片中對應(yīng)亮度的像素數(shù)量蝗岖,這個函數(shù)圖像就被稱為直方圖。
簡單來說榔至,圖像的直方圖是用來表現(xiàn)圖像中亮度分布的情況,給出的是圖像中某個亮度或者某個范圍亮度下共有幾個像素
在統(tǒng)計學(xué)中抵赢,直方圖是一種對數(shù)據(jù)分布情況的圖形表示,是一種二維統(tǒng)計圖表,它的兩個坐標分別是統(tǒng)計樣本(圖像铅鲤、視頻幀)和樣本的某種屬性(亮度划提,像素值,梯度邢享,方向鹏往,色彩等等任何特征)。