OpenCV學(xué)習(xí)筆記3找出人臉-同時(shí)比較兩張圖片中的人臉相似度_第1頁(yè)
OpenCV學(xué)習(xí)筆記3找出人臉-同時(shí)比較兩張圖片中的人臉相似度_第2頁(yè)
OpenCV學(xué)習(xí)筆記3找出人臉-同時(shí)比較兩張圖片中的人臉相似度_第3頁(yè)
OpenCV學(xué)習(xí)筆記3找出人臉-同時(shí)比較兩張圖片中的人臉相似度_第4頁(yè)
OpenCV學(xué)習(xí)筆記3找出人臉-同時(shí)比較兩張圖片中的人臉相似度_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

OpenCV學(xué)習(xí)筆記3:找出人臉,同時(shí)比較兩張圖片中的人臉相似度

終于到了有實(shí)際應(yīng)用的功能了,有2張圖片,里面各有一個(gè)人臉,我的目的是比較這兩個(gè)人臉的相似度,這里用到了facedetect的功能,還有圖像轉(zhuǎn)換,圖像剪切,以及直方圖的比較。具體流程是:

1。分別用facedetect功能將兩張圖片中的人臉檢測(cè)出來(lái)

2。將人臉部分的圖片剪切出來(lái),存到兩張只有人臉的圖片里。

3。將這兩張人臉圖片轉(zhuǎn)換成單通道的圖像

4。使用直方圖比較這兩張單通道的人臉圖像,得出相似度。

這里對(duì)圖的要求還是比較高的,光線和姿勢(shì)不能有差別,臉的垂直或者左右角度偏差就會(huì)影響比較,但和兩張圖片的大小關(guān)系不大,本人覺(jué)得較適合于證件照的對(duì)比。下面是代碼,其中haarcascade_frontalface_alt.xml是opencv里facedetect例子用的樣本。比較的是srcImage和targetImage對(duì)應(yīng)的文件.還有下面是IplImage和Mat混用,純當(dāng)熟悉這兩個(gè)類了。[cpp]

\o"viewplain"viewplain\o"copy"copy

[cpp]

\o"viewplain"viewplain\o"copy"copy

[cpp]

\o"viewplain"viewplain\o"copy"copy#include

"opencv/cv.hpp"

#include

"opencv2/objdetect/objdetect.hpp"

#include

"opencv2/highgui/highgui.hpp"

#include

"opencv2/imgproc/imgproc.hpp"

#include

<iostream>

#include

<stdio.h>

using

namespace

std;

using

namespace

cv;

String

cascadeName

=

"D:\\OpenCV-2.4.2\\data\\haarcascades\\haarcascade_frontalface_alt.xml";

IplImage*

cutImage(IplImage*

src,

CvRect

rect)

{

cvSetImageROI(src,

rect);

IplImage*

dst

=

cvCreateImage(cvSize(rect.width,

rect.height),

src->depth,

src->nChannels);

cvCopy(src,dst,0);

cvResetImageROI(src);

return

dst;

}

IplImage*

detect(

Mat&

img,

CascadeClassifier&

cascade,

double

scale)

{

int

i

=

0;

double

t

=

0;

vector<Rect>

faces;

Mat

gray,

smallImg(

cvRound

(img.rows/scale),

cvRound(img.cols/scale),

CV_8UC1

);

cvtColor(

img,

gray,

CV_BGR2GRAY

);

resize(

gray,

smallImg,

smallImg.size(),

0,

0,

INTER_LINEAR

);

equalizeHist(

smallImg,

smallImg

);

t

=

(double)cvGetTickCount();

cascade.detectMultiScale(

smallImg,

faces,

1.3,

2,

CV_HAAR_SCALE_IMAGE,

Size(30,

30)

);

t

=

(double)cvGetTickCount()

-

t;

printf(

"detection

time

=

%g

ms\n",

t/((double)cvGetTickFrequency()*1000.)

);

for(

vector<Rect>::const_iterator

r

=

faces.begin();

r

!=

faces.end();

r++,

i++

)

{

IplImage*

temp

=

cutImage(&(IplImage(img)),

cvRect(r->x,

r->y,

r->width,

r->height));

return

temp;

}

return

NULL;

}

//畫直方圖用

int

HistogramBins

=

256;

float

HistogramRange1[2]={0,255};

float

*HistogramRange[1]={&HistogramRange1[0]};

int

CompareHist(IplImage*

image1,

IplImage*

image2)

{

IplImage*

srcImage;

IplImage*

targetImage;

if

(image1->nChannels

!=

1)

{

srcImage

=

cvCreateImage(cvSize(image1->width,

image1->height),

image1->depth,

1);

cvCvtColor(image1,

srcImage,

CV_BGR2GRAY);

}

else

{

srcImage

=

image1;

}

if

(image2->nChannels

!=

1)

{

targetImage

=

cvCreateImage(cvSize(image2->width,

image2->height),

srcImage->depth,

1);

cvCvtColor(image2,

targetImage,

CV_BGR2GRAY);

}

else

{

targetImage

=

image2;

}

CvHistogram

*Histogram1

=

cvCreateHist(1,

&HistogramBins,

CV_HIST_ARRAY,HistogramRange);

CvHistogram

*Histogram2

=

cvCreateHist(1,

&HistogramBins,

CV_HIST_ARRAY,HistogramRange);

cvCalcHist(&srcImage,

Histogram1);

cvCalcHist(&targetImage,

Histogram2);

cvNormalizeHist(Histogram1,

1);

cvNormalizeHist(Histogram2,

1);

//

CV_COMP_CHISQR,CV_COMP_BHATTACHARYYA這兩種都可以用來(lái)做直方圖的比較,值越小,說(shuō)明圖形越相似

printf("CV_COMP_CHISQR

:

%.4f\n",

cvCompareHist(Histogram1,

Histogram2,

CV_COMP_CHISQR));

printf("CV_COMP_BHATTACHARYYA

:

%.4f\n",

cvCompareHist(Histogram1,

Histogram2,

CV_COMP_BHATTACHARYYA));

//

CV_COMP_CORREL,

CV_COMP_INTERSECT這兩種直方圖的比較,值越大,說(shuō)明圖形越相似

printf("CV_COMP_CORREL

:

%.4f\n",

cvCompareHist(Histogram1,

Histogram2,

CV_COMP_CORREL));

printf("CV_COMP_INTERSECT

:

%.4f\n",

cvCompareHist(Histogram1,

Histogram2,

CV_COMP_INTERSECT));

cvReleaseHist(&Histogram1);

cvReleaseHist(&Histogram2);

if

(image1->nChannels

!=

1)

{

cvReleaseImage(&srcImage);

}

if

(image2->nChannels

!=

1)

{

cvReleaseImage(&targetImage);

}

return

0;

}

String

srcImage

=

"d:\\ldh1.jpg";

String

targetImage

=

"d:\\ldh5.jpg";

int

main(int

argc,

char*

argv[])

{

CascadeClassifier

cascade;

namedWindow("image1");

namedWindow("image2");

if(

!cascade.load(

cascadeName

)

)

{

return

-1;

}

Mat

srcImg,

targetImg;

IplImage*

faceImage1;

IplImage*

faceImage2;

srcImg

=

imread(srcImage);

targetImg

=

imread(targetImage);

faceImage1

=

detect(srcImg,

cascade,

1);

if

(faceImage1

==

NULL)

{

return

-1;

}

//

cvSaveImage("d:\\face.jpg",

faceImage1,

0);

faceImage2

=

detect(targetImg,

cascade,

1);

if

(faceImage2

==

NULL)

{

return

-1;

}

//

cvSaveImage(

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論