Welcome to Doom9's Forum, THE in-place to be for everyone interested in DVD conversion. Before you start posting please read the forum rules. By posting to this forum you agree to abide by the rules. |
|
|
Thread Tools | Search this Thread | Display Modes |
16th May 2021, 21:19 | #1 | Link |
Registered User
Join Date: Apr 2021
Posts: 128
|
[S8/8mm film transfer] A setup for fast-capture and frame accurate result
Here is a more complete description of my setup for capturing 8mm/super8 footages.
It needs some work to be build but then, capture is fast and gives good results. Users on this forum helped me a lot to understand Avisynth and S8/8mm aspects. EDIT: especially on this thread My turn to give back... ---------------------------------------------------------------------------------------------------------- One more capture system? What is new in this system, is the use of an LED to allow synchronisation between video and footage frames. Please let me know if you know a similar setup as I didn't find any on the net. This whole thing is a [good working] work in progress and I am probably inaccurate on some points. Please feel free to correct and comment. . LED for images synchronisation The idea is to use an LED signal on the side of the filmgate as mark for software post-synchronisation with the projector: The LED is turned on while the projector changes from one frame to the next one. (the LED is captured on the side of the framegate). This was inspired from JohnMeyer's system where the software detects the framechange to be able to keep only one video frame for each film frame. I didn't feel confortable with the idea of relying on software to determine which image to throw away. (And was upmost too lazy, as I feared having to tweak a lot to find the right parameters for every different type of footage). Intuitively, the LED solution also seems to me faster to calculate, instead of calculating if images are mixed or not. Especially while pans or scenes changes, for example. Projection phases: Projector with blades, normal: |---------------Frame 1------------|change||---------------Frame 2------------|change| ... |bright| dark |bright| dark |bright| dark ||bright| dark |bright| dark |bright| dark | ... Projector without blades, LED: |---------------Frame 1------------|change||---------------Frame 2------------|change| ... |L. OFF|--------------------------|LED ON-||L. OFF|--------------------------|LED ON-| ... . Last edited by chmars; 10th November 2024 at 17:14. Reason: Add links, change pictures url to outside site |
16th May 2021, 21:42 | #2 | Link |
Registered User
Join Date: Apr 2021
Posts: 128
|
Blades
Projectors are built with a two or three blades disk. The disk is passing between the light source and the footage. It's function is ment to hide the film when it moves from one frame to another. But doing this only at that moment (approx 1/6th of the time) would result in discomfort for the spectator. So this blanking has been set to a regular frequency, three times per frame in my projector. This is a big problem as blades create flickering/exposure variation on the captured video. On most capture systems, the blade-disk is removed. Mine was complicated to remove and I needed something to trigger a signal. So, I kept some degrees of the blade that passes behind the frame while the image changes. This remaining part of blade is used as signal for the microcontroller to calculate the speed and the moment of the process. This is not the perfect setup however. Because the disk becomes unbalanced and can introduce vibrations. I'd recommend to use another moving part of the projector to trigger the signal thus removing the disk completely. . LED control + Speed control To determine what phase of the projecting process is happening, the remaining part of the blade passes into an optical endstop. At this moment precisely, a signal is triggered to the microcontroler (Arduino). With this signal happening once per frame, the microcontroler can calculate when to fire and stop the LED. It also adjusts the speed by driving a PWM motor controller. Speed control was useful when I was capturing with the blade disk in place. The original knob was driving a rheostat which did not give a constant speed, changing with the temperature, for example. When an LED is used to sync the images, a precise speed control is not mandatory any more. An approximative speed will do well too. Here is the code for the microcontroller: Code:
// Posted on https://forum.doom9.org/showthread.php?p=1942980#post1942980 // Chmars 05.2021 // This code could be more clever, elegant, clean, rapid........but it works :-)) #include <RBDdimmer_modif.h> #include <PID_v1.h> #include <FreqMeasure.h> #define USE_SERIAL Serial #define outputPin 13 // pwm #define zerocross 2 int potPin = A1; int potVal = 0; int ledPin = 6; int ledVal = 255; byte ledPower = 255; // User switches const byte debugPrint = 0; //Print to the console, debug bool compensateSpeed = 1; // Activation dimmer double Setpoint = 10.0; // Desired freq in Hz int freqMax = 0; int freqMin = 10000; int dureeCount = 100; long lastCount = 0; // PWM Dimmer dimmerLamp dimmer(outputPin); //initialase port for dimmer for MEGA, Leonardo, UNO, Arduino M0, Arduino Zero int outVal = 300; //Speed in dimmer langUAGE //PID //Define Variables we'll be connecting to double Input, Output; // double Kp = 20.0, Ki = 30.0, Kd = 1.0; PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT); int OutputProv = 0; // FREQ double sum=0; int count=0; double myFrequency = 0; long nextLedStartTime = 0; long nextLedStopTime = 0; // --------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------- void setup() { USE_SERIAL.begin(57600); // Serial.println(__FILE__); // Serial.println(__DATE__); // Serial.println(__TIME__); lastCount = millis(); //Dimmer dimmer.begin(NORMAL_MODE, ON); //dimmer initialisation: name.begin(MODE, STATE) //PID myPID.SetMode(AUTOMATIC); // turn the PID on/off // myPID.SetOutputLimits(600,130); FreqMeasure.begin(); pinMode(ledPin, OUTPUT); } // --------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------- void loop() { // READ POT VALUE int potVal = analogRead(potPin); int provSetpoint = map(potVal, 0, 1023, 3000, 1000); Setpoint = (float)provSetpoint/100.0; // If right moment, swich LED on if ( millis() >= nextLedStopTime ) analogWrite(ledPin, 0); else if ( millis() >= nextLedStartTime ) analogWrite(ledPin, ledPower); //LED // If sensor changed state if (FreqMeasure.available()) { // Calculate next switch on // Remember value float freqValueProv = FreqMeasure.read(); // What is the frequency float freqProv = (FreqMeasure.countToFrequency(freqValueProv)); if (debugPrint > 0 ) Serial.print("freq: "); if (debugPrint > 0 ) Serial.println(freqProv); // How long for one image, one turn? float frameDuration = 1000.0/freqProv; if (debugPrint > 0 ) Serial.print("FD: "); if (debugPrint > 0 ) Serial.println(frameDuration); // When to swich the LED on nextLedStartTime = millis() + ((int)frameDuration / 2); nextLedStopTime = millis() + (((int)frameDuration / 2) + ((int)frameDuration / 3) ); if (debugPrint > 0 ) Serial.print("time: "); if (debugPrint > 0 ) Serial.print(millis()); if (debugPrint > 0 ) Serial.print(", next: "); if (debugPrint > 0 ) Serial.println(nextLedStartTime); //MEASURE FREQUENCY // average several reading together sum = sum + freqValueProv; count = count + 1; if (count >= 3) { // Originalement 30 myFrequency = (FreqMeasure.countToFrequency(sum / count)); // Serial.println(myFrequency); sum = 0; count = 0; // Setup speed, only if new measues if (compensateSpeed == 1 ){ Input = myFrequency; myPID.Compute(); OutputProv = round(Output); outVal = map(OutputProv,0,255,350,170); } } } // PWM Serial command if (USE_SERIAL.available()){ int buf = USE_SERIAL.parseInt(); if (buf != 0 && buf < 10000 ) Setpoint = buf/100.0; else if (buf != 0 && buf > 10000) outVal = buf/100.0; delay(200); } dimmer.setPower(outVal); // setPower(130-600); //Debug if (debugPrint > 0 && millis() > lastCount + dureeCount && millis() > 4000){ //Si on a demandé d'afficher lastCount = millis(); // Reset compteur Serial.print(" "); //pour le plotter Serial.println(myFrequency); } delay(2); } Gate frame On the gate, the small part reducing the frame was removed to allow capturing the whole image. . Last edited by chmars; 10th November 2024 at 17:16. Reason: Add microcontroller code |
16th May 2021, 21:49 | #3 | Link |
Registered User
Join Date: Apr 2021
Posts: 128
|
Removing "bad" images.
The capture is made with a projector speed of 20fps. At these speed, the minimum camera speed is approximatively 60fps. EDIT: depending on the position on the reel, vibrations appear at different speeds. Safe projection speed seems to be 10fps. This results in a lot of duplicated/mixed frames. As the LED is ON at each frame change, it is then easy (for one who masters Avisynth scripts :-) ) to keep only one image between each one containing the illuminated LED. This was possible thanks to the huge help of user StainlessS. See the dedicated thread. Optical + camera setup The projector lens is removed. The camera is equiped with a canon MP-E 65mm macro lens. I use this equipment because it is af may disposal at the moment but it is overkill. Another camera with manual mode and a good rushes format could do the job. The best aperture compromise between aberration and depth of field seem to be around 5.6-6.3. The exposure time is 1/425th of second but some different speeds can be used without problems. Naturally, the exposure time cannot be longer than 1/3 of the footage image duration. A test I made about exposure time, here. Light source On almost every capture system, an LED is used to illuminate the footage. But LED's white light is tricky. Not every RGB or white LED have a good CRI (colour rendering index). There can be gaps into the spectrum, resulting in poor rendition of certain colours. This is very true in the photography and filming world. As I had no fun+time in searching a good LED model and no idea of the CRI influence by footage capturing, I chosen to keep the halogen bulb added with a daylight (Rosco or LEE full CTB) filter. The halogen light has to be day filtered as the camera sensors are daylight. Balancing during the grading process would increase the noise by lifting up the blue. Last edited by chmars; 19th May 2021 at 09:21. Reason: Correct spec |
16th May 2021, 21:54 | #4 | Link |
Registered User
Join Date: Apr 2021
Posts: 128
|
Sharpness
Focusing is not easy. You need a really stable and precise setup to make a good focus. Therefore, I put the camera on an old precision travelling which is actually a bearing linear table, File format, Codec, compression... No idea! I'd need a deep course on this subject and my knowledge is very thin here. What I believe to believe so far: Capturing with Slog3 is ok because the shadows are more richly defined than is Slog2. Xavc-L 50 is not too big but still 10bit, good compromise. Using RAW as we do with a RED camera would be a good option but not available with an FS7 in our setup. Please contradict! Workflow Not yet well defined. The steps are: Capture -> LED frames removal with Avisynth -> Grading in Davinci Resolve -> eventual use of Avisynth to remove dirt and increase details (Videofred's script and Johnmeyer's version). I wouldn't like to process the rushes too early in deshake and dirt removal as these steps are optional. I don't know yet where to stabilize between Resolve, VirtualDub and Avisynth. |
18th May 2021, 22:56 | #5 | Link |
Registered User
Join Date: Apr 2021
Posts: 128
|
Here a video sample. This is the stage before grading, just after having removed redundant BLUE_LED frames and trimmed the frame.
The fotage itself is very shaky, but the capture is stable, as it can be seen on the left side. Slog3, hence so uncontrasted: https://www.rican.ch/index.php/s/mHZAWNOnpSqj5tK Last edited by chmars; 10th November 2024 at 17:18. Reason: Add sample |
10th November 2024, 00:49 | #6 | Link |
Registered User
Join Date: Apr 2021
Posts: 128
|
Finally remembered to upload some finished footage!
https://www.rican.ch/index.php/s/cfHXjUQpwr3REOD Last edited by chmars; 10th November 2024 at 17:19. |
16th November 2024, 11:52 | #8 | Link |
Registered User
Join Date: Aug 2002
Location: Italy
Posts: 317
|
Interesting.
Check out my DIY Film Scanners collections too: https://hackaday.io/list/175104-diy-film-scanners https://www.thingiverse.com/forart/c...7601266/things
__________________
Hybrid Multimedia Production Suite will be a platform-indipendent open source suite for advanced audio/video contents production. Official git: https://forart.it/HyMPS |
Tags |
super8 film capture |
Thread Tools | Search this Thread |
Display Modes | |
|
|