Izicelo zesimanje ze-GUI zombono wekhompyutha ePython

Ngingumthandi omkhulu wokubuka okusebenzayo. Njengonjiniyela we-Computer Vision, ngibhekana cishe nosuku nsuku zonke ngemisebenzi ehlobene nokusebenza kwezithombe nokunye okuningi kunalokho hhayi ukuthi ngingenankinga lapho ngidinga khona impendulo ebonakalayo ukwenza izinqumo. Ake sicabange ngepayipi elisebenziseka kalula lesithombe esinezinyathelo ezimbili ezinamapharamitha athile ukuguqula isithombe:

Wazi kanjani ukuthi yimaphi amapharamitha okufanele alungiswe? Ngabe ipayipi lize lisebenze njengoba kulindeleke? Ngaphandle kokubona ngeso lengqondo umphumela wakho, ungahle uphuthelwe ekubukweni okuthile okusemqoka futhi wenze izinqumo eziphezulu.
Kwesinye isikhathi ukukhombisa nje isithombe sokuphuma kanye / noma amanye ama-metric ababaliwe angenele ukukala emaphangeni. Kepha ngizitholile ezimweni eziningi lapho ithuluzi luzosiza kakhulu ekusebenzeni ngokushesha nangokusebenzisana ngepayipi lami. Ngakho-ke kulesi sihloko ngizokukhombisa ukuthi ungasebenza kanjani ngezinto ezilula ezakhelwe ngaphakathi ezisebenzayo kusuka OpenCV
Kanye nendlela yokwakha izikhala zomsebenzisi zanamuhla zamaphrojekthi wokubuka amakhompyutha usebenzisa customtkinter
.
Izimfuneko
Uma ufuna ukulandela, ngincoma ukuthi usethe imvelo yakho yendawo nge-UV bese ufaka amaphakheji alandelayo:
uv add numpy opencv-Python pillow customtkinter
Igoli
Ngaphambi kokuthi singene kwiKhodi yephrojekthi, masize ngokushesha lokho esifuna ukuyakha. Isicelo kufanele sisebenzise okuphakelayo kwe-webcam futhi sivumele umsebenzisi ukuthi akhethe izinhlobo ezahlukene zokuhlunga ezizosetshenziswa emfuleni. Izithombe ezisetshenzisiwe kufanele zikhonjiswe ngesikhathi sangempela efasiteleni. Umdwebo onomoya we-UI ongaba khona ubukeka kanjena:

OpenCV – GUI
Ake siqale nge-loop elula ethinta ozimele kusuka ku-webcam yakho futhi ibonise ewindini le-opencv.
import cv2
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
cv2.imshow("Video Feed", frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
Ukufakwa kwekhibhodi
Indlela elula ukwengeza ukusebenzisana lapha, ukwengeza okokufaka kwekhibhodi. Isibonelo, singakwazi ukujikeleza izihlungi ezahlukahlukene ngezinkinobho zenombolo.
...
filter_type = "normal"
while True:
...
if filter_type == "grayscale":
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
elif filter_type == "normal":
pass
...
if key == ord('1'):
filter_type = "normal"
if key == ord('2'):
filter_type = "grayscale"
...
Manje usungashintsha phakathi kwesithombe esijwayelekile nenguqulo ye-greyscale ngokucindezela izinkinobho zenombolo 1 no-2. Masisheshe singeze i-ncazo esithombeni ukuze empeleni sibone igama lesihlungi esisebenza ngalo.
Manje kudingeka siqaphele lapha: Uma ubheka ukwakheka kohlaka ngemuva kwesihlungi, uzobona ukuthi ubukhulu bezinhlekelele zozimele selushintshile. Khumbula ukuthi ama-apancv ahade ahaliwe HWC (ukuphakama, ububanzi, umbala) ngombala njengoba I-BGR (luhlaza, oluhlaza okwesibhakabhaka, obomvu), ngakho-ke isithombe esingu-640 × 480 esivela ekhasini lami lewebhu selibunjiwe (480, 640, 3)
.
print(filter_type, frame.shape)
# normal (480, 640, 3)
# grayscale (480, 640)
Manje ngoba ukusebenza kwe-grayscale kukhipha isithombe sesiteshi esisodwa, ubukhulu bombala buhle. Uma manje sifuna ukudweba ngaphezulu kwalesi sithombe, kudingeka sicacise umbala wesiteshi esisodwa wesithombe se-greyscale noma siguqula leso sithombe sibuyele koqobo I-BGR ifomethi. Inketho yesibili ihlanzekile ngoba singahlanganisa nesichasiselo sesithombe.
if filter_type == "grayscale":
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
elif filter_type == "normal":
pass
if len(frame.shape) == 2: # Convert grayscale to BGR
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
Isitheni
Ngifuna ukufaka umngcele omnyama phansi kwesithombe, esiphezulu lapho igama lesihlungi luzokhonjiswa. Singasebenzisa i- copyMakeBorder
Umsebenzi wokufaka isithombe nge-Border Colour ezansi. Ngemuva kwalokho singangeza umbhalo ngaphezulu kwalo mngcele.
# Add a black border at the bottom of the frame
border_height = 50
border_color = (0, 0, 0)
frame = cv2.copyMakeBorder(frame, 0, border_height, 0, 0, cv2.BORDER_CONSTANT, value=border_color)
# Show the filter name
cv2.putText(
frame,
filter_type,
(frame.shape[1] // 2 - 50, frame.shape[0] - border_height // 2 + 10),
cv2.FONT_HERSHEY_SIMPLEX,
1,
(255, 255, 255),
2,
cv2.LINE_AA,
)
Le yindlela umphumela okufanele ubheke ngayo, futhi ungashintsha phakathi kwemodi ejwayelekile ne-grayscale kanye namafreyimu azoba khona ngokufanele.

Amaslayidi
Manje esikhundleni sokusebenzisa ikhibhodi njengendlela yokufaka, i-OpenCV inikeza into eyisisekelo ye-trackbar slider ui element. I-trackbar idinga ukuqaliswa ekuqaleni kweskripthi. Sidinga ukubheka iwindi elifanayo njengoba sizobe sibonisa izithombe zethu ngokuhamba kwesikhathi, ngakho-ke ngizokwakha ukuguquguquka kwegama lewindi. Usebenzisa leli gama, singakha ithrekhi bese sikuvumela kube yisikhethi senkomba ohlwini lokuhlunga.
filter_types = ["normal", "grayscale"]
win_name = "Webcam Stream"
cv2.namedWindow(win_name)
tb_filter = "Filter"
# def createTrackbar(trackbarName: str, windowName: str, value: int, count: int, onChange: _typing.Callable[[int], None]) -> None: ...
cv2.createTrackbar(
tb_filter,
win_name,
0,
len(filter_types) - 1,
lambda _: None,
)
Phawula ukuthi sisebenzisa kanjani i-lambda engenalutho ye onChange
I-Callback, sizolanda inani ngesandla ku-loop. Konke okunye kuzohlala kufana.
while True:
...
# Get the selected filter type
filter_id = cv2.getTrackbarPos(tb_filter, win_name)
filter_type = filter_types[filter_id]
...
Futhi i-voilà, sine-trackbar yokukhetha isihlungi sethu.

Manje futhi futhi singangeza kalula izihlungi eziningi kalula ngohlu lwethu futhi sisebenzise isinyathelo ngasinye sokucubungula.
filter_types = [
"normal",
"grayscale",
"blur",
"threshold",
"canny",
"sobel",
"laplacian",
]
...
if filter_type == "grayscale":
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
elif filter_type == "blur":
frame = cv2.GaussianBlur(frame, ksize=(15, 15), sigmaX=0)
elif filter_type == "threshold":
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, thresholded_frame = cv2.threshold(gray, thresh=127, maxval=255, type=cv2.THRESH_BINARY)
elif filter_type == "canny":
frame = cv2.Canny(frame, threshold1=100, threshold2=200)
elif filter_type == "sobel":
frame = cv2.Sobel(frame, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)
elif filter_type == "laplacian":
frame = cv2.Laplacian(frame, ddepth=cv2.CV_64F)
elif filter_type == "normal":
pass
if frame.dtype != np.uint8:
# Scale the frame to uint8 if necessary
cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX)
frame = frame.astype(np.uint8)

I-GUI yesimanje ngeCustomTKInter
Manje angazi ngawe kepha interface yomsebenzisi yamanje ayibukeki kakhulu -isimanje kimi. Ungangitholi okungalungile, kukhona ubuhle obunye ngesitayela se-interface, kepha ngincamela ukuhlanza, ukwakheka kwanamuhla. Futhi sesivele simkhawulo walokho I-OpenCV inikeza ngaphandle kwebhokisi ngokuya ngezinto ze-UI. I-Yep, azikho izinkinobho, amasimu wombhalo, ama-dropdown, amabhokisi okuhlola noma izinkinobho zomsakazo futhi azikho izakhiwo ngokwezifiso. Ngakho-ke ake sibheke ukuthi singaguqula kanjani ukubukeka nokuhlangenwe nakho komsebenzisi kwalolu hlelo lokusebenza oluyisisekelo kumuntu omusha futhi ohlanzekile.

Ngakho-ke ukuze uqalise, okokuqala kudingeka sakhe isigaba sohlelo lwethu lokusebenza. Sakha amafreyimu amabili: Owokuqala aqukethe ukukhetha kwethu okokuhlunga ngakwesokunxele kanti owesibili usonga isibonisi sesithombe. Okwamanje, ake siqale ngombhalo olula wokubamba. Ngeshwa akukho ngaphandle kwebhokisi le-OpenCV elivela kwiCustomtTKInter ngqo, ngakho-ke sizodinga ukwakha okwethu ezitebhisini ezimbalwa ezizayo. Kepha ake siqale siqede ukwakheka kwe-UI eyisisekelo.
import customtkinter
class App(customtkinter.CTk):
def __init__(self) -> None:
super().__init__()
self.title("Webcam Stream")
self.geometry("800x600")
self.filter_var = customtkinter.IntVar(value=0)
# Frame for filters
self.filters_frame = customtkinter.CTkFrame(self)
self.filters_frame.pack(side="left", fill="both", expand=False, padx=10, pady=10)
# Frame for image display
self.image_frame = customtkinter.CTkFrame(self)
self.image_frame.pack(side="right", fill="both", expand=True, padx=10, pady=10)
self.image_display = customtkinter.CTkLabel(self.image_frame, text="Loading...")
self.image_display.pack(fill="both", expand=True, padx=10, pady=10)
app = App()
app.mainloop()

Hlunga izinkinobho zomsakazo
Manje njengoba kwakhiwa amathambo, singaqala ukugcwalisa izinto zethu. Ohlangothini lwesobunxele, ngizobe ngisebenzisa uhlu olufanayo lwe filter_types
Ukuqhafaza iqembu lezinkinobho zomsakazo ukukhetha isihlungi.
# Create radio buttons for each filter type
self.filter_var = customtkinter.IntVar(value=0)
for filter_id, filter_type in enumerate(filter_types):
rb_filter = customtkinter.CTkRadioButton(
self.filters_frame,
text=filter_type.capitalize(),
variable=self.filter_var,
value=filter_id,
)
rb_filter.pack(padx=10, pady=10)
if filter_id == 0:
rb_filter.select()

Isakhi sokubonisa isithombe
Manje sesingaqala engxenyeni ethokozisayo, ukuthi ungazithola kanjani ozimele bethu be-OpenCV ukukhombisa engxenyeni yesithombe. Ngoba ayikho ingxenye eyakhelwe ngaphakathi, ake sakhe eyakho ngokusekelwe ku CTKLabel
. Lokhu kusivumela ukuthi sibonise umbhalo olayisha ngenkathi ukusakazwa kwe-webcam kuqala.
...
class CTkImageDisplay(customtkinter.CTkLabel):
"""
A reusable ctk widget widget to display opencv images.
"""
def __init__(
self,
master: Any,
) -> None:
self._textvariable = customtkinter.StringVar(master, "Loading...")
super().__init__(
master,
textvariable=self._textvariable,
image=None,
)
...
class App(customtkinter.CTk):
def __init__(self) -> None:
...
self.image_display = CTkImageDisplay(self.image_frame)
self.image_display.pack(fill="both", expand=True, padx=10, pady=10)
Kuze kube manje akukho okushintshile, simane sashintsha ilebula ekhona ngokuqaliswa kwethu kwesigaba sangokwezifiso. Kuthi yethu CTKImageDisplay
Isigaba singachaza umsebenzi ukukhombisa isithombe engxenyeni, ake sibize set_frame
.
import cv2
import numpy.typing as npt
from PIL import Image
class CTkImageDisplay(customtkinter.CTkLabel):
...
def set_frame(self, frame: npt.NDArray) -> None:
"""
Set the frame to be displayed in the widget.
Args:
frame: The new frame to display, in opencv format (BGR).
"""
target_width, target_height = frame.shape[1], frame.shape[0]
# Convert the frame to PIL Image format
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
frame_pil = Image.fromarray(frame_rgb, "RGB")
ctk_image = customtkinter.CTkImage(
light_image=frame_pil,
dark_image=frame_pil,
size=(target_width, target_height),
)
self.configure(image=ctk_image, text="")
self._textvariable.set("")
Ake sigaye lokhu. Okokuqala kudingeka sazi ukuthi ingxenye enkulu kangakanani yesithombe sethu, singakhipha lolo lwazi oluvela empahleni yokwesakhiwo sethu. Ukubonisa isithombe ku tkinter
sidinga umcamelo Image
Thayipha, asikwazi ukusebenzisa ngokuqondile i-OpenCV Array. Ukuguqula i-OpenCVV ihlelelekile, okokuqala kudingeka siguqule isikhala sombala kusuka I-BGR kwa- Rgb bese sikwazi ukusebenzisa Image.fromarray
Umsebenzi wokwakha into yesithombe somcamelo. Okulandelayo singakha i-CTKKage, lapho sisebenzisa khona isithombe esifanayo noma ngabe ingqikithi bese isetha usayizi ngokuya ngohlaka lwethu. Ekugcineni singasebenzisa indlela yokulungiselela ukusetha isithombe ngohlaka lwethu. Ekugcineni, siyasetha kabusha ukuguquguquka kombhalo ukuze kususe “Ukulayisha …” Umbhalo, yize bekungathinta ngokweqiniso ngemuva kwesithombe.
Ukuhlola ngokushesha lokhu, singasetha isithombe sokuqala se-webcam yethu ku-actorkhi. (Sizobona ngomzuzwana ukuthi kungani lokhu kungewona umqondo omuhle kangaka)
class App(customtkinter.CTk):
def __init__(self) -> None:
...
cap = cv2.VideoCapture(0)
_, frame0 = cap.read()
self.image_display.set_frame(frame0)
Uma ugijimisa lokhu, uzobona ukuthi iwindi lithatha isikhathi eside ukuvela, kepha ngemuva kokulibala okufushane kufanele ubone isithombe esibonakalayo kusuka ku-webcam yakho.
Qaphela: Uma ungenalo i-webcam elungile futhi ungasebenzisa nje ifayela levidiyo lendawo ngokudlula indlela yefayela ku
cv2.VideoCapture
I-Constructor call.

Manje lokhu akujabulisi kakhulu, ngoba uhlaka aluvuseleli okwamanje. Ngakho-ke ake sibheke ukuthi kwenzekani uma sizama ukwenza lokhu ngokuzwakalayo.
class App(customtkinter.CTk):
def __init__(self) -> None:
...
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
self.image_display.set_frame(frame)
Cishe kuyafana nangaphambilini, ngaphandle kokuthi manje sisebenzisa uhlaka loop njengoba senze esahlukweni esedlule nge-OpenCV GUI. Uma ugijimisa lokhu, uzobona … akukho lutho. Iwindi ayikaze libonise, ngoba sakha i-loop engapheli ku-app yohlelo lokusebenza! Lesi yisekho futhi esenza ukuthi uhlelo luboniswe kuphela ngemuva kokubambezeleka esibonelweni esedlule, ukuvulwa komsakazo we-webcam kuwukusebenza okuvinjelwe, bese kuthi i-Loop yomcimbi ye-windows ayinakusebenza, ngakho-ke akubonisi okwamanje.
Ngakho-ke ake sikulungise lokhu ngokungeza ukuqaliswa okungcono okuvumayo okuvumela i-Gui umcimbi we-loop ukuze sigijime ngenkathi sibuyekeza uhlaka njalo ngesikhashana. Singasebenzisa i- after
indlela ye tkinter
Ukuhlela ucingo lapho uveza inqubo ngesikhathi sokulinda isikhathi.
...
self.cap = cv2.VideoCapture(0)
self.after(10, self.update_frame)
def update_frame(self) -> None:
"""
Update the displayed frame.
"""
ret, frame = self.cap.read()
if not ret:
return
self.image_display.set_frame(frame)
self.after(10, self.update_frame)
Ngakho-ke manje sisasetha ukusakazwa kwe-webcam ku-lokwakha, ngakho-ke asikaze sixazulule leyo nkinga okwamanje. Kepha okungenani sibona umfudlana oqhubekayo wamafreyimu esithombeni sethu.

Ukufaka izihlungi
Manje njengoba i-loop yohlaka iyasebenza. Singasebenzisa futhi izihlungi zethu kusukela ekuqaleni bese sizisebenzisa ekusakazeni kwethu kwe-webcam. Emsebenzini wokuvuselela_ame, singabheka ukuguquguquka kwesihlungi samanje bese sisebenzisa umsebenzi wokuhlunga ohambelana nawo.
def update_frame(self) -> None:
...
# Get the selected filter type
filter_id = self.filter_var.get()
filter_type = filter_types[filter_id]
if filter_type == "grayscale":
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
elif filter_type == "blur":
frame = cv2.GaussianBlur(frame, ksize=(15, 15), sigmaX=0)
elif filter_type == "threshold":
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
_, frame = cv2.threshold(gray, thresh=127, maxval=255, type=cv2.THRESH_BINARY)
elif filter_type == "canny":
frame = cv2.Canny(frame, threshold1=100, threshold2=200)
elif filter_type == "sobel":
frame = cv2.Sobel(frame, ddepth=cv2.CV_64F, dx=1, dy=0, ksize=5)
elif filter_type == "laplacian":
frame = cv2.Laplacian(frame, ddepth=cv2.CV_64F)
elif filter_type == "normal":
pass
if frame.dtype != np.uint8:
# Scale the frame to uint8 if necessary
cv2.normalize(frame, frame, 0, 255, cv2.NORM_MINMAX)
frame = frame.astype(np.uint8)
if len(frame.shape) == 2: # Convert grayscale to BGR
frame = cv2.cvtColor(frame, cv2.COLOR_GRAY2BGR)
self.image_display.set_frame(frame)
self.after(10, self.update_frame)
Futhi manje sesibuyile ekusebenzeni okugcwele kohlelo lokusebenza, ungakhetha noma yikuphi ukuhlunga ohlangothini lwesobunxele futhi kuzosetshenziswa ngesikhathi sangempela kokuphakelayo kwe-webcam!

I-Multthitreating kanye nokuvumelanisa
Manje yize uhlelo lokusebenza lusebenza njengoba lukhona, kunezinkinga ezithile ngendlela yamanje esisebenzisa ngayo ifreyimu yethu. Njengamanje yonke into isebenza ngentambo eyodwa, intambo enkulu ye-gui. Kungaleso sizathu ekuqaleni, asiboni masinyane ukubona iwindi pop up, ukuqaliswa kwethu kwewebhu kuvimba intambo eyinhloko. Manje ake ucabange, uma senze ukucubungula kwesithombe esinzima, mhlawumbe sisebenzisa izithombe ngenethiwekhi ye-neural, ubungeke ufune ukuthi isikhombimsebenzisi sakho somsebenzisi sivinjelwe ngenkathi inethiwekhi isebenza. Lokhu kuzoholela ekuhlangenwe nakho komsebenzisi ongaphenduli kakhulu lapho uchofoza izinto ze-UI!

Indlela engcono yokuphatha lokhu kuhlelo lwethu lokusebenza ukuthi Hlukanisa ukucubungula kwesithombe kusuka ku-interface yomsebenzisi. Ngokuvamile lokhu cishe kungumqondo omuhle ukuhlukanisa i-GUI Logic kusuka kunoma yiluphi uhlobo lokucutshungulwa okungathandeki. Ngakho-ke kithi, sizosebenzisa intambo ehlukile ebhekele loop wesithombe. Izofunda amafreyimu asuka kwi-webcam asakazeke futhi asebenzise izihlungi.

Qaphela: Imicu yePython ayiyona “Real” imicu ngomqondo wokuthi abanawo amandla okusebenza kuma-cores ahlukile we-CPU ahlukile ngakho-ke ngeke ngempela gijimani ngokufana. Ku-Python Multithressing umongo uzoshintsha phakathi kwentambo, kepha ngenxa ye-gil, ukukhiya okutoritha komhlaba jikelele, inqubo eyodwa ye-python ingasebenza kuphela intambo eyodwa yomzimba. Uma ufuna “Real” ukucubungula okuhambisanayo, kuzodingeka usebenzise I-MultiProcesing. Kusukela inqubo yethu lapha ayiboshwe i-CPU kepha empeleni Mina / o Bodwaokwanele okufundwayo.
class App(customtkinter.CTk):
def __init__(self) -> None:
...
self.webcam_thread = threading.Thread(target=self.run_webcam_loop, daemon=True)
self.webcam_thread.start()
def run_webcam_loop(self) -> None:
"""
Run the webcam loop in a separate thread.
"""
self.cap = cv2.VideoCapture(0)
if not self.cap.isOpened():
return
while True:
ret, frame = self.cap.read()
if not ret:
break
# Filters
...
self.image_display.set_frame(frame)
Uma ugijima lokhu, manje uzobona ukuthi iwindi lethu livula ngokushesha futhi sibona ngisho nombhalo wethu wokulayisha ngenkathi ukusakazwa kwe-webcam kuvuleka. Kodwa-ke, lapho nje ukusakazwa kuqala, amafreyimu aqala ukugcwala. Ngokuya ngezinto eziningi, ungathola ubuciko obuhlukile bokubuka noma amaphutha kulesi sigaba.
Isexwayiso: isithombe esikhanyayo

Manje kungani kwenzeka lokhu? Inkinga ukuthi sizama ngasikhathi sinye ukuvuselela ifreyimu entsha ngenkathi i-loop yokuvuselela yangaphakathi ye-interface yomsebenzisi ingahle isebenzise imininingwane ye-array ukuyidweba esikrinini. Bobabili bancintisana ngohlaka olufanayo.
Ngokuvamile akuwona umqondo omuhle wokuvuselela ngokuqondile izakhi ze-UI kusuka intambo ehlukile, kwezinye izinhlaka ezingavikeleka futhi kuzokhulisa ngaphandle kwalokho. Phakathi kwa- I-TKIRTsingakwenza, kepha sizothola imiphumela exakile. Sidinga uhlobo oluthile ukuzomelayina phakathi kwemicu yethu. Yilapho Queue
iyaqala ukudlala.

Cishe ujwayelene emigqeni kusuka esitolo sezinto zokudla noma amapaki etimu. Umqondo wokulawuwe lapha ufana kakhulu: into yokuqala engena kulayini futhi ishiya kuqala (E finto eyiyo Minani E finto eyiyo OneUt).
Kulokhu, empeleni sifuna umugqa ngento eyodwa, umugqa owodwa we-slot. Ukusetshenziswa komugqa ku-Python kuyinto Intambo-iphephileokusho ukuthi singakwazi beka na- zuza izinto ezivela kulayini ovela emicuqweni ehlukene. Ilungele icala lethu lokusebenzisa, intambo yokucubungula izofaka ama-arrays wesithombe kulayini kanye nentambo ye-GUI izozama ukuthola into, kepha hhayi ukuvimba uma ulayini ungenalutho.
class App(customtkinter.CTk):
def __init__(self) -> None:
...
self.queue = queue.Queue(maxsize=1)
self.webcam_thread = threading.Thread(target=self.run_webcam_loop, daemon=True)
self.webcam_thread.start()
self.frame_loop_dt_ms = 16 # ~60 FPS
self.after(self.frame_loop_dt_ms, self._update_frame)
def _update_frame(self) -> None:
"""
Update the frame in the image display widget.
"""
try:
frame = self.queue.get_nowait()
self.image_display.set_frame(frame)
except queue.Empty:
pass
self.after(self.frame_loop_dt_ms, self._update_frame)
def run_webcam_loop(self) -> None:
...
while True:
...
self.queue.put(frame)
Phawula ukuthi sikuhambisa kanjani ucingo oluqondile ku set_frame
sebenza kusuka ku-webcam loop egijima ngentambo yayo ku- _update_frame
umsebenzi osebenza kuntambo eyinhloko, ehlelwe kaninginingi ngaphakathi Abathile izikhathi ezithile.
Lapha kubalulekile ukusebenzisa get_nowait
Umsebenzi kuhlu oluyinhloko, uma kungenjalo uma ngabe sisebenzisa umsebenzi, sizobe sivimba lapho. Le kholi iyakwenza hhayi ukuvimbakepha kuphakamisa a queue.Empty
Ngaphandle uma kungekho nto yokulanda ukuze sibambe lokhu futhi singakunaki. E-webcam loop, singasebenzisa umsebenzi wokuvimba okuvinjiwe ngoba akunandaba ukuthi thina cina le khasi run_webcam_loop
akukho okunye okudinga ukugijima lapho.

Futhi manje yonke into isebenza njengoba bekulindelekile, azikho amafreyimu akhanyayo!
Ukugcina
Ukuhlanganisa uhlaka lwe-UI afana I-TKIRT ne- I-OpenCV Ivumela ukuthi sikwazi ukwakha izinhlelo zokusebenza zesimanje zokubukeka ngesibonisi somsebenzisi esisebenzayo. Ngenxa ye-UI egijima intambo enkulu, sisebenzisa ukucubungula kwesithombe emucu ohlukile futhi sivumelanise imininingwane phakathi kwentambo esebenzisa umugqa we-slot. Ungathola uhlobo lokuhlanza lwale demo endaweni yokugcina ngezansi nesakhiwo se-modular. Ungazise uma wakhe okuthile okuthokozisayo ngale ndlela. Uzinakekele!
Bheka ikhodi yomthombo ephelele ku-GitHub Repo: