关于武汉高芯coin417G2红外机芯的二次开发

文章目录


前言

最近工作中接触了一款基于武汉高芯科技有限公司开发的红外模组,即coin417g2(测温型)+9.1mm镜头.使用此模组,开发了一套红外热成像检测桌面应用程序.下面简单记录下该模组的使用.

一、外观和机芯参数

如下是该机芯的外观和机芯参数:



二、SDK的使用

这里使用的是linux_sdk_usb2.0_v.1.1.5_aarch64-linux-gnu-gcc-8.4.0版本.

1、打开相机

cpp 复制代码
int ret = guide_usb_initial();
if(ret < 0){
    g_pLog->log_E(QString::fromLocal8Bit("初始化相机失败,ret=%1").arg(ret));
    return -1;
}
else{
    g_pLog->log_I(QString::fromLocal8Bit("初始化相机成功,ret=%1").arg(ret));
    ret = guide_usb_opencommandcontrol((OnSerialDataReceivedCB)serailCallBack);
    if(ret < 0){
        g_pLog->log_E(QString::fromLocal8Bit("开启机芯控制命令通信失败,ret=%1").arg(ret));
        return -1;
    }
    else{
        g_pLog->log_I(QString::fromLocal8Bit("开启机芯控制命令通信成功"));
    }
}
m_deviceInfo = (guide_usb_device_info_t*)malloc(sizeof (guide_usb_device_info_t));
m_deviceInfo->width = IMAGEWIDTH;
m_deviceInfo->height = IMAGEHEIGHT;
m_deviceInfo->video_mode = Y16_PARAM_YUV;  //观瞄mode:YUV_PARAM  //测温mode:Y16_PARAM_YUV
ret = guide_usb_openstream(m_deviceInfo,(OnFrameDataReceivedCB)frameCallBack,(OnDeviceConnectStatusCB)connectStatusCallBack);
if(ret < 0)
{
   g_pLog->log_E(QString::fromLocal8Bit("打开视频流失败,ret=%1").arg(ret));
   return -1;
}
else{
    g_pLog->log_I(QString::fromLocal8Bit("打开视频流成功"));
}

2、回调函数中获取全局温度和图像

cpp 复制代码
int serailCallBack(guide_usb_serial_data_t *pSerialData)
{
    int i = 0;
    for (i = 0;i< pSerialData->serial_recv_data_length;i++)
    {
        if(i== (pSerialData->serial_recv_data_length-1))
        {
            printf("%x\n",pSerialData->serial_recv_data[i]);
            fflush(stdout);
        }
        else
        {
            printf("%x ",pSerialData->serial_recv_data[i]);
            fflush(stdout);
        }
    }
    return 1;
}

int connectStatusCallBack(guide_usb_device_status_e deviceStatus)
{
    if(deviceStatus == DEVICE_CONNECT_OK)
    {
        printf("VideoStream Capture start...\n");
        fflush(stdout);
        g_pLog->log_I(QString::fromLocal8Bit("连接正常"));
    }
    else
    {
        printf("VideoStream Capture end...\n");
        fflush(stdout);
        g_pLog->log_I(QString::fromLocal8Bit("断开连接"));
    }

    return 1;
}

int frameCallBack(guide_usb_frame_data_t *pVideoData)
{
    //回调函数中建议只对数据入队,其他操作建议另起线程处理
    //YUV数据  [pVideoData->frame_yuv_data:机芯送出来的YUV数据] yuv422 uyvy
    //Y16数据  [pVideoData->frame_src_data:机芯送出来的Y16数据] for measure
    //参数行数据[pVideoData->paramLine:机芯送出来的参数行数据]
    if(m_mutex.try_lock()){
        if(m_dataQueue.size() <1)
        {
            guide_usb_measure_external_param_t param;
            param.distance = 50;
            param.emiss = 98;
            param.relHum = 60;
            param.reflectedTemper = 230;
            param.atmosphericTemper = 230;
            param.modifyK = 100;
            param.modifyB = 0;
            //
            int ret = guide_usb_measure_convertgray2temper(1,1,pVideoData->frame_src_data,
                            (uchar*)pVideoData->paramLine,IMAGEWIDTH*IMAGEHEIGHT,&param,pTemper);
            if(ret >= 0){
                cv::Mat yuvimg = cv::Mat(IMAGEHEIGHT,IMAGEWIDTH,CV_8UC2,pVideoData->frame_yuv_data);
                cv::Mat bgrImg;
                cv::cvtColor(yuvimg, bgrImg,  cv::COLOR_YUV2BGR_Y422);
                m_dataQueue.enqueue(bgrImg);
            }
        }
        m_mutex.unlock();
    }
    else{
        QThread::usleep(10);
    }
    return 1;
}

3、关闭相机

cpp 复制代码
int ret = guide_usb_closestream();
if(ret < 0){
    g_pLog->log_E(QString::fromLocal8Bit("关闭视频流失败,ret=%1").arg(ret));
}
else{
    g_pLog->log_I(QString::fromLocal8Bit("关闭视频流成功"));
}

ret = guide_usb_closecommandcontrol();
if(ret < 0){
    g_pLog->log_E(QString::fromLocal8Bit("关闭机芯控制命令通信失败,ret=%1").arg(ret));
}
else{
    g_pLog->log_I(QString::fromLocal8Bit("关闭机芯控制命令通信成功"));
}

ret = guide_usb_exit();
if(ret < 0){
    g_pLog->log_E(QString::fromLocal8Bit("清除数据释放内存失败,ret=%1").arg(ret));
}
else{
    g_pLog->log_I(QString::fromLocal8Bit("清除数据释放内存成功"));
}
if(m_deviceInfo != NULL)
{
     free(m_deviceInfo);
     m_deviceInfo = NULL;
}
if(paraData != NULL)
{
    free(paraData);
    paraData = NULL;
}
相关推荐
꧁坚持很酷꧂1 小时前
Linux Ubuntu18.04下安装Qt Craeator 5.12.9(图文详解)
linux·运维·qt
ChoSeitaku2 小时前
17.QT-Qt窗口-工具栏|状态栏|浮动窗口|设置停靠位置|设置浮动属性|设置移动属性|拉伸系数|添加控件(C++)
c++·qt·命令模式
OpenC++5 小时前
【C++QT】Buttons 按钮控件详解
c++·经验分享·qt·leetcode·microsoft
我真的不会C6 小时前
QT窗口相关控件及其属性
开发语言·qt
云小逸6 小时前
【QQMusic项目界面开发复习笔记】第二章
c++·qt
꧁坚持很酷꧂7 小时前
配置Ubuntu18.04中的Qt Creator为中文(图文详解)
开发语言·qt·ubuntu
快乐飒男8 小时前
Qt基础009(HTTP编程和QJSON)
qt
此刻我在家里喂猪呢10 小时前
Qt指ModbusTcp协议的使用
qt
爱上解放晚晚10 小时前
QT 的.pro 转 vsproject 工程
开发语言·qt
Zfox_10 小时前
【Qt】文件
c++·qt·qt5·客户端开发