Я использую 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 + реальный_х * 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 contoursvector< 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";
}
не могли бы вы, ребята, помочь мне. Заранее спасибо.
Задача ещё не решена.
Других решений пока нет …