我有以上3幅图片,我想计算它激光线移动的距离。其中的黑色圆形是知道尺寸的r=15mm,图1与图2之间只有很小的位移,并且其实我有一个文件夹的图片记录了它从图1到图3的所有图片。 我应该怎么把每个图片之间的距离计算出来?
关于图像处理与机器视觉的图像问题
我有以上3幅图片,我想计算它激光线移动的距离。其中的黑色圆形是知道尺寸的r=15mm,图1与图2之间只有很小的位移,并且其实我有一个文件夹的图片记录了它从图1到图3的所有图片。 我应该怎么把每个图片之间的距离计算出来?
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
4条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
要计算激光线在这些图片中的移动距离,我们可以使用图像处理技术来识别圆圈的位置,然后计算圆心位置的变化。这里是一个基本的步骤指南,以及Python代码示例,我们将使用OpenCV库来进行图像处理。
首先,请确保安装了所需的库:
pip install opencv-python pip install numpy
接下来,按照以下步骤操作:
- 读取图片并转换为灰度图像。
- 使用Canny边缘检测找到轮廓。
- 对轮廓进行筛选,找出最接近已知直径(例如15mm)的圆。
- 计算圆心位置。
- 比较连续图片中圆心位置的变化,得到每次移动的距离。
以下是实现上述步骤的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)
这段代码会读取指定文件夹中的图片,并计算出圆心位置。然后,根据连续帧中圆心的变化,计算出激光线移动的距离。请注意,这个方法依赖于图片质量和边缘检测的效果,可能需要对参数进行调整以适应不同的场景。此外,对于更复杂的图像,可能需要额外的预处理步骤,如二值化、膨胀/腐蚀等,以提高边缘检测的准确性。
解决 无用评论 打赏 举报 编辑记录
悬赏问题
- ¥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 设计一个温度闭环控制系统