{ "cells": [ { "cell_type": "code", "execution_count": 25, "id": "ba958c88", "metadata": {}, "outputs": [], "source": [ "# coding=utf-8\n", "\"\"\"\n", "Test script to help find optimal exposure settings for your GigE camera.\n", "This script captures a single test image with different exposure settings.\n", "\"\"\"\n", "import sys\n", "\n", "sys.path.append(\"./python demo\")\n", "import os\n", "import mvsdk\n", "import numpy as np\n", "import cv2\n", "import platform\n", "from datetime import datetime\n", "\n", "# Add the python demo directory to path\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "23f1dc49", "metadata": {}, "outputs": [], "source": [ "def test_exposure_settings():\n", " \"\"\"\n", " Test different exposure settings to find optimal values\n", " \"\"\"\n", " # Initialize SDK\n", " try:\n", " mvsdk.CameraSdkInit(1)\n", " print(\"SDK initialized successfully\")\n", " except Exception as e:\n", " print(f\"SDK initialization failed: {e}\")\n", " return False\n", "\n", " # Enumerate cameras\n", " DevList = mvsdk.CameraEnumerateDevice()\n", " nDev = len(DevList)\n", "\n", " if nDev < 1:\n", " print(\"No camera was found!\")\n", " return False\n", "\n", " print(f\"Found {nDev} camera(s):\")\n", " for i, DevInfo in enumerate(DevList):\n", " print(f\" {i}: {DevInfo.GetFriendlyName()} ({DevInfo.GetPortType()})\")\n", "\n", " # Use first camera\n", " DevInfo = DevList[0]\n", " print(f\"\\nSelected camera: {DevInfo.GetFriendlyName()}\")\n", "\n", " # Initialize camera\n", " try:\n", " hCamera = mvsdk.CameraInit(DevInfo, -1, -1)\n", " print(\"Camera initialized successfully\")\n", " except mvsdk.CameraException as e:\n", " print(f\"CameraInit Failed({e.error_code}): {e.message}\")\n", " return False\n", "\n", " try:\n", " # Get camera capabilities\n", " cap = mvsdk.CameraGetCapability(hCamera)\n", " monoCamera = cap.sIspCapacity.bMonoSensor != 0\n", " print(f\"Camera type: {'Monochrome' if monoCamera else 'Color'}\")\n", "\n", " # Get camera ranges\n", " try:\n", " exp_min, exp_max, exp_step = mvsdk.CameraGetExposureTimeRange(hCamera)\n", " print(f\"Exposure time range: {exp_min:.1f} - {exp_max:.1f} μs\")\n", "\n", " gain_min, gain_max, gain_step = mvsdk.CameraGetAnalogGainXRange(hCamera)\n", " print(f\"Analog gain range: {gain_min:.2f} - {gain_max:.2f}x\")\n", "\n", " print(\"whatever this is: \", mvsdk.CameraGetAnalogGainXRange(hCamera))\n", " except Exception as e:\n", " print(f\"Could not get camera ranges: {e}\")\n", " exp_min, exp_max = 100, 100000\n", " gain_min, gain_max = 1.0, 4.0\n", "\n", " # Set output format\n", " if monoCamera:\n", " mvsdk.CameraSetIspOutFormat(hCamera, mvsdk.CAMERA_MEDIA_TYPE_MONO8)\n", " else:\n", " mvsdk.CameraSetIspOutFormat(hCamera, mvsdk.CAMERA_MEDIA_TYPE_BGR8)\n", "\n", " # Set camera to continuous capture mode\n", " mvsdk.CameraSetTriggerMode(hCamera, 0)\n", " mvsdk.CameraSetAeState(hCamera, 0) # Disable auto exposure\n", "\n", " # Start camera\n", " mvsdk.CameraPlay(hCamera)\n", "\n", " # Allocate frame buffer\n", " FrameBufferSize = cap.sResolutionRange.iWidthMax * cap.sResolutionRange.iHeightMax * (1 if monoCamera else 3)\n", " pFrameBuffer = mvsdk.CameraAlignMalloc(FrameBufferSize, 16)\n", "\n", " # Create test directory\n", " if not os.path.exists(\"exposure_tests\"):\n", " os.makedirs(\"exposure_tests\")\n", "\n", " print(\"\\nTesting different exposure settings...\")\n", " print(\"=\" * 50)\n", "\n", " # Test different exposure times (in microseconds)\n", " exposure_times = [100, 200, 500, 1000, 2000, 5000, 10000, 20000] # 0.5ms to 20ms\n", " analog_gains = [2.5, 5.0, 10.0, 16.0] # Start with 1x gain\n", "\n", " test_count = 0\n", " for exp_time in exposure_times:\n", " for gain in analog_gains:\n", " # Clamp values to valid ranges\n", " exp_time = max(exp_min, min(exp_max, exp_time))\n", " gain = max(gain_min, min(gain_max, gain))\n", "\n", " print(f\"\\nTest {test_count + 1}: Exposure={exp_time/1000:.1f}ms, Gain={gain:.1f}x\")\n", "\n", " # Set camera parameters\n", " mvsdk.CameraSetExposureTime(hCamera, exp_time)\n", " try:\n", " mvsdk.CameraSetAnalogGainX(hCamera, gain)\n", " except:\n", " pass # Some cameras might not support this\n", "\n", " # Wait a moment for settings to take effect\n", " import time\n", "\n", " time.sleep(0.1)\n", "\n", " # Capture image\n", " try:\n", " pRawData, FrameHead = mvsdk.CameraGetImageBuffer(hCamera, 2000)\n", " mvsdk.CameraImageProcess(hCamera, pRawData, pFrameBuffer, FrameHead)\n", " mvsdk.CameraReleaseImageBuffer(hCamera, pRawData)\n", "\n", " # Handle Windows image flip\n", " if platform.system() == \"Windows\":\n", " mvsdk.CameraFlipFrameBuffer(pFrameBuffer, FrameHead, 1)\n", "\n", " # Convert to numpy array\n", " frame_data = (mvsdk.c_ubyte * FrameHead.uBytes).from_address(pFrameBuffer)\n", " frame = np.frombuffer(frame_data, dtype=np.uint8)\n", "\n", " if FrameHead.uiMediaType == mvsdk.CAMERA_MEDIA_TYPE_MONO8:\n", " frame = frame.reshape((FrameHead.iHeight, FrameHead.iWidth))\n", " else:\n", " frame = frame.reshape((FrameHead.iHeight, FrameHead.iWidth, 3))\n", "\n", " # Calculate image statistics\n", " mean_brightness = np.mean(frame)\n", " max_brightness = np.max(frame)\n", "\n", " # Save image\n", " filename = f\"exposure_tests/test_{test_count+1:02d}_exp{exp_time/1000:.1f}ms_gain{gain:.1f}x.jpg\"\n", " cv2.imwrite(filename, frame)\n", "\n", " # Provide feedback\n", " status = \"\"\n", " if mean_brightness < 50:\n", " status = \"TOO DARK\"\n", " elif mean_brightness > 200:\n", " status = \"TOO BRIGHT\"\n", " elif max_brightness >= 255:\n", " status = \"OVEREXPOSED\"\n", " else:\n", " status = \"GOOD\"\n", "\n", " print(f\" → Saved: {filename}\")\n", " print(f\" → Brightness: mean={mean_brightness:.1f}, max={max_brightness:.1f} [{status}]\")\n", "\n", " test_count += 1\n", "\n", " except mvsdk.CameraException as e:\n", " print(f\" → Failed to capture: {e.message}\")\n", "\n", " print(f\"\\nCompleted {test_count} test captures!\")\n", " print(\"Check the 'exposure_tests' directory to see the results.\")\n", " print(\"\\nRecommendations:\")\n", " print(\"- Look for images marked as 'GOOD' - these have optimal exposure\")\n", " print(\"- If all images are 'TOO BRIGHT', try lower exposure times or gains\")\n", " print(\"- If all images are 'TOO DARK', try higher exposure times or gains\")\n", " print(\"- Avoid 'OVEREXPOSED' images as they have clipped highlights\")\n", "\n", " # Cleanup\n", " mvsdk.CameraAlignFree(pFrameBuffer)\n", "\n", " finally:\n", " # Close camera\n", " mvsdk.CameraUnInit(hCamera)\n", " print(\"\\nCamera closed\")\n", "\n", " return True" ] }, { "cell_type": "code", "execution_count": 27, "id": "2891b5bf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "GigE Camera Exposure Test Script\n", "========================================\n", "This script will test different exposure settings and save sample images.\n", "Use this to find the optimal settings for your lighting conditions.\n", "\n", "SDK initialized successfully\n", "Found 2 camera(s):\n", " 0: Blower-Yield-Cam (NET-100M-192.168.1.204)\n", " 1: Cracker-Cam (NET-1000M-192.168.1.246)\n", "\n", "Selected camera: Blower-Yield-Cam\n", "Camera initialized successfully\n", "Camera type: Color\n", "Exposure time range: 8.0 - 1048568.0 μs\n", "Analog gain range: 2.50 - 16.50x\n", "whatever this is: (2.5, 16.5, 0.5)\n", "\n", "Testing different exposure settings...\n", "==================================================\n", "\n", "Test 1: Exposure=0.1ms, Gain=2.5x\n", " → Saved: exposure_tests/test_01_exp0.1ms_gain2.5x.jpg\n", " → Brightness: mean=94.1, max=255.0 [OVEREXPOSED]\n", "\n", "Test 2: Exposure=0.1ms, Gain=5.0x\n", " → Saved: exposure_tests/test_02_exp0.1ms_gain5.0x.jpg\n", " → Brightness: mean=13.7, max=173.0 [TOO DARK]\n", "\n", "Test 3: Exposure=0.1ms, Gain=10.0x\n", " → Saved: exposure_tests/test_03_exp0.1ms_gain10.0x.jpg\n", " → Brightness: mean=14.1, max=255.0 [TOO DARK]\n", "\n", "Test 4: Exposure=0.1ms, Gain=16.0x\n", " → Saved: exposure_tests/test_04_exp0.1ms_gain16.0x.jpg\n", " → Brightness: mean=18.2, max=255.0 [TOO DARK]\n", "\n", "Test 5: Exposure=0.2ms, Gain=2.5x\n", " → Saved: exposure_tests/test_05_exp0.2ms_gain2.5x.jpg\n", " → Brightness: mean=22.1, max=255.0 [TOO DARK]\n", "\n", "Test 6: Exposure=0.2ms, Gain=5.0x\n", " → Saved: exposure_tests/test_06_exp0.2ms_gain5.0x.jpg\n", " → Brightness: mean=19.5, max=255.0 [TOO DARK]\n", "\n", "Test 7: Exposure=0.2ms, Gain=10.0x\n", " → Saved: exposure_tests/test_07_exp0.2ms_gain10.0x.jpg\n", " → Brightness: mean=25.3, max=255.0 [TOO DARK]\n", "\n", "Test 8: Exposure=0.2ms, Gain=16.0x\n", " → Saved: exposure_tests/test_08_exp0.2ms_gain16.0x.jpg\n", " → Brightness: mean=36.6, max=255.0 [TOO DARK]\n", "\n", "Test 9: Exposure=0.5ms, Gain=2.5x\n", " → Saved: exposure_tests/test_09_exp0.5ms_gain2.5x.jpg\n", " → Brightness: mean=55.8, max=255.0 [OVEREXPOSED]\n", "\n", "Test 10: Exposure=0.5ms, Gain=5.0x\n", " → Saved: exposure_tests/test_10_exp0.5ms_gain5.0x.jpg\n", " → Brightness: mean=38.5, max=255.0 [TOO DARK]\n", "\n", "Test 11: Exposure=0.5ms, Gain=10.0x\n", " → Saved: exposure_tests/test_11_exp0.5ms_gain10.0x.jpg\n", " → Brightness: mean=60.2, max=255.0 [OVEREXPOSED]\n", "\n", "Test 12: Exposure=0.5ms, Gain=16.0x\n", " → Saved: exposure_tests/test_12_exp0.5ms_gain16.0x.jpg\n", " → Brightness: mean=99.3, max=255.0 [OVEREXPOSED]\n", "\n", "Test 13: Exposure=1.0ms, Gain=2.5x\n", " → Saved: exposure_tests/test_13_exp1.0ms_gain2.5x.jpg\n", " → Brightness: mean=121.1, max=255.0 [OVEREXPOSED]\n", "\n", "Test 14: Exposure=1.0ms, Gain=5.0x\n", " → Saved: exposure_tests/test_14_exp1.0ms_gain5.0x.jpg\n", " → Brightness: mean=68.8, max=255.0 [OVEREXPOSED]\n", "\n", "Test 15: Exposure=1.0ms, Gain=10.0x\n", " → Saved: exposure_tests/test_15_exp1.0ms_gain10.0x.jpg\n", " → Brightness: mean=109.6, max=255.0 [OVEREXPOSED]\n", "\n", "Test 16: Exposure=1.0ms, Gain=16.0x\n", " → Saved: exposure_tests/test_16_exp1.0ms_gain16.0x.jpg\n", " → Brightness: mean=148.7, max=255.0 [OVEREXPOSED]\n", "\n", "Test 17: Exposure=2.0ms, Gain=2.5x\n", " → Saved: exposure_tests/test_17_exp2.0ms_gain2.5x.jpg\n", " → Brightness: mean=171.9, max=255.0 [OVEREXPOSED]\n", "\n", "Test 18: Exposure=2.0ms, Gain=5.0x\n", " → Saved: exposure_tests/test_18_exp2.0ms_gain5.0x.jpg\n", " → Brightness: mean=117.9, max=255.0 [OVEREXPOSED]\n", "\n", "Test 19: Exposure=2.0ms, Gain=10.0x\n", " → Saved: exposure_tests/test_19_exp2.0ms_gain10.0x.jpg\n", " → Brightness: mean=159.0, max=255.0 [OVEREXPOSED]\n", "\n", "Test 20: Exposure=2.0ms, Gain=16.0x\n", " → Saved: exposure_tests/test_20_exp2.0ms_gain16.0x.jpg\n", " → Brightness: mean=195.7, max=255.0 [OVEREXPOSED]\n", "\n", "Test 21: Exposure=5.0ms, Gain=2.5x\n", " → Saved: exposure_tests/test_21_exp5.0ms_gain2.5x.jpg\n", " → Brightness: mean=214.6, max=255.0 [TOO BRIGHT]\n", "\n", "Test 22: Exposure=5.0ms, Gain=5.0x\n", " → Saved: exposure_tests/test_22_exp5.0ms_gain5.0x.jpg\n", " → Brightness: mean=180.2, max=255.0 [OVEREXPOSED]\n", "\n", "Test 23: Exposure=5.0ms, Gain=10.0x\n", " → Saved: exposure_tests/test_23_exp5.0ms_gain10.0x.jpg\n", " → Brightness: mean=214.6, max=255.0 [TOO BRIGHT]\n", "\n", "Test 24: Exposure=5.0ms, Gain=16.0x\n", " → Saved: exposure_tests/test_24_exp5.0ms_gain16.0x.jpg\n", " → Brightness: mean=239.6, max=255.0 [TOO BRIGHT]\n", "\n", "Test 25: Exposure=10.0ms, Gain=2.5x\n", " → Saved: exposure_tests/test_25_exp10.0ms_gain2.5x.jpg\n", " → Brightness: mean=247.5, max=255.0 [TOO BRIGHT]\n", "\n", "Test 26: Exposure=10.0ms, Gain=5.0x\n", " → Saved: exposure_tests/test_26_exp10.0ms_gain5.0x.jpg\n", " → Brightness: mean=252.4, max=255.0 [TOO BRIGHT]\n", "\n", "Test 27: Exposure=10.0ms, Gain=10.0x\n", " → Saved: exposure_tests/test_27_exp10.0ms_gain10.0x.jpg\n", " → Brightness: mean=218.9, max=255.0 [TOO BRIGHT]\n", "\n", "Test 28: Exposure=10.0ms, Gain=16.0x\n", " → Saved: exposure_tests/test_28_exp10.0ms_gain16.0x.jpg\n", " → Brightness: mean=250.8, max=255.0 [TOO BRIGHT]\n", "\n", "Test 29: Exposure=20.0ms, Gain=2.5x\n", " → Saved: exposure_tests/test_29_exp20.0ms_gain2.5x.jpg\n", " → Brightness: mean=252.4, max=255.0 [TOO BRIGHT]\n", "\n", "Test 30: Exposure=20.0ms, Gain=5.0x\n", " → Saved: exposure_tests/test_30_exp20.0ms_gain5.0x.jpg\n", " → Brightness: mean=244.4, max=255.0 [TOO BRIGHT]\n", "\n", "Test 31: Exposure=20.0ms, Gain=10.0x\n", " → Saved: exposure_tests/test_31_exp20.0ms_gain10.0x.jpg\n", " → Brightness: mean=251.5, max=255.0 [TOO BRIGHT]\n", "\n", "Test 32: Exposure=20.0ms, Gain=16.0x\n", " → Saved: exposure_tests/test_32_exp20.0ms_gain16.0x.jpg\n", " → Brightness: mean=253.4, max=255.0 [TOO BRIGHT]\n", "\n", "Completed 32 test captures!\n", "Check the 'exposure_tests' directory to see the results.\n", "\n", "Recommendations:\n", "- Look for images marked as 'GOOD' - these have optimal exposure\n", "- If all images are 'TOO BRIGHT', try lower exposure times or gains\n", "- If all images are 'TOO DARK', try higher exposure times or gains\n", "- Avoid 'OVEREXPOSED' images as they have clipped highlights\n", "\n", "Camera closed\n", "\n", "Testing completed successfully!\n" ] } ], "source": [ "\n", "\n", "if __name__ == \"__main__\":\n", " print(\"GigE Camera Exposure Test Script\")\n", " print(\"=\" * 40)\n", " print(\"This script will test different exposure settings and save sample images.\")\n", " print(\"Use this to find the optimal settings for your lighting conditions.\")\n", " print()\n", "\n", " success = test_exposure_settings()\n", "\n", " if success:\n", " print(\"\\nTesting completed successfully!\")\n", " else:\n", " print(\"\\nTesting failed!\")\n" ] }, { "cell_type": "code", "execution_count": null, "id": "ead8d889", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "cc_pecan", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }