摆烂且自信的小七 2024-03-15 16:43 采纳率: 0%
浏览 27
已结题

MFC重复调用halcon算法报错

我的需求:我想通过定时器实现不断保存摄像头图片并进行图像处理(halcon算法),也就是每隔5s保存图片然后调用这个processimage函数显示在UI界面上,halcon集成在mfc里面应该配置没有问题,我的程序能够执行一遍,但是执行第二遍就会报错,在一开头就会报错,而且我的picturecontrol控件不更新,不知道什么原因。在MFC的定时器事件中里面重复调用processimage函数并进行显示,希望你能解决我的问题,金额也能追加。

void CDemoMFCDlg::ProcessImage()
{
    
    /*if (HDevWindowStack::IsOpen())
        CloseWindow(HDevWindowStack::Pop());*/
    //ClearObj(ho_Image); ClearObj(ho_GrayImage); ClearObj(ho_sharp0);

    TRACE(_T("开始 ProcessImage\n"));
    /*if (HalconCpp::HDevWindowStack::IsOpen())
    {
        HalconCpp::CloseWindow(HalconCpp::HDevWindowStack::Pop());
    }*/

    ReadImage(&ho_Image, "D:/A_CODE_ATMV/SDK_AtUsbA_V3.3_halcon2.1/SDK_AtUsbA_V3.3/Demos/DemoMFC/image.bmp");
    GetImagePointer1(ho_Image, &hv__, &hv__, &hv_Width, &hv_Height);
    SetWindowAttr("background_color", "black");

    HWND hwndl = GetDlgItem(IDC_STATIC1)->GetSafeHwnd();

    CRect rect;
    GetDlgItem(IDC_STATIC1)->GetClientRect(&rect);
    //ScreenToClient(&rect);
    //Hlong halconWinID;

    OpenWindow(0, 0, rect.Width(), rect.Height(), (LONG)hwndl, "visible", "", &hv_WindowHandle);
    HDevWindowStack::Push(hv_WindowHandle);

    if (HDevWindowStack::IsOpen())
        SetColored(HDevWindowStack::GetActive(), 12);
    if (HDevWindowStack::IsOpen())
        SetDraw(HDevWindowStack::GetActive(), "margin");
    SetLineWidth(hv_WindowHandle, 3);

    Rgb1ToGray(ho_Image, &ho_GrayImage);
    Emphasize(ho_GrayImage, &ho_sharp0, 7, 7, 7.0);
    if (HDevWindowStack::IsOpen())
        DispObj(ho_sharp0, HDevWindowStack::GetActive());
    //mult_image (GrayImage, GrayImage, Mult_image2, 0.006, 0)
    
    //AfxMessageBox(_T("success"));
    // Call this after you've done all the image processing and the image is ready to be displayed
    CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC1);
    pStatic->Invalidate(TRUE);  // TRUE to erase the background as well
    pStatic->UpdateWindow();    // Forces the control to be redrawn immediately

    //计数
    processImageCounter++;
    CString strCallCount;
    strCallCount.Format(_T("%d "), processImageCounter);
    m_staticCallCount.SetWindowText(strCallCount);

}

img

  • 写回答

15条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-15 16:43
    关注

    引自免费微信小程序:皆我百晓生

    针对您在MFC中重复调用halcon算法并更新UI界面时遇到的问题,程序在第二次执行ProcessImage函数时出现异常,根据提供的代码片段和报错信息,问题可能出在Halcon图像对象未正确清理或重置。为了确保每次循环处理新图片时不产生资源冲突,请在ProcessImage函数开始部分添加清除图像对象的代码:

    void CDemoMFCDlg::ProcessImage()
    {
        // 清除上一次使用的Halcon图像对象
        ClearObj(ho_Image);
        ClearObj(ho_GrayImage);
        ClearObj(ho_sharp0);
    
        // ...(保留原有代码)
    }
    

    另外,在使用定时器反复调用该函数前,请确保ho_Image等图像对象已初始化,避免在首次调用前为空指针。

    至于静态控件picturecontrol不更新的问题,您的代码中已经尝试了强制重绘窗口部件,但可能由于UI线程的消息处理机制未能及时响应。建议在调用InvalidateUpdateWindow之后加入消息循环刷新,确保UI能够立即进行重绘:

    // 在调用 Invalidate 和 UpdateWindow 后追加以下代码
    pStatic->Invalidate(TRUE);
    pStatic->UpdateWindow();
    
    // 强制应用程序处理挂起的消息,从而实现立即重绘
    AfxGetMainWnd()->UpdateWindow();
    

    总结一下,修改后的ProcessImage函数应为:

    void CDemoMFCDlg::ProcessImage()
    {
        // 清理 Halcon 图像对象
        ClearObj(ho_Image);
        ClearObj(ho_GrayImage);
        ClearObj(ho_sharp0);
    
        TRACE(_T("开始 ProcessImage\n"));
    
        // ...(保留原有的读取、处理及显示图像的代码)
    
        CStatic* pStatic = (CStatic*)GetDlgItem(IDC_STATIC1);
        pStatic->Invalidate(TRUE);  
        pStatic->UpdateWindow();  
    
        // 强制主窗口刷新以立即重绘静态控件
        AfxGetMainWnd()->UpdateWindow();
    
        // ...(计数器及其他后续操作)
    }
    

    请按照上述建议调整代码后重新测试,并确保在定时器事件触发函数中正确调用了ProcessImage函数。如果问题依旧存在,请进一步检查是否存在其他潜在问题,例如图片文件读取权限、文件路径有效性、Halcon接口调用异常处理等方面。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月16日
  • 创建了问题 3月15日

悬赏问题

  • ¥15 编辑cmake lists 明明写了project项目名,但是还是报错怎么回事
  • ¥15 关于#计算机视觉#的问题:求一份高质量桥梁多病害数据集
  • ¥15 特定网页无法访问,已排除网页问题
  • ¥50 如何将脑的图像投影到颅骨上
  • ¥15 提问一个关于vscode相关的环境配置问题,就是输入中文但是显示不出来,代码在idea可以显示中文,但在vscode不行,不知道怎么配置环境
  • ¥15 netcore使用PuppeteerSharp截图
  • ¥20 这张图页头,页脚具体代码该怎么写?
  • ¥15 关于#sql#的问题,请各位专家解答!
  • ¥20 WPF MVVM模式 handycontrol 框架, hc:SearchBar 控件 Text="{Binding NavMenusKeyWords}" 绑定取不到值
  • ¥15 需要手写数字信号处理Dsp三个简单题 不用太复杂