как вычесть один кадр из другого с помощью opencv в android

Я работаю над кадрами видео и хочу вычесть один кадр из другого, чтобы узнать разницу, но я не знаю, как это сделать. Я попытался преобразовать свои растровые кадры в мат, а затем вычесть их, но это не работает. Я использую opencv 2.4.3 для матовой функции. может ли кто-нибудь сказать мне, как это сделать. если возможно объясните фрагментами кода.

я пробовал что-то вроде этого

     Bitmap myBitmap1 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image001.jpg");  
    Bitmap myBitmap2 = BitmapFactory.decodeFile("/mnt/sdcard/Frames/mpgFrames/image002.jpg");  

    int width = myBitmap1.getWidth();
    int height = myBitmap1.getHeight();

    Mat  imgToProcess1 = new Mat(height, width, CvType.CV_8UC4);
    Mat  imgToProcess2 = new Mat(height, width, CvType.CV_8UC4);
    Mat  imgToProcess = new Mat(height, width, CvType.CV_8UC4);

    Utils.bitmapToMat(myBitmap1, imgToProcess1); 
    Utils.bitmapToMat(myBitmap2, imgToProcess1);        
    imgToProcess = imgToProcess1-imgToProcess2;

person AnShU    schedule 27.02.2013    source источник
comment
Вы столкнулись с этой проблемой? Можете ли вы просто прочитать файлы напрямую с помощью imread?   -  person mrh    schedule 27.02.2013
comment
Пока я здесь, я должен предложить вам использовать absdiff, а не просто вычитать матрицы.   -  person mrh    schedule 28.02.2013
comment
спасибо мрр .. я попробовал absdiff() и теперь он работает ... +1 за это :)   -  person AnShU    schedule 28.02.2013
comment
Здорово! Я напишу ответ на всякий случай, если кто-то еще столкнется с этой проблемой.   -  person mrh    schedule 28.02.2013


Ответы (1)


Если вы просто вычтете один кадр из другого, вы получите изображение, содержащее только те области, где второй кадр имеет более высокие значения, чем первый кадр.

Чтобы получить различия, вам нужно использовать absdiff:

absdiff(imgToProcess1, imgToProcess2, imgToProcess);

Это даст вам матрицу фактических различий, но если вам нужна маска областей различий, вы можете применить порог к результату:

Mat mask(imgToProcess.rows, imgToProcess.cols, CV_8U);
cvtColor(imgToProcess, mask, CV_RGB2GRAY, 1); //your conversion specifier may vary
threshold(mask, mask, 0, 255, CV_THRESH_BINARY);

Минимальное пороговое значение (0 выше) можно настроить. Если вы используете изображения в формате JPEG, вам может потребоваться немного увеличить его, чтобы учесть шум кодирования.

person mrh    schedule 28.02.2013
comment
Так же, как указатель re. шум и маскирование: фильтрация с помощью blur() или GaussianBlur(), скорее всего, улучшит ваши результаты больше, чем просто увеличив порог. Есть также более сложные подходы, которые можно найти в других вопросах и текущих исследованиях. - person FvD; 23.04.2013