

如上圖存在的問題 求大神幫我改一改
代碼如下
#include "cv.h"
#include "highgui.h"
#include "windows.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <float.h>
#include <limits.h>
#include <time.h>
#include <ctype.h>
#ifdef _EiC
#define WIN32
#endif
static CvMemStorage* storage = 0;
static CvHaarClassifierCascade* cascade = 0;
void detect_and_draw( IplImage* image );
const char* cascade_name =
"haarcascade_frontalface_alt.xml";
/* "haarcascade_profileface.xml";*/
int main( int argc, char** argv )
{
// HWND MyWin;
cascade_name = "haarcascade_frontalface_alt2.xml";
cascade = (CvHaarClassifierCascade*)cvLoad( cascade_name, 0, 0, 0 );
//CvCapture* pCap = cvCreateCameraCapture( 1 );//這里-1也可以,不過我的電腦裝的有CyberLink YouCam軟體,
// //OpenCV會默認呼叫該攝像頭,而不呼叫系統的驅動
//IplImage *frame = NULL;
//if (cvCreateCameraCapture == NULL)
//{
// return(0);
//}
//cvNamedWindow("Camera",CV_WINDOW_FULLSCREEN);
//while ((frame = cvQueryFrame(pCap)) != 0 && cvWaitKey(20) != 27)
//{
// frame = cvQueryFrame(pCap);
// cvShowImage("Camera", frame);
//}
//cvReleaseCapture(&pCap);
//cvDestroyWindow("Camera");
if( !cascade )
{
fprintf( stderr, "ERROR: Could not load classifier cascade\n" );
return -1;
}
storage = cvCreateMemStorage(0);
// cvNamedWindow( "result", 1 );
//const char* filename = "op.jpg";
//IplImage* image = cvLoadImage( filename, 1 );
//if( image )
//{
// detect_and_draw( image );
// cvWaitKey(0);
// cvReleaseImage( &image );
//}
//cvDestroyWindow("result");
//========================================================
// CvCapture 是一個結構體,用來保存影像捕獲所需要的資訊。
// opencv提供兩種方式從外部捕獲影像,一種是從攝像頭中,一種
// 是通過解碼視頻得到影像。兩種方式都必須從第一幀開始一幀一幀
// 的按順序獲取,因此每獲取一幀后都要保存相應的狀態和引數。
// 比如從視頻檔案中獲取,需要保存視頻檔案的檔案名,相應的******
// 型別,下一次如果要獲取將需要解碼哪一幀等。 這些資訊都保存在
// CvCapture結構中,每獲取一幀后,這些資訊都將被更新,獲取下一幀
// 需要將新資訊傳給獲取的api介面
//=======================================================
CvCapture* capture = 0;
//===========================================================
// IplImage 是結構體型別,用來保存一幀影像的資訊,也就是一幀
// 影像的所有像素值構成的一個矩陣
//===========================================================
IplImage *frame, *frame_copy = 0;
// 創建一個視窗,用“result”作為視窗的識別符號
cvNamedWindow( "source", 1 );
// ==========================================
// 初始化一個視頻捕獲操作。
// 告訴底層的捕獲api我想從 Capture1.avi中捕獲圖片,
// 底層api將檢測并選擇相應的******并做好準備作業
//==============================================
capture = cvCaptureFromFile("papi.avi");
// 如果 初始化失敗,那么capture為空指標,程式停止,
// 否則進入捕獲回圈
if( capture )
{
// 捕獲回圈
for(;;)
{
// 呼叫cvGrabFrame,讓底層api解碼一幀影像
// 如果解碼失敗,就退出回圈
// 如果成功,解碼的影像保存在底層api的快取中
if( !cvGrabFrame( capture ))
break;
// 將解碼得到影像資訊從快取中轉換成IplImage格式放在frame中
frame = cvRetrieveFrame( capture );
// 如果獲取快取或轉換失敗,則退出回圈
if( !frame )
break;
detect_and_draw( frame );
// 將frame中的影像資訊在視窗result中顯示
// detect_and_draw( frame );
cvShowImage( "source", frame );
// 暫停一會兒,讓你看一下影像
//Sleep(10);
// 如果你敲了鍵盤,就退出程式,否則繼續捕獲下一幀
if( cvWaitKey( 10 ) >= 0 )
break;
}
// 退出程式之前要清理一下堆疊中的記憶體,免得記憶體泄露
//cvReleaseImage( &frame );注意不需要這句,因為frame是從視頻中捕獲的,沒有單獨分配記憶體,無需釋放,當capture 釋放的時候frame自然就釋放了。
// 退出之前結束底層api的捕獲操作,免得它們占著茅坑不拉屎
// 比如會使得別的程式無法訪問已經被它們打開的檔案
cvReleaseCapture( &capture );
}
cvDestroyWindow("source");
//cvDestroyWindow("result");
return 0;
}
void detect_and_draw(IplImage* img )
{
double scale=1.2;
static CvScalar colors[] = {
{{0,0,255}},{{0,128,255}},{{0,255,255}},{{0,255,0}},
{{255,128,0}},{{255,255,0}},{{255,0,0}},{{255,0,255}}
};//Just some pretty colors to draw with
//Image Preparation
//
IplImage* gray = cvCreateImage(cvSize(img->width,img->height),8,1);
IplImage* small_img=cvCreateImage(cvSize(cvRound(img->width/scale),cvRound(img->height/scale)),8,1);
cvCvtColor(img,gray, CV_BGR2GRAY);
cvResize(gray, small_img, CV_INTER_LINEAR);
cvEqualizeHist(small_img,small_img); //直方圖均衡
//Detect objects if any
//
cvClearMemStorage(storage);
double t = (double)cvGetTickCount();
CvSeq* objects = cvHaarDetectObjects(small_img,cascade,storage,1.1,2,0,cvSize(30,30));
t = (double)cvGetTickCount() - t;
printf( "detection time = %gms\n", t/((double)cvGetTickFrequency()*1000.) );
//Loop through found objects and draw boxes around them
for(int i=0;i<(objects? objects->total:0);++i)
{
CvRect* r=(CvRect*)cvGetSeqElem(objects,i);
cvRectangle(img, cvPoint(r->x*scale,r->y*scale), cvPoint((r->x+r->width)*scale,(r->y+r->height)*scale), colors[i%8]);
}
for( int i = 0; i < (objects? objects->total : 0); i++ )
{
CvRect* r = (CvRect*)cvGetSeqElem( objects, i );
CvPoint center;
int radius;
center.x = cvRound((r->x + r->width*0.5)*scale);
center.y = cvRound((r->y + r->height*0.5)*scale);
radius = cvRound((r->width + r->height)*0.25*scale);
cvCircle( img, center, radius, colors[i%8], 3, 8, 0 );
}
//cvShowImage( "result", img );
cvReleaseImage(&gray);
cvReleaseImage(&small_img);
}
uj5u.com熱心網友回復:
限制大小uj5u.com熱心網友回復:
CvSeq* objects = cvHaarDetectObjects(small_img,cascade,storage,1.1,2,0,cvSize(30,30));這句代碼里面的引數除錯一下就行了
uj5u.com熱心網友回復:
什么意思?uj5u.com熱心網友回復:
回傳的人臉框的寬和高不超過比如100像素,不認為是有效的人臉。
uj5u.com熱心網友回復:
什么意思?
限制大小
趙老師,您的意思是不是對得到的人臉框進行判斷,寬和高不超過100像素視為無效的人臉,是這個意思嗎?
uj5u.com熱心網友回復:
關于樓上有人說限制寬高大小,媽耶,也不想想,寬高不高于100px就不認為是人臉嗎???假如離得遠拍照臉就不是臉了嗎,你要選好的資料去訓練模型啊,改進一下函式引數設定,或者別的方法,你來個限制寬高 mmp什么垃圾方法uj5u.com熱心網友回復:
關于樓上有人說限制寬高大小,媽耶,也不想想,寬高不高于100px就不認為是人臉嗎???假如離得遠拍照臉就不是臉了嗎,你要選好的資料去訓練模型啊,改進一下函式引數設定,或者別的方法,你來個限制寬高 mmp什么垃圾方法
如圖,后墻后面能站人嗎?
uj5u.com熱心網友回復:
關于樓上有人說限制寬高大小,媽耶,也不想想,寬高不高于100px就不認為是人臉嗎???假如離得遠拍照臉就不是臉了嗎,你要選好的資料去訓練模型啊,改進一下函式引數設定,或者別的方法,你來個限制寬高 mmp什么垃圾方法
離多遠?10000米?
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/67050.html
標籤:圖形處理/算法
