如何只保存一次相同的面
how to save identical faces only once
我正在做一个关于监控摄像头人脸检测的项目。现在我正处于人脸检测的阶段,我可以从每一帧中检测人脸。在检测到人脸后,我需要将该人脸存储到本地文件夹中。现在我可以将每个面保存在指定的文件夹中。
问题现在它正在保存每个面,但我只需要保存一次相同的面。这意味着,如果将一张人脸保存为jpeg图像,当人脸检测再次进行时,会出现同一张人脸,所以这次我不想保存那个特定的人脸。
这是我的代码:
#include <cv.h>
#include <highgui.h>
#include <time.h>
#include <stdio.h>
using namespace std;
int ct=1;
int ct1=0;
IplImage *frame;
int frames;
void facedetect(IplImage* image);
void saveImage(IplImage *img,char *ex);
IplImage* resizeImage(const IplImage *origImg, int newWidth,int newHeight, bool keepAspectRatio);
const char* cascade_name="haarcascade_frontalface_default.xml";
int k=1;
int main(int argc, char** argv)
{
CvCapture *capture=cvCaptureFromFile("Arnab Goswami on Pepper spary rajagopal Complete NewsHour Debate (Mobile).3gp");
int count=1;
while(1)
{
frame = cvQueryFrame(capture);
if(count%30==0)
{
facedetect(frame);
}
count++;
}
cvReleaseCapture(&capture);
return 0;
}
void facedetect(IplImage* image)
{
ct1++;
cvNamedWindow("output");
int j=0,i,count=0,l=0,strsize;
char numstr[50];
int arr[100],arr1[100];
CvPoint ul,lr,w,h,ul1,lr1;
CvRect *r;
//int i=0;
IplImage* image1;IplImage* tmpsize;IplImage* reimg;
CvHaarClassifierCascade* cascade=(CvHaarClassifierCascade*) cvLoad(cascade_name);
CvMemStorage* storage=cvCreateMemStorage(0);
const char *extract;
if(!cascade)
{
cout<<"Coulid not load classifier cascade"<<endl;
}
if(cascade)
{
CvSeq*faces=cvHaarDetectObjects(image,cascade,storage,1.1,1,CV_HAAR_DO_CANNY_PRUNING,cvSize(10,10));
//function used for detecting faces.o/p is list of detected faces.
for(int i=0;i<(faces ? faces->total : 0);i++)
{
string s1="im",re,rename,ex=".jpeg";
sprintf(numstr, "%d", k);
re = s1 + numstr;
rename=re+ex;
char *extract1=new char[rename.size()+1];
extract1[rename.size()]=0;
memcpy(extract1,rename.c_str(),rename.size());
//Copies the values of rename.size from the location pointed by source //(rename.c_str)directly to the memory block pointed by destination(extract).
strsize=rename.size();
r=(CvRect*) cvGetSeqElem(faces,i);//draw rectangle outline around each image.
ul.x=r->x;
ul.y=r->y;
w.x=r->width;
h.y=r->height;
lr.x=(r->x + r->width);
lr.y=(r->y + r->height);
cvSetImageROI(image,cvRect(ul.x,ul.y,w.x,h.y));
image1=cvCreateImage(cvGetSize(image),image->depth,image->nChannels);
cvCopy(image, image1, NULL);
reimg=resizeImage(image1, 40, 40, true);
saveImage(reimg,extract1);
cvResetImageROI(image);
cvRectangle(image,ul,lr,CV_RGB(1,255,0),3,8,0);
j++,count++;
k++;
cout<<"frame"<<ct1<<" "<<"face"<<ct<<":"<<"x: "<<ul.x<<endl;
cout<<"frame"<<ct1<<" "<<"face"<<ct<<":"<<"y: "<<ul.y<<endl;
cout<<""<<endl;
ct++;
//cvShowImage("output",image);
}
//return image;
//cvNamedWindow("output");//creating a window.
cvShowImage("output",image);//showing resized image.
cvWaitKey(0);
}
}
void saveImage(IplImage *img,char *ex)
{
int i=0;
char path[255]="/home/athira/Image/OutputImage";
char *ext[200];
char buff[1000];
ext[i]=ex;
sprintf(buff,"%s/%s",path,ext[i]);//copy ext[i] to buff
strcat(path,buff);//concat path & buff
cvSaveImage(buff,img);
i++;
}
您正在使用基于haar特征的级联分类器进行对象检测。据我所知,这些xml文件只被训练来检测基于数百张评估图片的特定对象(请参阅级联分类器训练)。
因此,要比较保存的图像,您需要另一种"检测"模式,因为您必须比较两张脸在视角等方面是否相同(关键词:生物特征数据)。我想你要找的关键词是"人脸识别"。只需根据检测到的人脸建立一个数据库,然后将其用于人脸识别。
编辑:另一个可能有用的链接:www.shervinemami.info/faceRecognition.html
如果我理解正确,你想要的是在一帧中检测人脸,保存这个人脸的缩略图。然后,在下一帧中,您希望再次检测人脸,但只保存第一帧中不存在的人脸的缩略图。
这个问题很难解决,因为视频中捕捉到的人脸总是从一帧变到下一帧。这是由于图像中的噪声、人员可能在移动等原因造成的。因此,监控视频中没有两张脸是相同的。
因此,为了达到您的要求,您需要确定您正在考虑的人脸是否已经在前几帧中被观察到。一般来说,这个问题并不明显,仍然是许多与生物识别、行人跟踪和重新识别等相关研究的主题。因此,你很难在检测到已经观察到给定人脸时达到100%的有效性。
然而,如果可以接受不是100%有效的方法,您可以尝试以下方法:
-
检测帧0中的人脸F0i,以及相关的图像位置(x0i、y0i),并存储缩略图
-
计算前一帧n-1中人脸的位置(xn-1i,yn-1i
-
检测当前帧n中的人脸F0i以及相关联的图像位置(xn>i,yn<1sub>i),并且仅保存那些不靠近预测位置之一的人脸的缩略图(xxn-<2sub>iyyyyn。
-
递增n,然后使用下一帧重复步骤2-3。
这是一个简单的算法,使用跟踪来确定之前是否已经观察到给定的人脸。它应该比基于生物特征的方法更容易实现,而且可能更适合视频监控。然而,由于光流估计和人脸检测器的有效性有限,不是100%准确的。
- 我是否需要在下一次转移时将所有权*转移回转移队列
- 使用仅使用一次的变量调用的复制构造函数.这可能是通过调用move构造函数进行编译器优化的情况吗
- 在C++中一次将矢量值写入多个文件
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么 zlib 放气初始化调用一次不起作用?
- 在一次迭代中从 txt 文件中读取多行
- 为什么无论你输入什么,这"while(cin.get(str,3))"只运行一次?
- 在头文件和 cpp 文件中使用一次 #pragma 时出现结构重定义错误
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- (C++)for循环中的空初始语句是否保存所有编译器中变量的上一次初始化
- GoogleMock:如何保存参数,以便在模拟上的下一次调用中使用
- 尝试保存到成员向量的连接-一次只保存一个
- 如何只保存一次相同的面
- QT4 QListView保存图标位置下一次由手动移动
- GDI+在循环中只保存一次图像
- QApplication::activeWindow()->windowTitle();保存此信息以每秒记录一次
- c++将输出(数字)保存到一个数组中.一次两个数字
- 调用从上一次执行中保存的函数指针会失败吗