Fallen_406 2024-05-24 20:29 采纳率: 0%
浏览 0

关于图像处理与机器视觉的图像问题

img

img

img


我有以上3幅图片,我想计算它激光线移动的距离。其中的黑色圆形是知道尺寸的r=15mm,图1与图2之间只有很小的位移,并且其实我有一个文件夹的图片记录了它从图1到图3的所有图片。 我应该怎么把每个图片之间的距离计算出来?

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-24 20:29
    关注

    引自免费微信小程序:皆我百晓生

    要计算激光线在这些图片中的移动距离,我们可以使用图像处理技术来识别圆圈的位置,然后计算圆心位置的变化。这里是一个基本的步骤指南,以及Python代码示例,我们将使用OpenCV库来进行图像处理。

    首先,请确保安装了所需的库:

    pip install opencv-python
    pip install numpy
    

    接下来,按照以下步骤操作:

    1. 读取图片并转换为灰度图像。
    2. 使用Canny边缘检测找到轮廓。
    3. 对轮廓进行筛选,找出最接近已知直径(例如15mm)的圆。
    4. 计算圆心位置。
    5. 比较连续图片中圆心位置的变化,得到每次移动的距离。

    以下是实现上述步骤的Python代码:

    import cv2
    import numpy as np
    
    def find_circle(img, r):
        # Step 1: Convert to grayscale and Gaussian blur
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        gray = cv2.GaussianBlur(gray, (5, 5), 0)
    
        # Step 2: Canny edge detection
        edges = cv2.Canny(gray, 30, 150)
    
        # Step 3: Find contours and filter for circles
        contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
        circle_candidates = []
        for contour in contours:
            area = cv2.contourArea(contour)
            perimeter = cv2.arcLength(contour, True)
            approx = cv2.approxPolyDP(contour, 0.02 * perimeter, True)
            if len(approx) >= 8 and area > 1000 and area < 50000 and abs(perimeter - 2 * np.pi * r) <= 100:
                circle_candidates.append((approx, perimeter))
    
        # Choose the best circle candidate
        if circle_candidates:
            min_diff = float('inf')
            best_circle = None
            for circle in circle_candidates:
                diff = abs(circle[1] - 2 * np.pi * r)
                if diff < min_diff:
                    min_diff = diff
                    best_circle = circle
            return best_circle
        else:
            return None
    
    def get_circle_center(circle_contour):
        moments = cv2.moments(circle_contour)
        if moments["m00"] != 0:
            cx = int(moments["m10"] / moments["m00"])
            cy = int(moments["m01"] / moments["m00"])
            return cx, cy
        else:
            return None
    
    def calculate_distance(circle_centers):
        distances = []
        for i in range(1, len(circle_centers)):
            dx = circle_centers[i][0] - circle_centers[i-1][0]
            dy = circle_centers[i][1] - circle_centers[i-1][1]
            distance = np.sqrt(dx**2 + dy**2)
            distances.append(distance)
        return distances
    
    # Load images from a folder
    image_folder = "path/to/your/image/folder"
    images = [cv2.imread(f"{image_folder}/{i}.jpg") for i in range(1, 4)]
    
    circle_centers = []
    for img in images:
        circle = find_circle(img, 15)
        if circle is not None:
            center = get_circle_center(circle[0])
            if center is not None:
                circle_centers.append(center)
    
    distances = calculate_distance(circle_centers)
    
    print("Circle centers:", circle_centers)
    print("Distances between consecutive frames:", distances)
    

    这段代码会读取指定文件夹中的图片,并计算出圆心位置。然后,根据连续帧中圆心的变化,计算出激光线移动的距离。请注意,这个方法依赖于图片质量和边缘检测的效果,可能需要对参数进行调整以适应不同的场景。此外,对于更复杂的图像,可能需要额外的预处理步骤,如二值化、膨胀/腐蚀等,以提高边缘检测的准确性。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月24日

悬赏问题

  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多
  • ¥15 设计一个温度闭环控制系统