首页 > 代码库 > 视频序列中扣图,在扣下的区域进行人眼检测
视频序列中扣图,在扣下的区域进行人眼检测
代码功能:
1.能打开视频逐帧显示,按除ESC外任意键显示
2.鼠标在视频上滑动画矩形确定人眼检测范围
1.能打开视频逐帧显示,按除ESC外任意键显示
2.鼠标在视频上滑动画矩形确定人眼检测范围
3.按ESC确认矩形范围,销毁窗口并进行人眼检测
// FindEyeInVideo.cpp : 定义控制台应用程序的入口点。 //cxcore.lib cv.lib ml.lib cvaux.lib highgui.lib cvcam.lib #include "stdafx.h" #include "cv.h" #include "highgui.h" #include "time.h" //鼠标拖动标志 bool check_line_state = false; IplImage* tmpImg = NULL; IplImage* grayFrame = NULL; CvRect ROI_rect; CvPoint p1,p2; //人眼检测序列 CvMemStorage* storage = cvCreateMemStorage(0); CvHaarClassifierCascade* cascade = (CvHaarClassifierCascade*)cvLoad("haarcascade_eye.xml", 0, 0, 0); void on_mouse4(int event, int x,int y,int flags,void* param) { int thickness = 2; if(event==CV_EVENT_LBUTTONDOWN) { //当前鼠标位置(x,y) ROI_rect.x = x; ROI_rect.y = y; check_line_state = true; } else if(check_line_state&&event==CV_EVENT_MOUSEMOVE)//鼠标状态 { cvCopy(grayFrame,tmpImg); p1=cvPoint(ROI_rect.x,ROI_rect.y); p2=cvPoint(x, y); ROI_rect.width = abs(p1.x - p2.x); ROI_rect.height = abs(p1.y - p2.y); cvRectangle(tmpImg,p1,p2,CV_RGB(0,255,150),thickness,CV_AA,0); cvShowImage("image",tmpImg); } else if(check_line_state&&event==CV_EVENT_LBUTTONUP) { check_line_state = false; } } void Decode(CONST char* filename) { CvCapture * capture = cvCreateFileCapture (filename) ; IplImage* frame = cvQueryFrame (capture); char filePath[200]={0}; int n = 0; int iConfirm = 0; CvSeq* eye; IplImage* img; clock_t start,finish; tmpImg = cvCreateImage(cvSize(frame->width, frame->height), frame->depth, 1); grayFrame = cvCreateImage(cvSize(frame->width, frame->height), frame->depth, 1); while (frame) { //转灰度 //反转图片 cvFlip(frame, NULL, 0); cvCvtColor(frame,grayFrame,CV_BGR2GRAY); //设置好人脸区域之后按ESC让程序自动进行人眼检测 if (0 == iConfirm) { cvShowImage("image",grayFrame); if (cvWaitKey(0) == 27) { iConfirm = 1; cvDestroyWindow("image"); start=clock(); } } else { //设置人脸ROI cvSetImageROI(grayFrame, ROI_rect); img = cvCreateImage(cvSize(ROI_rect.width, ROI_rect.height),grayFrame->depth, grayFrame->nChannels); cvCopy(grayFrame,img); //sprintf(filePath,"FaceResult//%d.bmp",n); //cvSaveImage(filePath, img); //在抠图区域搜索人眼 eye = cvHaarDetectObjects(img, cascade, storage, 1.2, 3, 0, cvSize(25,25)); if (2 != eye->total) goto NEXT; ROI_rect.x += ((CvRect*)cvGetSeqElem(eye, 0))->x - 20; ROI_rect.y += ((CvRect*)cvGetSeqElem(eye, 0))->y - 20; ROI_rect.width = ((CvRect*)cvGetSeqElem(eye, 0))->width + 40; ROI_rect.height = ((CvRect*)cvGetSeqElem(eye, 0))->height + 40; //cvResetImageROI(img); //cvSetImageROI(img, *((CvRect*)cvGetSeqElem( eye, 0))); //sprintf(filePath,"EyeResult//%d.bmp",n); //cvSaveImage(filePath, img); //cvResetImageROI(img); NEXT: cvResetImageROI(grayFrame); cvReleaseImage(&img); printf("%d\n",n++); } frame = cvQueryFrame (capture); } finish = clock(); double totaltime=(double)(finish-start)/CLOCKS_PER_SEC/n; printf("\n此程序的运行时间为%lf\n",totaltime); getchar(); cvReleaseCapture (&capture) ; cvReleaseImage(&tmpImg); cvReleaseImage(&grayFrame); } int main() { ROI_rect.x=ROI_rect.y=0; cvNamedWindow("image",CV_WINDOW_AUTOSIZE); cvSetMouseCallback("image",on_mouse4); Decode("..\\..\\DecodeFrame\\移动白天.avi"); }
视频序列中扣图,在扣下的区域进行人眼检测
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。