Как уменьшить шум и улучшить внешний вид?

Я использую Visual 2010 (C++) с opencv 2.3.1 для создания этого кода для вычитания фона с помощью MOG2. Как показано в полном коде, он работает успешно, но с большим шумом.

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

       void morphOps(Mat &thresh){

   Mat erodeElement = getStructuringElement( MORPH_RECT,Size(2,2)); //3x3
  Mat dilateElement = getStructuringElement( MORPH_RECT,Size(1,1)); //8x8

   erode(thresh,thresh,erodeElement);
   erode(thresh,thresh,erodeElement);


   dilate(thresh,thresh,dilateElement);
   dilate(thresh,thresh,dilateElement);

    }

Но я действительно не знаю, как это сделать, потому что я все еще начинающий. Другой (спасибо ему) предложил для решения проблемы контуров заметить, если вы запустите код " Два совета. Кажется, вы просто берете одну точку из многих контуров. Попробуйте усреднить их. Другой способ - ослабить во времени". * 0,9 + real_x*0,1; также в этой части я не знаю, как это сделать.

Вы можете увидеть часть кода, содержащую контуры в следующем разделе, я намеренно использовал это для перемещения больших двоичных объектов на другие меньшие объекты, потому что я уже использовал другую инструкцию для отслеживания только самого большого объекта (это не хороший выбор, но я не мог сделать это, чтобы отслеживать все, поэтому я просто связал их с каплями вместо этого).

    //Find contour  
   ContourImg = binaryImage.clone();  
  //less blob delete  
  vector< vector< Point> > contours;  

   findContours(ContourImg,  
    contours, // a vector of contours  
      CV_RETR_EXTERNAL, // retrieve the external contours  
      CV_CHAIN_APPROX_NONE); // all pixels of each contours  


  vector< Rect > output;  
  vector< vector< Point> >::iterator itc= contours.begin();  
   while (itc!=contours.end()) {  

  //Create bounding rect of object  
 //rect draw on origin image  
 Rect mr= boundingRect(Mat(*itc));  
 rectangle(frame, mr, CV_RGB(255,0,0));  
++itc;  
}   

Это инструкция для выбора самого большого объекта для отслеживания:

    void searchForMovement(Mat binaryImage, Mat &framein){

 bool objectDetected = false;
 Mat temp;
 binaryImage.copyTo(temp);
vector< vector<Point> > contours;
vector<Vec4i> hierarchy;

findContours(temp,contours,hierarchy,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE   );// retrieves external contours

//if contours vector is not empty, we have found some objects
if(contours.size()>0)objectDetected=true;
else objectDetected = false;

 if(objectDetected){
  //the largest contour is found at the end of the contours vector
  //we will simply assume that the biggest contour is the object we are   looking for.
   vector< vector<Point> > largestContourVec;
   largestContourVec.push_back(contours.at(contours.size()-1));
  //make a bounding rectangle around the largest contour then find its  centroid

    objectBoundingRectangle = boundingRect(largestContourVec.at(0));
   int xpos = objectBoundingRectangle.x+objectBoundingRectangle.width/2;
   int ypos = objectBoundingRectangle.y+objectBoundingRectangle.height/2;

   //update the objects positions by changing the 'theObject' array values
   theObject[0] = xpos , theObject[1] = ypos;
 }
//make some temp x and y variables so we dont have to type out so much
int x = theObject[0];
int y = theObject[1];

//draw some crosshairs around the object
circle(framein,Point(x,y),20,Scalar(0,255,0),2);
line(framein,Point(x,y),Point(x,y-25),Scalar(0,255,0),2);
line(framein,Point(x,y),Point(x,y+25),Scalar(0,255,0),2);
line(framein,Point(x,y),Point(x-25,y),Scalar(0,255,0),2);
line(framein,Point(x,y),Point(x+25,y),Scalar(0,255,0),2);

//write the position of the object to the screen
putText(framein,"Tracking object at (" +      intToString(x)+","+intToString(y)+")",Point(x,y),1,1,Scalar(255,0,0),2);
 file_ <<"X:"<<intToString(x)<<"  "<<"Y:"<<intToString(y)<<"\n";
 }

не могли бы вы, ребята, помочь мне. Заранее спасибо.

0 ответов

Другие вопросы по тегам