代码拉取完成,页面将自动刷新
#include "my_camera.h"
#include"my_dlib.h"
// 静态成员变量需要在类体的外面进行初始化 //此初始化需要cpp文件里面初始化
my_camera* my_camera::m_cam = NULL;
//摄像头模块构造函数
my_camera::my_camera(int width,int height):m_width(width),m_height(height)
{
//打开摄像头
open_camera();
//载入面部识别文件
if (!face_cascade.load("D:\\opencv\\opencv\\sources\\data\\haarcascades\\haarcascade_frontalface_alt.xml"))
{
qDebug("Load haarcascade_frontalface_alt failed!");
return;
}
//初始化my_dlib
d = new my_dlib();
}
//析构函数
my_camera::~my_camera()
{
close();
}
//打开摄像头
void my_camera::open_camera()
{
capture.open(0); //从摄像头读入视频如果设备只有一个摄像头就传入参数0
qDebug("open");
if (!capture.isOpened()) //先判断是否打开摄像头
{
qDebug("err");
}
}
//获得当前摄像头的一帧
QPixmap &my_camera::get_pixmap()
{
capture>>cap; //读取当前帧
ShowFPS_Method(cap); //显示帧率
if (!cap.empty()) //判断当前帧是否捕捉成功 **这步很重要
{
//对图像进行预处理
cvtColor(cap, cap_gray, cv::COLOR_BGR2GRAY); //转为灰度图
equalizeHist(cap_gray, cap_gray); //直方图均衡化,增加对比度方便处理
//进行识别
face_cascade.detectMultiScale(cap_gray, faceRect, 1.1, 3, 0 | cv::CASCADE_DO_ROUGH_SEARCH, cv::Size(50, 50));//检测,检测的结果会放到faceRect中
//开始画框 faceRect.size表示检测到的人脸个数
for (size_t i = 0; i < faceRect.size(); i++)
{
cv::rectangle(cap, faceRect[i], cv::Scalar(0, 255, 0)); //用绿色矩形画出检测到的位置
//在此处要判判断人脸,获取name
QString reco_name = d->recognition_face(cap);
//给图片加文字
cv::putText(cap, reco_name.toStdString(), cv::Point(faceRect[i].x,faceRect[i].y-1), cv::FONT_HERSHEY_COMPLEX, 1, cv::Scalar(255, 0, 0),2,2, 0);
//如果脸部大于10张,就不保存了
cv::Mat faceROI = cap_gray(faceRect[i]); //保存脸部图片
cv::resize(faceROI,faceROI,cv::Size(92, 112));
face_mat = faceROI;
}
//将每一帧的画面添加到label中
imag = Mat2QImage(cap); // 将Mat转换成QImage对象来显示
imag = imag.scaled(m_width, m_height,
Qt::IgnoreAspectRatio, Qt::SmoothTransformation);//设置图片大小和label的长宽一致
pm_cam = QPixmap::fromImage(imag);
//ui->cam->setPixmap(QPixmap::fromImage(imag)); // 将图片显示到label上
}
else
qDebug("can not ");
return pm_cam; //将每一帧的图片传回
}
//返回人脸的位置
std::vector<cv::Rect> & my_camera::select_face()
{
return faceRect;
}
//mat to QImage
QImage my_camera::Mat2QImage(cv::Mat cvImg)
{
QImage qImg;
if(cvImg.channels()==3) //3 channels color image
{
cv::cvtColor(cvImg,cvImg,cv::COLOR_BGR2RGB);
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
else if(cvImg.channels()==1) //grayscale image
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_Indexed8);
}
else
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
return qImg;
}
//关闭摄像头
void my_camera::close()
{
capture.release();
}
void my_camera::set_size(int w,int h)
{
m_width = w;
m_height = h;
}
cv::Mat & my_camera::get_face_mat()
{
return face_mat;
}
//显示帧率函数2
void my_camera::ShowFPS_Method(cv::Mat &dstImage)
{
char str[20]; //存放字符串化的帧率
double fps; //帧率
double t_front, t_now; //用于中间计算
t_front = (double)cv::getTickCount(); //返回从操作系统启动到当前所经过的毫秒数
t_now = ((double)cv::getTickCount() - t_front) / cv::getTickFrequency(); //getTickFrequency返回每秒的计时周期数
fps = 1.0 / t_now;
std::string FPSstring("FPS:");
sprintf_s(str, "%.2f", fps);
FPSstring += str;
//在帧上显示"FPS:XXXX"
putText(dstImage, FPSstring, cv::Point(5, 20),
cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(255, 255, 255));
}
void my_camera::save_csv()
{
d->read_all_file();
}
cv::Mat &my_camera::get_cap()
{
capture>>cap; //读取当前帧
return cap;
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。