openCV 基礎(chǔ)函數(shù)和類
OpenCV環(huán)境配置及測試
預(yù)熱:
1俭嘁、環(huán)境配置
在系統(tǒng)環(huán)境變量path中 追加路徑:C:\openCV\install\x86\mingw\bin
2沈跨、配置工程文件pro:
INCLUDEPATH += C:\openCV\install\include
INCLUDEPATH += C:\openCV\install\include\opencv
INCLUDEPATH += C:\openCV\install\include\opencv2
LIBS += C:/openCV/install/x86/mingw/lib/libopencv_*.a
3劲室、頭文件
#include <opencv2/opencv.hpp>
using namespace cv;
4仿耽、測試Code
int main(int argc, char *argv[])
{
Mat src, dst;
src = imread("1.jpg");
if (!src.data) {
printf("could not load image...\n");
return -1;
}
namedWindow("input image", CV_WINDOW_AUTOSIZE);
imshow("input image", src);
waitKey(0);
return 0;
}
備注:我的QT版本是5.4.0
以下開啟OpenCV的學(xué)習(xí)Q矣堋I恰恭金!
Mat類
OpenCV中表示圖像的類
計(jì)算機(jī)“眼中”的圖片(二維數(shù)組)
創(chuàng)建對象
Mat src;
重要屬性
Mat src;
src.clos; //獲取圖像的寬度
src.rows;//獲取圖像的高度
src.channels();//獲取圖像的通道數(shù),表示一個像素點(diǎn)的數(shù)組元素的個數(shù)褂策,比如:BGR的圖片通道數(shù)是3
常用函數(shù)
功能:加載圖像
Mat imread( const String& filename, int flags = IMREAD_COLOR );
參數(shù)1:圖片的路徑
參數(shù)2:圖像的色彩空間模式(默認(rèn)為BGR)
返回值:圖像對象
功能:在窗口顯示圖像
void imshow(const String& winname, const ogl::Texture2D& tex);
參數(shù)1:窗口名稱
參數(shù)2:圖像對象Mat就可以
功能:轉(zhuǎn)換圖像色彩空間 色彩空間(一個像素點(diǎn)的組成)
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
參數(shù)1:輸入圖像
參數(shù)2:輸出圖像
參數(shù)3:色彩空間 詳情ColorConversionCodes
參數(shù)4:通道數(shù)横腿,默認(rèn)根據(jù)色彩空間決定
常用來將BGR轉(zhuǎn)成Gray,灰度圖雖然難看辙培,但是保留了原圖像的所有特征蔑水,提升效率。
flip();//圖片翻轉(zhuǎn)
resize();//
Mat類轉(zhuǎn)換到QImage
通常情況下需要在QT上顯示圖片扬蕊,因此了解Mat(BGR)轉(zhuǎn)換QImage(RGB)非常必要
Mat src;
Mat dst;
執(zhí)行操作步驟:
1搀别、色彩空間轉(zhuǎn)換
cvtColor(src,dst,CV_BGR2RGB);
2、QImage img(dst.data, dst.cols, dst.rows, dst.cols*rgb.channels(), QImage::Format_RGB888);
QImgae構(gòu)造函數(shù)的參數(shù)說明:
參數(shù)1:存放圖片數(shù)據(jù)的數(shù)組
參數(shù)2:圖片的列數(shù)
參數(shù)3:圖片的行數(shù)
參數(shù)4:每一行的通道數(shù)
參數(shù)5:圖片的編碼格式
3尾抑、可以在Qt上顯示了
ui->show_label->setPixmap(QPixmap::fromImage(img));
VideoCapture視頻類
常用函數(shù)
功能:打開視頻
bool open(const String& filename);
參數(shù)1:視頻路徑歇父;參數(shù)傳整數(shù)0,表示打開攝像頭
返回值:打開成功
功能:讀取視頻幀
VideoCapture& operator >> (CV_OUT Mat& image);
參數(shù)1:讀取到Mat對象
返回值:VideoCapture對象
矩陣掩膜
掩膜并不重要再愈,重要的是通過掩膜我們來感受卷積榜苫,opencv對圖像所有的操作幾乎都是卷積
卷積:對圖片中的每個像素點(diǎn)進(jìn)行特定的操作
有什么用呢?
可以提升圖片的對比度翎冲,對比美顏相機(jī)(降低對比度)
常用函數(shù)
功能:獲取圖像像素指針
Mat src;
uchar* p = src.ptr<uchar>(i) 獲取圖像像素的指針垂睬,i表示第i行
這里的指針p偏移一個單位是偏移了一個通道,而不是一個像素點(diǎn)抗悍,對于3通道的圖片驹饺,p需要偏移3次才能指向下調(diào)一個像素點(diǎn)
功能:獲取通道數(shù)
src.channels()
功能:獲取位圖深度
src.depth()
位圖深度:指一個像素點(diǎn)的通道的值,占了幾個二進(jìn)制位
功能:像素范圍處理
saturate_cast<uchar>(num) 將數(shù)字參數(shù)num的值限制的類型參數(shù)的范圍內(nèi)缴渊,如果num超出最小值范圍赏壹,
函數(shù)返回最小值,超出最大值范圍衔沼,函數(shù)返回最大值蝌借。
功能:掩膜公式
矩陣的掩膜操作十分簡單昔瞧,就是掩膜來計(jì)算每個像素的像素值,從而提升對比對菩佑,掩膜(mask也被稱作kernel)
I(i,j) = 5*I(i,j)-[I(i+1,j)+I(i-1,j)+I(i,j+1)+I(i,j-1)]
功能:對RGB圖修改像素值
Vec3b val = img.at<Vec3b>(i, j);
img.at<Vec3b>(y,x)[0]=128; // blue
img.at<Vec3b>(y,x)[1]=128; // green
img.at<Vec3b>(y,x)[2]=128; // red
或者
Vec3b v(255, 255, 255);
src.at<Vec3b>(j,i) = v;//一次性給返回值的三個通道賦值
Rect類
矩形
void rectangle( Mat& img, //背景圖片
Rect rec, //矩形的范圍
const Scalar& color, //顏色
int thickness = 1, //線條寬度
int lineType = LINE_8,
//線條類型LINE_4 LINE_8 LINE_AA(反鋸齒)
int shift = 0); //點(diǎn)坐標(biāo)中小數(shù)位數(shù)
截圖自晰,對感興趣區(qū)域選擇
Mat src;
Rect rect(100, 100, 200, 400);
//參數(shù)1 矩形左上角x
//參數(shù)2 矩形左上角y
//參數(shù)3 矩形寬
//參數(shù)4 矩形高
Mat dst = src(rect);
//這里是()的運(yùn)算符重載,從src中截取rect部分的圖片放到dst里
級聯(lián)分類器
理論上可以查找任何事物
訓(xùn)練模型文件采用OpenCV自帶的
路徑:C:/openCV/install/etc/haarcascades/haarcascade_frontalface_alt2.xml
識別:
通過多級篩選在圖片中尋找目標(biāo)
注意:1擎鸠、不要每次都創(chuàng)建新的對象缀磕,重復(fù)加載模型不合理
2、加載很多個臉怎么回事 detectMultiScale參數(shù)是不是寫錯了
cv::CascadeClassifier類 _初始化級聯(lián)分類器
CascadeClassifier classifier = CascadeClassifier(const String& filename);
參數(shù):訓(xùn)練模型的文件路徑
人臉檢測函數(shù)_detectMultiScale
void detectMultiScale(
InputArray image,
//待檢測的灰度圖劣光,需要預(yù)先進(jìn)行直方圖均值化來提升對比度
CV_OUT std::vector<Rect>& objects,//查找到的目標(biāo)矩形輸出
double scaleFactor = 1.1,//前后兩次相繼的掃描中搜索窗口的比例系數(shù)袜蚕,默認(rèn)為1.1 即每次搜索窗口擴(kuò)大10%,這個值越大,某些尺寸的對象無法被檢測绢涡,但檢測更快
int minNeighbors = 3,
//有多少個重疊的檢測標(biāo)記才被認(rèn)為有效
int flags = 0, //新的級聯(lián)分類器沒用
Size minSize = Size(),//目標(biāo)最小尺寸
Size maxSize = Size() );//目標(biāo)最大尺寸牲剃,可以排除不合理對象,大大提升識別效率
機(jī)器學(xué)習(xí)_人臉識別器
1雄可、機(jī)器學(xué)習(xí)的作用:根據(jù)提供的圖片模型通過算法生成數(shù)據(jù)模型凿傅,從而在其他圖片中查找相關(guān)的目標(biāo)
2、人臉識別的兩種常見算法
1.Fisher
輸入數(shù)據(jù)-->減去均值-->計(jì)算離散矩陣-->計(jì)算特征值與特征向量-->計(jì)算前K個最大特征值對應(yīng)特征向量-->投影到子空間-->終止
2.LBPH
開始-->圖像灰度化-->LBP特征提取-->ULBP降維處理-->分割為多個方格-->每個方格生成直方圖-->直方圖連接特征向量集合-->直方圖比較-->得到分類結(jié)果
FaceRecognizer類
opencv提供的人臉識別器基類数苫,LBPHFaceRecognizer是根據(jù)LBPH算法實(shí)現(xiàn)的識別器類.
- 頭文件
#include <opencv2/face.hpp> //人臉識別器
using namespace cv::face;
- 創(chuàng)建對象
//創(chuàng)建空的人臉識別器對象
Ptr<FaceRecognizer> recognizer = LBPHFaceRecognizer::create();
//根據(jù)已有的模型創(chuàng)新人臉識別器對象
Ptr<FaceRecognizer> recognizer = FaceRecognizer::load<LBPHFaceRecognizer>("模型文件.xml");
機(jī)器學(xué)習(xí)
_更新模型
void update(
InputArrayOfArrays src, //圖片模型數(shù)組 vector<Mat>
InputArray labels);//標(biāo)簽數(shù)組聪舒,每個模型識別后的標(biāo)簽 vector<int>
_保存模型
void save(const String& filename);
_預(yù)測目標(biāo)
void predict(InputArray src, //預(yù)測圖形
int &label, //預(yù)測后的標(biāo)簽,學(xué)習(xí)時對應(yīng)的標(biāo)簽
double &confidence) const;//可信度
使用定時器說明
由于UI界面不能出現(xiàn)死循環(huán)之類的虐急,否則就卡住了
因此考慮使用定時器 箱残。