关于武汉高芯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;
}
相关推荐
用户805533698033 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner3 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz8 天前
QML Hello World 入门示例
qt
xcyxiner11 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner12 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner12 天前
DicomViewer (添加模型类)3
qt
xcyxiner13 天前
DicomViewer (目录调整) 2
qt
xcyxiner13 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
桥田智能15 天前
桥田智能 QT-650S:面向白车身焊装的 800kg 重载快换解决方案
开发语言·qt·系统架构
森G15 天前
75、服务器源码解析---------云视频服务项目
linux·服务器·网络·c++·qt