HALCON error #1302: Wrong value of control parameter: 2 in operator affine_trans_region

理论

关于affine_trans_region最后一个参数,帮助上可选值是:

 'constant', 'nearest_neighbor'

VS2013 halcon10 这两个值都会崩溃。

实际

void Test()
        {
            HObject rRect;
            HOperatorSet.GenRectangle1(out rRect,0, 0, 100, 100);
     
            HTuple matIdentity;
            HOperatorSet.HomMat2dIdentity(out matIdentity);         

            HObject rDilation = new HObject();
            HOperatorSet.GenEmptyObj(out rDilation);
            HOperatorSet.AffineTransRegion(rRect, out rDilation, matIdentity, "nearest_neighbor");       
          
        }

解决方法

最后一个参数改成: "true"或"false"都可以。

HOperatorSet.AffineTransRegion(rRect, out rDilation, matIdentity, "true"); 

halcon18 这两个值 true false 都可以,其它值不行。

https://img-blog.csdnimg.cn/ea2601b3918f4aef836b5fe30da2ebf7.gif#pic_center#pic_center

其它

学院课程

基础算法的C++实现课程,请点击下面的优快云学院的链接。

2024年1月15之前完全免费,之后绝大部分免费

https://edu.youkuaiyun.com/course/detail/38771

C#入职培训

此课程的目的:让新同事更快完成从学生到C#程序员的转换,更快上手完成C#的开发工作。

https://edu.youkuaiyun.com/course/detail/38768

C++入职培训

让新同事更快完成从学生到C++程序员的转换,更快上手完成C++的开发工作。

https://edu.youkuaiyun.com/course/detail/32049

运行验证环境

Win10 VS2022 Ck++17 或win7 VS2019 C++17

每天都补充正能量

好好学习,天天向上。

事无终始,无务多业。

是故置本不安者,无务丰末。

相关下载

如果你时间宝贵,只想看精华,请到优快云下载频道下载《闻缺陷则喜算法册》doc版

https://download.youkuaiyun.com/download/he_zhidan/88348653

https://i-blog.csdnimg.cn/blog_migrate/4b48f80cdf99b7ea9bda88ceb91d788f.gif#pic_center

### HALCON 中 `tuple_div` 操作符控制参数 2 的错误解决方案 在 HALCON 编程环境中,当遇到错误代码 `#1302: Wrong value of control parameter: 2 in operator tuple_div` 时,通常是因为传递给该操作符的第二个参数不符合其预期的数据类型或范围要求[^4]。 #### 错误分析 `tuple_div` 是用于执行元组除法的操作符。它的语法如下: ```cpp HTuple result = tuple_div(HTuple dividend, HTuple divisor); ``` 其中: - **dividend** 表示被除数(可以是一个标量或元组)。 - **divisor** 表示除数(同样可以是一个标量或元组)。如果 divisor 包含零值,则会引发运行时错误。 根据引用中的描述,错误的原因可能是以下之一: 1. **数据类型的不匹配**:`divisor` 参数可能包含了非数值型数据(例如字符串或其他非法类型),这违反了 `tuple_div` 对输入的要求[^3]。 2. **数值范围问题**:如果 `divisor` 包含零值或者非常接近于零的小数值,可能会导致计算失败并触发此错误。 #### 解决方案 以下是针对上述两种情况的具体解决方法: ##### 方法一:验证数据类型一致性 确保传入 `tuple_div` 的两个参数均为合法的数值型元组。可以通过显式转换来强制统一数据类型。例如,在下面的例子中,我们将所有整数转换为浮点数以避免潜在冲突: ```cpp HTuple dividend; dividend.Append(10).Append(20); HTuple divisor; divisor.Append(2).Append(0); // 这里存在一个零值! // 将 divisor 转换为浮点数形式 HTuple safeDivisor = divisor.TupleCastToDouble(); try { HTuple result = tuple_div(dividend, safeDivisor); } catch (HException e) { std::cout << "Error occurred: " << e.ErrorMessage() << std::endl; } ``` ##### 方法二:排除零值或异常小值 为了防止因除数中含有零而导致程序崩溃,可以在实际调用之前先筛选掉这些危险值。具体实现方式如下所示: ```cpp HTuple filteredDivisor; for(int i=0;i<divisor.Length();i++) { double currentValue = divisor[i].D(); if(currentValue != 0 && abs(currentValue) >= 1e-6){ // 设置阈值过滤极小值 filteredDivisor.Append(currentValue); } } if(filteredDivisor.Length()==0){ throw new Exception("All elements in the divisor are invalid!"); } HTuple finalResult = tuple_div(dividend, filteredDivisor); ``` 以上两步措施能够有效减少由不当输入引起的错误发生概率。 --- ### 示例代码 综合考虑前面提到的各种因素后,给出完整的修正版代码片段作为参考: ```cpp #include <halcon.h> using namespace HalconCpp; int main(){ try{ HTuple num = {10, 20}; HTuple den = {2, &#39;a&#39;}; // 原始denominator包含字符&#39;a&#39; // Step1: Convert all entries into numeric form. HTuple correctedDen = den.TupleMapType(HAL_DOUBLE); // Step2: Filter out zeros and near-zero values from denominator. HTuple validDen={}; for(auto elem : correctedDen.AsList()){ auto dblElem = static_cast<double>(elem); if(dblElem!=0 && fabs(dblElem)>1E-7){ validDen.Add(dblElem); }else{ continue; } } if(validDen.Size()==0){ throw RuntimeException("Division failed due to lack of valid denominators."); } HTuple res = tuple_div(num,validDen); cout<<"Final Result:"<<res<<endl; }catch(Exception&e){ cerr<<e.what()<<endl; } return EXIT_SUCCESS;} ``` --- ### 总结 通过对 HALCON 中 `tuple_div` 函数可能出现的问题进行深入剖析,并提供了相应的预防策略以及改进后的示范代码,希望能够帮助开发者更高效地处理类似场景下的技术难题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

软件架构师何志丹

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

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

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

打赏作者

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

抵扣说明:

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

余额充值