Skip to content

Commit 5484e67

Browse files
Update main.py
Camera can now be dynamically selected.
1 parent 3284c80 commit 5484e67

File tree

1 file changed

+58
-46
lines changed

1 file changed

+58
-46
lines changed

main.py

Lines changed: 58 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@
22
import cv2
33
import time
44
from PyQt5 import QtCore, QtGui, QtWidgets
5-
from ui.new_gui import Ui_MainWindow
5+
from PyQt5.QtWidgets import QMessageBox
6+
from ui.new_gui3 import Ui_MainWindow
67
from sqlalchemy import create_engine, text
78
from datetime import datetime
89
import logging
910
import queue
1011
from onnxmodules.yolov8onnx import YOLOv8
1112

12-
# Logging configuration
1313
logging.basicConfig(level=logging.INFO,
1414
format='%(asctime)s - %(levelname)s - %(message)s',
1515
handlers=[
16-
logging.FileHandler("yeni.log"),
16+
logging.FileHandler("new.log"),
1717
logging.StreamHandler()
1818
])
1919

@@ -44,7 +44,6 @@ def get(self):
4444
except queue.Empty:
4545
logging.error("Error LatestFrame get function.")
4646

47-
4847
class DatabaseThread(QtCore.QThread):
4948
def __init__(self, detected_dict, db_manager):
5049
super().__init__()
@@ -88,7 +87,7 @@ def update_detection_in_database(self, detected_dict):
8887
def log_thread_finished(self):
8988
logging.info("DatabaseThread successfully finished.")
9089

91-
class DatabaseManager():
90+
class DatabaseManager:
9291
def __init__(self):
9392
super().__init__()
9493
self.engine = None
@@ -97,18 +96,18 @@ def __init__(self):
9796
def connect(self):
9897
try:
9998
if not self.connected:
100-
server = 'server_ip'
101-
database = 'database_name'
102-
username = 'username'
103-
password = 'password'
99+
server = '10.161.112.70'
100+
database = 'AIDATA'
101+
username = 'majorskt'
102+
password = 'gargara'
104103
driver = 'ODBC Driver 17 for SQL Server'
105104
connection_string = f"mssql+pyodbc://{username}:{password}@{server}/{database}?driver={driver}"
106105
self.engine = create_engine(
107106
connection_string,
108-
pool_size=20,
109-
max_overflow=40,
110-
pool_timeout=30,
111-
pool_recycle=1800
107+
pool_size=20, # Varsayılan değeri artırın
108+
max_overflow=40, # Varsayılan değeri artırın
109+
pool_timeout=30, # Zaman aşımı süresini gerektiğinde artırın
110+
pool_recycle=1800 # Bağlantıların geri dönüşüm süresini ayarlayın
112111
)
113112
self.connected = True
114113
logging.info("Database connected")
@@ -177,6 +176,7 @@ class CameraThread(QtCore.QThread):
177176
change_pixmap_signal = QtCore.pyqtSignal(QtGui.QImage)
178177
update_fps_signal = QtCore.pyqtSignal(float)
179178
update_person_count_signal = QtCore.pyqtSignal(int)
179+
error_signal = QtCore.pyqtSignal(str) # Add signal for errors
180180

181181
def __init__(self, source, yolo_model, latest_frame, db_manager):
182182
super().__init__()
@@ -198,21 +198,16 @@ def __init__(self, source, yolo_model, latest_frame, db_manager):
198198
def run(self):
199199
try:
200200
logging.info("CameraThread started")
201-
start_time = time.time()
202201
self.cap = cv2.VideoCapture(self.source)
203-
end_time = time.time()
204-
logging.info(f"Camera access time: {end_time - start_time:.2f} seconds")
205-
206202
if not self.cap.isOpened():
207-
try:
208-
logging.error("Failed to open camera")
209-
self.retry_connection()
210-
return
211-
except Exception as e:
212-
logging.error(f"Kamera tekrar açılamadı: {e}")
203+
logging.error("Failed to open camera initially")
204+
self.error_signal.emit("Failed to open camera initially. Please check the camera connection.")
205+
return
206+
213207
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
214208
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 640)
215209
self.running = True
210+
216211
while not self.isInterruptionRequested():
217212
ret, frame = self.cap.read()
218213
if ret:
@@ -235,7 +230,7 @@ def run(self):
235230
detected_dict = {
236231
'Tespit Edilme Saati': datetime.strptime(tespit_zamani, "%Y-%m-%d %H:%M:%S"),
237232
'Tespit Durumu': tespit_durumu,
238-
'ID': 2
233+
'ID': 2 # Güncellenecek kaydın ID'si
239234
}
240235
db_thread = DatabaseThread(detected_dict, self.db_manager)
241236
db_thread.start()
@@ -254,11 +249,17 @@ def run(self):
254249
else:
255250
logging.warning("Cannot read frame from camera")
256251
self.stop()
257-
self.retry_connection()
252+
if not self.retry_connection():
253+
logging.error("Failed to reconnect to camera")
254+
self.error_signal.emit("Failed to reconnect to camera. Please check the camera connection.")
255+
break
256+
258257
self.cap.release()
259-
self.processing_frames = False
258+
self.processing_frames = False # Indicate that processing is done
259+
260260
except Exception as e:
261261
logging.error(f"Error in CameraThread: {e}")
262+
self.error_signal.emit(str(e))
262263
if self.cap:
263264
self.cap.release()
264265

@@ -271,26 +272,33 @@ def stop(self):
271272
logging.error(f"Error in CameraThread.stop: {e}")
272273

273274
def retry_connection(self):
274-
try:
275-
while not self.running:
275+
retry_count = 0
276+
max_retry_duration = 20 # seconds
277+
start_time = time.time()
278+
279+
while time.time() - start_time < max_retry_duration:
280+
try:
276281
logging.info("Attempting to reconnect to camera...")
277-
self.cap.release()
282+
if self.cap:
283+
self.cap.release()
278284
time.sleep(2)
279285
self.cap = cv2.VideoCapture(self.source)
280-
self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
281-
self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 640)
282286
if self.cap.isOpened():
283287
logging.info("Reconnected to camera")
284-
self.running = True
285-
break
288+
return True
286289
else:
287-
logging.warning("Failed to reconnect to camera")
288-
except Exception as e:
289-
logging.error(f"Error in CameraThread.retry_connection: {e}")
290+
logging.warning(f"Failed to reconnect to camera (attempt {retry_count + 1})")
291+
retry_count += 1
292+
except Exception as e:
293+
logging.error(f"Error in CameraThread.retry_connection: {e}")
294+
295+
logging.error("Failed to reconnect to camera after maximum retry duration. Please check the camera connection.")
296+
return False
290297

291298
def log_thread_finished(self):
292299
logging.info("CameraThread successfully finished.")
293300

301+
294302
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow):
295303
stop_signal = QtCore.pyqtSignal()
296304

@@ -326,8 +334,6 @@ def init_ui(self):
326334
self.model_box.addItems(['yolov8n', 'yolov8m', 'yolov8l', 'yolov8x'])
327335
self.model_box.currentTextChanged.connect(self.change_model)
328336

329-
self.camera_box.addItems(['your_rtsp_ip'])
330-
331337
self.open_camera.clicked.connect(self.start_camera)
332338
self.stop_camera.clicked.connect(self.stop_camera_stream)
333339
except Exception as e:
@@ -363,14 +369,11 @@ def change_model(self, model_name):
363369
def start_camera(self):
364370
try:
365371
if self.camera_thread is None:
366-
camera_source = self.camera_box.currentText()
367-
camera_url = 'rtsp://admin:admin1admin1@192.168.1.108:554/cam/realmonitor?channel=1&subtype=1'
368-
'''if camera_source == '0':
369-
camera_url = 0
370-
else:
371-
camera_url = camera_source'''
372-
373-
self.camera_thread = CameraThread(camera_url, self.yolo_model, self.latest_frame, self.db_manager)
372+
camera_source = self.camera_line.text()
373+
if camera_source.isdigit():
374+
camera_source = int(camera_source)
375+
self.camera_thread = CameraThread(camera_source, self.yolo_model, self.latest_frame, self.db_manager)
376+
self.camera_thread.error_signal.connect(self.show_error_message) # Connect error signal to slot
374377
time.sleep(0.2)
375378
self.camera_thread.change_pixmap_signal.connect(self.update_image)
376379
self.camera_thread.update_fps_signal.connect(self.update_fps)
@@ -471,6 +474,7 @@ def update_provider_label(self, provider):
471474

472475
def format_provider(self, provider_value):
473476
return f"<html><head/><body><p align=\"center\"><span style=\" font-size:12pt;\">PROVİDER</span></p><hr/><p align=\"center\"><span style=\" font-size:12pt;\">{provider_value}</span></p></body></html>"
477+
474478
def format_fps(self, fps_value):
475479
return f"<html><head/><body><p align=\"center\"><span style=\" font-size:12pt;\">Fps</span></p><hr/><p align=\"center\"><span style=\" font-size:12pt;\">{fps_value}</span></p></body></html>"
476480

@@ -480,6 +484,14 @@ def format_model(self, model_value):
480484
def format_person(self, person_value):
481485
return f"<html><head/><body><p align=\"center\"><span style=\" font-size:12pt;\">Detection Person</span></p><hr/><p align=\"center\"><span style=\" font-size:12pt;\">{person_value}</span></p></body></html>"
482486

487+
def show_error_message(self, message):
488+
self.stop_camera_stream() # Ensure all threads are terminated
489+
msg_box = QMessageBox()
490+
msg_box.setIcon(QMessageBox.Critical)
491+
msg_box.setText(message)
492+
msg_box.setWindowTitle("Camera Connection Error")
493+
msg_box.exec_()
494+
483495
try:
484496
if __name__ == "__main__":
485497
app = QtWidgets.QApplication(sys.argv)

0 commit comments

Comments
 (0)