主頁 > 軟體工程 > 使用opencvpython無法正確讀取模擬時鐘的第二臂

使用opencvpython無法正確讀取模擬時鐘的第二臂

2022-10-17 02:35:25 軟體工程

圖片鏈接,因為我無法上傳它> 謝謝https://github.com/HassanAdamm,我可以繼續進一步的代碼,但仍然無法使用 OpenCV 顯示正確的模擬時鐘秒針。使用 HoughLineP() 成功完成時針和分針。我無法將秒針與影像分開。以下是我的作業代碼,希望你們能幫助我!

import cv2
import math
import numpy as np
import tkinter as tk

from matplotlib import pyplot as plt
from math       import sqrt, acos, degrees


# Reading the input image and convert the original RGB to a grayscale image
kernel   = np.ones((5, 5), np.uint8)
img1     = cv2.imread('input1.jpg')
img      = cv2.imread('input1.jpg', 0)
img_gray = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)


# Appling a binary threshold to the image
ret, thresh = cv2.threshold(img_gray, 50, 255, cv2.THRESH_BINARY)


# Create mask
height, width = img.shape

mask  = np.zeros((height, width), np.uint8)
edges = cv2.Canny(thresh, 100, 200)


# Circle Detection
cimg    = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
circles = cv2.HoughCircles(img_gray, cv2.HOUGH_GRADIENT, 1.2, 100)

for i in circles[0,:]:
    i[2] = i[2]   4
    # cv2.cicle(image, center_coordinates, radius, color, thickness)
    cv2.circle(mask, (int(i[0]),int(i[1])), int(i[2]), (255,255,255), thickness = -1)


# Copy that image using that mask
masked_data = cv2.bitwise_and(img1, img1, mask = mask)


# Apply threshold
_,thresh = cv2.threshold(mask, 1, 255, cv2.THRESH_BINARY)


# Find Contour
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
x, y, w, h          = cv2.boundingRect(contours[0])


# Crop masked_data
crop = masked_data[y   30 : y   h -30, x   30 : x   w - 30]

height, width, channel = crop.shape
blur_crop     = cv2.GaussianBlur(crop, (5, 5), 0)
edges         = cv2.Canny(blur_crop, 50, 150)


# Line segments
line_image = np.copy(crop) * 0
lines      = cv2.HoughLinesP(edges, 1, np.pi/180, 15, np.array([]), 100, 10)

l = []

xl1, xl2, yl1, yl2 = 0, 0, 0, 0             #long   -> l
xm1, xm2, ym1, ym2 = 0, 0, 0, 0             #medium -> m
xs1, xs2, ys1, ys2 = 0, 0, 0, 0             #short  -> s

# Getting the values from the line
for line in lines:
    
    x1, y1, x2, y2 = line[0]
    
    dx = x2 - x1
    if (dx < 0):
        dx = dx* (-1)
        
    dy = y2 - y1
    if (dy < 0):
        dy = dy* (-1)
        
    hypo = sqrt(dx**2   dy**2)  
    l.append(hypo)

l.sort(reverse=True)

s, m, h = 0, 0, 0

for f in range(len(l)):
    for line in lines:
        # getting the values from the line
        x1, y1, x2, y2 = line[0]
        
        #cv2.line(crop, (x1, y1), (x2, y2), (0, 255, 0), 3)
        dx = x2 - x1
        if (dx < 0):
            dx = dx* (-1)
            
        dy = y2 - y1
        if (dy < 0):
            dy = dy* (-1)
        
        hypo2 = sqrt(dx**2   dy**2)

        if (hypo2 == l[0]):
            m = hypo2
            xl1 = x1
            xl2 = x2
            yl1 = y1
            yl2 = y2

            # getting line region
            cv2.line(crop, (xl1, yl1), (xl2, yl2), (255, 0, 0), 3)

        if (m == l[0]):
            if (hypo2 == l[f]):
                if ((sqrt((xl2 - x2)**2   (yl2 - y2)**2)) > 20):
                    if ((sqrt((xl1 - x1)**2   (yl1 - y1)**2)) > 20):
                        xs1 = x1
                        xs2 = x2
                        ys1 = y1
                        ys2 = y2

                        # getting line region
                        cv2.line(crop, (xl1, yl1), (xl2, yl2), (0, 255, 0), 5)
                        h = 1
                        break
                    
# Calculate center point
xcenter = width/2
ycenter = height/2


# Determine the cooridnates of the end point (farther from the center)
def coordinates (x1, y1, x2, y2):
    a = abs(xcenter - x1)
    b = abs(xcenter - x2)

    if (a > b):
        x_coor = x1
        y_coor = y1
    else:
        x_coor = x2
        y_coor = y2
        
    return x_coor, y_coor

xhour, yhour = coordinates(xs1, ys1, xs2, ys2)
xmin, ymin   = coordinates(xl1, yl1, xl2, yl2)
xsec, ysec   = coordinates(xl1, yl1, xl2, yl2)

cv2.line(crop, (xs1, ys1), (xs2, ys2), (0, 255, 0), 5)


# Calculate the Hour, Minute, Second-hands by the law of cosines
def law_of_cosines (x, y):
    l1 = sqrt(((xcenter - x)**2)   ((ycenter - y)**2))
    l2 = ycenter
    l3 = sqrt(((xcenter - x)**2)   ((0 - y)**2))
    
    cos_theta = ( (l1**2)   (l2**2) - (l3**2) )/(2*l1*l2)
    theta_radian = acos(cos_theta)
    theta = math.degrees(theta_radian)
    return theta

theta_hour = law_of_cosines(xhour, yhour)
theta_min  = law_of_cosines(xmin, ymin)
theta_sec  = law_of_cosines(xsec, ysec)

def right_or_not (x):
    if (x > xcenter):
        right = 1
    else:
        right = 0
    return right

hour_right = right_or_not(xhour)
min_right  = right_or_not(xmin)
sec_right  = right_or_not(xsec)


def time_cal (x, y, z):
    if (z == xhour):
        if (x == 1):
            a = int(y/30)
        else:
            a = 12 - int(y/30)
        if a == 0:
            a = 12
    else:
        if (x == 1):
            a = int(y/6)
        else:
            a = 60 - int(y/6)
            if (z == xcenter):
                a = 30
    return a

hour   = time_cal(hour_right, theta_hour, xhour)
minute = time_cal(min_right, theta_min, xmin)
sec    = time_cal(sec_right, theta_sec, xsec)


# Display window
canvas = tk.Tk()
canvas.title("Analog to Digital")
canvas.geometry("500x250")

digit = tk.Label(canvas, font = ("ds-digital", 65, "bold"), bg = "white", fg = "blue", bd = 80)
digit.grid(row = 0, column = 1)


# Display result
def display(hour, minute, sec):
    value = "{0:0=2d}:{1:0=2d}:{2:0=2d}".format(hour, minute, sec)
    digit.config(text=value)
    print(value)

display(hour, minute, sec)  
canvas.mainloop()

for line in lines:
    for x1,y1,x2,y2 in line:
        cv2.line(line_image, (x1,y1), (x2,y2), (255,0,0), 1)

lines_edges = cv2.addWeighted(crop, 0.8, line_image, 1, 0)
cv2.imshow('Line Image', line_image)
cv2.imshow('Crop', crop)
cv2.waitKey(0)

uj5u.com熱心網友回復:

這種事情有很多可能的陷阱。因為每只手生成兩條線,但并不完全平行,并且某些互動可能會使它們顯得更短,等等。

但在你的情況下,我敢打賭問題要簡單得多:

xhour, yhour = coordinates(xs1, ys1, xs2, ys2)
xmin, ymin   = coordinates(xl1, yl1, xl2, yl2)
xsec, ysec   = coordinates(xl1, yl1, xl2, yl2)

我很確定,其中之一應該是coordinates(xm1, ym1, xm2, ym2)

在您發表評論后進行編輯。所以,我們處在一個更糟糕的地方。因為您所擁有的是計算機視覺問題,而不僅僅是 python 問題。對此沒有明確的解決方案。但是,您可以做一些提示。

  • 您可以確定時鐘的中心(我認為您已經完成了,畫了一個圓圈),并且還使用到中心的距離而不是線的長度。
  • 您可以利用它來過濾不通過中心或幾乎不通過中心的線
  • 由于線條是手的邊界,并且是略微三角形的,因此它們與中心的距離有多近表明它是哪只手。時針和分針的線并不完全穿過圓的中心。秒針線更靠近中心。
  • 此外,您應該期望每手至少有 2 行(實際上更多,這就是霍夫的作業方式)。一個在中心上方,另一個在下方。因此,您可以利用它來增強角度計算(通過計算穿過中心的中線)和長度計算的可靠性。避免用同一只手數兩次
  • 此外,您可以計算所有線的角度:如果有 3 個明顯分開的角度,您就知道您正在尋找的所有角度都在那里。長針的分針和秒針(您可以區分它們,因為我們的小時更三角形和更粗的形狀,而秒針的形狀更窄。這導致小時的線條方向變化比秒的更大)。短時針。
  • 您也可以嘗試利用秒針的“尾巴”,并嘗試檢查是否在與指標相反的方向上發現了一些暗像素。如果你不這樣做,它就不是二手的。
  • 您還可以使用形態學運算子,在 canny/hough 之前侵蝕黑色像素。這樣你就知道秒針已經消失了,因為它太窄了。你會從那里找到兩只手。然后在沒有腐蝕的情況下重做這項作業。你發現的多余的手是秒針
  • 當然,也有一些手疊加處理的情況。如果你確信,在嘗試了一些想法之后,如果有 3 手牌,你會找到 3 手牌,那么,你可以相信 2 手牌在同一個位置。您還可以使用您之前檢測的知識(您知道手應該如何移動)
  • 最后,如果你不是特別想只使用線檢測,你也可以簡單地觀察一些圓圈上的像素。一個圓心是時鐘的中心,其半徑盡可能大但不足以包括數字,應該用兩只手(小時和秒)交叉,很容易發現那個(分鐘)比另一個(秒)厚。如果只有一個,那么您知道小時和秒是相同的。較小的圓圈應由 3 只手交叉。額外的一個是時針。如果找不到額外的,并且有 2 根指標(與大圓圈相同),則時針與分針或秒針重疊。如果是二手的,那么它應該會變得更厚。

轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/514733.html

標籤:Python图片麻木的

上一篇:CSS/HTML-自動將影像調整為螢屏大小

下一篇:BufferedImage->int[]->BufferedImage結果為灰黑色

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • Git本地庫既關聯GitHub又關聯Gitee

    創建代碼倉庫 使用gitee舉例(github和gitee差不多) 1.在gitee右上角點擊+,選擇新建倉庫 ? 2.選擇填寫倉庫資訊,然后進行創建 ? 3.服務端已經準備好了,本地開始作準備 (1)Git 全域設定 git config --global user.name "成鈺" git c ......

    uj5u.com 2020-09-10 05:04:14 more
  • CODING DevOps 代碼質量實戰系列第二課,相約周三

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。**《DevOps 代碼質量實戰(PHP 版)》**為 CODING DevOps 代碼質量實戰系列的第二課,同時也是本系列的 PHP ......

    uj5u.com 2020-09-10 05:07:43 more
  • 推薦Scrum書籍

    推薦Scrum書籍 直接上干貨,推薦書籍清單如下(推薦有順序的哦) Scrum指南 Scrum精髓 Scrum敏捷軟體開發 Scrum捷徑 硝煙中的Scrum和XP : 我們如何實施Scrum 敏捷軟體開發:Scrum實戰指南 Scrum要素 大規模Scrum:大規模敏捷組織的設計 用戶故事地圖 用 ......

    uj5u.com 2020-09-10 05:07:45 more
  • CODING DevOps 代碼質量實戰系列最后一課,周四發車

    隨著 ToB(企業服務)的興起和 ToC(消費互聯網)產品進入成熟期,線上故障帶來的損失越來越大,代碼質量越來越重要,而「質量內建」正是 DevOps 核心理念之一。 **《DevOps 代碼質量實戰(Java 版)》**為 CODING DevOps 代碼質量實戰系列的最后一課,同時也是本系列的 ......

    uj5u.com 2020-09-10 05:07:52 more
  • 敏捷軟體工程實踐書籍

    Scrum轉型想要做好,第一步先了解并真正落實Scrum,那么我推薦的Scrum書籍是要看懂并實踐的。第二步是團隊的工程實踐要做扎實。 下面推薦工程實踐書單: 重構:改善既有代碼的設計 決議極限編程 : 擁抱變化 代碼整潔代碼 程式員的職業素養 修改代碼的藝術 撰寫可讀代碼的藝術 測驗驅動開發 : ......

    uj5u.com 2020-09-10 05:07:55 more
  • Jenkins+svn+nginx實作windows環境自動部署vue前端專案

    前面文章介紹了Jenkins+svn+tomcat實作自動化部署,現在終于有空抽時間出來寫下Jenkins+svn+nginx實作自動部署vue前端專案。 jenkins的安裝和配置已經在前面文章進行介紹,下面介紹實作vue前端專案需要進行的哪些額外的步驟。 注意:在安裝jenkins和nginx的 ......

    uj5u.com 2020-09-10 05:08:49 more
  • CODING DevOps 微服務專案實戰系列第一課,明天等你

    CODING DevOps 微服務專案實戰系列第一課**《DevOps 微服務專案實戰:DevOps 初體驗》**將由 CODING DevOps 開發工程師 王寬老師 向大家介紹 DevOps 的基本理念,并探討為什么現代開發活動需要 DevOps,同時將以 eShopOnContainers 項 ......

    uj5u.com 2020-09-10 05:09:14 more
  • CODING DevOps 微服務專案實戰系列第二課來啦!

    近年來,工程專案的結構越來越復雜,需要接入合適的持續集成流水線形式,才能滿足更多變的需求,那么如何優雅地使用 CI 能力提升生產效率呢?CODING DevOps 微服務專案實戰系列第二課 《DevOps 微服務專案實戰:CI 進階用法》 將由 CODING DevOps 全堆疊工程師 何晨哲老師 向 ......

    uj5u.com 2020-09-10 05:09:33 more
  • CODING DevOps 微服務專案實戰系列最后一課,周四開講!

    隨著軟體工程越來越復雜化,如何在 Kubernetes 集群進行灰度發布成為了生產部署的”必修課“,而如何實作安全可控、自動化的灰度發布也成為了持續部署重點關注的問題。CODING DevOps 微服務專案實戰系列最后一課:**《DevOps 微服務專案實戰:基于 Nginx-ingress 的自動 ......

    uj5u.com 2020-09-10 05:10:00 more
  • CODING 儀表盤功能正式推出,實作作業資料可視化!

    CODING 儀表盤功能現已正式推出!該功能旨在用一張張統計卡片的形式,統計并展示使用 CODING 中所產生的資料。這意味著無需額外的設定,就可以收集歸納寶貴的作業資料并予之量化分析。這些海量的資料皆會以圖表或串列的方式躍然紙上,方便團隊成員隨時查看各專案的進度、狀態和指標,云端協作迎來真正意義上 ......

    uj5u.com 2020-09-10 05:11:01 more
最新发布
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:41:12 more
  • windows系統git使用ssh方式和gitee/github進行同步

    使用git來clone專案有兩種方式:HTTPS和SSH:
    HTTPS:不管是誰,拿到url隨便clone,但是在push的時候需要驗證用戶名和密碼;
    SSH:clone的專案你必須是擁有者或者管理員,而且需要在clone前添加SSH Key。SSH 在push的時候,是不需要輸入用戶名的,如果配置... ......

    uj5u.com 2023-04-19 08:35:34 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:05:44 more
  • 2023年農牧行業6大CRM系統、5大場景盤點

    在物聯網、大資料、云計算、人工智能、自動化技術等現代資訊技術蓬勃發展與逐步成熟的背景下,數字化正成為農牧行業供給側結構性變革與高質量發展的核心驅動因素。因此,改造和提升傳統農牧業、開拓創新現代智慧農牧業,加快推進農牧業的現代化、資訊化、數字化建設已成為農牧業發展的重要方向。 當下,企業數字化轉型已經 ......

    uj5u.com 2023-04-18 08:00:18 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:20:31 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:55 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:18:51 more
  • 談一談我對協同開發的一些認識

    如今各互聯網公司普通都使用敏捷開發,采用小步快跑的形式來進行專案開發。如果是小專案或者小需求,那一個開發可能就搞定了。但對于電商等復雜的系統,其功能多,結構復雜,一個人肯定是搞不定的,所以都是很多人來共同開發維護。以我曾經待過的商城團隊為例,光是后端開發就有七十多人。 為了更好地開發這類大型系統,往 ......

    uj5u.com 2023-04-17 08:18:00 more
  • 專案管理PRINCE2核心知識點整理

    PRINCE2,即 PRoject IN Controlled Environment(受控環境中的專案)是一種結構化的專案管理方法論,由英國政府內閣商務部(OGC)推出,是英國專案管理標準。
    PRINCE2 作為一種開放的方法論,是一套結構化的專案管理流程,描述了如何以一種邏輯性的、有組織的方法,... ......

    uj5u.com 2023-04-17 08:17:55 more
  • 計算機組成原理—存盤器

    計算機組成原理—硬體結構 二、存盤器 1.概述 存盤器是計算機系統中的記憶設備,用來存放程式和資料 1.1存盤器的層次結構 快取-主存層次主要解決CPU和主存速度不匹配的問題,速度接近快取 主存-輔存層次主要解決存盤系統的容量問題,容量接近與價位接近于主存 2.主存盤器 2.1概述 主存與CPU的聯 ......

    uj5u.com 2023-04-17 08:12:06 more