Commit a535583b authored by Martin Cífka's avatar Martin Cífka
Browse files

Added exposure correction for bracketing with auto-speed&iso

parent 6cfccc74
Loading
Loading
Loading
Loading
Loading
+248 B (9.38 MiB)

File changed.

No diff preview for this file type.

+28 −11
Original line number Diff line number Diff line
@@ -432,18 +432,22 @@ bool Commander::setBracketing(size_t evStep, size_t halfCount)
            
            if (_iso == Codes::ISO::Auto)
            {
                // - Find such combination (Speed, ISO) that fits measured exposure and bracketing is possible
                auto speedIt = findClosestSpeed(speed);
                auto isoIt = findClosestISO(iso);
                // Find such combination (Speed, ISO) that approximately fits the measured exposure and bracketing is possible
                double error;
                auto speedIt = findClosestSpeed(speed, 0, error);
                auto isoIt = findClosestISO(iso, error, error);
                if (!computeBracketingVector(speedIt, isoIt, halfCount, evStep))
                    return false;
                
                //ISO must be set manually before shooting, otherwise auto-ISO would compensate the exposure differences 
                setISO(isoIt->first);
            }

            else
            {
                auto speedIt = findClosestSpeed(speed);
                // Find the closest exposure speed to the measured one
                double error;
                auto speedIt = findClosestSpeed(speed, 0, error);
                if (!computeBracketingVector(speedIt, halfCount, evStep))
                    return false;
            }
@@ -1022,8 +1026,11 @@ bool Commander::measureExposureExif(double& speed, double& iso)
    return true;
}

std::vector<std::pair<Codes::Speed, double>>::iterator Commander::findClosestSpeed(double speed)
std::vector<std::pair<Codes::Speed, double>>::iterator Commander::findClosestSpeed(double speed, double inputError, double& outputError)
{
    
    speed = pow(2, log2(speed) - inputError); // error correction

    auto it = speedOrderedMapping.begin();
    for ( ; it != speedOrderedMapping.end(); ++it)
        if (it->second >= speed)
@@ -1045,17 +1052,27 @@ std::vector<std::pair<Codes::Speed, double>>::iterator Commander::findClosestSpe

        // if previous speed is closer to the measured one, select it
        // (    (it-1)->second    <    speed    <=    it->second   )
        if ( middle-lower < upper-middle ) 
        auto bottomError  = middle - lower;
        auto topError     = upper - middle;
        if ( bottomError < topError )
        {
            --it;
        }
        //else do nothing, iterator is ok

        
        //else do nothing, iterator is ok)
    }

    outputError = log2(it->second) - log2(speed);
    return it;
}

std::vector<std::pair<Codes::ISO, double>>::iterator Commander::findClosestISO(double iso)
std::vector<std::pair<Codes::ISO, double>>::iterator Commander::findClosestISO(double iso, double inputError, double& outputError)
{
    
    iso = pow(2, log2(  iso  ) - inputError); // error correction
    //  = pow(2, log2(iso/100) - inputError) * 100;

    auto it = isoOrderedMapping.begin();
    for ( ; it != isoOrderedMapping.end(); ++it)
        if (it->second >= iso)
@@ -1083,7 +1100,7 @@ std::vector<std::pair<Codes::ISO, double>>::iterator Commander::findClosestISO(d
        //else do nothing, iterator is ok)
    }
    

    outputError = log2(it->second/100) - log2(iso/100);
    return it;
}

+8 −2
Original line number Diff line number Diff line
@@ -176,8 +176,14 @@ private:
        size_t evStep);
    
    bool measureExposureExif(double& speed, double& iso);
    std::vector<std::pair<Codes::Speed, double>>::iterator findClosestSpeed(double speed);
    std::vector<std::pair<Codes::ISO, double>>::iterator findClosestISO(double iso);
    std::vector<std::pair<Codes::Speed, double>>::iterator findClosestSpeed(
        double speed,
        double inputError,
        double& outputError);
    std::vector<std::pair<Codes::ISO, double>>::iterator findClosestISO(
        double iso,
        double inputError, 
        double& outputError);
    
    // check if vector iterator is in valid range
    template <typename T>