Qt 与Halcon联合开发八: 结合Qt与Halcon实现海康相机采图显示(附源码)

1. 引言

在工业自动化、质量检测以及其他机器视觉领域,相机采集与图像处理的系统非常关键。本项目结合了 Qt 框架和 Halcon 库,配合 海康威视相机SDK ,实现了一个完整的相机图像采集与处理系统。该系统不仅能够采集高质量图像,还支持实时显示和处理。

源码

通过网盘分享的文件:Qt 与Halcon联合开发八: 结合Qt与Halcon实现海康相机采图显示(附源码)

链接: https://pan.baidu.com/s/1mdb28C4MzN1b4-XK918Beg?pwd=jkcf 提取码: jkcf

2. 软件架构

本软件系统的架构主要分为以下几个模块:

  1. 相机控制模块 :通过 CameraHikCamera 类实现对相机的控制,包括相机初始化、打开、关闭、采集等。
  2. 图像数据管理模块 :通过 ImageData 类来管理图像数据的缓存、存取和处理。
  3. 线程处理模块 :利用 IThread 类来处理图像采集线程,从图像缓存中提取数据并显示。
  4. 用户界面模块 :通过 MainWindow 类为用户提供交互界面,控制相机的启动与停止,查看图像处理结果等。

3. 核心模块与实现

3.1 相机回调机制

相机回调机制是相机与软件之间的重要通信桥梁。每当相机采集到新图像时,相机回调函数被触发。以下是海康相机的图像回调函数的实现:

cpp 复制代码
void __stdcall ImageCallBack(unsigned char* pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser) {
    HikCamera* camera = static_cast<HikCamera*>(pUser);
    HalconCpp::HObject ho_Image;
    int ImageWidth = pFrameInfo->nWidth;
    int ImageHeight = pFrameInfo->nHeight;
    switch (pFrameInfo->enPixelType) {
        case PixelType_Gvsp_Mono8:
            HalconCpp::GenImage1(&ho_Image, "byte", ImageWidth, ImageHeight, reinterpret_cast<Hlong>(pData));
            break;
        case PixelType_Gvsp_RGB8_Packed:
            HalconCpp::GenImageInterleaved(&ho_Image, reinterpret_cast<Hlong>(pData), "rgb",
                                           ImageWidth, ImageHeight, -1, "byte", 0, 0, 0, 0, -1, 0);
            break;
        case PixelType_Gvsp_BayerRG8:
            HalconCpp::GenImage1(&ho_Image, "byte", ImageWidth, ImageHeight, reinterpret_cast<Hlong>(pData));
            HalconCpp::CfaToRgb(ho_Image, &ho_Image, "bayer_rg", "bilinear");
            break;
        default:
            HalconCpp::GenImageConst(&ho_Image, "byte", ImageWidth, ImageHeight);
            break;
    }
    if (!camera->getImageData()->addImageData(0, ho_Image)) {
        camera->sendErrorsMsgs(camera->getImageData()->getLastErrorMsg() + QString(" -相机#%1").arg(camera->getCameraIndex()));
    }
}

此回调函数将原始图像数据转化为 Halcon 图像对象,并存储到 ImageData 的缓存区中。每次新图像采集完成后,该函数被触发。

3.2 图像数据存取:ImageData

ImageData 类负责管理图像数据的缓存区。每当新图像采集到时,数据会被加入缓存区,通过多队列管理保证图像数据的高效存取。

cpp 复制代码
class ImageData {
public:
    bool addImageData(const int index, const HalconCpp::HObject& ho_Image);
    int getImageData(const int index, HalconCpp::HObject* ho_Image);
    void clearImageData();
};
  • addImageData:向指定队列添加图像数据,如果缓存队列已满,则返回错误信息。
  • getImageData:从指定队列获取最新的图像数据。如果队列为空,线程将等待图像数据到来。

3.3 图像显示:IThread

图像显示由 IThread 类在独立线程中完成。线程持续从 ImageData 缓存区获取图像数据并将其显示在用户界面上。

cpp 复制代码
void IThread::run() {
    while (m_isRun) {
        HalconCpp::HObject ho_Image;
        switch (m_imgData->getImageData(m_imgIndex, &ho_Image)) {
        case ImageData::NoImageData:
            m_imgData->wait(m_imgIndex);
            continue;
        case ImageData::ExistDataButObtainFailed:
            emit errors(m_cameraIndex, m_imgData->getLastErrorMsg() + QString(" -相机#%1").arg(m_cameraIndex));
            m_isRun = false;
            continue;
        case ImageData::ExistDataButObtainWithProblem:
            break;
        case ImageData::ExistDataAndObtainSucced:
            break;
        }
        // 图像显示
        HalconCpp::HTuple hv_w, hv_h;
        HalconCpp::GetImageSize(ho_Image, &hv_w, &hv_h);
        HalconCpp::SetPart(m_windowHandle, 0, 0, hv_h - 1, hv_w - 1);
        HalconCpp::DispObj(ho_Image, m_windowHandle);
    }
}

图像通过 HalconCpp::DispObj 方法显示在 Qt 窗体上。

3.4 GUI 界面控制:MainWindow

MainWindow 类提供了用户交互界面,用户可以通过界面按钮启动或停止相机的图像采集。界面与线程进行通信,实时显示图像。

cpp 复制代码
void MainWindow::createImageBase() {
    m_camera = new HikCamera(0, ui->L1->text());
    m_camera->setCameraImageFormat(Camera::ImageFormat::RGB8);
    m_camera->setCameraType(Camera::CameraType::GIGE);
    m_camera->setCameraQueneNumber(3);
    m_camera->openCamera(Camera::OpenHardWare);
    m_ithread = new IThread();
    if (!m_ithread->bind(m_camera, hv_window)) {
        writeRunTimeMsgs("处理线程创建失败", JKCF::Error);
        return;
    }
    m_ithread->start();
}

createImageBase 方法中,首先初始化相机对象,然后绑定图像处理线程。图像处理线程将开始采集和显示图像。

4. 流程图:从相机到用户界面的图像流转

以下是从相机到用户界面显示的完整流程图:

5. 总结

本系统通过 QtHalcon 库,结合 海康威视相机SDK,实现了图像采集、处理、显示的完整流程。通过回调机制,系统能够实时接收相机采集到的图像数据,并通过独立的图像处理线程进行显示。模块化设计保证了系统的灵活性和可扩展性,可以适应不同的图像处理需求和相机设备。

相关推荐
Scott9999HH4 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准
开发语言·python
码智社5 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
AI云海5 小时前
python 列表、元组、集合和字典
开发语言·python
萧瑟余晖6 小时前
JDK 26 新特性详解
java·开发语言
gaosushexiangji6 小时前
基于高速3D-DIC的风力叶片旋转工况下应变测量与振动模态分析
数码相机
马优晨6 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
人邮异步社区8 小时前
怎么把C语言学到精通?
c语言·开发语言
心平气和量大福大9 小时前
C#-WPF-控件-TextBox 数据绑定
开发语言·c#·wpf
ttwuai9 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验
开发语言·后端·golang
এ慕ོ冬℘゜9 小时前
前端基础:什么是时间戳?JS获取时间戳三种方法与实战用途
开发语言·前端·javascript