国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

OpenCV構(gòu)建交互式圖像距離測量工具

這篇具有很好參考價值的文章主要介紹了OpenCV構(gòu)建交互式圖像距離測量工具。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

在計算機視覺和圖形學(xué)應(yīng)用中,準確測量圖像上的點之間距離是一項常見且重要的任務(wù)。本篇技術(shù)博客將詳細介紹如何利用Python編程語言和OpenCV庫構(gòu)建一個交互式的圖像距離測量工具。我們將通過編寫一個名為ImageProcessor的類,讓用戶能夠在圖像上點擊選取點,并實時顯示兩點間的實際距離(以毫米為單位)。下面讓我們一起深入探討代碼實現(xiàn)及其核心功能。

一、代碼結(jié)構(gòu)概覽

首先,我們來看看整個程序的主要組成部分:

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庫)用于數(shù)值計算。

  2. 定義ImageProcessor類:封裝圖像加載、點選、距離計算、結(jié)果顯示等邏輯。

  3. 主程序入口:創(chuàng)建ImageProcessor實例,傳入圖像路徑和像素與毫米的比例,默認為0.3,然后調(diào)用process方法啟動交互過程。
    接下來,我們將逐一解析ImageProcessor類中的關(guān)鍵方法。

二、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__方法是類的構(gòu)造器,負責(zé)初始化對象屬性。這里定義了以下幾個屬性:
image_path: 存儲待處理圖像的路徑。
pixel_to_mm: 像素與毫米之間的比例,默認值為0.3,表示每個像素代表0.3毫米。
image: 用于存放加載的圖像數(shù)據(jù)。
points: 存儲用戶點擊的點坐標,按點擊順序排列。
distances: 存儲已計算的實際距離值。
最后,load_image方法被調(diào)用,用于加載指定路徑下的圖像

  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方法負責(zé)從指定路徑加載圖像。它使用cv2.imread函數(shù)嘗試讀取圖像,如果文件不存在,則捕獲FileNotFoundError異常,打印錯誤消息并退出程序,確保程序在遇到無效文件時能優(yōu)雅終止。

  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方法接收兩個點坐標作為參數(shù),計算它們之間的像素距離(歐氏距離)并轉(zhuǎn)換為實際距離(毫米)。結(jié)果以元組形式返回,包含像素距離和實際距離。

  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方法負責(zé)在圖像副本上繪制用戶選擇的點、連線及距離文字。具體步驟如下:

  • 創(chuàng)建圖像副本,防止直接修改原始圖像。
  • 遍歷points列表,繪制每個點為紅色圓圈。
  • 當(dāng)索引i為奇數(shù)時,表示當(dāng)前點與前一個點構(gòu)成一對,于是:
    繪制連接這兩個點的線。
    調(diào)用calculate_distance計算它們之間的實際距離,并將結(jié)果添加到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方法作為鼠標回調(diào)函數(shù),響應(yīng)用戶的鼠標操作。當(dāng)用戶按下左鍵(cv2.EVENT_LBUTTONDOWN)時,將當(dāng)前鼠標位置((x, y))添加到points列表中。文章來源地址http://www.zghlxwxcb.cn/news/detail-850869.html

到了這里,關(guān)于OpenCV構(gòu)建交互式圖像距離測量工具的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • OpenCV中的圖像處理 —— 霍夫線 / 圈變換 + 圖像分割(分水嶺算法) + 交互式前景提?。℅rabCut算法)

    OpenCV中的圖像處理 —— 霍夫線 / 圈變換 + 圖像分割(分水嶺算法) + 交互式前景提?。℅rabCut算法)

    ??上一節(jié)我們介紹了OpenCV中傅里葉變換和模板匹配,這一部分我們來聊一聊霍夫線/圈變換的原理和應(yīng)用、使用分水嶺算法實現(xiàn)圖像分割和使用GrabCut算法實現(xiàn)交互式前景提取 ??哈嘍大家好,這里是ErrorError!,一枚某高校大二本科在讀的♂同學(xué),希望未來在機器視覺領(lǐng)域能夠有

    2023年04月08日
    瀏覽(31)
  • 【OpenCV-Python】——單/多模板匹配&分水嶺算法圖像分割&圖像金字塔&交互式前景提取

    目錄 前言: 1、模板匹配 1.1 單目標匹配 1.2 多目標匹配 2、圖像分割

    2024年02月07日
    瀏覽(40)
  • MATLAB 之 隱函數(shù)繪圖、圖形修飾處理、圖像處理與動畫制作和交互式繪圖工具

    MATLAB 之 隱函數(shù)繪圖、圖形修飾處理、圖像處理與動畫制作和交互式繪圖工具

    如果給定了函數(shù)的顯式表達式,可以先設(shè)置自變量向量,然后根據(jù)表達式計算出函數(shù)向量,從而用 plot 、 plot3 等函數(shù)繪制出圖形。 但如果函數(shù)用隱函數(shù)形式給出,則很難用上述方法繪制出圖形。對此,MATLAB 提供了一些函數(shù)用來繪制隱函數(shù)圖形。 隱函數(shù)二維繪圖采用 ezplot 函數(shù)

    2024年02月07日
    瀏覽(26)
  • 構(gòu)建一個動態(tài)交互式圖表

    在Web開發(fā)中,JavaScript不僅是實現(xiàn)交互效果的關(guān)鍵,還可以用于構(gòu)建復(fù)雜的可視化組件,如動態(tài)交互式圖表。在本篇博客中,我將演示如何使用JavaScript和HTML5的Canvas元素來創(chuàng)建一個簡單的動態(tài)條形圖。 HTML結(jié)構(gòu) ?首先,我們需要一個HTML結(jié)構(gòu)來容納我們的圖表。 JavaScript實現(xiàn) 接下

    2024年02月20日
    瀏覽(32)
  • Android2:構(gòu)建交互式應(yīng)用

    Android2:構(gòu)建交互式應(yīng)用

    一。創(chuàng)建項目 項目名 Beer Adviser 二。更新布局 activity_main.xml 三。增加資源 strings.xml 四。響應(yīng)點擊 MainActivity.kt 知識點:

    2024年02月12日
    瀏覽(24)
  • 使用 htmx 構(gòu)建交互式 Web 應(yīng)用

    學(xué)習(xí)目標:了解htmx的基本概念、特點和用法,并能夠運用htmx來創(chuàng)建交互式的Web應(yīng)用程序。 學(xué)習(xí)內(nèi)容: 1. 什么是htmx? ? ?- htmx是一種用于構(gòu)建交互式Web應(yīng)用程序的JavaScript庫。 ? ?- 它通過將HTML擴展為一種聲明性的交互式語言,使得開發(fā)人員可以使用簡單的HTML標記來實現(xiàn)動態(tài)

    2024年02月10日
    瀏覽(17)
  • 使用Gradio Interface構(gòu)建交互式機器學(xué)習(xí)演示

    使用Gradio Interface構(gòu)建交互式機器學(xué)習(xí)演示

    ??覺得內(nèi)容不錯的話,歡迎點贊收藏加關(guān)注??????,后續(xù)會繼續(xù)輸入更多優(yōu)質(zhì)內(nèi)容?? ??有問題歡迎大家加關(guān)注私戳或者評論(包括但不限于NLP算法相關(guān),linux學(xué)習(xí)相關(guān),讀研讀博相關(guān)......)?? 博主原文鏈接:https://www.yourmetaverse.cn/nlp/231/ (封面圖由文心一格生成) 在

    2024年02月09日
    瀏覽(103)
  • HTML5:構(gòu)建現(xiàn)代、交互式的Web應(yīng)用

    HTML5作為最新版本的HTML標準,引入了許多令人興奮的特性和改進,使Web開發(fā)更加靈活和強大。本篇博客將圍繞HTML5的核心功能展開,包括語義化標簽、多媒體支持、表單增強、Canvas繪圖、地理定位、本地存儲等方面。我們將通過詳細的代碼示例和實用的技巧,幫助你全面掌握

    2024年02月12日
    瀏覽(16)
  • 【元宇宙歐米說】打造藝術(shù)與技術(shù)構(gòu)建的交互式數(shù)字旅程

    【元宇宙歐米說】打造藝術(shù)與技術(shù)構(gòu)建的交互式數(shù)字旅程

    Web3 to Earn項目如何擴大應(yīng)用 功能和場景 ?在Web3時代怎么才能以更 新穎 、 有趣 的方式追趕潮流?各Web3領(lǐng)域項目及應(yīng)用如何進行功能外延以 滿足用戶需求 ? 11月17日晚上九點,ZenCats項目管理員Fred將以“ 打造藝術(shù)與技術(shù)構(gòu)建的交互式數(shù)字旅程 ”為題,與大家共同探討藝術(shù)和

    2024年01月20日
    瀏覽(20)
  • 使用 OpenCV 和 GrabCut 算法進行交互式背景去除

    ????????我想,任何人都可以嘗試從圖像中刪除背景。當(dāng)然,有大量可用的軟件或工具能夠做到這一點,但其中一些可能很昂貴。但是,我知道有人使用窗口繪畫3D魔術(shù)選擇或PowerPoint背景去除來刪除背景。 ????????如果您是計算機視覺領(lǐng)域的初學(xué)者,這可能適合您。讓

    2024年02月15日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包