update tracker

This commit is contained in:
Pongsatorn 2025-08-20 21:26:54 +07:00
parent a54da904f7
commit 3a4a27ca68
7 changed files with 1405 additions and 84 deletions

View file

@ -0,0 +1,142 @@
#!/usr/bin/env python3
"""
Test script to check available camera indices
"""
import cv2
import logging
import sys
import subprocess
# Configure logging
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
)
logger = logging.getLogger("camera_index_test")
def test_camera_index(index):
"""Test if a camera index is available"""
try:
cap = cv2.VideoCapture(index)
if cap.isOpened():
ret, frame = cap.read()
if ret and frame is not None:
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
cap.release()
return True, f"{width}x{height} @ {fps}fps"
else:
cap.release()
return False, "Can open but cannot read frames"
else:
cap.release()
return False, "Cannot open camera"
except Exception as e:
return False, f"Error: {str(e)}"
def get_windows_cameras_ffmpeg():
"""Get available cameras on Windows using FFmpeg"""
try:
result = subprocess.run(['ffmpeg', '-f', 'dshow', '-list_devices', 'true', '-i', 'dummy'],
capture_output=True, text=True, timeout=10, encoding='utf-8', errors='ignore')
output = result.stderr
lines = output.split('\n')
video_devices = []
# Parse the output - look for lines with (video) that contain device names in quotes
for line in lines:
if '[dshow @' in line and '(video)' in line and '"' in line:
# Extract device name between first pair of quotes
start = line.find('"') + 1
end = line.find('"', start)
if start > 0 and end > start:
device_name = line[start:end]
video_devices.append(device_name)
logger.info(f"FFmpeg detected video devices: {video_devices}")
return video_devices
except Exception as e:
logger.error(f"Failed to get Windows camera names: {e}")
return []
def main():
logger.info("=== Camera Index Test ===")
# Check FFmpeg availability for Windows device detection
ffmpeg_available = False
try:
result = subprocess.run(['ffmpeg', '-version'], capture_output=True, text=True, timeout=5)
if result.returncode == 0:
ffmpeg_available = True
logger.info("FFmpeg is available")
except:
logger.info("FFmpeg not available")
# Get Windows camera names if possible
if sys.platform.startswith('win') and ffmpeg_available:
logger.info("\n=== Windows Camera Devices (FFmpeg) ===")
cameras = get_windows_cameras_ffmpeg()
if cameras:
for i, camera in enumerate(cameras):
logger.info(f"Device {i}: {camera}")
else:
logger.info("No cameras detected via FFmpeg")
# Test camera indices 0-9
logger.info("\n=== Testing Camera Indices ===")
available_cameras = []
for index in range(10):
logger.info(f"Testing camera index {index}...")
is_available, info = test_camera_index(index)
if is_available:
logger.info(f"✓ Camera {index}: AVAILABLE - {info}")
available_cameras.append(index)
else:
logger.info(f"✗ Camera {index}: NOT AVAILABLE - {info}")
# Summary
logger.info("\n=== Summary ===")
if available_cameras:
logger.info(f"Available camera indices: {available_cameras}")
logger.info(f"Default camera index to use: {available_cameras[0]}")
# Test the first available camera more thoroughly
logger.info(f"\n=== Detailed Test for Camera {available_cameras[0]} ===")
cap = cv2.VideoCapture(available_cameras[0])
if cap.isOpened():
# Get properties
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
fps = cap.get(cv2.CAP_PROP_FPS)
backend = cap.getBackendName()
logger.info(f"Resolution: {width}x{height}")
logger.info(f"FPS: {fps}")
logger.info(f"Backend: {backend}")
# Test frame capture
ret, frame = cap.read()
if ret and frame is not None:
logger.info(f"Frame capture: SUCCESS")
logger.info(f"Frame shape: {frame.shape}")
logger.info(f"Frame dtype: {frame.dtype}")
else:
logger.info(f"Frame capture: FAILED")
cap.release()
else:
logger.error("No cameras available!")
logger.info("Possible solutions:")
logger.info("1. Check if camera is connected and not used by another application")
logger.info("2. Check camera permissions")
logger.info("3. Try different camera indices")
logger.info("4. Install camera drivers")
if __name__ == "__main__":
main()