zwd307932411 2023-11-09 08:29 采纳率: 100%
浏览 37
已结题

在linux系统中用vscode,并用opencv显示出海康相机拍摄的内容

如何在vscode中用C++语言调用海康工业相机,并用窗口实时显示出相机拍摄的内容
海康威视工业相机MV_CA013-21UC
使用vscode软件,linux系统,环境都配置好了(opencv和海康的库文件)
我现在使用的是以回调函数的方式,imshow一直显示不出图像窗口
(想得到Mat类型图像后用opencv进行处理)方法不局限在回调函数

Mat img;
//回调函数内容
void __stdcall ImageCallBackEx(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser)
{
    int nRet;
    if (pFrameInfo)
    {
        printf("GetOneFrame, Width[%d], Height[%d], nFrameNum[%d]\n", 
            pFrameInfo->nWidth, pFrameInfo->nHeight, pFrameInfo->nFrameNum);
        
        img = Convert2Mat(pFrameInfo,pData);
        printf("hello");
        imshow("test",img);
    }
}
//主函数中的调用
 nRet = MV_CC_RegisterImageCallBackEx(handle, ImageCallBackEx, handle);
  • 写回答

11条回答 默认 最新

  • 社区专家-Monster-XH 2023-11-09 08:38
    关注

    基于Monster 组和AIGC的调写:若有帮助,还望采纳~~:

    • 要在Linux系统中使用VSCode,并用C++语言调用海康工业相机,同时用OpenCV实时显示相机拍摄的内容,你需要确保已经安装了必要的库和驱动程序,包括OpenCV库和海康相机的SDK。这里提供一个基本的步骤指导:
    1. 安装OpenCV:首先确认你的Linux系统上已经正确安装了OpenCV。

    2. 安装海康相机SDK:下载并安装海康相机的SDK。通常这会包括一些库文件和头文件,你需要在VSCode中配置这些。

    3. 设置VSCode:在VSCode中创建一个新的C++项目,并在项目设置中包含OpenCV和海康相机SDK的库和头文件路径。

    4. 编写代码:确保你的C++程序包含了正确的头文件,并且你已经设置好了链接器,以便程序可以找到和链接到OpenCV和海康相机的库。

    下面是一个简化的代码示例,可以在海康相机接收到新的帧时,使用回调函数将图像数据转换为OpenCV的Mat对象,并显示出来:

    #include <opencv2/opencv.hpp>
    #include <MvCameraControl.h>
    #include <iostream>
    
    cv::Mat Convert2Mat(MV_FRAME_OUT_INFO_EX* pFrameInfo, unsigned char * pData) {
        cv::Mat outMat;
        switch(pFrameInfo->enPixelType) {
            case PixelType_Gvsp_Mono8:
                outMat = cv::Mat(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC1, pData);
                break;
            case PixelType_Gvsp_RGB8_Packed:
                outMat = cv::Mat(pFrameInfo->nHeight, pFrameInfo->nWidth, CV_8UC3, pData);
                cv::cvtColor(outMat, outMat, CV_RGB2BGR);
                break;
            // 根据需要添加其他像素格式的处理
            default:
                std::cout << "Unsupported pixel format." << std::endl;
                break;
        }
        return outMat;
    }
    
    void __stdcall ImageCallBackEx(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser) {
        if (pFrameInfo) {
            std::cout << "GetOneFrame, Width[" << pFrameInfo->nWidth << "], Height[" << pFrameInfo->nHeight << "], nFrameNum[" << pFrameInfo->nFrameNum << "]" << std::endl;
            
            cv::Mat img = Convert2Mat(pFrameInfo, pData);
            if(!img.empty()){
                cv::imshow("Camera", img);
                cv::waitKey(1); // 必须调用waitKey函数处理窗口消息
            }
        }
    }
    
    int main() {
        // 初始化相机和注册回调函数的代码...
        
        // 显示窗口初始化
        cv::namedWindow("Camera", cv::WINDOW_AUTOSIZE);
        
        // 注册回调函数
        // nRet = MV_CC_RegisterImageCallBackEx(handle, ImageCallBackEx, handle);
        
        // 开始捕获图像
        // nRet = MV_CC_StartGrabbing(handle);
        
        // 主循环,等待用户退出
        while(true) {
            if(cv::waitKey(30) == 27) { // 按下ESC退出
                break;
            }
        }
        
        // 停止捕获和关闭相机的代码...
        
        return 0;
    }
    

    上述代码片段是一个简化的示例,演示了如何在回调函数中将海康相机的原始图像数据转换为OpenCV的Mat格式,并且显示在一个窗口中。请注意,为了使imshow能够正常工作,必须调用cv::waitKey(1)来处理窗口的消息队列。

    确保你的主循环调用cv::waitKey,这是OpenCV显示图像的必要步骤。如果不调用它,窗口可能无法正常刷新,从而导致无法显示图像。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 11月18日
  • 已采纳回答 11月10日
  • 创建了问题 11月9日

悬赏问题

  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店
  • ¥15 请教如何关于Msg文件解析
  • ¥200 sqlite3数据库设置用户名和密码
  • ¥15 AutoDL无法使用docker install吗?