- 帖子
- 254
- 主題
- 6
- 精華
- 0
- 積分
- 310
- 點名
- 0
- 作業系統
- W10
- 軟體版本
- Excel 2016
- 閱讀權限
- 20
- 性別
- 男
- 來自
- 台灣
- 註冊時間
- 2019-6-16
- 最後登錄
- 2024-9-23
|
[發問] 新手問題 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()
應該是這一段造成的卡頓 不知道 有沒有大大可以告知小弟
該如何修改才不會卡頓- #!/usr/bin/env python3
- # -*- coding: utf-8 -*-
- import cv2 #OpenCV version: 4.5.3 print("OpenCV version:", cv2.__version__)
- # import numpy as np
- import math
- import os
- # 列出指定目錄中的所有檔案和子目錄。
- def count_files(directory):
- total = 0
- for root, dirs, files in os.walk(directory):
- total += len(files) + len(dirs)
- return total
- # 刪除的圖像
- def delete_image(directory, filename):
- filepath = os.path.join(directory, filename)
- if os.path.isfile(filepath):
- os.remove(filepath)
- print(f"Deleted {filename}.")
- else:
- print(f"{filename} 不存在")
- # 當左鍵按下並移動時繪製圖形,event可以查看移動,flag查看是否按下
- # 定義 `draw_line()` 函數來處理滑鼠事件,例如在圖像上繪製線條
- def draw_line(event, x, y, flags, param):
- if event == cv2.EVENT_FLAG_LBUTTON: # 左鍵按下
- global start_point, isDrawing ,img1
- start_point = (x, y) # 拖曳滑鼠時,不斷記錄座標
- isDrawing = True
- print("左鍵按下")
- print(start_point)
- elif event == cv2.EVENT_MOUSEMOVE and isDrawing: # 移動滑鼠時繪圖
- # end_point = (x,y) # 拖曳滑鼠時,不斷記錄座標
- end_point = (x,y)
- print("移動滑鼠")
- print(end_point)
- 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()
-
- # P1 與 P2 是已知的點
- # P1 = (start_point[0], start_point[1])
- # P2 = (end_point[0], end_point[1])
- P1 = (start_point[-2], start_point[-1])
- P2 = (end_point[-2], end_point[-1])
- cv2.line(img1, P1, P2, (0, 255, 0), 3)
-
- # 計算直線長度公式為:length = sqrt((x2-x1)^2 + (y2-y1)^2)
- length = math.sqrt((P2[0] - P1[0])**2 + (P2[1] - P1[1])**2)
- # length = np.sqrt((P2[0]-P1[0])**2 + (P2[1]-P1[1])**2) # 計算直線的長度
- # 長度單位 micrometer(um)
- length = length * 1000
- # 顯示座標 cv2.threshold() strXY=str(x)+','+str(y)+"um"
- strXY=str(x)+','+str(y)+','+str(length)+"um"
- font=cv2.FONT_HERSHEY_PLAIN
- cv2.putText(img1,strXY,(x+10,y+10),font,1,(0,255,0),2)
- cv2.imshow("Image", img1)
- elif event == cv2.EVENT_LBUTTONUP: # 左鍵釋放 True False
- isDrawing = False
- print("左鍵釋放")
- print(isDrawing)
- #保存照片
- cv2.imwrite('C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST1.jpg', img1)
-
- elif event == cv2.EVENT_RBUTTONDOWN:
- print("右鍵按下")
- if __name__ == "__main__":
- directory = 'C:/VSC_PY/GUI_AI/sand_train/text_dir/' # 目錄路徑
- filename = "TEST1.jpg" # 圖片的名稱
- delete_image(directory, filename) #刪除照片
- img3 = img.copy()
- cv2.imshow("Image", img3)
- # 載入圖片 'C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST.jpg'
- # 預設使用 cv2.IMREAD_COLOR 模式
- img = cv2.imread('C:/VSC_PY/GUI_AI/sand_train/text_dir/TEST.jpg')
- # cv2.imshow('oxxostudio', img) # 使用名為 oxxostudio 的視窗開啟圖片
- # 建立一個視窗以顯示影像並設定事件監聽器
- cv2.namedWindow("Image")
- # 偵測指定視窗下的滑鼠事件
- cv2.setMouseCallback("Image", draw_line)
- # 啟動主迴圈以顯示和更新圖像,包括繪製的線條
- while True:
- cv2.imshow("Image", img)
- # 按下任意鍵停止
- if cv2.waitKey(0):
- cv2.destroyAllWindows() # 結束所有圖片視窗
- break
複製代碼 |
|