“Add Portrait”标签对应图像添加的功能,它的存在标志着整套程序开始运行。在点击该标签后需要对摄取图像进行分组标号便于之后的图像处理过程,所以在这里仍需一个子界面Ui来完成相关操作。于是再利用Qt Creator中的Design功能绘制出“Add People”界面,设计人员可在“Add People”界面内输入每组图像自身名称编号和确认是否让USB摄像模块执行拍摄任务。
在“Name”后输入字符并按下“Start taking photos”后,程序启动外部USB摄像头进行拍照,在摄取到预定数值的照片后会实现自动保存功能,保存在指定路径下的文件夹内,并将输入的字符编号与对应ID文件夹储存在指定路径下的people.txt文件内,如图3-3-1(2)所示。
同时需要注意的是这里的people.txt文件是预先创建好的,不在函数中实现。并且其文本格式采用UTF-8编码,避免Qt Creator再对文件进行编码处理,节约不少代码。
void AddPeople::on_TakeAPotoBtn_clicked()
{
if(ui->NamelineEdit->text()==NULL)
{
QMessageBox::warning(this,tr("错误"),tr("请输入姓名"),QMessageBox::Ok);
}
else
{
ui->NamelineEdit->setEnabled(false);
ui->TakeAPotoBtn->setEnabled(false);
capture=new cv::VideoCapture(0);
int i=0;
while (i!=10)
{
char key = cv::waitKey(100);
*capture >> frame;
imshow("frame", frame);
std::string filename = cv::format("/home/jr/Qt/3/camera/AddData/%d.jpg", i+1);
switch (key)
{
case'p':
i++;
imwrite(filename, frame);
imshow("photo", frame);
cv::waitKey(500);
cv::destroyWindow("photo");
break;
default:
break;
}
}
capture->release();
cv::destroyWindow("frame");
ui->NamelineEdit->setEnabled(true);
ui->TakeAPotoBtn->setEnabled(true);
}
int i=file.GetMaxNum("/home/jr/Qt/3/camera/Data/people.txt");
QString text=QString::number(i,10)+" "+ui->NamelineEdit->text();
file.AddPeople("/home/jr/Qt/3/camera/Data/people.txt",text);
MaxNumAboutPeople=i;
}
AddPeople::AddPeople(QWidget *parent) :
QDialog(parent),
ui(new Ui::AddPeople)
{
ui->setupUi(this);
this->setWindowTitle(tr("人员添加"));
connect(ui->TakeAPotoBtn,SIGNAL(clicked()),this,SLOT(on_TakeAPotoBtn_clicked()),Qt::UniqueConnection);
}