uvscada:gxs700
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revision | |||
| uvscada:gxs700 [2017/12/31 19:19] – [Calibration] mcmaster | uvscada:gxs700 [2020/09/16 06:57] (current) – removed mcmaster | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | Quick start guide to getting the sensor working. | ||
| - | |||
| - | - Install software | ||
| - | - Force a capture to verify the sensor works | ||
| - | - Fire x-rays at sensor to test full functionality | ||
| - | |||
| - | [[https:// | ||
| - | |||
| - | [[https:// | ||
| - | |||
| - | ====== WARNING ====== | ||
| - | |||
| - | x-rays are dangerous…make sure you know what you are doing. | ||
| - | |||
| - | ====== Supported devices ====== | ||
| - | |||
| - | ^ Image ^ Vendor | ||
| - | | | Gendex | ||
| - | | | Gendex | ||
| - | | | Dexis | Platinum | ||
| - | | | Dexis | Plus 690 | Probably | ||
| - | |||
| - | I don't know if any other vendors (ex: schick) use the same hardware | ||
| - | |||
| - | |||
| - | ====== Installation ====== | ||
| - | |||
| - | Prereq: | ||
| - | |||
| - | * Linux | ||
| - | * Tested on Ubuntu 12.04 x64, Ubuntu 16.04 x64 | ||
| - | * USB port (duh) | ||
| - | * A supported sensor | ||
| - | * x-ray source: not needed for initial setup | ||
| - | * You DO NOT need calibration files | ||
| - | * See below for details | ||
| - | |||
| - | "$ cmd" means type " | ||
| - | |||
| - | Do (I'll improve this as people run into problems): | ||
| - | |||
| - | - $ sudo apt-get install -y git python-pip | ||
| - | * Also maybe: sudo apt-get install -y python-serial python-numpy python-PIL | ||
| - | - $ sudo pip install libusb1 | ||
| - | - $ git clone [[https:// | ||
| - | - $ cd uvscada | ||
| - | - $ ln -s $PWD/ | ||
| - | - $ ./ | ||
| - | - Plug in your sensor to the USB port | ||
| - | * Re-plug it if its already plugged in | ||
| - | - $ python gxs700/ | ||
| - | * Optional (highly recommended): | ||
| - | - $ python gxs700/ | ||
| - | * Optional: test sensor by forcing a capture | ||
| - | |||
| - | |||
| - | ====== Force capture ====== | ||
| - | |||
| - | This step tests the sensor without actually firing x-rays at it. This is also useful for calibrating sensor defects | ||
| - | |||
| - | {{: | ||
| - | |||
| - | - $ python gxs700/ | ||
| - | - Check which you got: | ||
| - | * Waiting for image: expected response. | ||
| - | * " | ||
| - | - It should have written capture_000_e.png to the current directory | ||
| - | - You should see an image roughly resembling the noise of the reference above. | ||
| - | |||
| - | ====== X-ray capture ====== | ||
| - | |||
| - | {{: | ||
| - | |||
| - | Suggest you force a capture first to verify your sensor is working | ||
| - | |||
| - | - $ python gxs700/ | ||
| - | - Verify it says " | ||
| - | - Fire your x-ray source | ||
| - | - It should notice the x-rays and begin downloading an image | ||
| - | - It should have written capture_000.png to the current directory | ||
| - | - Currently also writes capture_000.bin but will probably remove this soon | ||
| - | - You have your first x-ray! | ||
| - | |||
| - | ====== Diagnostic dump ====== | ||
| - | |||
| - | Please do this and send me the result. | ||
| - | |||
| - | - $ python gxs700/ | ||
| - | |||
| - | Send me the directory " | ||
| - | |||
| - | [[https:// | ||
| - | |||
| - | |||
| - | ====== Troubleshooting ====== | ||
| - | |||
| - | Troubleshooting: | ||
| - | |||
| - | * Couldn' | ||
| - | * Did you run the udev permission script? | ||
| - | * Try re-plugging it in and/or restarting Linux system | ||
| - | * VM: did you connect USB to the guest? | ||
| - | * Didn't detect x-rays | ||
| - | * Can you turn up current higher? | ||
| - | * Only recently added mA monitoring…don' | ||
| - | * Too high or low kVp? | ||
| - | * 60 kVp is a good place to start | ||
| - | |||
| - | Known issues: | ||
| - | |||
| - | * Multiple sensors are not supported | ||
| - | * Would slightly increase software complexity and no use case today for that | ||
| - | * The small sensor is not supported | ||
| - | * Dexis untested | ||
| - | * Really, only tested against my one sensor | ||
| - | * Usually can be interrupted but sometimes will fail init if it is | ||
| - | * Workaround: re-plug the USB port | ||
| - | |||
| - | Misc: | ||
| - | |||
| - | * USB speed limits frame rate to something like 0.3 FPS…don' | ||
| - | * Currently doesn' | ||
| - | * .bin file is raw output. | ||
| - | * Image decoding can probably be made much faster but usually I don't care | ||
| - | * For long runs (ex: CBCT) I'm waiting for sensor to cool anyway | ||
| - | |||
| - | See also: GXS700 general troubleshooting | ||
| - | |||
| - | ====== Decoding ====== | ||
| - | |||
| - | decode.py has a " | ||
| - | |||
| - | Example | ||
| - | |||
| - | < | ||
| - | $ python decode.py -e capture_004.bin capture_004e.png | ||
| - | </ | ||
| - | |||
| - | NOTE: future revisions may require .png input instead of .bin | ||
| - | |||
| - | ====== x-ray trigger ====== | ||
| - | |||
| - | I haven' | ||
| - | |||
| - | ====== x-ray fire ====== | ||
| - | |||
| - | I use a Gendex GE-100 x-ray head. I've found these readily available for <$75 on both eBay and Craigslist. | ||
| - | |||
| - | I control the setup via a DLI WPS7. When wired correctly: | ||
| - | |||
| - | * Outlet 1: HV | ||
| - | * Outlet 2: filament | ||
| - | |||
| - | do something like: | ||
| - | |||
| - | < | ||
| - | $ WPS7_HOST=wpsip WPS7_PASS=mypassword python fire.py | ||
| - | </ | ||
| - | |||
| - | to fire an x-ray (ie when the sensor is armed. | ||
| - | |||
| - | Note: you can also set these environment variables in files like .bashrc so you don't have to type them for each command | ||
| - | |||
| - | I recommend you use a hard wired ethernet line and have a way to cut power to the switch remotely if it fails. | ||
| - | |||
| - | TODO: use WPS7 scripting capability to make switch throws atomic | ||
| - | |||
| - | ====== Calibration ====== | ||
| - | |||
| - | Takes raw, uncalibrated images. | ||
| - | |||
| - | ===== cal.py flow ===== | ||
| - | |||
| - | Quick scheme to get rid of the worst artifacts | ||
| - | |||
| - | Basic idea: | ||
| - | - Capture a dark field frame (no x-ray) to get the lowest possible pixel value | ||
| - | - Capture a flat field frame (x-ray with no object) to get the highest possible pixel value | ||
| - | - Rescale images to range found above | ||
| - | |||
| - | Notes: | ||
| - | * Decoded images invert pixel values (per x-ray industry convention), | ||
| - | * As of late 2017 capture.py now spits out a sensor .json file with each image. Hopefully the scanner will add this soon as well | ||
| - | * As of this writing no bad pixel replacement is done | ||
| - | |||
| - | |||
| - | ==== 1: Capture dark field ==== | ||
| - | |||
| - | First, take a dark field capture using something like: | ||
| - | |||
| - | $ gxs700-capture -f -e | ||
| - | |||
| - | This should yield a raw picture that looks something like this: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | And histogram equalized looks like this: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | |||
| - | ==== 2: Capture flat field ==== | ||
| - | |||
| - | Now make sure the sensor and the x-ray head have the exact same position and settings you will use to take your actual image capture. Make sure there is nothing in the beam and do a standard capture (and also firing the x-ray head): | ||
| - | |||
| - | $ gxs700-capture -e | ||
| - | |||
| - | This produces a flat field image like this: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | Which might look like this when histogram equalized: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | For best results you should also let the sensor and x-ray head sit a while to warm up. I'm not sure how long matters, but maybe 10 minutes would be good | ||
| - | |||
| - | |||
| - | ==== 3: Capture data ==== | ||
| - | |||
| - | ie using capture.py or xray_plan_cli.py | ||
| - | |||
| - | Put your sample in and use the exact setup as the flat field to capture data. Don't move the sensor or x-ray head | ||
| - | |||
| - | |||
| - | ==== 4: Correct images ==== | ||
| - | |||
| - | run something like | ||
| - | |||
| - | $ python cal.py | ||
| - | |||
| - | Where: | ||
| - | * df.png is your dark field capture | ||
| - | * ff.png is your flat field capture | ||
| - | * png is a directory with your images to be corrected | ||
| - | * cal is the output directory with corrected images | ||
| - | |||
| - | Here is a raw image as captured: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | And with histogram equalization: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | Now the corrected image: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | And it with histogram equalization: | ||
| - | |||
| - | {{: | ||
| - | |||
| - | ====== Quality ====== | ||
| - | |||
| - | I haven' | ||
| - | |||
| - | ====== Stitching ====== | ||
| - | |||
| - | stitch.sh has an example workflow using pr0ntools (panotools). | ||
| - | |||
uvscada/gxs700.1514747973.txt.gz · Last modified: 2017/12/31 19:19 by mcmaster
