当前位置: 首页 > news >正文

八.工控之视觉专题

目录

  • 一.相机和成像知识
    • 1.成像原理
    • 2.工业相机
  • 二.视觉小知识
    • 1. 阈(yu)值化
    • 2.相机内参、相机外参
    • 3.标定和标定板
      • 1.标定
      • 2.标定板
    • 4.腐蚀和膨胀
      • 1.膨胀
      • 2.腐蚀
    • 5.拟合
    • 6.亚像素
    • 7.Halcon中基于形状的模板匹配过程
    • 8.九点标定(手眼标定)
    • 9.单相机标定(内外参标定)
      • 1.大致操作步骤
      • 2.标定步骤总结
      • 3.注意事项
    • 10.hsv颜色模型

记录平时视觉学习过程中的知识点,如有错误,请指正。

在这里插入图片描述

一.相机和成像知识

1.成像原理

相机输出图像的过程:
首先物体的光进入镜头成像后,图像是打在感光芯片上的。芯片上有许多微小颗粒的传感器,每个(或每几个)传感器都会将光线变化转换为电信号变化,输出到外部系统。所以图像的每个像素点,实际上是对应相机的感光传感器的,两者间就像有通道连接一样,传感器对外界光线的变化导致像素变化,组合到图像上就是图像的变化。
黑白图像,可能只需要对应一个灰度通道。彩色的对应多个通道,然后根据色彩比例显示结果。

2.工业相机

  1. 工业相机、工控机这些电子产品,相对于日常电子产品,最大的区别就是稳定、抗干扰能力强。好多时候工业产品需要在极端的环境下长时间稳定地进行工作。而工业相机相比于传统民用相机,它具有更高的图像稳定性、高传输能力和高抗干扰能力。
    本质功能就是将光信号转变成有序的电信号。
  2. 工业相机知识拓展:工业相机及相关配件选型。
  3. 如下分别是公司所用的2款相机型号,华睿的面阵相机、dasla的线扫相机(也叫线阵相机)的参数截图:
    在这里插入图片描述
    在这里插入图片描述

二.视觉小知识

1. 阈(yu)值化

阈值化是一种图像分割的方法,用于从一幅图片里面提取我们需要的部分。比如分离图像的前景和背景。其基本原理就是利用一幅图像各个部分之间的像素差异,通过设定一个灰度值的阈值,截取出我们需要的部分 。

2.相机内参、相机外参

内参是描述相机内部属性的参数,包括焦距、主点(光学中心)坐标、畸变系数等。内参通常在相机标定时确定,因为它们通常对于特定相机型号是固定的,不随时间变化。一旦相机内参被确定,它们在相机的使用过程中通常是保持不变的。

外参是描述相机在世界坐标系中的位置和姿态的参数,通常包括旋转矩阵和平移向量。外参在不同的相机位置或拍摄时刻可能会发生变化。例如,在立体视觉中,如果您有两个相机,那么它们的相对位置和方向会在每次移动相机时发生变化,从而导致外参的变化。

如果相机不发生位置和方向的变化,比如相机固定在一个固定位置,那么外参在很长一段时间内可能保持不变。然而,如果相机的位置或方向发生变化,例如移动相机或更改拍摄角度,外参会随之变化。

3.标定和标定板

1.标定

标定的本质是建立一个测量的标准系统。
在标定的时候,摄像机通过带有固定间距图案阵列的平板(即标定板)拍摄图像,然后经过标定算法计算,得出拍摄图像的几何模型,进而得到高精度的测量和重建结果,最后通过相关算法校正镜头畸变,从而提高机器视觉应用中图像测量、摄影测量的精度。
通过像机标定我们可以知道些什么?

  1. 外参数矩阵。告诉你现实世界点(世界坐标)是怎样经过旋转和平移,然后落到另一个现实世界点(摄像机坐标)上。
  2. 内参数矩阵。告诉你上述那个点在1的基础上,是如何继续经过摄像机的镜头、并通过针孔成像和电子转化而成为像素点的。
  3. 畸变矩阵。告诉你为什么上面那个像素点并没有落在理论计算该落在的位置上,还产生了一定的偏移和变形。

上述3点的每一个转换,都有已经有成熟的数学描述,通过计算我们完全可以精确地重现现实世界的任意一个点到其数字图像只上对应像素点的投影过程。

2.标定板

标定板就是带有固定间距图案阵列的平板。

4.腐蚀和膨胀

1.膨胀

膨胀主要用于扩大区域像素,使边缘像素连接在一起。

2.腐蚀

腐蚀主要用于减小区域像素,使边缘像素断开。

5.拟合

用一个参数模型来表示特征,说的直白点就是把平面上一系列的点,用一条光滑的曲线连接起来。简单的特征描述就是线性边缘可以使用线性模型表示,圆形等等,复杂一些的比如车辆的完成轮廓。

6.亚像素

例如两个感官原件上的像素之间有4.5um的间距,宏观上它们是连在一起的,微观上它们之间还有无数微小的东西存在,这些存在于两个实际物理像素之间的像素,就被称为“亚像素”。亚像素实际上应该是存在的,只是缺少更小的传感器将其检测出来而已,因此只能在软件上将其近似计算出来。

亚像素可以表示为如下图所示,每四个红色点围成的矩形区域为实际原件上的像素点,黑色点为亚像素点:
在这里插入图片描述

7.Halcon中基于形状的模板匹配过程

Halcon中一个完整的模板匹配过程如下:

  • 读取并显示图像;
  • 确定模板ROI及检测ROI;
  • 创建模型;
  • 匹配模板;
  • ROI仿射变换,得到ROI位置。

8.九点标定(手眼标定)

九点标定是手眼标定的一种,用于找到图像坐标系和物理坐标系的转化关系。
操作步骤为: 在物体上打9个点(12或16个点也可以),然后拍照,此时会拿到该图像坐标系中的其中9个点的坐标,把机械手分别移动到移动到这9个点的上方,每个点上拍一张图片,记录轴平台实际图像上的9个点坐标。到此,得到了2个组标记集合,图像坐标集合和其对应的轴平台坐标集合共18个坐标点,带入标定算法即可拿到坐标系的对应关系。此后每次移动机器人的时候将坐标关系方程带入坐标即可控制机械手走到准确位置。

9.单相机标定(内外参标定)

内外参(单相机)标定相机本身的,需要用到标定板。在相机出厂后,在车间安装完可能会产生一些形变,通过内外参标定来解决此问题。

内参数用于相机拍照时候填写,然后用于拿到标准的图片。
外参用于在测量物体距离时候用到,外参拿到的是每个像素对应的实际物理坐标位置,比如每个像素对应的mm数值,然后在测量物体距离的时候会用到。

1.大致操作步骤

  1. 准备标定板:
  • 常用棋盘格标定板
  • 确定标定板的尺寸(如9x6格)
  • 确定每个格子的实际物理尺寸(如25mm)
  1. 采集标定图像:
public class CameraCalibration
{
    private List<Mat> calibrationImages = new List<Mat>();
    
    public void CaptureImage(Mat frame)
    {
        // 保存不同角度的标定板图像
        calibrationImages.Add(frame.Clone());
    }
}
  1. 角点检测:
public class CornerDetection
{
    private Size patternSize = new Size(9, 6); // 标定板内角点数
    private List<VectorOfPointF> imagePoints = new List<VectorOfPointF>();
    
    public bool DetectChessboardCorners(Mat image)
    {
        VectorOfPointF corners = new VectorOfPointF();
        bool found = CvInvoke.FindChessboardCorners(
            image, 
            patternSize, 
            corners,
            CalibCbType.AdaptiveThresh | CalibCbType.NormalizeImage
        );
        
        if (found)
        {
            // 亚像素角点检测
            Mat grayImage = new Mat();
            CvInvoke.CvtColor(image, grayImage, ColorConversion.Bgr2Gray);
            CvInvoke.CornerSubPix(
                grayImage,
                corners,
                new Size(11, 11),
                new Size(-1, -1),
                new MCvTermCriteria(30, 0.1)
            );
            
            imagePoints.Add(corners);
        }
        
        return found;
    }
}
  1. 计算标定板三维坐标:
public class CalibrationPoints
{
    private Size patternSize = new Size(9, 6);
    private float squareSize = 25.0f; // 每个格子的实际尺寸(mm)
    
    public VectorOfPoint3D32F CalculateObjectPoints()
    {
        VectorOfPoint3D32F objectPoints = new VectorOfPoint3D32F();
        List<MCvPoint3D32f> points = new List<MCvPoint3D32f>();
        
        for (int i = 0; i < patternSize.Height; i++)
        {
            for (int j = 0; j < patternSize.Width; j++)
            {
                points.Add(new MCvPoint3D32f(
                    j * squareSize,
                    i * squareSize,
                    0.0f
                ));
            }
        }
        
        objectPoints.Push(points.ToArray());
        return objectPoints;
    }
}

5.相机标定

public class CameraCalibrator
{
    private Mat cameraMatrix = new Mat();
    private Mat distCoeffs = new Mat();
    
    public void Calibrate(
        List<VectorOfPoint3D32F> objectPoints,
        List<VectorOfPointF> imagePoints,
        Size imageSize)
    {
        VectorOfMat rotationVectors = new VectorOfMat();
        VectorOfMat translationVectors = new VectorOfMat();
        
        double error = CvInvoke.CalibrateCamera(
            objectPoints,
            imagePoints,
            imageSize,
            cameraMatrix,
            distCoeffs,
            rotationVectors,
            translationVectors,
            CalibType.Default,
            new MCvTermCriteria(30, 1e-6)
        );
    }
    
    public void SaveCalibrationResults(string filename)
    {
        // 保存标定结果
        using (FileStorage fs = new FileStorage(filename, FileStorage.Mode.Write))
        {
            fs.Write(cameraMatrix, "camera_matrix");
            fs.Write(distCoeffs, "distortion_coefficients");
        }
    }
}

6.图像校正

public class ImageCorrection
{
    private Mat cameraMatrix;
    private Mat distCoeffs;
    
    public Mat UndistortImage(Mat distortedImage)
    {
        Mat undistortedImage = new Mat();
        CvInvoke.Undistort(
            distortedImage,
            undistortedImage,
            cameraMatrix,
            distCoeffs
        );
        return undistortedImage;
    }
}

2.标定步骤总结

  1. 准备工作
  • 准备标定板
  • 设置相机参数
  • 引入必要的库
  1. 图像采集
  • 采集15-20张不同角度的标定板图像
  • 确保图像清晰、无模糊
  1. 角点检测
  • 对每张图像进行角点检测
  • 进行亚像素级别的角点优化
  1. 计算三维坐标
  • 建立世界坐标系
  • 计算标定板角点的三维坐标
  1. 相机标定
  • 计算相机内参矩阵
  • 计算畸变系数
  • 计算重投影误差
  1. 结果验证与应用
  • 保存标定结果
  • 进行图像校正
  • 验证标定效果

3.注意事项

  1. 采集图像时应该:
  • 保持标定板平整
  • 使用不同的角度和位置
  • 避免运动模糊
  1. 标定精度依赖于:
  • 标定图像的数量和质量
  • 角点检测的准确性
  • 标定板的制作精度
  1. 实际应用中:
  • 定期进行标定
  • 保存标定参数
  • 监控标定效果

10.hsv颜色模型

在Halcon中,HSV颜色识别是一种常用的图像处理技术,它利用HSV色彩模型中的色相(Hue)、饱和度(Saturation)和亮度(Value)三个分量来识别和分割图像中的特定颜色区域。

HSV色彩模型是一种基于人类视觉感知的颜色表示方式,它将颜色分为色相(Hue)、饱和度(Saturation)和亮度(Value)三个分量。色相代表颜色的种类,如红色、黄色或蓝色等;饱和度表示颜色的鲜艳程度,饱和度越高颜色越鲜艳;亮度表示颜色的明暗程度,亮度越高颜色越明亮。

相关文章:

  • pandas(13 Caveats Gotchas和SQL比较)
  • 【Three.js】JS 3D library(一个月进化史)
  • 1-14 Merge与rebase操作
  • Swift CChar元祖转String
  • 12-罗马数字转整数
  • DeepSeek R1 与 OpenAI O1:机器学习模型的巅峰对决
  • python(1)-元组和集合
  • linux-centos nginx 添加stream模块
  • Map和Set
  • FunPapers[2]:www‘24 「快手」连续特征单调性建模
  • 【RocketMQ 存储】消息重放服务-ReputMessageService
  • Java与DeepSeek的完美结合:开启高效智能编程新时代 [特殊字符]
  • JavaSE:数组
  • Pygame中自定义事件处理的方法2-2
  • Linux-文件IO
  • 蓝桥杯篇---8位 ADC/DAC转换芯片 PCF8591
  • AtCoder Beginner Contest 393 —— E - GCD of Subset 补题 + 题解 python
  • 2025-02-16 学习记录--C/C++-PTA 7-21 求特殊方程的正整数解
  • 【css】超过文本显示省略号
  • nodejs:express + js-mdict 网页查询英汉词典,能显示图片
  • 上海市第二十届青少年科技节启动:为期半年,推出百余项活动
  • 清雪车司机未拉手刹下车导致溜车被撞亡,事故调查报告发布
  • 布局50多个国家和地区,我国科技型企业孵化器数量全球第一
  • 南方降水频繁暴雨连连,北方高温再起或现40°C酷热天气
  • 为何选择上海?两家外企提到营商环境、人才资源……
  • 七部门:进一步增强资本市场对于科技创新企业的支持力度