Clean push: Removed heavy files & added only latest snapshot
This commit is contained in:
210
qt_app_pyside1/update_controller.py
Normal file
210
qt_app_pyside1/update_controller.py
Normal file
@@ -0,0 +1,210 @@
|
||||
"""
|
||||
Update main window to use enhanced video controller with async inference.
|
||||
This module provides functions to inject optimized controllers into an existing Qt app.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import time
|
||||
from pathlib import Path
|
||||
|
||||
# Add parent directory to path
|
||||
parent_dir = Path(__file__).parent.parent
|
||||
if str(parent_dir) not in sys.path:
|
||||
sys.path.append(str(parent_dir))
|
||||
|
||||
# These imports will work when the script is run inside the Qt app
|
||||
try:
|
||||
from PySide6.QtWidgets import QApplication, QMessageBox, QTabWidget, QWidget
|
||||
from PySide6.QtCore import Qt
|
||||
# Import our enhanced controller
|
||||
from controllers.enhanced_video_controller import EnhancedVideoController
|
||||
from controllers.model_manager import ModelManager
|
||||
except ImportError:
|
||||
# For linting/development outside the app
|
||||
print("Note: PySide6 imports not available outside of Qt app environment")
|
||||
|
||||
def update_main_window():
|
||||
"""
|
||||
Update main window to use enhanced video controller with async inference.
|
||||
|
||||
This function finds the running MainWindow instance and injects our enhanced
|
||||
video controller with async inference support.
|
||||
"""
|
||||
try:
|
||||
print("\n" + "="*80)
|
||||
print("Enhancing Video Controller with Async Inference")
|
||||
print("="*80)
|
||||
|
||||
# Find the Qt application instance
|
||||
app = QApplication.instance()
|
||||
if not app:
|
||||
print("❌ QApplication instance not found!")
|
||||
return False
|
||||
|
||||
# Find main window instance
|
||||
for widget in app.topLevelWidgets():
|
||||
if widget.__class__.__name__ == "MainWindow":
|
||||
main_window = widget
|
||||
break
|
||||
else:
|
||||
print("❌ Main window not found!")
|
||||
return False
|
||||
|
||||
# Find the tab widget and live tab
|
||||
tab_widget = None
|
||||
for child in main_window.children():
|
||||
if isinstance(child, QTabWidget):
|
||||
tab_widget = child
|
||||
break
|
||||
|
||||
if not tab_widget:
|
||||
print("❌ Tab widget not found!")
|
||||
return False
|
||||
|
||||
# Find live tab
|
||||
live_tab = None
|
||||
for i in range(tab_widget.count()):
|
||||
if tab_widget.tabText(i).lower() == "live":
|
||||
live_tab = tab_widget.widget(i)
|
||||
break
|
||||
|
||||
if not live_tab:
|
||||
print("❌ Live tab not found!")
|
||||
return False
|
||||
# Get the configuration panel to read current device and model settings
|
||||
config_panel = None
|
||||
for widget in main_window.findChildren(QWidget):
|
||||
if widget.__class__.__name__ == "ConfigPanel":
|
||||
config_panel = widget
|
||||
break
|
||||
|
||||
# Initialize the model manager with optimized settings for CPU
|
||||
model_manager = ModelManager()
|
||||
|
||||
# Update model manager with best model for CPU
|
||||
if config_panel:
|
||||
# Get the device selection from config panel
|
||||
device_combo = None
|
||||
for child in config_panel.children():
|
||||
if hasattr(child, 'currentText') and child.objectName() == "device_combo":
|
||||
device_combo = child
|
||||
break
|
||||
|
||||
if device_combo:
|
||||
print(f"✅ Found device selection: current = {device_combo.currentText()}")
|
||||
# Make sure CPU is selected when on CPU hardware
|
||||
if device_combo.currentText() != "CPU":
|
||||
print("⚠️ Switching to CPU for optimal performance...")
|
||||
device_combo.setCurrentText("CPU")
|
||||
|
||||
# Force update config
|
||||
if hasattr(config_panel, 'apply_config'):
|
||||
config_panel.apply_config()
|
||||
|
||||
# Create enhanced video controller with async support
|
||||
print("🚀 Creating enhanced video controller with async inference...")
|
||||
enhanced_controller = EnhancedVideoController(model_manager)
|
||||
|
||||
# Find the frame display widget (might have different names in different implementations)
|
||||
frame_display = None
|
||||
for widget in live_tab.findChildren(QWidget):
|
||||
if hasattr(widget, 'display_frame'):
|
||||
frame_display = widget
|
||||
break
|
||||
|
||||
if not frame_display:
|
||||
print("⚠️ Frame display widget not found by method. Searching by common names...")
|
||||
for name in ["frame_display", "liveDisplay", "videoDisplay"]:
|
||||
widget = live_tab.findChild(QWidget, name)
|
||||
if widget and hasattr(widget, 'display_frame'):
|
||||
frame_display = widget
|
||||
break
|
||||
|
||||
if frame_display:
|
||||
print(f"✅ Found frame display widget: {frame_display}")
|
||||
enhanced_controller.frame_ready.connect(frame_display.display_frame)
|
||||
else:
|
||||
print("❌ Could not find frame display widget!")
|
||||
return False # Get current source if available, otherwise use default camera
|
||||
if hasattr(live_tab, 'current_source') and live_tab.current_source is not None:
|
||||
print(f"✅ Using existing source from live_tab: {live_tab.current_source}")
|
||||
# Check if it's a file path and if it exists
|
||||
if isinstance(live_tab.current_source, str) and os.path.exists(live_tab.current_source):
|
||||
print(f"🎥 Setting video file source: {live_tab.current_source}")
|
||||
enhanced_controller.set_source(live_tab.current_source)
|
||||
elif live_tab.current_source != 0:
|
||||
print(f"🎥 Setting non-default source: {live_tab.current_source}")
|
||||
enhanced_controller.set_source(live_tab.current_source)
|
||||
else:
|
||||
print("⚠️ Source is default camera (0)")
|
||||
enhanced_controller.set_source(0)
|
||||
else:
|
||||
# Check if there's a video source combo box
|
||||
source_combo = None
|
||||
for child in live_tab.children():
|
||||
if hasattr(child, 'currentData') and child.objectName() == "source_combo":
|
||||
source_combo = child
|
||||
break
|
||||
|
||||
if source_combo and source_combo.currentData() == "file":
|
||||
print("⚠️ File source selected but no file path found. Prompting user...")
|
||||
# Try to open file dialog
|
||||
if hasattr(live_tab, 'browse_files'):
|
||||
print("🔍 Calling browse_files()")
|
||||
QTimer.singleShot(500, live_tab.browse_files) # Open file dialog after UI is ready
|
||||
else:
|
||||
print("⚠️ No source found, using default camera")
|
||||
enhanced_controller.set_source(0)
|
||||
else:
|
||||
print("⚠️ No source found, using default camera")
|
||||
enhanced_controller.set_source(0)
|
||||
|
||||
# Stop old controller if it exists
|
||||
if hasattr(live_tab, "video_controller") and live_tab.video_controller:
|
||||
print("⏹️ Stopping old video controller...")
|
||||
try:
|
||||
live_tab.video_controller.stop()
|
||||
except Exception as e:
|
||||
print(f"⚠️ Error stopping old controller: {e}")
|
||||
|
||||
# Replace with enhanced controller
|
||||
live_tab.video_controller = enhanced_controller
|
||||
# Start the enhanced controller
|
||||
print("▶️ Starting enhanced video controller...")
|
||||
enhanced_controller.start()
|
||||
|
||||
# Show success message
|
||||
print("✅ Enhanced video controller successfully activated!")
|
||||
QMessageBox.information(
|
||||
main_window,
|
||||
"Enhanced Video Processing",
|
||||
"Enhanced video controller with async inference activated!\n\n"
|
||||
"✅ Using FP16 precision for optimal CPU performance\n"
|
||||
"✅ Async inference pipeline activated\n"
|
||||
"✅ UI and detection FPS are now tracked separately\n"
|
||||
"✅ Automatic model selection based on device\n"
|
||||
"✅ OpenVINO embedder for DeepSORT tracking"
|
||||
)
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ Error updating main window: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
return False
|
||||
|
||||
def main():
|
||||
"""
|
||||
Run this script from within the Qt app to inject our enhanced controller.
|
||||
"""
|
||||
success = update_main_window()
|
||||
if success:
|
||||
print("✅ Update completed successfully!")
|
||||
else:
|
||||
print("❌ Update failed!")
|
||||
return success
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user