问题标签 [halcon]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - HALCON 到 OpenCV 失真系数的转换
我有一个校准的多相机系统。内部(焦距、失真等)和外部(姿势)相机参数均已使用基于 HALCON 的程序进行了估计。现在,目标是编写一个 C++ 程序,读取相机参数,特别是 HALCON 估计的失真系数 (k1, k2, k3, p1, p2),并使用它们使用 OpenCV 对图像进行不失真处理。不幸的是,到目前为止,我无法成功:在 HALCON 和 OpenCV 中使用相同的失真系数会生成非常不同的未失真图像!我想,问题在于 HALCON 和 OpenCV 解释失真系数的方式,甚至是它们执行不失真的方式。
这是我的 HALCON 代码,用于读取失真系数并使用它们来使测试图像不失真:
我正在尝试在 OpenCV 中做同样的事情,使用以下代码:
OpenCV 中的变量“cameraMatrix”等于 HALCON 中的变量“CamMatrix”。OpenCV 中的失真系数“distCoeffs”取自 HALCON (k1, k2, k3, p1, p2),并按照文档以这种方式重新排列:
请注意,k3 作为第五个参数提供,并且 p2 和 p1 交换了。根据 HALCON 文档(https://www.mvtec.com/doc/halcon/12/en/calibrate_cameras.html,请参阅函数 calibrate_cameras ),图像平面中的未失真坐标(u,v)是从失真的(u', v') 为:
u = u' + u' (k1 r^2 + k2 r^4 + k3 r^6) + p1 (r^2 + 2 u'^2) + 2 p2 u' v'
v = v' + v' (k1 r^2 + k2 r^4 + k3 r^6) + p2 (r^2 + 2 v'^2) + 2 p1 u' v'
有 r = sqrt(u'^2 + v'^2)
而在 OpenCV(https://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html,参见函数 initUndistortRectifyMap)中,相同的未失真坐标的估计相似,只有 p1 和 p2 被交换。
显然,OpenCV 和 HALCON 都将像素投影到图像平面中。也就是说,具有像素 (x, y) 的相应图像平面坐标计算如下:
u' = x - cx / fx
v' = y - cy / fy
这些当然可以反向投影以重新获得相应的像素坐标:
x = u' * fx + cx
y = v' * fy + cy
根据文档,似乎一切都应该按预期工作。但是,我不明白为什么基于 HALCON 和 OpenCV 的代码仍然输出非常不同的结果。我注意到要产生与 HALCON 中类似的未失真结果(但不完全相同),我必须缩小(约 100 倍!)OpenCV 中的失真系数。事实上,我注意到 HALCON 估计了巨大的失真系数。例如,为了在未失真的图像中产生可见的变化,我必须在 HALCON k1=1000中设置,而在 OpenCV k1=1中已经明显地改变了图像。对于某些失真系数,我什至不得不反转(用负号)值以获得朝着相似方向前进的未失真结果......
我深入挖掘了一点 HALCON 不失真代码,并尝试按照文档手动估计未失真坐标(u,v),它应该对应于“地图”中的坐标。我这样做是为了确保“地图”确实是按照文档中指定的方式/我理解的方式估计的。然而,即使在这里,与“地图”中估计的结果相比,我也得到了非常不同的结果......为了进行测试,我使用了以下代码:
我尝试一次只关注几个失真系数,即只有 k1 > 0,其他设置为 0。但是在大多数情况下,(x = cx,y = cy 时有少数例外)未失真的坐标超过图像大小或甚至变成负数。
这不是 HALCON 估计不失真地图坐标的方式吗?我错过了什么吗?应该如何转换这些失真系数以使 OpenCV 生成完全相同的未失真结果图像?任何帮助将不胜感激!
由于某些软件限制,仅使用 OpenCV 进行校准和不失真是有争议的,但不幸的是,对我来说这不是一个可接受的解决方案。
c# - 从轮廓生成 HALCON 区域
我在内部数据结构中有一个多边形,由表示像素坐标的二维点组成。我需要这个多边形作为 HALCON 区域 ( HRegion
)。转换应该是这样发生的:
虽然轮廓 ( HContour
) 是有效的,但根据Halcon Variable Inspect,创建的区域 ( hRegion
) 似乎是空的。HRegion::IsInitialized
返回 true,但HRegion::AreaCenter
对于面积和位置都将返回零,这显然是错误的。
也有这些函数调用的构造函数版本(例如GenContourPolygonXld
),使用“标志性”类型HXLDCont
and HRegion
,这也会导致不正确的区域。
我还尝试将轮廓序列化,将其保存在文件中并将其加载到 HDevelop 中。在那里,相应的代码确实创建了一个有效区域:
在 C# 中,我还加载了该轮廓文件并尝试创建相应的区域。然而,这种方法也导致了一个错误的空白区域:
Halcon 版本是 12.0.3。
库中是否有错误,或者我在 C++ 和 C# 代码中做错了?
编辑:
在执行任何 Halcon 代码之前,会进行以下设置:
所有坐标都在有效范围内,并且不会裁剪区域。
已用于测试的轮廓是this。
image - 过滤低对比度的噪声图像
我尝试在一个非常嘈杂的图像中实现 OCR。数字和背景之间的对比度也很低。我尝试使用一些中值滤波器来平滑背景噪声和边缘增强方法,但没有明显的效果。有没有人有类似的任务要做?我应该使用什么过滤器?
带有背景噪音和低对比度的数字:
编辑(添加过度曝光的图片)
c# - 使用独立线程在 Windows 窗体中启动、暂停和继续嵌入式 HALCON 应用程序时出现问题
我在完成 Windows 窗体 C# 中的 GUI 时遇到了瓶颈。我是 100% 的新手,我认为我在混和乱搞。有人可以帮助我吗?
我正在嵌入一个人工视觉应用程序(在 HALCON 软件中开发并导出为 C#)。我在一个类中恢复这个应用程序,其中一种方法具有三个输出(几个图像和一个字符串)。
我将这个类与其他类一起放在一个 while 循环中,以迭代并与视觉应用程序的输出交互,直到状态statusFile
为 1 以退出循环。
首先,我只使用平均线程,当 while 循环进入视野时,我的 GUI 没有响应。
开始按钮的片段:
进行此更改后,GUI 变得响应良好,而且我确信正确的方法是使用不同的线程。但是,当再次单击将标签更改为“暂停”的按钮时,它不会暂停线程run1
,它会继续......myResetEvent.WaitOne();
请问我可以请你帮忙吗?我也很困惑,不知道从哪里继续或改变什么......</p>
提前非常感谢。我真的很想在 5 天后关闭这个东西,而不是这个好主意。
brightness - Halcon - 设置图像亮度/曝光
我是第一次在 Halcon 中尝试一些东西。但无法弄清楚,甚至在文档中,如何设置图像采集的曝光......到目前为止我的代码是这样的,但我的测试环境很暗,并且想稍微照亮图像:
balance - Halcon - 如何设置白平衡
我有这段代码可以尝试使用 halcon。图像非常偏绿,无法弄清楚如何设置白平衡。我在示例、文档、谷歌和参数中找不到它。halcon上的白平衡是怎么设置的?
sorting - Halcon - 根据索引列表对元组进行排序
我有 2 个元组,代表点坐标列表。我需要它们按行排序。以下代码对行元组进行排序,并返回一个新元组,其中包含它对元组排序所做的更改。现在我需要使用此信息以相同的方式对列元组进行排序。
指数现在包含以下内容:[1, 0, 5, 2, 4, 3]
所以我需要以与[730.5, 1200.15, 515.429, 670.778, 1330.5, 1473.4]
上面元组中显示的顺序相同的顺序使用这些值对 intersection_points_col 进行排序。
如何才能做到这一点?
row - Halcon - image_points_to_world_plane -> x1 和 y1 格式
在 Halcon 的示例camera_calibration_multi_image.hdev
中有以下代码:
文档说 x 和 y 包含世界坐标系中点的X
和坐标。Y
因此,如果 Col 和 Row 可以是数组,则 X1 和 Y1 也必须是数组。但在下一行中,它们的访问方式如下:X1[0:11]
我无法弄清楚这意味着什么...... 0 和 11 指的是什么,因为它很简单此示例中包含 12 个点的列表...
coordinates - Halcon - 获取世界坐标中的区域面积
我有以下代码:
此代码以 mm 为单位返回值。
现在代码如下所示,我需要以 mm² 为单位的 Regions1 的面积。相反,我以像素形式获取它们..
AreaLabels
以 px² 为单位,我需要以 mm² 为单位。但找不到类似 region_to_world_plane 的东西......这怎么办?