Showing posts with label blur. Show all posts
Showing posts with label blur. Show all posts

1/17/2016

OpenCV Background Subtraction sample code

Dear Peter

Here is your answer.
I hope this posting & source code help to you.
And This page also is good explain to use background subtraction.
http://docs.opencv.org/master/d1/dc5/tutorial_background_subtraction.html#gsc.tab=0

This is simple code for example background subtraction.

The input is cam video.
Before get video frame, source code set some options.
MOG2, ROI, and morphology

in while, blur is option for reduce noise,
And morphology is also option.
As your project purpose and camera environment, you add more pre-processing.

But I don't add labeling code, normally do labeling processing after background subtration, because blob selecting(valid size or not), blob counting, interpretation of blob.

More information
Background subtraction code.
http://study.marearts.com/search/label/Background%20subtraction
Morphology
http://study.marearts.com/search/label/Morphology
Labeling (findContours)http://study.marearts.com/search/label/Blob%20labeling

Thank you.


#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char)
{
 VideoCapture cap(0); // open the default camera
 if (!cap.isOpened()) // check if we succeeded
  return -1;

 Ptr< BackgroundSubtractorMOG2 > MOG2 = createBackgroundSubtractorMOG2(3000, 64);
 //Options
 //MOG2->setHistory(3000);
 //MOG2->setVarThreshold(128);
 //MOG2->setDetectShadows(1); //shadow detection on/off
 Mat Mog_Mask;
 Mat Mog_Mask_morpho;

 Rect roi(100, 100, 300, 300);
 
 namedWindow("Origin", 1);
 namedWindow("ROI", 1);
 Mat frame;
 Mat RoiFrame;
 Mat BackImg;

 int LearningTime=0; //300;

 Mat element;
 element = getStructuringElement(MORPH_RECT, Size(9, 9), Point(4, 4));

 for (;;)
 {
  
  cap >> frame; // get a new frame from camera
  if (frame.empty())
   break;

  //option 
  blur(frame(roi), RoiFrame, Size(3, 3));
  //RoiFrame = frame(roi);

  //Mog processing
  MOG2->apply(RoiFrame, Mog_Mask);

  if (LearningTime < 300)
  {
   LearningTime++;
   printf("background learning %d \n", LearningTime);
  }
  else
   LearningTime = 301;

  //Background Imge get
  MOG2->getBackgroundImage(BackImg);  

  //morphology 
  morphologyEx(Mog_Mask, Mog_Mask_morpho, CV_MOP_DILATE, element);
  //Binary
  threshold(Mog_Mask_morpho, Mog_Mask_morpho, 128, 255, CV_THRESH_BINARY);  

  imshow("Origin", frame);
  imshow("ROI", RoiFrame);
  imshow("MogMask", Mog_Mask);
  imshow("BackImg", BackImg);
  imshow("Morpho", Mog_Mask_morpho);

  if (waitKey(30) >= 0)
   break;
 }

 
 return 0;
}

..










4/26/2015

Background Subtraction and Blob labeling and FREAK feature extraction

This code is the source of this video.
https://www.youtube.com/watch?v=txOaulCPzSM



The source code included 2 separable routine.
One is blob labeling.
Another is FREAK feature extraction and draw.

Blob labeling is using MOG2 algorithm.
MOG2 is introduced in past on my blog.
Refer to this page.
http://study.marearts.com/search/label/MOG2
http://study.marearts.com/2014/04/opencv-study-background-subtractor-mog.html
By the way, this code included blur routine.
I thought low frequency image is more useful for background learning.
This rgb blur code on GPU mode is referenced from here.
http://study.marearts.com/2014/11/opencv-gpu-3-channel-blur-example.html

Another routine is FREAK feature extraction.
Firstly, find feature using FAST_GPU, and extract FREAK descriptor.
After extraction, 2 descriptor can compare same image or not.

This code is made for processing time check.
The process is enough to processing in real time, because image is resized and use GPU.

Hope helping to you.
Thank you.




...code start...

...code end...

11/05/2014

Opencv gpu 3 channel blur example

There is no 3 channel blur in gpu function.

gpu::blur is support CV_8UC1 and CV_8UC4  channel only.
gpu::gaussianblur is also not suitable often.

So one of idea is split channel.
split 3 channel and perform blur function for each channel.
and then merge to a blur 3channel image.

this is faster than cpu code(lager image will be faster).

In my case, the process takes cpu :0.0126sec gpu:0.0035sec in 800x600 image.

refer to example source code.


...
//gpu case
gpu::resize(o_frame_gpu, r_frame_gpu, Size(RWIDTH, RHEIGHT) );
vector< gpu::GpuMat> gpurgb(3);
vector< gpu::GpuMat> gpurgb2(3);
gpu::split(r_frame_gpu, gpurgb);
gpu::blur(gpurgb[0], gpurgb2[0], Size(3,3) );
gpu::blur(gpurgb[1], gpurgb2[1], Size(3,3) );
gpu::blur(gpurgb[2], gpurgb2[2], Size(3,3) );
gpu::merge(gpurgb2, r_frame_blur_gpu);

//cpu case
resize(o_frame, rFrame, Size(RWIDTH, RHEIGHT) );
blur(rFrame, blurFrame, Size(3,3));



...