qt调用海康相机内触发按照帧率连续抓图

2023年7月19日 14:46 ry 710

最近在弄一个海康威视的掌纹掌静脉的项目,通过海康相机设置好帧率,实现连续抓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;
        }

    }


}

完美实现我的需求!!!

如果上述代码帮助您很多,可以打赏下以减少服务器的开支吗,万分感谢!

欢迎发表评论~

点击此处登录后即可评论


评论列表
2023年11月17日 14:35 ry: 回复
需要源码的可以联系我,本人承接各种软件定制,数据采集,接口搭建,网站开发,环境配置的杂活,需要的可以联系我 qq:1449917271 微信:liuyoudyping


赣ICP备2021001574号-1

赣公网安备 36092402000079号