几何尺寸与公差论坛

 找回密码
 注册
查看: 492|回复: 5

大视野FA镜头做手眼标定,计算出的抓取位置总是会偏离产品中心

  [复制链接]
发表于 2023-7-5 16:58:26 | 显示全部楼层 |阅读模式
大视野FA镜头做手眼标定,标定之后,远离镜头视野中心的产品,计算出的抓取位置总是会偏离产品中心,基本上是产品在图像左上方,抓取点就偏离产品中心左上方,已经做过相机校准了,还是有这种问题,感觉是不是fa镜头都有这种情况啊
 楼主| 发表于 2023-7-5 16:59:01 | 显示全部楼层
这个,是由于FA镜头畸变导致的,解决方式要么就做畸变矫正,要么就换更大焦距的镜头。
 楼主| 发表于 2023-7-5 17:02:17 | 显示全部楼层
大视野FA镜头在进行手眼标定时,可能会出现远离镜头视野中心的产品计算出的抓取位置偏离产品中心的情况。这可能是由于镜头的畸变、透视变换等因素导致的。

首先,确保相机校准已经正确完成。相机校准可以帮助消除镜头的畸变,提高图像的准确性。如果已经进行了相机校准,但问题仍然存在,可以尝试重新进行校准,确保参数设置正确。

其次,考虑使用更高精度的标定板进行手眼标定。标定板的质量和精度会直接影响标定结果的准确性。选择一个高质量的标定板,并确保标定板的特征点清晰可见,可以提高标定的准确性。

此外,还可以尝试调整镜头的焦距和视角,以获得更好的图像质量和准确性。不同的镜头可能会有不同的特性和性能,因此可能需要根据具体情况进行调整。

最后,如果问题仍然存在,可以考虑咨询镜头厂商或专业的视觉系统集成商,以获取更专业的技术支持和解决方案。他们可能会根据具体情况提供更具体的建议和解决方案。"
 楼主| 发表于 2023-7-5 17:06:51 | 显示全部楼层
要进行畸变矫正,首先需要获取相机的畸变参数。一般来说,相机的畸变参数可以通过相机标定得到。相机标定是通过拍摄一组已知的特征点图像,并通过计算得到相机的内参和畸变参数。

以下是一个使用OpenCV库进行相机标定的示例代码:

csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;

namespace CameraCalibration
{
    class Program
    {
        static void Main(string[] args)
        {
            // 设置标定板的尺寸
            Size boardSize = new Size(9, 6);

            // 创建标定板上角点的三维坐标
            List<Point3f> objectPoints = new List<Point3f>();
            for (int i = 0; i < boardSize.Height; i++)
            {
                for (int j = 0; j < boardSize.Width; j++)
                {
                    objectPoints.Add(new Point3f(j, i, 0));
                }
            }

            // 读取标定图像
            List<Mat> calibrationImages = new List<Mat>();
            for (int i = 1; i <= 20; i++)
            {
                string imagePath = $"calibration_images/{i}.jpg";
                Mat image = Cv2.ImRead(imagePath, ImreadModes.Color);
                calibrationImages.Add(image);
            }

            // 检测角点
            List<List<Point2f>> imagePoints = new List<List<Point2f>>();
            foreach (var image in calibrationImages)
            {
                Mat gray = new Mat();
                Cv2.CvtColor(image, gray, ColorConversionCodes.BGR2GRAY);

                List<Point2f> corners = new List<Point2f>();
                bool found = Cv2.FindChessboardCorners(gray, boardSize, corners);

                if (found)
                {
                    Cv2.CornerSubPix(gray, corners, new Size(11, 11), new Size(-1, -1), new TermCriteria(CriteriaType.Eps | CriteriaType.MaxIter, 30, 0.1));
                    imagePoints.Add(corners);
                    Cv2.DrawChessboardCorners(image, boardSize, corners, found);
                    Cv2.ImShow("Chessboard," image);
                    Cv2.WaitKey(500);
                }
            }

            // 进行相机标定
            Mat cameraMatrix = new Mat();
            Mat distCoeffs = new Mat();
            List<Mat> rvecs = new List<Mat>();
            List<Mat> tvecs = new List<Mat>();
            Cv2.CalibrateCamera(objectPoints, imagePoints, calibrationImages[0].Size(), cameraMatrix, distCoeffs, rvecs, tvecs);

            // 保存相机参数
            cameraMatrix.Save("camera_matrix.xml");
            distCoeffs.Save("dist_coeffs.xml");

            Console.WriteLine("Camera calibration completed.");
            Console.ReadKey();
        }
    }
}
上述代码中,我们首先设置了标定板的尺寸,然后创建了标定板上角点的三维坐标。接下来,我们读取了标定图像,并使用FindChessboardCorners函数检测角点。如果检测到了角点,我们使用CornerSubPix函数对角点进行亚像素级别的精确化处理,并绘制角点在图像上的位置。然后,我们使用CalibrateCamera函数进行相机标定,得到相机的内参和畸变参数。最后,我们将相机参数保存到文件中。
 楼主| 发表于 2023-7-5 17:08:55 | 显示全部楼层
完成相机标定后,我们可以使用相机的内参和畸变参数进行畸变矫正。编写一个使用OpenCV库进行畸变矫正的示例代码
 楼主| 发表于 2023-7-5 17:09:11 | 显示全部楼层
下面是一个使用OpenCV库进行畸变矫正的示例代码:

python
import cv2
import numpy as np

# 读取相机的内参和畸变参数
camera_matrix = np.array([[fx, 0, cx],
                          [0, fy, cy],
                          [0, 0, 1]])
dist_coeffs = np.array([k1, k2, p1, p2, k3])

# 读取待校正的图像
image = cv2.imread('image.jpg')

# 进行畸变矫正
undistorted_image = cv2.undistort(image, camera_matrix, dist_coeffs)

# 显示校正前后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Undistorted Image', undistorted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中,首先读取相机的内参和畸变参数,然后使用cv2.undistort()函数对待校正的图像进行畸变矫正。最后,使用cv2.imshow()函数显示校正前后的图像,并使用cv2.waitKey()和cv2.destroyAllWindows()函数等待用户按下键盘上的任意键关闭窗口。

请注意,代码中的fx、fy、cx、cy、k1、k2、p1、p2和k3需要根据实际情况进行替换。此外,还需要将image.jpg替换为实际的待校正图像路径。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-4-29 02:21 , Processed in 0.041107 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表