news 2026/4/28 20:13:52

org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry

文章目录

  • org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry
    • 功能
    • 参数
    • 例子
      • 产生测试图像
      • cv-pipeline
    • 效果
    • END

org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry

功能

检测具有矩形线性对称性的物体(例如矩形芯片、IC、排针、无源元件等)。它不依赖于清晰的边缘或完整的轮廓,而是通过分析图像在不同旋转角度下的水平和垂直截面(cross‑section)的对称性,找到使对称性最大的角度和中心位置,最终输出一个 RotatedRect(旋转矩形),包含物体的中心、尺寸和旋转角度.

参数

参数类型默认值说明
expectedAngledouble0期望的物体旋转角度(度)。算法将在该角度附近搜索。
searchDistancedouble100围绕中心的搜索半径(像素)。用于确定中心偏移的范围。
searchAngledouble45围绕expectedAngle的搜索范围(度,双向)。实际搜索角度范围为[expectedAngle - searchAngle, expectedAngle + searchAngle]
maxWidthdouble100物体的最大宽度(像素)。用于限制截面分析的范围,提高效率。
maxHeightdouble100物体的最大高度(像素)。
symmetricLeftRightbooleantrue物体是否左右对称(在0°旋转时)。若为true,使用symmetricFunction;若为false,使用asymmetricFunction
symmetricUpperLowerbooleantrue物体是否上下对称(在0°旋转时)。若为true,使用symmetricFunction;若为false,使用asymmetricFunction
symmetricFunctionSymmetryFunctionFullSymmetry当物体对称时,使用的对称评估函数。可选值:FullSymmetry,EdgeSymmetry,OutlineSymmetry,OutlineEdgeSymmetry,OutlineSymmetryMasked
asymmetricFunctionSymmetryFunctionOutlineSymmetryMasked当物体不对称时,使用的对称评估函数。通常用于元件内部图案不对称但轮廓对称的情况。
minSymmetrydouble10最小对称性得分。得分 >1 表示有对称性,低于此值视为检测失败。
subSamplingint8子采样步长。为加速,每隔subSampling像素采样一次。后续迭代会逐步减小该值以获得更高精度。
superSamplingint1超采样因子,用于最终阶段的亚像素精度。1 表示无超采样,2 表示半像素精度。负值可提前停止细化。
smoothingint5高斯平滑核大小(像素)。用于消除由于像素网格和角度采样引起的噪声干扰。
gammadouble2.5伽马校正指数。对像素亮度进行幂变换,gamma > 1会增强亮部对比度,有助于检测较亮的元件。
thresholdint128掩膜对称模式下的亮度阈值(0-255)。仅当像素亮度大于该阈值时,才视为物体的一部分。
minFeatureSizedouble40掩膜对称模式下的最小特征尺寸(像素)。用于过滤掉小的噪声斑点,只有大于该尺寸的连续掩膜区域才被视为有效特征。
diagnosticsbooleanfalse是否在输出图像上叠加诊断信息(十字线、边界框等)。用于调试。
diagnosticsMapbooleanfalse是否叠加角度对比图和截面轮廓图,提供更详细的诊断信息。
propertyNameString"DetectRectlinearSymmetry"管道属性名称。如果设置,管道运行时可以通过该属性动态覆盖部分配置参数(如centerexpectedAngle等)。

例子

产生测试图像

# @fn generate_rotated_rectangle_v2.pyimportcv2importnumpy as np# 图像尺寸width, height=800,600# 创建纯蓝色背景img=np.full((height,width,3),(255,0,0),dtype=np.uint8)# 矩形参数(未旋转时) rect_w,rect_h=200,120center=(width//2,height//2)angle=30# 逆时针旋转30度 # 方法:先在一个小画布上绘制未旋转的矩形,然后旋转并粘贴到背景上 # 创建足够大的画布(包含矩形) canvas_w=rect_w+100canvas_h=rect_h+100canvas=np.zeros((canvas_h,canvas_w,3),dtype=np.uint8)canvas[:]=(255,0,0)# 蓝色背景,与主图一致 # 在画布中央绘制白色矩形 cv2.rectangle(canvas,(50,50),(50+rect_w,50+rect_h),(255,255,255),-1)# 计算旋转矩阵,绕画布中心旋转 M=cv2.getRotationMatrix2D((canvas_w/2,canvas_h/2),angle,1.0)rotated=cv2.warpAffine(canvas,M,(canvas_w,canvas_h),borderMode=cv2.BORDER_CONSTANT,borderValue=(255,0,0))# 将旋转后的矩形区域叠加到主图像中心# 找到旋转后非蓝色区域的边界gray=cv2.cvtColor(rotated, cv2.COLOR_BGR2GRAY)_, mask=cv2.threshold(gray,1,255, cv2.THRESH_BINARY)mask_inv=cv2.bitwise_not(mask)# 主图像中对应的区域(需要裁剪到主图范围内)x_start=center[0]- canvas_w//2 y_start=center[1]- canvas_h//2 x_end=x_start + canvas_w y_end=y_start + canvas_h roi=img[y_start:y_end, x_start:x_end]# 将旋转后的非蓝色部分复制到 ROIroi_bg=cv2.bitwise_and(roi, roi,mask=mask_inv)rotated_fg=cv2.bitwise_and(rotated, rotated,mask=mask)img[y_start:y_end, x_start:x_end]=cv2.add(roi_bg, rotated_fg)# 可选:绘制中心十字标记(绿色)cv2.line(img,(center[0]-50, center[1]),(center[0]+50, center[1]),(0,255,0),2)cv2.line(img,(center[0], center[1]-50),(center[0], center[1]+50),(0,255,0),2)# 添加文字cv2.putText(img, f"Rotated Rectangle, angle={angle} deg",(50,50), cv2.FONT_HERSHEY_SIMPLEX,0.7,(0,0,0),2)# 保存cv2.imwrite("rotated_rectangle_v2.png", img)print("已生成旋转矩形测试图像: rotated_rectangle_v2.png")

cv-pipeline

<cv-pipeline><stages><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRead"name="read"enabled="true"file="D:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\rotated_rectangle_v2.png"color-space="Bgr"handle-as-captured="false"/><cv-stageclass="org.openpnp.vision.pipeline.stages.ConvertColor"name="gray"enabled="true"conversion="Bgr2Gray"/><cv-stageclass="org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry"name="detect"enabled="true"expected-angle="30.0"search-distance="50.0"search-angle="20.0"max-width="250.0"max-height="180.0"symmetric-left-right="true"symmetric-upper-lower="true"symmetric-function="FullSymmetry"asymmetric-function="OutlineSymmetryMasked"min-symmetry="10.0"sub-sampling="4"super-sampling="2"smoothing="5"gamma="2.5"threshold="128"min-feature-size="20.0"diagnostics="true"diagnostics-map="false"property-name=""/><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageRecall"name="recall"enabled="true"image-stage-name="read"/><cv-stageclass="org.openpnp.vision.pipeline.stages.DrawRotatedRects"name="draw"enabled="true"rotated-rects-stage-name="detect"thickness="2"draw-rect-center="true"rect-center-radius="4"show-orientation="true"><colorr="0"g="255"b="0"a="255"/></cv-stage><cv-stageclass="org.openpnp.vision.pipeline.stages.ImageWrite"name="save"enabled="true"file="output_rotated_rectangle.png"/></stages></cv-pipeline>

效果


END

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/28 20:09:57

Decoding:大模型解码策略解析

前言&#xff1a;模型是怎么“说话“的&#xff1f; 想象一下&#xff0c;你让ChatGPT写一篇文章&#xff0c;它是怎么一个字一个字“蹦”出来的&#xff1f; 其实&#xff0c;大模型每次只预测下一个词(token)。每次预测时&#xff0c;模型会给词库里的所有词打分。算出每个词…

作者头像 李华
网站建设 2026/4/28 20:09:56

湘美谈教育湘美书院自然教育系列:AI+助力野生鸟类分布图调查统计

群峰叠翠&#xff0c;枫叶含丹&#xff0c;从来都是东亚候鸟迁徙的重要驿站&#xff0c;更是众多鸟类繁衍生息的家园。从洞庭湖湿地上成群栖息的小天鹅&#xff0c;到莽山林谷中穿梭觅食的黄腹角雉&#xff0c;从城市公园偶然落脚的红嘴蓝鹊&#xff0c;到湘西村寨旁掠过天际的…

作者头像 李华
网站建设 2026/4/15 2:15:19

【智能体开发】【开发工具】【入门】9.n8n 入门

n8n 是一个强大且开源的工作流自动化工具&#xff0c;它的核心思想是通过“拖拽节点”的方式&#xff0c;像搭积木一样将不同的应用和服务连接起来&#xff0c;从而自动完成各种复杂任务。 &#x1f4cc; 快速认识 n8n 它是什么&#xff1a;一个开源、基于节点的可视化工作流…

作者头像 李华
网站建设 2026/4/15 2:14:05

MQTT 消息推送详解

#MQTT 消息推送详解 MQTT(Message Queuing Telemetry Transport)是一种轻量级的发布/订阅消息协议,专为低带宽、高延迟或不稳定网络环境设计,非常适合物联网设备通信、移动消息推送等场景。 一、MQTT 核心概念 - **Broker(代理/服务器)**:消息的中转中心,负责接收客…

作者头像 李华
网站建设 2026/4/15 2:06:27

重载 AGV 控制怎么做?这篇 2025 论文把“载荷转移”讲透了

最新 AGV 控制论文解析&#xff1a;20 吨重载 AGV 怎么把“轨迹跟踪”和“车身稳定”一起管起来&#xff1f; 摘要 这次分析一篇 AGV 控制 方向的最新论文&#xff0c;而且和前面讲过的 Pure Pursuit 改进、外部视觉导航、托盘装卸 都不重复。本文选取的是 2025 年发表的论文 《…

作者头像 李华
网站建设 2026/4/15 2:04:12

从零部署Orbbec Gemini2:ROS2 Humble环境下的驱动配置与多话题数据解析

1. 环境准备与驱动安装 最近在做一个机器人项目&#xff0c;需要用到Orbbec Gemini2&#xff08;原DaBai DCL&#xff09;深度相机。折腾了两天才把ROS2驱动搞定&#xff0c;这里把完整过程记录下来&#xff0c;希望能帮到同样在配置这款相机的朋友。 1.1 系统要求检查 首先确认…

作者头像 李华