Удаление мерцания с помощью OpenCV? - PullRequest
1 голос
/ 08 марта 2011

Я новичок в openCV. Я установил библиотеку opencv в системе Ubuntu, скомпилировал ее и попытался изучить некоторые приложения для обработки изображений и видео в opencv, чтобы понять больше.

Мне интересно знать, есть ли в библиотеке OpenCV какой-либо алгоритм / класс для удаления мерцания в захваченных видео? Если да, какой документ или код я должен изучить более глубоко?

Если в openCV его нет, существуют ли какие-либо стандартные реализации в какой-либо другой библиотеке обработки видео / SDK / Matlab, .., которые предоставляют алгоритмы удаления мерцания из видеопоследовательностей?

Любые указатели были бы полезны

Спасибо.

-AD.

Ответы [ 2 ]

1 голос
/ 16 декабря 2012

Я написал свою собственную функцию Deflicker C ++. вот. Вы можете вырезать и вставить этот код как есть - не требуется никаких заголовков, кроме обычных openCV.

    Mat deflicker(Mat,int);
    Mat prevdeflicker;
    Mat deflicker(Mat Mat1,int strengthcutoff = 20){  //deflicker - compares each pixel of the frame to a previously stored frame, and throttle small changes in pixels (flicker)

    if (prevdeflicker.rows){//check if we stored a previous frame of this name.//if not, theres nothing we can do. clone and exit
         int i,j;
        uchar* p;
        uchar* prevp;
        for( i = 0; i < Mat1.rows; ++i)
        {
            p = Mat1.ptr<uchar>(i);
            prevp = prevdeflicker.ptr<uchar>(i);
            for ( j = 0; j < Mat1.cols; ++j){  

                Scalar previntensity = prevp[j];
                Scalar intensity = p[j];
                int strength = abs(intensity.val[0] - previntensity.val[0]);

                if(strength < strengthcutoff){ //the strength of the stimulus must be greater than a certain point, else we do not want to allow the change
                    //value 25 works good for medium+ light.  anything higher creates too much blur around moving objects. 
                    //in low light however this makes it worse, since low light seems to increase contrasts in flicker - some flickers go from 0 to 255 and back.  :(
                    //I need to write a way to track large group movements vs small pixels, and only filter out the small pixel stuff.  maybe blur first?

                    if(intensity.val[0] > previntensity.val[0]){  // use the previous frames value.  Change it by +1 - slow enough to not be noticable flicker
                        p[j] = previntensity.val[0] + 1;  
                    }else{
                        p[j] = previntensity.val[0] - 1;
                    }
                }

            }

        }//end for
    }

    prevdeflicker = Mat1.clone();//clone the current one as the old one.
    return Mat1;
}

Назовите это как: Mat = deflicker (Mat). Для этого нужен цикл и изображение в градациях серого, например:

for(;;){
    cap >> frame; // get a new frame from camera
    cvtColor( frame, src_grey, CV_RGB2GRAY );  //convert to greyscale - simplifies everything

    src_grey = deflicker(src_grey);  // this is the function call

    imshow("grey video", src_grey);
    if(waitKey(30) >= 0) break;
}
1 голос
/ 08 марта 2011

Я не знаю никакого стандартного способа отменить мерцание видео.

Но VirtualDub - это программа для обработки видео, которая имеет фильтр для удаления мерцания видео. Вы можете найти его источник фильтра и документы (описание алгоритма, вероятно) здесь .

...