关于武汉高芯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;
}
相关推荐
----云烟----6 小时前
QT中QString类的各种使用
开发语言·qt
「QT(C++)开发工程师」12 小时前
【qt版本概述】
开发语言·qt
一路冰雨16 小时前
Qt打开文件对话框选择文件之后弹出两次
开发语言·qt
老赵的博客16 小时前
QT 自定义界面布局要诀
开发语言·qt
码码哈哈0.017 小时前
VSCode 2022 离线安装插件QT VSTOOl报错此扩展不能安装在任何当前安装的产品上。
ide·vscode·qt
feiyangqingyun20 小时前
Qt/C++离线地图的加载和交互/可以离线使用/百度和天地图离线/支持手机上运行
c++·qt·qt天地图·qt离线地图·qt地图导航
gz94561 天前
windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...
开发语言·qt
「QT(C++)开发工程师」1 天前
Ubuntu 26.04 LTS 大升级:Qt 6 成为未来新引擎
qt
兆。2 天前
python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具
爬虫·python·qt
喝哈喝哈2 天前
pycharm中配置pyqt5
python·qt·pycharm