Как уменьшить шум и улучшить внешний вид?
Я использую 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";
}
не могли бы вы, ребята, помочь мне. Заранее спасибо.