返回列表 上一主題 發帖

[發問] 新手問題 python3 & OpenCV 4.5.3 版本 關於執行程式會卡頓的問題

[發問] 新手問題 python3 & OpenCV 4.5.3 版本 關於執行程式會卡頓的問題

這是一個在照片上畫直線 然後量測值線長度的程式練習
這段程式代碼有一個問題 在執行程式的時候 會卡頓
在想應該是 迴圈的問題  函式中 有一段 :

        directory = 'C:/VSC_PY/GUI_AI/sand_train/text_dir/'  # 目錄路徑
        total_items = count_files(directory)
        if total_items > 1:
            print("此目錄下的項數總計大於 2。")
            print(total_items)
            # 讀取照片
            img1 = cv2.imread('C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST1.jpg')
            #複製照片避免殘影現象 None   
            img1 = img1.copy()  
        else:
            print("此目錄下的項數總計不足 2。")
            img1 = img.copy()

應該是這一段造成的卡頓 不知道 有沒有大大可以告知小弟
該如何修改才不會卡頓
  1. #!/usr/bin/env python3
  2. # -*- coding: utf-8 -*-
  3. import cv2 #OpenCV version: 4.5.3  print("OpenCV version:", cv2.__version__)
  4. # import numpy as np
  5. import math
  6. import os

  7. # 列出指定目錄中的所有檔案和子目錄。
  8. def count_files(directory):
  9.     total = 0
  10.     for root, dirs, files in os.walk(directory):
  11.         total += len(files) + len(dirs)
  12.     return total

  13. # 刪除的圖像
  14. def delete_image(directory, filename):
  15.     filepath = os.path.join(directory, filename)
  16.     if os.path.isfile(filepath):
  17.         os.remove(filepath)
  18.         print(f"Deleted {filename}.")
  19.     else:
  20.         print(f"{filename} 不存在")

  21. # 當左鍵按下並移動時繪製圖形,event可以查看移動,flag查看是否按下
  22. # 定義 `draw_line()` 函數來處理滑鼠事件,例如在圖像上繪製線條
  23. def draw_line(event, x, y, flags, param):
  24.     if event == cv2.EVENT_FLAG_LBUTTON:  # 左鍵按下
  25.         global start_point, isDrawing ,img1

  26.         start_point = (x, y) # 拖曳滑鼠時,不斷記錄座標
  27.         isDrawing = True
  28.         print("左鍵按下")
  29.         print(start_point)

  30.     elif event == cv2.EVENT_MOUSEMOVE and isDrawing:  # 移動滑鼠時繪圖

  31.         # end_point = (x,y) # 拖曳滑鼠時,不斷記錄座標
  32.         end_point = (x,y)
  33.         print("移動滑鼠")
  34.         print(end_point)

  35.         directory = 'C:/VSC_PY/GUI_AI/sand_train/text_dir/'  # 目錄路徑
  36.         total_items = count_files(directory)
  37.         if total_items > 1:
  38.             print("此目錄下的項數總計大於 2。")
  39.             print(total_items)
  40.             # 讀取照片
  41.             img1 = cv2.imread('C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST1.jpg')
  42.             #複製照片避免殘影現象 None   
  43.             img1 = img1.copy()  
  44.         else:
  45.             print("此目錄下的項數總計不足 2。")
  46.             img1 = img.copy()
  47.             

  48.         # P1 與 P2 是已知的點
  49.         # P1 = (start_point[0], start_point[1])
  50.         # P2 = (end_point[0], end_point[1])  
  51.         P1 = (start_point[-2], start_point[-1])
  52.         P2 = (end_point[-2], end_point[-1])  
  53.         cv2.line(img1, P1, P2, (0, 255, 0), 3)

  54.         # 計算直線長度公式為:length = sqrt((x2-x1)^2 + (y2-y1)^2)
  55.         length = math.sqrt((P2[0] - P1[0])**2 + (P2[1] - P1[1])**2)
  56.         # length = np.sqrt((P2[0]-P1[0])**2 + (P2[1]-P1[1])**2) # 計算直線的長度
  57.         # 長度單位 micrometer(um)
  58.         length = length * 1000

  59.         # 顯示座標  cv2.threshold() strXY=str(x)+','+str(y)+"um"
  60.         strXY=str(x)+','+str(y)+','+str(length)+"um"
  61.         font=cv2.FONT_HERSHEY_PLAIN
  62.         cv2.putText(img1,strXY,(x+10,y+10),font,1,(0,255,0),2)

  63.         cv2.imshow("Image", img1)

  64.     elif event == cv2.EVENT_LBUTTONUP:  # 左鍵釋放 True False
  65.         isDrawing = False
  66.         print("左鍵釋放")
  67.         print(isDrawing)
  68.         #保存照片
  69.         cv2.imwrite('C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST1.jpg', img1)
  70.    
  71.     elif event == cv2.EVENT_RBUTTONDOWN:
  72.         print("右鍵按下")

  73.         if __name__ == "__main__":
  74.             directory = 'C:/VSC_PY/GUI_AI/sand_train/text_dir/'  # 目錄路徑
  75.             filename = "TEST1.jpg" # 圖片的名稱
  76.             delete_image(directory, filename) #刪除照片
  77.         img3 = img.copy()
  78.         cv2.imshow("Image", img3)     

  79. # 載入圖片 'C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST.jpg'
  80. # 預設使用 cv2.IMREAD_COLOR 模式
  81. img = cv2.imread('C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST.jpg')

  82. # cv2.imshow('oxxostudio', img) # 使用名為 oxxostudio 的視窗開啟圖片

  83. # 建立一個視窗以顯示影像並設定事件監聽器
  84. cv2.namedWindow("Image")
  85. # 偵測指定視窗下的滑鼠事件
  86. cv2.setMouseCallback("Image", draw_line)

  87. # 啟動主迴圈以顯示和更新圖像,包括繪製的線條
  88. while True:
  89.     cv2.imshow("Image", img)      
  90.     # 按下任意鍵停止
  91.     if cv2.waitKey(0):
  92.         cv2.destroyAllWindows() # 結束所有圖片視窗
  93.         break
複製代碼

        靜思自在 : 欣賞別人就是莊嚴自己。
返回列表 上一主題