OpenCV构建交互式图像距离测量工具

这篇具有很好参考价值的文章主要介绍了OpenCV构建交互式图像距离测量工具。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在计算机视觉和图形学应用中,准确测量图像上的点之间距离是一项常见且重要的任务。本篇技术博客将详细介绍如何利用Python编程语言和OpenCV库构建一个交互式的图像距离测量工具。我们将通过编写一个名为ImageProcessor的类,让用户能够在图像上点击选取点,并实时显示两点间的实际距离(以毫米为单位)。下面让我们一起深入探讨代码实现及其核心功能。

一、代码结构概览

首先,我们来看看整个程序的主要组成部分:

import cv2
import numpy as np


class ImageProcessor:
    def __init__(self, image_path, pixel_to_mm=0.3):
        self.image_path = image_path
        self.pixel_to_mm = pixel_to_mm
        self.image = None
        self.points = []
        self.distances = []
        self.load_image()

    def load_image(self):
        try:
            self.image = cv2.imread(self.image_path)
        except FileNotFoundError:
            print("Image file not found.")
            exit()

    def calculate_distance(self, point1, point2):
        pixel_distance = np.sqrt((point2[0] - point1[0]) ** 2 + (point2[1] - point1[1]) ** 2)
        actual_distance = pixel_distance * self.pixel_to_mm
        return pixel_distance, actual_distance

    def draw_on_image(self):
        img_copy = self.image.copy()
        for i in range(len(self.points)):
            cv2.circle(img_copy, self.points[i], 3, (0, 0, 255), -1)  # Display Point
            if i % 2 == 1:
                cv2.line(img_copy, self.points[i - 1], self.points[i], (255, 0, 0), 2)  # Draw line between points

                pixel_distance, actual_distance = self.calculate_distance(self.points[i - 1], self.points[i])
                self.distances.append(actual_distance)
                text = "AD: {:.2f} mm".format(actual_distance)
                cv2.putText(img_copy, text, (
                (self.points[i - 1][0] + self.points[i][0]) // 2, (self.points[i - 1][1] + self.points[i][1]) // 2),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

        return img_copy

    def mouse_event(self, event, x, y, flags, param):
        if event == cv2.EVENT_LBUTTONDOWN:
            self.points.append((x, y))

    def process(self):
        cv2.namedWindow('Image')
        cv2.setMouseCallback('Image', self.mouse_event)

        while True:
            img_copy = self.draw_on_image()

            cv2.imshow('Image', img_copy)
            key = cv2.waitKey(1) & 0xFF
            if key == 27:  # Press 'Esc' to exit
                break

        cv2.destroyAllWindows()


if __name__ == "__main__":
    processor = ImageProcessor('mask/img.png', pixel_to_mm=0.3)
    processor.process()

该程序主要由以下几部分组成:

  1. 标题引入必要的库:cv2(OpenCV库)用于图像处理和显示,numpy(NumPy库)用于数值计算。

  2. 定义ImageProcessor类:封装图像加载、点选、距离计算、结果显示等逻辑。

  3. 主程序入口:创建ImageProcessor实例,传入图像路径和像素与毫米的比例,默认为0.3,然后调用process方法启动交互过程。
    接下来,我们将逐一解析ImageProcessor类中的关键方法。

二、ImageProcessor类详解

  1. __init__方法
def __init__(self, image_path, pixel_to_mm=0.3):
    self.image_path = image_path
    self.pixel_to_mm = pixel_to_mm
    self.image = None
    self.points = []
    self.distances = []
    self.load_image()

__init__方法是类的构造器,负责初始化对象属性。这里定义了以下几个属性:
image_path: 存储待处理图像的路径。
pixel_to_mm: 像素与毫米之间的比例,默认值为0.3,表示每个像素代表0.3毫米。
image: 用于存放加载的图像数据。
points: 存储用户点击的点坐标,按点击顺序排列。
distances: 存储已计算的实际距离值。
最后,load_image方法被调用,用于加载指定路径下的图像

  1. load_image方法
def load_image(self):
   try:
       self.image = cv2.imread(self.image_path)
   except FileNotFoundError:
       print("Image file not found.")
       exit()

load_image方法负责从指定路径加载图像。它使用cv2.imread函数尝试读取图像,如果文件不存在,则捕获FileNotFoundError异常,打印错误消息并退出程序,确保程序在遇到无效文件时能优雅终止。

  1. calculate_distance方法
def calculate_distance(self, point1, point2):
    pixel_distance = np.sqrt((point2[0] - point1[0]) ** 2 + (point2[1] - point1[1]) ** 2)
    actual_distance = pixel_distance * self.pixel_to_mm
    return pixel_distance, actual_distance

calculate_distance方法接收两个点坐标作为参数,计算它们之间的像素距离(欧氏距离)并转换为实际距离(毫米)。结果以元组形式返回,包含像素距离和实际距离。

  1. draw_on_image方法
def draw_on_image(self):
    img_copy = self.image.copy()
    for i in range(len(self.points)):
        cv2.circle(img_copy, self.points[i], 3, (0, 0, 255), -1)  # Display Point
        if i % 2 == 1:
            cv2.line(img_copy, self.points[i - 1], self.points[i], (255, 0, 0), 2)  # Draw line between points

            pixel_distance, actual_distance = self.calculate_distance(self.points[i - 1], self.points[i])
            self.distances.append(actual_distance)
            text = "AD: {:.2f} mm".format(actual_distance)
            cv2.putText(img_copy, text, (
            (self.points[i - 1][0] + self.points[i][0]) // 2, (self.points[i - 1][1] + self.points[i][1]) // 2),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    return img_copy

draw_on_image方法负责在图像副本上绘制用户选择的点、连线及距离文字。具体步骤如下:

  • 创建图像副本,防止直接修改原始图像。
  • 遍历points列表,绘制每个点为红色圆圈。
  • 当索引i为奇数时,表示当前点与前一个点构成一对,于是:
    绘制连接这两个点的线。
    调用calculate_distance计算它们之间的实际距离,并将结果添加到distances列表。
    在两点之间合适的位置绘制包含实际距离的文字。
    最后返回处理过的图像副本。
  1. mouse_event
def mouse_event(self, event, x, y, flags, param):
    if event == cv2.EVENT_LBUTTONDOWN:
        self.points.append((x, y))

mouse_event方法作为鼠标回调函数,响应用户的鼠标操作。当用户按下左键(cv2.EVENT_LBUTTONDOWN)时,将当前鼠标位置((x, y))添加到points列表中。文章来源地址https://www.toymoban.com/news/detail-850869.html

到了这里,关于OpenCV构建交互式图像距离测量工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV中的图像处理 —— 霍夫线 / 圈变换 + 图像分割(分水岭算法) + 交互式前景提取(GrabCut算法)

    🌎上一节我们介绍了OpenCV中傅里叶变换和模板匹配,这一部分我们来聊一聊霍夫线/圈变换的原理和应用、使用分水岭算法实现图像分割和使用GrabCut算法实现交互式前景提取 🏠哈喽大家好,这里是ErrorError!,一枚某高校大二本科在读的♂同学,希望未来在机器视觉领域能够有

    2023年04月08日
    浏览(49)
  • 【OpenCV-Python】——单/多模板匹配&分水岭算法图像分割&图像金字塔&交互式前景提取

    目录 前言: 1、模板匹配 1.1 单目标匹配 1.2 多目标匹配 2、图像分割

    2024年02月07日
    浏览(52)
  • MATLAB 之 隐函数绘图、图形修饰处理、图像处理与动画制作和交互式绘图工具

    如果给定了函数的显式表达式,可以先设置自变量向量,然后根据表达式计算出函数向量,从而用 plot 、 plot3 等函数绘制出图形。 但如果函数用隐函数形式给出,则很难用上述方法绘制出图形。对此,MATLAB 提供了一些函数用来绘制隐函数图形。 隐函数二维绘图采用 ezplot 函数

    2024年02月07日
    浏览(46)
  • 构建一个动态交互式图表

    在Web开发中,JavaScript不仅是实现交互效果的关键,还可以用于构建复杂的可视化组件,如动态交互式图表。在本篇博客中,我将演示如何使用JavaScript和HTML5的Canvas元素来创建一个简单的动态条形图。 HTML结构  首先,我们需要一个HTML结构来容纳我们的图表。 JavaScript实现 接下

    2024年02月20日
    浏览(55)
  • Android2:构建交互式应用

    一。创建项目 项目名 Beer Adviser 二。更新布局 activity_main.xml 三。增加资源 strings.xml 四。响应点击 MainActivity.kt 知识点:

    2024年02月12日
    浏览(59)
  • 使用 htmx 构建交互式 Web 应用

    学习目标:了解htmx的基本概念、特点和用法,并能够运用htmx来创建交互式的Web应用程序。 学习内容: 1. 什么是htmx?    - htmx是一种用于构建交互式Web应用程序的JavaScript库。    - 它通过将HTML扩展为一种声明性的交互式语言,使得开发人员可以使用简单的HTML标记来实现动态

    2024年02月10日
    浏览(54)
  • 使用Gradio Interface构建交互式机器学习演示

    ❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博相关......)👈 博主原文链接:https://www.yourmetaverse.cn/nlp/231/ (封面图由文心一格生成) 在

    2024年02月09日
    浏览(86)
  • HTML5:构建现代、交互式的Web应用

    HTML5作为最新版本的HTML标准,引入了许多令人兴奋的特性和改进,使Web开发更加灵活和强大。本篇博客将围绕HTML5的核心功能展开,包括语义化标签、多媒体支持、表单增强、Canvas绘图、地理定位、本地存储等方面。我们将通过详细的代码示例和实用的技巧,帮助你全面掌握

    2024年02月12日
    浏览(46)
  • 【元宇宙欧米说】打造艺术与技术构建的交互式数字旅程

    Web3 to Earn项目如何扩大应用 功能和场景 ?在Web3时代怎么才能以更 新颖 、 有趣 的方式追赶潮流?各Web3领域项目及应用如何进行功能外延以 满足用户需求 ? 11月17日晚上九点,ZenCats项目管理员Fred将以“ 打造艺术与技术构建的交互式数字旅程 ”为题,与大家共同探讨艺术和

    2024年01月20日
    浏览(45)
  • 使用 OpenCV 和 GrabCut 算法进行交互式背景去除

            我想,任何人都可以尝试从图像中删除背景。当然,有大量可用的软件或工具能够做到这一点,但其中一些可能很昂贵。但是,我知道有人使用窗口绘画3D魔术选择或PowerPoint背景去除来删除背景。         如果您是计算机视觉领域的初学者,这可能适合您。让

    2024年02月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包