陈cy. 2024-03-25 11:15 采纳率: 0%
浏览 188
已结题

halconcpp!HalconCpp::HOperatorException::Throw出错


void widget::on_pushButton_ImageProcessing_clicked()
{
    // HTuple hv_Exception,hv_ErroCode;
    // try
    // {
    // CountSeconds(&hv_S1);


    //关闭当前窗口。
    if (HDevWindowStack::IsOpen())
        CloseWindow(HDevWindowStack::Pop());



    //读取图片
    ReadImage(&ho_Image,L"D://Data//实验图片");

    //打开一个窗口并显示图像,窗口大小根据图像大小自动调整,并将窗口句柄赋值给变量WindowHandle。
    dev_open_window_fit_image(ho_Image, 0, 0, 960, 1920, &hv_WindowHandle);

    //设置窗口中显示的字体大小为16,字体类型为'mono',抗锯齿开启。
    set_display_font(hv_WindowHandle, 16, "mono", "true", "false");

    //设置图形绘制模式为'margin',即边缘绘制。
    if (HDevWindowStack::IsOpen())
        SetDraw(HDevWindowStack::GetActive(),"margin");

    // //获取系统设置的存储空区域参数,并将其赋值给变量StoreEmptyRegion。
    GetSystem("store_empty_region", &hv_StoreEmptyRegion);

    // //设置系统设置的存储空区域参数为'true',即开启存储空区域功能。
    SetSystem("store_empty_region", "true");

    // //定义一个变量cm_per_pix,表示每像素对应的厘米数,这里设置为0.0373。
    //hv_cm_per_pix = 0.0373;

    // //定义一个变量TargetLength,表示目标长度,这里设置为55pixel。
    hv_TargetLength = 55.0;

    // //定义一个变量ToleranceHigh,表示高容忍度,这里设置为0.8。
    hv_ToleranceHigh = 6;

    // //定义一个变量ToleranceLow,表示低容忍度,这里设置为0.2
    hv_ToleranceLow = 7;

    // //定义一个变量LongTargetLength,表示目标长度,这里设置为115pixel。
    hv_LongTargetLength = 115.0;

    // //定义一个变量LongToleranceHigh,表示高容忍度,这里设置为0.8。
    hv_LongToleranceHigh = 5;

    // //定义一个变量LongToleranceLow,表示低容忍度,这里设置为0.2
    hv_LongToleranceLow = 5;

    // //一个整数类型的变量,表示接下来要读取的图像数量。
    hv_NumImages = 10;

    //for I := 1 to NumImages by 1
    //保存一张新的图片图片名为Imageprocess.2.bmp
    //read_image (Image, 'D:/Data/实际数量图片(正常2)')
    //使用threshold算子进行局部自适应阈值分割17
    Threshold(ho_Image, &ho_DivisionRegion, 0, 17);
    //使用local_threshold算子进行局部自适应阈值分割4
    //local_threshold (Image, DivisionRegion, 'adapted_std_deviation', 'dark', 'mask_size', 15)
    //参数说明:
    //ImageIn: 输入的单通道灰度图像
    //ImageOut: 输出的二值图像(背景为0,前景为1)
    //'adapted_std_deviation': 这是当前唯一支持
    //'dark':表示使用暗通道方法确定局部阈值。
    //'mask_size':表示用于计算局部阈值的像素邻域大小。这里设置为 15。

    //膨胀处理
    DilationRectangle1(ho_DivisionRegion, &ho_RegionDilation, 3, 3);

    //将不相连的区域分开成若干个区域
    Connection(ho_RegionDilation, &ho_ConnectedRegions);

    //填充连通域
    FillUp(ho_ConnectedRegions, &ho_RegionFillUp);

    //形状选择宽度在30px-70px之间的区域
    SelectShape(ho_RegionFillUp, &ho_Widths, "width", "and", 7, 120);
    SelectShape(ho_Widths, &ho_Heights, "height", "and", 7, 120);
    SelectShape(ho_Heights, &ho_SelectedRegions, "area", "and", 90, 99999);
    //计算联通区面积
                //select_shape ()
    //去掉被图像边缘隔断的区域
    Boundary(ho_Image, &ho_RegionBorder, "inner");
    //找到有效区域与边界的交集,注意交集是多维,有可能存在空区域
    Intersection(ho_SelectedRegions, ho_RegionBorder, &ho_RegionIntersection);
    AreaCenter(ho_RegionIntersection, &hv_Area, &hv_Row1, &hv_Column1);
    //如果交集面积为0,则该区域不与边界相交,反之则相交。[==]中的[]为元组处理,获取到的是索引
    //用于根据对象的属性进行筛选的操作算子,用来基于区域(或对象)的面积属性来选择连通区域。
    select_mask_obj(ho_SelectedRegions, &ho_ValidSticks, hv_Area.TupleEqualElem(0));
    select_mask_obj(ho_SelectedRegions, &ho_StickAtBorder, hv_Area.TupleNotEqualElem(0));

    //这个最小外接矩形是能够完全包裹住给定连通区域且具有最小面积的矩形,并且它可以是任意旋转角度。
    //检查一下物体的大小* 最小外接矩形,判断是否合格Length1, Length2: 输出参数,分别表示最小外接矩形的两个边长,其中Length1 >= Length2
    SmallestRectangle2(ho_ValidSticks, &hv_Row, &hv_Column, &hv_Phi, &hv_Length1,&hv_Length2);
    //实际的像素大小,cm_per_pix是已经标定计算好的,*2是因为Length1为半径:: FishLength1 := Length1 * 2 * cm_per_pix

    hv_FishLength1 = hv_Length1*2;

    //判断是否合格,注意这里的优先级,+-优先级大于 >= 这些,实际不确定时就加小括号
    // try {
        hv_Good = (hv_FishLength1.TupleGreaterEqualElem(hv_TargetLength-hv_ToleranceLow)).TupleAnd(hv_FishLength1.TupleLessEqualElem(hv_TargetLength+hv_ToleranceHigh));
        hv_LongGood = (hv_FishLength1.TupleGreaterEqualElem(hv_LongTargetLength-hv_LongToleranceLow)).TupleAnd(hv_FishLength1.TupleLessEqualElem(hv_LongTargetLength+hv_LongToleranceHigh));
    hv_Bad = hv_Good.TupleNot();
    // }
    // catch (HalconCpp::HException &HDevExpDefaultException) {
    //     // 处理异常的代码块
    //     //std::cerr << "Exception caught: " << e.what() << std::endl;
    //     HDevExpDefaultException.ToHTuple(&hv_Exception);
    //     hv_ErroCode = ((const HTuple&)hv_Exception)[0];
    // }
    //
    //显示结果
    hv_RowGood = hv_Row.TupleSelectMask(hv_Good);
    hv_ColumnGood = hv_Column.TupleSelectMask(hv_Good);
    hv_RowBad = hv_Row.TupleSelectMask(hv_Bad);
    hv_ColumnBad = hv_Column.TupleSelectMask(hv_Bad);

    hv_RowLongGood = hv_Row.TupleSelectMask(hv_LongGood);
    hv_ColumnLongGood = hv_Column.TupleSelectMask(hv_LongGood);

    hv_FishLength1Good = hv_FishLength1.TupleSelectMask(hv_Good);
    hv_FishLength1Bad = hv_FishLength1.TupleSelectMask(hv_Bad);
    hv_FishLength1LongGood = hv_FishLength1.TupleSelectMask(hv_LongGood);
    GenRectangle2(&ho_AllSticks, hv_Row, hv_Column, hv_Phi, hv_Length1, hv_Length2);
    select_mask_obj(ho_AllSticks, &ho_GoodSticks, hv_Good);
    select_mask_obj(ho_AllSticks, &ho_BadSticks, hv_Bad);
    select_mask_obj(ho_AllSticks, &ho_LongGoodSticks, hv_LongGood);




    if (HDevWindowStack::IsOpen())
        DispObj(ho_Image, HDevWindowStack::GetActive());
    if (HDevWindowStack::IsOpen())
        SetColor(HDevWindowStack::GetActive(),"white");
    if (HDevWindowStack::IsOpen())
        SetLineWidth(HDevWindowStack::GetActive(),1);
    if (HDevWindowStack::IsOpen())
        DispObj(ho_ValidSticks, HDevWindowStack::GetActive());
    if (HDevWindowStack::IsOpen())
        SetLineWidth(HDevWindowStack::GetActive(),3);
    if (HDevWindowStack::IsOpen())
        SetColor(HDevWindowStack::GetActive(),"yellow");
    if (HDevWindowStack::IsOpen())
        DispObj(ho_StickAtBorder, HDevWindowStack::GetActive());
    if (HDevWindowStack::IsOpen())
        SetColor(HDevWindowStack::GetActive(),"green");
    if (HDevWindowStack::IsOpen())
        DispObj(ho_GoodSticks, HDevWindowStack::GetActive());
    if (HDevWindowStack::IsOpen())
        SetColor(HDevWindowStack::GetActive(),"red");
    if (HDevWindowStack::IsOpen())
        DispObj(ho_BadSticks, HDevWindowStack::GetActive());
    if (HDevWindowStack::IsOpen())
        SetColor(HDevWindowStack::GetActive(),"cadet blue");
    if (HDevWindowStack::IsOpen())
        DispObj(ho_LongGoodSticks, HDevWindowStack::GetActive());
    //String := 'Target length: ' + TargetLength$'.1f' + ' cm'(源代码)改为显示像素点
    hv_String = ("Target length: "+(hv_TargetLength.TupleString(".1f")))+"pixel";
    hv_String[1] = (("Tolerance:  -"+(hv_ToleranceLow.TupleString(".1f")))+"/+")+(hv_ToleranceHigh.TupleString(".1f"));
    disp_message(hv_WindowHandle, hv_String, "window", 12, 12, "black", "true");
    //disp_message (WindowHandle, 'OK', 'image', 80, ColumnGood - 10, 'green', 'false')
    disp_message(hv_WindowHandle, (hv_FishLength1Good.TupleString(".1f"))+"pixel","image", hv_RowGood, hv_ColumnGood-28, "green", "false");
    //disp_message (WindowHandle, 'Not OK', 'image', 80, ColumnBad - 30, 'red', 'false')
    disp_message(hv_WindowHandle, (hv_FishLength1Bad.TupleString(".1f"))+"pixel","image", hv_RowBad, hv_ColumnBad-28, "blue", "false");
    // if (I != NumImages)
    disp_continue_message(hv_WindowHandle, "black", "true");
    CountSeconds(&hv_S2);
    hv_Time = hv_S2-hv_S1;
    WriteString(hv_WindowHandle, ("运行时间是:"+hv_Time)+"s");
    // stop ()
    // endif
    // endfor
    if (HDevWindowStack::IsOpen())
        SetColor(HDevWindowStack::GetActive(),"red");
    SetSystem("store_empty_region", hv_StoreEmptyRegion);

    GenRegionPoints(&ho_BadSticks, hv_rot_x, hv_rot_y);

    //htuple转string

    int BadRowNumber = hv_RowBad.Length();
    int BadColumnNumber = hv_ColumnBad.Length();
    HTuple hv_BadLength;
    TupleLength(hv_RowBad,&hv_BadLength);
    cout << BadRowNumber << "," << BadColumnNumber << endl;
    cout << hv_RowBad[BadRowNumber - 1].D() << "," << hv_ColumnBad[BadColumnNumber - 1].D() << endl;
    cout << "Number of elements in hv_RowBad: " << hv_BadLength.I() << std::endl;
    //储存执行坐标
    struct Coord
    {
        double x;
        double y;
    };
    vector<Coord>BadCoord;//创建坐标数组

    for(int i = 0 ; i <= BadRowNumber - 1 ; i++)
    {
        for(int j = 0 ; j <= BadColumnNumber - 1 ; j++)
        {
            Coord coord;//实例化的坐标点
            coord.x = hv_RowBad[i].D();
            coord.y = hv_ColumnBad[j].D();
            BadCoord.push_back(coord);//将坐标点添加到向量中
        }

    }
    QString message ;
    for(const auto& coord : BadCoord)
    {
        std::cout << "Coordinate: (" << coord.x << ", " << coord.y << ")" << std::endl;
        // 将坐标信息转换为字符串并发送到串口
        if (!message.isEmpty()) {
            message.append(", "); // 在已有内容后添加分隔符
        }
        message.append(QString::number(coord.x)); // 将 x 值转换为字符串并添加到 message
        message.append(",");
        message.append(QString::number(coord.y)); // 将 y 值转换为字符串并添加到 message
        // serialPort->write(message.toUtf8());
        // ui->textBrowser_Send->insertPlainText(message);

    }
    serialPort->write(message.toUtf8());
    ui->textBrowser_Send->insertPlainText(message);


    //}
    // catch (HalconCpp::HException &HDevExpDefaultException)
    // {
    //     // 处理异常的代码块
    //     //std::cerr << "Exception caught: " << e.what() << std::endl;
    //     HDevExpDefaultException.ToHTuple(&hv_Exception);
    //     hv_ErroCode = ((const HTuple&)hv_Exception)[0];
    // }
}

执行后程序中断:

img


调试执行出现以下错误:

img

  • 写回答

18条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-03-25 11:15
    关注
    获得0.60元问题酬金

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

    从您提供的错误信息来看,您遇到的问题并不直接与Halcon图像处理代码相关,而是涉及到了Windows网络服务方面的错误。错误信息提示namespaceserviceprovider.cpp文件中的第550行抛出了错误,错误码为8007277C,含义为“此服务不存在。在指定的命名空间中找不到这个服务。”

    针对Halcon图像处理部分的代码审查,未发现明显语法错误,但为了确保代码正确无误,建议对以下几个地方进行确认或优化:

    1. 异常处理:虽然您在代码末尾注释掉了异常捕获部分,但在实际应用中,当执行Halcon算子可能抛出异常时,应确保有适当的异常处理机制。例如,您可以启用异常捕获区块,以便在发生错误时获取具体错误信息并作出相应处理。
    try
    {
        // Your Halcon image processing operations here
    }
    catch (HalconCpp::HException &e)
    {
        // Handle the exception here
        e.ToHTuple(&hv_Exception);
        hv_ErrorCode = ((const HTuple&)hv_Exception)[0];
        // Output or log the error details
        std::cerr << "Halcon Exception caught: " << hv_ErrorCode << std::endl;
    }
    
    1. 窗口操作:为了避免频繁调用if (HDevWindowStack::IsOpen()),可以考虑在打开窗口之后一次性完成一系列窗口操作。

    2. 数据范围:在执行hv_Goodhv_LongGoodhv_Bad的条件判断时,请确保输入的hv_TargetLengthhv_ToleranceLowhv_ToleranceHigh等变量的数值范围合理,以免超出hv_FishLength1的有效范围。

    对于网络服务错误8007277C,这可能是由于您的应用程序依赖于某个网络服务,而该服务当前未能启动或注册成功。解决这个问题的方法通常是:

    • 检查并启动相关的Windows服务,确保其正在运行。
    • 检查系统日志或事件查看器,查找更详细的错误报告和上下文信息,以确定出现问题的具体服务名称。
    • 如果服务缺失或损坏,尝试重新安装或修复该服务所对应的应用程序。

    总之,在排查Halcon代码错误的同时,也需要关注和解决网络服务错误这一方面的问题。对于Halcon代码本身,建议按照上述建议调整异常处理和窗口操作逻辑。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 4月2日
  • 修改了问题 3月25日
  • 创建了问题 3月25日

悬赏问题

  • ¥20 遥感植被物候指数空间分布图制作
  • ¥20 Github上传代码没有contribution和activity记录
  • ¥20 SNETCracker
  • ¥15 数学建模大赛交通流量控制
  • ¥15 为什么我安装了open3d但是在调用的时候没有报错但是什么都没有发生呢
  • ¥50 paddleocr最下面一行似乎无法识别
  • ¥15 求某类社交网络数据集
  • ¥15 靶向捕获探针方法/参考文献
  • ¥15 很抱歉出现错误word不能启动(24),如何解决?
  • ¥15 javascript下载网络图片