最近在弄一个海康威视的掌纹掌静脉的项目,通过海康相机设置好帧率,实现连续抓400张图片,一般帧率设置为50,意思就是连续抓取400张图片所需8秒左右即可,当然,抓图这个功能利用海康威视的MVS软件即可实现抓图,但是我的项目我基于QT开发的,要看相关文档还得下载MVS软件,因为开发文档包含在里面,如图所示
qt开发的可以看看这个文档,话不多说,直接上代码
#include "scrapy.h"
#include<QString>
#include<QDebug>
#include<QElapsedTimer>
#include<QMutex>
#include<QCoreApplication>
Scrapy::Scrapy(QObject *parent) : QThread(parent)
{
}
//析构函数
Scrapy::~Scrapy()
{
if(cameraPtr==NULL)
{
delete cameraPtr;
}
if(imagePtr==NULL)
{
delete imagePtr;
}
}
//子线程接受主线程传来的参数
void Scrapy::getCameraPtr(CameraInterface *camera)
{
cameraPtr = camera;
}
void Scrapy::getImagePtr(cv::Mat *image)
{
imagePtr = image;
}
void Scrapy::run()
{
if(cameraPtr==NULL)
{
return;
}
if(imagePtr==NULL)
{
return;
}
cameraPtr->stopCamera();
//清理图像缓存
cameraPtr->cleanImageBuffer();
// //设置缓存节点
// int result_node = cameraPtr->setImageNode(1000);
// if(result_node==0)
// {
// qDebug()<<"缓存节点设置成功!!!!!";
// }
//创建一个图像容器对象
std::vector<cv::Mat> imageContainer;
//设置触发源
qDebug()<<"触发源设置状态:"<<cameraPtr->setTriggerSource(0)<<endl;
//发送内触发
cameraPtr->closeTrigger();
//开始抓图
cameraPtr->startCamera();
//计时间
QElapsedTimer timer;
timer.start();
//请求200张图片
for(int i=begin;i<end;i++)
{
if(time_btn==1)
{
//读取图像
cameraPtr->ReadBuffer(*imagePtr);
//发送图像读取显示的信号
qDebug() << "正在采集第" << i << "张掌纹图片";
emit sendSave(QString::number(i), imagePtr);
//将获取的图像存入容器中
imageContainer.push_back(imagePtr->clone());
}
else
{
//读取图像
cameraPtr->ReadBuffer(*imagePtr);
//发送保存图像的信号
qDebug() << "正在采集第" << i << "张掌静脉图片";
emit sendSave(QString::number(i), imagePtr);
//将获取的图像存入容器中
imageContainer.push_back(imagePtr->clone());
}
}
//执行所花费的时间
int spendTime = timer.elapsed();
//发送图像已经采集完毕的信号,并将容器的图像写入到主线程磁盘中
emit mess1(spendTime,imageContainer);
}
我们利用利用多线程采集图片,然后将图片保存容器中,子线程采集完图像数据后,发送信号给主线程,主线程将容器内的图像数据写入磁盘即可,极大节省了时间花哨,以下是内触发的代码
int Mycamera::closeTrigger()
{
// 设置触发模式为关闭
int closetrigger_result = MV_CC_SetEnumValue(m_hDevHandle, "TriggerMode", MV_TRIGGER_MODE_OFF);
if (MV_OK != closetrigger_result)
{
return -1;
}
//视频流形式实时显示:continue:2
int video_Frame = MV_CC_SetEnumValue(m_hDevHandle,"AcquisitionMode",2);
if(video_Frame!=MV_OK)
{
return -1;
}
else
{
qDebug()<<"实时视频流开启成功!";
int many_image = MV_CC_SetIntValue(m_hDevHandle, "AcquisitionBurstFrameCount",200);
if(many_image==0)
{
qDebug()<<"多帧采集开启!"<<endl;
return 0;
}
else
{
qDebug()<<"多帧采集失败!"<<endl;
return -1;
}
}
}
完美实现我的需求!!!
点击此处登录后即可评论