Merge c1a6dc693d into f0fae811d8
				
					
				
			
						commit
						c74972ce0e
					
				|  | @ -799,73 +799,39 @@ def webcam_preview(root: ctk.CTk, camera_index: int): | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def get_available_cameras(): | def get_available_cameras(): | ||||||
|     """Returns a list of available camera names and indices.""" |     """ | ||||||
|  |     Safe camera detection for macOS and Unix-like systems that avoids threading and AVX crashes. | ||||||
|  |     Returns a tuple of (camera_indices, camera_names). | ||||||
|  |     """ | ||||||
|  |     import cv2 | ||||||
|  |     import platform | ||||||
|  | 
 | ||||||
|     if platform.system() == "Windows": |     if platform.system() == "Windows": | ||||||
|         try: |         try: | ||||||
|  |             from pygrabber.dshow_graph import FilterGraph | ||||||
|             graph = FilterGraph() |             graph = FilterGraph() | ||||||
|             devices = graph.get_input_devices() |             devices = graph.get_input_devices() | ||||||
| 
 |  | ||||||
|             # Create list of indices and names |  | ||||||
|             camera_indices = list(range(len(devices))) |             camera_indices = list(range(len(devices))) | ||||||
|             camera_names = devices |             camera_names = devices | ||||||
| 
 |  | ||||||
|             # If no cameras found through DirectShow, try OpenCV fallback |  | ||||||
|             if not camera_names: |  | ||||||
|                 # Try to open camera with index -1 and 0 |  | ||||||
|                 test_indices = [-1, 0] |  | ||||||
|                 working_cameras = [] |  | ||||||
| 
 |  | ||||||
|                 for idx in test_indices: |  | ||||||
|                     cap = cv2.VideoCapture(idx) |  | ||||||
|                     if cap.isOpened(): |  | ||||||
|                         working_cameras.append(f"Camera {idx}") |  | ||||||
|                         cap.release() |  | ||||||
| 
 |  | ||||||
|                 if working_cameras: |  | ||||||
|                     return test_indices[: len(working_cameras)], working_cameras |  | ||||||
| 
 |  | ||||||
|             # If still no cameras found, return empty lists |  | ||||||
|             if not camera_names: |             if not camera_names: | ||||||
|                 return [], ["No cameras found"] |                 return [], ["No cameras found"] | ||||||
| 
 |  | ||||||
|             return camera_indices, camera_names |             return camera_indices, camera_names | ||||||
| 
 |  | ||||||
|         except Exception as e: |         except Exception as e: | ||||||
|             print(f"Error detecting cameras: {str(e)}") |             print(f"[Camera Detection Error - Windows]: {e}") | ||||||
|             return [], ["No cameras found"] |             return [], ["No cameras found"] | ||||||
|     else: |  | ||||||
|         # Unix-like systems (Linux/Mac) camera detection |  | ||||||
|         camera_indices = [] |  | ||||||
|         camera_names = [] |  | ||||||
| 
 | 
 | ||||||
|         if platform.system() == "Darwin":  # macOS specific handling |     # macOS or Linux | ||||||
|             # Try to open the default FaceTime camera first |     try: | ||||||
|  |         print("[Info] Safely checking for available cameras...") | ||||||
|         cap = cv2.VideoCapture(0) |         cap = cv2.VideoCapture(0) | ||||||
|             if cap.isOpened(): |         if cap is None or not cap.isOpened(): | ||||||
|                 camera_indices.append(0) |             print("[Warning] Default camera (index 0) not available.") | ||||||
|                 camera_names.append("FaceTime Camera") |             return [], ["No cameras found"] | ||||||
|                 cap.release() |         cap.release() | ||||||
| 
 |         return [0], ["Default Camera (Index 0)"] | ||||||
|             # On macOS, additional cameras typically use indices 1 and 2 |     except Exception as e: | ||||||
|             for i in [1, 2]: |         print(f"[Camera Detection Error - Unix]: {e}") | ||||||
|                 cap = cv2.VideoCapture(i) |  | ||||||
|                 if cap.isOpened(): |  | ||||||
|                     camera_indices.append(i) |  | ||||||
|                     camera_names.append(f"Camera {i}") |  | ||||||
|                     cap.release() |  | ||||||
|         else: |  | ||||||
|             # Linux camera detection - test first 10 indices |  | ||||||
|             for i in range(10): |  | ||||||
|                 cap = cv2.VideoCapture(i) |  | ||||||
|                 if cap.isOpened(): |  | ||||||
|                     camera_indices.append(i) |  | ||||||
|                     camera_names.append(f"Camera {i}") |  | ||||||
|                     cap.release() |  | ||||||
| 
 |  | ||||||
|         if not camera_names: |  | ||||||
|         return [], ["No cameras found"] |         return [], ["No cameras found"] | ||||||
| 
 |  | ||||||
|         return camera_indices, camera_names |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| def create_webcam_preview(camera_index: int): | def create_webcam_preview(camera_index: int): | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue