org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry

张开发
2026/4/15 2:23:55 15 分钟阅读

分享文章

org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry
文章目录org.openpnp.vision.pipeline.stages.DetectRectlinearSymmetry功能参数例子产生测试图像cv-pipeline效果ENDorg.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是否叠加角度对比图和截面轮廓图提供更详细的诊断信息。propertyNameStringDetectRectlinearSymmetry管道属性名称。如果设置管道运行时可以通过该属性动态覆盖部分配置参数如center、expectedAngle等。例子产生测试图像# fn generate_rotated_rectangle_v2.pyimportcv2importnumpy as np# 图像尺寸width, height800,600# 创建纯蓝色背景imgnp.full((height,width,3),(255,0,0),dtypenp.uint8)# 矩形参数未旋转时 rect_w,rect_h200,120center(width//2,height//2)angle30# 逆时针旋转30度 # 方法先在一个小画布上绘制未旋转的矩形然后旋转并粘贴到背景上 # 创建足够大的画布包含矩形 canvas_wrect_w100canvas_hrect_h100canvasnp.zeros((canvas_h,canvas_w,3),dtypenp.uint8)canvas[:](255,0,0)# 蓝色背景与主图一致 # 在画布中央绘制白色矩形 cv2.rectangle(canvas,(50,50),(50rect_w,50rect_h),(255,255,255),-1)# 计算旋转矩阵绕画布中心旋转 Mcv2.getRotationMatrix2D((canvas_w/2,canvas_h/2),angle,1.0)rotatedcv2.warpAffine(canvas,M,(canvas_w,canvas_h),borderModecv2.BORDER_CONSTANT,borderValue(255,0,0))# 将旋转后的矩形区域叠加到主图像中心# 找到旋转后非蓝色区域的边界graycv2.cvtColor(rotated, cv2.COLOR_BGR2GRAY)_, maskcv2.threshold(gray,1,255, cv2.THRESH_BINARY)mask_invcv2.bitwise_not(mask)# 主图像中对应的区域需要裁剪到主图范围内x_startcenter[0]- canvas_w//2 y_startcenter[1]- canvas_h//2 x_endx_start canvas_w y_endy_start canvas_h roiimg[y_start:y_end, x_start:x_end]# 将旋转后的非蓝色部分复制到 ROIroi_bgcv2.bitwise_and(roi, roi,maskmask_inv)rotated_fgcv2.bitwise_and(rotated, rotated,maskmask)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, fRotated 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-pipelinecv-pipelinestagescv-stageclassorg.openpnp.vision.pipeline.stages.ImageReadnamereadenabledtruefileD:\3rd\openpnp_prj\openpnp-official\openpnp-test-images\my_test\rotated_rectangle_v2.pngcolor-spaceBgrhandle-as-capturedfalse/cv-stageclassorg.openpnp.vision.pipeline.stages.ConvertColornamegrayenabledtrueconversionBgr2Gray/cv-stageclassorg.openpnp.vision.pipeline.stages.DetectRectlinearSymmetrynamedetectenabledtrueexpected-angle30.0search-distance50.0search-angle20.0max-width250.0max-height180.0symmetric-left-righttruesymmetric-upper-lowertruesymmetric-functionFullSymmetryasymmetric-functionOutlineSymmetryMaskedmin-symmetry10.0sub-sampling4super-sampling2smoothing5gamma2.5threshold128min-feature-size20.0diagnosticstruediagnostics-mapfalseproperty-name/cv-stageclassorg.openpnp.vision.pipeline.stages.ImageRecallnamerecallenabledtrueimage-stage-nameread/cv-stageclassorg.openpnp.vision.pipeline.stages.DrawRotatedRectsnamedrawenabledtruerotated-rects-stage-namedetectthickness2draw-rect-centertruerect-center-radius4show-orientationtruecolorr0g255b0a255//cv-stagecv-stageclassorg.openpnp.vision.pipeline.stages.ImageWritenamesaveenabledtruefileoutput_rotated_rectangle.png//stages/cv-pipeline效果END

更多文章