一、關(guān)于圖像處理的相關(guān)類和函數(shù)
圖像容器:Mat類
讀取圖像:
Mat imread( const String& filename, int flags = IMREAD_COLOR );
功能:讀取出圖像
參數(shù):圖像路徑
返回值:讀取的圖像
?命名展示圖像的窗口:
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
功能:命名一個圖像窗口
參數(shù)1:窗口名稱
參數(shù)2:窗體尺寸,默認(rèn)為自適應(yīng)大小
返回值:無
展示圖像:
void imshow(const String& winname, const ogl::Texture2D& tex);
功能:展示圖像
參數(shù)1:要展示圖像的窗口名稱
參數(shù)2:要展示的二維圖像
返回值:無
示例:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
//1、定義一個圖像容器
Mat src;
//2、將圖像加載進(jìn)來
//函數(shù)原型:Mat imread( const String& filename, int flags = IMREAD_COLOR );
//參數(shù):圖像的路徑
//返回值:圖像容器
src = imread("D:/opencv/resource/age.jpg");
//4、命名一個展示圖像的窗口
//namedWindow("Test");
//5、展示圖像
//函數(shù)原型:void imshow(const String& winname, const ogl::Texture2D& tex);
//參數(shù)1:要展示圖像的窗口名稱
//參數(shù)2:要展示的圖像
//返回值:無
imshow("Test", src);
return a.exec();
}
二、視頻流相關(guān)類和函數(shù)
視頻流類:VideoCapture
打開視頻:
virtual bool open(const String& filename);
參數(shù):要打開視頻的路徑
返回值:成功返回true失敗返回false
若想要打開攝像頭只需在構(gòu)造時,調(diào)用構(gòu)造函數(shù)參數(shù)傳遞0即可
讀取視頻流中圖像:
virtual bool read(OutputArray image);
功能:讀取視頻流中的圖像
參數(shù):圖像容器
返回值:成功讀取返回true,失敗或者視頻結(jié)束返回false
?圖像翻轉(zhuǎn):
void flip(InputArray src, OutputArray dst, int flipCode);
將圖像進(jìn)行旋轉(zhuǎn)
參數(shù)1:要處理的圖像
參數(shù)2:處理后的圖像容器
參數(shù)3:處理規(guī)則:0:表示沿x翻轉(zhuǎn),1表示沿y軸翻轉(zhuǎn),-1表示沿xy軸翻轉(zhuǎn)
休眠阻塞函數(shù):
int waitKey(int delay = 0);
功能:阻塞等待用戶輸入數(shù)據(jù),如果delay=0,則一直等待
參數(shù):毫秒數(shù)
返回值:在等待過程中用戶按下鍵的值
示例:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
//1、定義視頻流對象
VideoCapture v(0); //表明使用攝像頭構(gòu)造一個視頻流對象
//2、讀取攝像頭中的圖像
Mat src; //用于存放讀取出來的圖像
//函數(shù)原型:virtual bool read(OutputArray image);
//功能:從視頻流中讀取一張圖像放入?yún)?shù)中
//參數(shù):圖像容器
//返回值:成功返回真,失敗或者讀取視頻結(jié)束返回假
while(v.read(src))
{
//將圖像進(jìn)行翻轉(zhuǎn)
//函數(shù)原型:void flip(InputArray src, OutputArray dst, int flipCode);
//參數(shù)1:要翻轉(zhuǎn)的圖像
//參數(shù)2:翻轉(zhuǎn)后的圖像容器
//參數(shù)3:翻轉(zhuǎn)規(guī)則:正數(shù)表示按y軸翻轉(zhuǎn),0表示按x軸翻轉(zhuǎn),負(fù)數(shù)表示按xy軸翻轉(zhuǎn)
flip(src, src, 1);
//展示圖像
imshow("Test1", src);
//加延時函數(shù)
//函數(shù)原型:int waitKey(int delay = 0);
//參數(shù):等待時間
//返回值:在等待期間用戶按下的鍵盤的ascii值 ESC鍵對應(yīng)的值為27
if(waitKey(20)==27)
{
break;
}
}
return a.exec();
}
三、圖像處理
灰度處理:
void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
功能:轉(zhuǎn)換圖像色彩空間
參數(shù)1:要轉(zhuǎn)換的圖像
參數(shù)2:轉(zhuǎn)變后圖像容器
參數(shù)3:轉(zhuǎn)換規(guī)則:BGR to gray
返回值:無
均衡化處理:
void equalizeHist( InputArray src, OutputArray dst );
參數(shù)1:輸入的灰度圖像,必須是8-bit的單通道圖像
參數(shù)2:輸出的圖像
圖像直方圖:對整個圖像在灰度范圍內(nèi)的像素值(0-255)統(tǒng)計出現(xiàn)的頻率,據(jù)此生成直方圖,直方圖反應(yīng)了圖像的灰度分布情況。
示例:
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
//1、定義視頻流對象
VideoCapture v(0); //表明使用攝像頭構(gòu)造一個視頻流對象
//2、讀取攝像頭中的圖像
Mat src; //用于存放讀取出來的圖像
Mat gray; //用于存儲灰度圖的圖像容器
Mat dst; //用于存儲均衡化處理后的圖像容器
//函數(shù)原型:virtual bool read(OutputArray image);
//功能:從視頻流中讀取一張圖像放入?yún)?shù)中
//參數(shù):圖像容器
//返回值:成功返回真,失敗或者讀取視頻結(jié)束返回假
while(v.read(src))
{
//將圖像進(jìn)行翻轉(zhuǎn)
//函數(shù)原型:void flip(InputArray src, OutputArray dst, int flipCode);
//參數(shù)1:要翻轉(zhuǎn)的圖像
//參數(shù)2:翻轉(zhuǎn)后的圖像容器
//參數(shù)3:翻轉(zhuǎn)規(guī)則:正數(shù)表示按y軸翻轉(zhuǎn),0表示按x軸翻轉(zhuǎn),負(fù)數(shù)表示按xy軸翻轉(zhuǎn)
flip(src, src, 1);
//3、將圖像灰度處理
//函數(shù)原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
//參數(shù)1:要轉(zhuǎn)換的圖像
//參數(shù)2:轉(zhuǎn)換后的圖像容器
//參數(shù)3:轉(zhuǎn)換規(guī)則 CV_BGR2GRAY表示將bgr彩色圖轉(zhuǎn)換為gray灰度圖
//返回值:無
cvtColor(src, gray, CV_BGR2GRAY);
//4、對圖像進(jìn)行均衡化處理
//函數(shù)原型:void equalizeHist( InputArray src, OutputArray dst );
//參數(shù)1:要進(jìn)行均衡化處理的圖像,必須是單通道灰度圖
//參數(shù)2:均衡化處理后的圖像容器
//返回值:無
equalizeHist(gray, dst);
//展示彩色圖像
imshow("Test1", src);
//展示灰度圖像
imshow("Test2", gray);
//展示均衡化處理后的圖像
imshow("Test3", dst);
//加延時函數(shù)
//函數(shù)原型:int waitKey(int delay = 0);
//參數(shù):等待時間
//返回值:在等待期間用戶按下的鍵盤的ascii值 ESC鍵對應(yīng)的值為27
if(waitKey(20)==27)
{
break;
}
}
return a.exec();
}
四、級聯(lián)分類器
opencv級聯(lián)分類器工具類 : CascadeClassifier
加載級聯(lián)分類器配置文件 :
bool load( const String& filename )
參數(shù)1:分類器數(shù)據(jù)文件的名字
返回值:成功true,失敗false
找到人臉?biāo)谖恢玫木匦螀^(qū)域:
void detectMultiScale(
const Mat& image,
CV_OUT vector& objects,
double scaleFactor = 1.1,
int minNeighbors = 3,
int flags = 0,
Size ize = Size(24,24))
參數(shù)1:待檢測灰度圖像(數(shù)據(jù)少處理起來簡單)
參數(shù)2:被檢測物體的矩形框向量( 人臉Rect矩形區(qū)域,其中objects.size()是人臉個數(shù) )
參數(shù)3:前后兩次相繼的掃描中搜索窗口的比例系數(shù),默認(rèn)為1.1 即每次搜索窗口擴大10%
參數(shù)4:構(gòu)成檢測目標(biāo)的相鄰矩形的最小個數(shù) 如果組成檢測目標(biāo)的小矩形的個數(shù)和小于 minneighbors - 1 都會被除
參數(shù)5:若設(shè)置為CV_HAAR_DO_CANNY_PRUNING 函數(shù)將會使用Canny邊緣檢測來排除邊緣過多 或過少的區(qū)域,,一般采用默認(rèn)值0
參數(shù)6:用來限制得到的目標(biāo)區(qū)域的范圍,一般檢測人臉使用Size(24, 24)
顯示矩形區(qū)域:
void rectangle(
CV_IN_OUT Mat& img,
Rect rec,
const Scalar& color,
int thickness = 1,
int lineType = LINE_8,
int shift = 0);
img:圖像。
rec:表征矩形的位置和長寬。
color:線條顏色 (RGB) 。
thickness:組成矩形的線條的粗細(xì)程度。
line_type:線條的類型。
shift:坐標(biāo)點的小數(shù)點位數(shù),0表示沒有小數(shù)點。
示例:文章來源:http://www.zghlxwxcb.cn/news/detail-696493.html
?文章來源地址http://www.zghlxwxcb.cn/news/detail-696493.html
#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
//1、定義視頻流對象
VideoCapture v(0); //表明使用攝像頭構(gòu)造一個視頻流對象
//2、讀取攝像頭中的圖像
Mat src; //用于存放讀取出來的圖像
Mat gray; //用于存儲灰度圖的圖像容器
Mat dst; //用于存儲均衡化處理后的圖像容器
//5、實例化一個級聯(lián)分類器的對象,用于找到圖像中的人臉矩形區(qū)域
CascadeClassifier c;
//給類對象裝載人臉識別模型
//函數(shù)原型:bool load( const String& filename );
//功能:給級聯(lián)分類器對象,下載一個識別模型
//參數(shù):人臉識別模型的文件路徑
//返回值:成功下載返回真,失敗返回假
if(!c.load("D:/opencv/resource/haarcascade_frontalface_alt2.xml"))
{
QMessageBox::information(NULL,"失敗", "人臉識別模型裝載失敗");
return -1;
}
//定義容器存放人臉分類后的矩形框
vector<Rect> faces;
//函數(shù)原型:virtual bool read(OutputArray image);
//功能:從視頻流中讀取一張圖像放入?yún)?shù)中
//參數(shù):圖像容器
//返回值:成功返回真,失敗或者讀取視頻結(jié)束返回假
while(v.read(src))
{
//將圖像進(jìn)行翻轉(zhuǎn)
//函數(shù)原型:void flip(InputArray src, OutputArray dst, int flipCode);
//參數(shù)1:要翻轉(zhuǎn)的圖像
//參數(shù)2:翻轉(zhuǎn)后的圖像容器
//參數(shù)3:翻轉(zhuǎn)規(guī)則:正數(shù)表示按y軸翻轉(zhuǎn),0表示按x軸翻轉(zhuǎn),負(fù)數(shù)表示按xy軸翻轉(zhuǎn)
flip(src, src, 1);
//3、將圖像灰度處理
//函數(shù)原型:void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 );
//參數(shù)1:要轉(zhuǎn)換的圖像
//參數(shù)2:轉(zhuǎn)換后的圖像容器
//參數(shù)3:轉(zhuǎn)換規(guī)則 CV_BGR2GRAY表示將bgr彩色圖轉(zhuǎn)換為gray灰度圖
//返回值:無
cvtColor(src, gray, CV_BGR2GRAY);
//4、對圖像進(jìn)行均衡化處理
//函數(shù)原型:void equalizeHist( InputArray src, OutputArray dst );
//參數(shù)1:要進(jìn)行均衡化處理的圖像,必須是單通道灰度圖
//參數(shù)2:均衡化處理后的圖像容器
//返回值:無
equalizeHist(gray, dst);
//6、使用級聯(lián)分類器對象,獲取人臉矩形區(qū)域
//函數(shù)原型:void detectMultiScale( InputArray image,CV_OUT std::vector<Rect>& objects)
//參數(shù)1:要進(jìn)行識別的圖像
//參數(shù)2:對該圖像識別后,的矩形框存放的數(shù)組容器
c.detectMultiScale(dst, faces);
//7、將上述得到的矩形框,全部都繪制到圖像上
for(int i=0; i<faces.size(); i++)
{
//將任意一個矩形框,全部都繪制到圖像上
//函數(shù)原型:void rectangle(CV_IN_OUT Mat& img, Rect rec,const Scalar& color, int thickness = 1)
//參數(shù)1:要被繪制的圖像
//參數(shù)2:要繪制的矩形框
//參數(shù)3:矩形框的顏色
//參數(shù)4:矩形框的粗細(xì)
//返回值:無
rectangle(src, faces[i], Scalar(0,0,255), 2);
}
//8、像素反差
for(int i=0; i<src.rows; i++) //外層循環(huán)控制行數(shù)
{
for(int j=0; j<src.cols; j++) //內(nèi)層循環(huán)控制列數(shù)
{
//找到任意一個像素:src.at<Vec3b>(i,j)
//找到任意一個像素中的通道中的值src.at<Vec3b>(i,j)[k]
for(int k=0; k<3; k++)
{
src.at<Vec3b>(i,j)[k] = 255 - src.at<Vec3b>(i,j)[k]; //對像素進(jìn)行反差
}
}
}
//展示彩色圖像
imshow("Test1", src);
//展示灰度圖像
imshow("Test2", gray);
//展示均衡化處理后的圖像
imshow("Test3", dst);
//加延時函數(shù)
//函數(shù)原型:int waitKey(int delay = 0);
//參數(shù):等待時間
//返回值:在等待期間用戶按下的鍵盤的ascii值 ESC鍵對應(yīng)的值為27
if(waitKey(20)==27)
{
break;
}
}
return a.exec();
}
到了這里,關(guān)于QT連接OpenCV庫實現(xiàn)人臉識別的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!