海康机器人工业相机 Win10+Qt+Cmake 开发环境搭建

本文详细介绍了如何在Qt环境中搭建海康机器人的工业相机开发环境,包括安装MVS客户端、配置CMakeLists.txt文件、添加库依赖以及展示设备枚举的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. Qt搭建海康机器人工业相机开发环境

  1. 参考这个链接安装好MVS客户端

  2. Qt新建一个c++项目
    在这里插入图片描述
    在这里插入图片描述

  3. cmakeList中添加海康机器人的库,如下:
    在这里插入图片描述

    cmake_minimum_required(VERSION 3.5)
    
    project(HIKRobotCameraTest LANGUAGES CXX)
    
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
    # 海康机器人库文件设置
    set(MVC_DIR "C:\\Program Files (x86)\\MVS\\Development")
    set(MVC_INCLUDE_DIRS ${MVC_DIR}\\Includes)
    set(MVC_LIB_DIRS ${MVC_DIR}\\Libraries\\win64)
    include_directories(${MVC_INCLUDE_DIRS})
    link_directories(${MVC_LIB_DIRS})
    
    add_executable(HIKRobotCameraTest main.cpp)
    
    target_link_libraries(${PROJECT_NAME} PUBLIC MvCameraControl)
    
    install(TARGETS HIKRobotCameraTest
        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
    
  4. main.cpp中添加以下代码

    #include <iostream>
    #include "MvCameraControl.h"
    #include <stdio.h>
    #include <Windows.h>
    #include <conio.h>
    
    using namespace std;
    
    bool PrintDeviceInfo(MV_CC_DEVICE_INFO* pstMVDevInfo)
    {
        if (NULL == pstMVDevInfo)
        {
            printf("The Pointer of pstMVDevInfo is NULL!\n");
            return false;
        }
        if (pstMVDevInfo->nTLayerType == MV_CAMERALINK_DEVICE)
        {
            printf("chPortID: [%s]\n", pstMVDevInfo->SpecialInfo.stCamLInfo.chPortID);
            printf("chModelName: [%s]\n", pstMVDevInfo->SpecialInfo.stCamLInfo.chModelName);
            printf("chFamilyName: [%s]\n", pstMVDevInfo->SpecialInfo.stCamLInfo.chFamilyName);
            printf("chDeviceVersion: [%s]\n", pstMVDevInfo->SpecialInfo.stCamLInfo.chDeviceVersion);
            printf("chManufacturerName: [%s]\n", pstMVDevInfo->SpecialInfo.stCamLInfo.chManufacturerName);
            printf("Serial Number: [%s]\n", pstMVDevInfo->SpecialInfo.stCamLInfo.chSerialNumber);
        }
        else
        {
            printf("Not support.\n");
        }
    
        return true;
    }
    
    
    int main()
    {
        int nRet = MV_OK;
        void* handle = NULL;
    
        MV_CC_DEVICE_INFO_LIST stDeviceList;
        memset(&stDeviceList, 0, sizeof(MV_CC_DEVICE_INFO_LIST));
        nRet = MV_CC_EnumDevices(MV_CAMERALINK_DEVICE, &stDeviceList);
        if (MV_OK != nRet)
        {
           printf("Enum Devices fail! nRet [0x%x]\n", nRet);
        }
    
        if (stDeviceList.nDeviceNum > 0)
        {
           for (unsigned int i = 0; i < stDeviceList.nDeviceNum; i++)
           {
               printf("[device %d]:\n", i);
               MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[i];
               if (NULL == pDeviceInfo)
               {
               }
               PrintDeviceInfo(pDeviceInfo);
           }
        }
        else
        {
           printf("Find No Devices!\n");
        }
    
        return 0;
    }
    
    
  5. 运行程序,出现以下内容则说明安装库成功
    在这里插入图片描述

<think>我们正在处理用户关于在QT框架下连接并使用海康机器人RGBD相机的开发指南问题。由于用户提到了海康机器人(Hikrobot)的RGBD相机,我们假设用户使用的是海康威视的工业相机,并且希望通过QT进行开发。 首先,我们需要明确几个关键点: 1. 海康机器人的相机通常提供SDK(软件开发工具包)供开发者使用。 2. QT是一个跨平台的C++图形用户界面应用程序框架,因此我们将主要使用C++进行开发。 3. RGBD相机通常提供彩色图像(RGB)和深度图像(Depth)。 开发步骤一般包括: - 下载并安装海康机器人的相机SDK。 - 在QT项目中包含SDK的头文件和库文件。 - 使用SDK提供的API进行相机的连接、图像采集和断开。 以下是详细步骤: ### 步骤1: 获取海康机器人相机SDK 首先,需要从海康机器人官方网站下载相机的SDK。通常,SDK会包含开发文档、头文件、库文件(动态链接库或静态库)以及示例代码。 ### 步骤2: 创建QT项目 在QT Creator中创建一个新的QT项目(例如,选择Qt Widgets Application)。 ### 步骤3: 配置项目以使用海康SDK 将海康SDK中的头文件(.h)和库文件(.lib或.a,以及运行时需要的.dll或.so)放置在合适的位置。通常,我们会: - 在项目目录下创建第三方库的文件夹(例如`thirdparty/hikrobot`),并将头文件和库文件分别放在`include`和`lib`子目录中。 - 在QT的.pro项目文件中添加头文件路径和库文件路径。 例如,在.pro文件中添加: ```qmake # 添加头文件路径 INCLUDEPATH += $$PWD/thirdparty/hikrobot/include # 添加库文件路径(Windows示例) LIBS += -L$$PWD/thirdparty/hikrobot/lib -lMvCameraControl ``` 注意:库文件名可能因相机型号和SDK版本而异,请参考SDK文档。 ### 步骤4: 初始化相机并连接 使用SDK提供的函数来发现设备、创建句柄并打开设备。 示例代码: ```cpp #include "MvCameraControl.h" // 枚举设备 int nRet = MV_OK; MV_CC_DEVICE_INFO_LIST stDeviceList; memset(&stDeviceList, 0, sizeof(MvCameraControl)); nRet = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList); if (nRet != MV_OK || stDeviceList.nDeviceNum == 0) { // 处理错误 } // 选择第一个设备(实际中可能需要让用户选择) unsigned int nIndex = 0; MV_CC_DEVICE_INFO* pDeviceInfo = stDeviceList.pDeviceInfo[nIndex]; // 创建相机实例 void* handle = nullptr; nRet = MV_CC_CreateHandle(&handle, pDeviceInfo); if (nRet != MV_OK) { // 处理错误 } // 打开设备 nRet = MV_CC_OpenDevice(handle); if (nRet != MV_OK) { // 处理错误 } // 开始采集图像 nRet = MV_CC_StartGrabbing(handle); if (nRet != MV_OK) { // 处理错误 } ``` ### 步骤5: 获取图像数据 在开始采集后,需要从相机获取图像数据。通常有两种方式:回调方式或主动获取方式。 这里以回调方式为例: ```cpp // 定义图像数据回调函数 static void __stdcall ImageCallback(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser) { if (pFrameInfo) { // 获取图像宽度和高度 int width = pFrameInfo->nWidth; int height = pFrameInfo->nHeight; // 根据图像格式(例如pFrameInfo->enPixelType)处理数据 // 注意:RGBD相机可能同时返回RGB和深度图,需要根据SDK文档解析 // 处理图像数据,例如转换为QImage显示 } } // 注册回调函数 nRet = MV_CC_RegisterImageCallBackEx(handle, ImageCallback, nullptr); if (nRet != MV_OK) { // 处理错误 } ``` ### 步骤6: 图像显示 在回调函数中,将获取的图像数据转换为QT的QImage格式,然后发送信号到主线程进行显示。 例如,在回调函数中: ```cpp // 假设是RGB格式(8位,3通道) QImage image(pData, width, height, QImage::Format_RGB888); // 注意:海康SDK返回的图像数据可能是BGR格式,需要转换 // image = image.rgbSwapped(); // 如果需要从BGR转换为RGB // 发送信号(注意:回调函数可能在非主线程,需要线程安全) emit newImage(image); ``` 然后在主窗口类中定义一个槽函数来更新显示的图像。 ### 步骤7: 断开和清理 在程序退出时,需要停止采集、关闭设备并销毁句柄。 ```cpp // 停止采集 MV_CC_StopGrabbing(handle); // 关闭设备 MV_CC_CloseDevice(handle); // 销毁句柄 MV_CC_DestroyHandle(handle); ``` ### 注意事项 1. **线程安全**:海康SDK的回调函数通常运行在独立的线程中,因此更新UI时需要使用信号槽机制,确保线程安全。 2. **图像格式**:海康相机可能返回多种格式的图像数据(如BGR、RGB、YUV等),需要根据实际情况进行转换。深度图可能是16位灰度图,需要特殊处理。 3. **错误处理**:每一步操作后都应检查返回值,并进行错误处理。 4. **深度图处理**:RGBD相机通常同时提供RGB和深度图,具体获取方式请参考SDK文档,可能需要设置参数或分别获取。 ### 参考资源 - 海康机器人官方SDK文档和示例代码 - QT官方文档:多线程、信号槽、QImage §§相关问题§§ 1. 海康机器人相机SDK中如何同时获取RGB图像和深度图? 2. QT中如何安全地在不同线程间传递图像数据? 3. 如何处理海康相机SDK返回的不同图像格式(如BGR、YUV等)? 4. 海康机器人RGBD相机的深度图如何转换为可显示的格式?</think>### QT框架连接海康机器人RGBD相机开发指南 #### 1. **环境准备** - **安装海康SDK** 从海康机器人官网下载相机SDK(如`MVS`或`HikRobotVision`),包含开发库、驱动和文档[^1]。 - **QT配置** 在`.pro`文件中添加SDK库路径: ```qmake INCLUDEPATH += $$PWD/hikrobot_sdk/include LIBS += -L$$PWD/hikrobot_sdk/lib -lMvCameraControl ``` - **相机连接** 通过USB3.0或千兆网口连接相机,确保设备管理器识别到相机。 #### 2. **初始化相机** ```cpp #include "MvCameraControl.h" void* handle = nullptr; MV_CC_DEVICE_INFO_LIST stDeviceList; // 枚举设备 int ret = MV_CC_EnumDevices(MV_GIGE_DEVICE | MV_USB_DEVICE, &stDeviceList); if (ret != MV_OK || stDeviceList.nDeviceNum == 0) { qDebug() << "未检测到相机"; return; } // 创建句柄并连接 ret = MV_CC_CreateHandle(&handle, stDeviceList.pDeviceInfo[0]); ret = MV_CC_OpenDevice(handle); if (ret != MV_OK) { qDebug() << "相机连接失败,错误码:" << ret; } ``` #### 3. **采集RGBD数据** - **设置参数** ```cpp // 启用深度数据流 MV_CC_SetEnumValue(handle, "PixelFormat", PixelType_Gvsp_Coord3D_Depth); // 设置RGB分辨率 (示例:1280x720) MVCC_INTVALUE stParam; MV_CC_GetIntValue(handle, "Width", &stParam); MV_CC_SetIntValueEx(handle, "Width", 1280); MV_CC_SetIntValueEx(handle, "Height", 720); ``` - **启动采集** ```cpp MV_CC_StartGrabbing(handle); // 注册回调函数 MV_CC_RegisterImageCallBackEx(handle, ImageCallback, this); ``` #### 4. **数据处理回调** ```cpp static void __stdcall ImageCallback( unsigned char *pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser) { if (pFrameInfo->enPixelType == PixelType_Gvsp_Coord3D_Depth) { // 深度图处理 (16位深度数据) uint16_t* depthData = reinterpret_cast<uint16_t*>(pData); int width = pFrameInfo->nWidth; int height = pFrameInfo->nHeight; // 转换为QT图像显示 QImage depthImage(width, height, QImage::Format_Grayscale16); memcpy(depthImage.bits(), depthData, width*height*2); } else if (pFrameInfo->enPixelType == PixelType_Gvsp_RGB8_Packed) { // RGB处理 QImage rgbImage(pData, pFrameInfo->nWidth, pFrameInfo->nHeight, QImage::Format_RGB888); } // 发送信号更新UI (注意跨线程) emit ((CameraThread*)pUser)->newFrameReceived(rgbImage, depthImage); } ``` #### 5. **深度图可视化优化** ```cpp // 深度值归一化 (示例范围0.3m-5m) for (int i = 0; i < depthImage.byteCount(); i += 2) { uint16_t depth = *(uint16_t*)(depthImage.bits() + i); uint8_t normalized = (depth > 5000) ? 0 : (depth - 300) * 255 / 4700; depthImage.bits()[i/2] = normalized; // 转换为8位灰度 } ``` #### 6. **释放资源** ```cpp MV_CC_StopGrabbing(handle); MV_CC_CloseDevice(handle); MV_CC_DestroyHandle(handle); ``` #### 7. **常见问题解决** - **连接失败**:检查防火墙设置,确保`MVCameraControl.dll`在可执行文件目录。 - **帧率低**:降低分辨率或关闭无关数据流。 - **深度数据异常**:校准相机并检查环境光照(避免强光干扰)[^1]。 > **关键提示**: > - 深度图数据单位为毫米,需根据实际场景缩放 > - 使用`QThread`分离相机操作和UI线程 > - 海康SDK提供点云生成工具`MV_CC_ConvertDepthToPointCloud`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AoDeLuo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值