Kluczowanie koloru z video używając OpenCV

0

Witam, próbuje stworzyć program do kluczowania koloru z video i natrafiłem na problem którego nie mogę rozwiązać. Gdy odpalam program, zacina się i pojawiają sie 2 szare okna "Wykluczowany obraz" i "Oryginalny obraz". Używam algorytmu Vlahosa https://smirnov-am.github.io/chromakeying. Czy macie jakieś sugestie co robię źle?

int main()
{
    VideoCapture video("PracticeResources/green.mp4");
    Mat image = imread("PracticeResources/bg.jpg");
    const float a1 = 0.9;
    const float a2 = 0.2;
    
    Size S = Size(1280, 720);
    
    Mat src, res_front, res_back, res;

    vector<Mat> channels, img_channels; 

    Mat alpha = Mat::zeros(S, CV_32F); 
    resize(image, image, S);

    while(true)
    {

        video >> src; 
        if (src.empty()) break; 
        src.convertTo(src, CV_32F, 1.0 / 255); 

        resize(src, src, S);
        

        split(src, channels); 
        split(image, img_channels); 

        
        alpha = Scalar::all(1.0) - a1 * (channels[1] - a2 * channels[0]); 

     
        threshold(alpha, alpha, 1, 1, THRESH_TRUNC); 
        threshold(-1 * alpha, alpha, 0, 0, THRESH_TRUNC); 
        alpha = -1 * alpha; 


        for (int i = 0; i < 3; ++i)
        {
            channels[i].convertTo(channels[i], CV_32F);  // Konwersja typu danych
            img_channels[i].convertTo(img_channels[i], CV_32F);  // Konwersja typu danych

            multiply(alpha, channels[i], channels[i]);
            multiply(1 - alpha, img_channels[i], img_channels[i]);
        }

        merge(channels, res_front); 
        merge(img_channels, res_back); 

        res = res_front + res_back;

        imshow("Wykluczowany obraz", res);
        imshow("Oryginalny obraz", src);
    }
    return 0;
}
0

Sprawdź video.isOpened czy masz otwarty strumień. Zamiast video >> src; użyj metody video.read która zwróci informację, czy przeczytałeś poprawnie ramkę. Twój src to nie jest oryginalny obraz tylko przetworzony kilkoma krokami, spróbuj najpierw wyświetlić ramkę zaraz po pobraniu.

if(!video.read(src));
   break;

if (src.empty()) break;
imshow("Oryginalny obraz", src);
src.convertTo(src, CV_32F, 1.0 / 255);

1 użytkowników online, w tym zalogowanych: 0, gości: 1