我正在一个视频处理项目中,该项目将摄像机供稿作为输入并具有静态背景。我不需要像opencv中的BackgroundSubtractorMOG那样的任何动态背景生成。我试图将前景对象绑定(bind)到边界框内。所以这就是我所做的
cv::absdiff(back_frame,matProcessed,temp); //back_frame is the background matProcessed is the frame from CAMERA in grayscale
cv::threshold(temp,temp,20,255,THRESH_BINARY);
cv::findContours(temp,contours,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
std::vector<Rect> boundRect( contours.size() );
std::vector< std::vector<Point> > contours_poly( contours.size() );
int j=0;
for(int i = 0; i < contours.size(); i++ )
{
if(contourArea(contours[i])>100)
{
approxPolyDP( Mat(contours[i]), contours_poly[i], 10, true );
boundRect[j] = boundingRect( Mat(contours_poly[i]) );
j++;
}
}
cv::rect r;
for (int i = 0; i < boundRect.size(); i++)
{
r = boundRect[i];
cv::rectangle(
frame,
cv::Point(r.x, r.y),
cv::Point(r.x + r.width, r.y + r.height),
CV_RGB(0,255,0)
);
}
但是问题是我没有正确获得前景。无论如何,无论背景复杂度和其他因素如何,我都可以改善前景的生成并始终使用一些矩形边界框来约束前景对象吗?
最佳答案
有多种简单和复杂的方法可以做到这一点。绝对建议使用像素级概率方法。您还可以在外观上使用诸如Markov模型之类的东西来完善您的结果。请参考this paper,尤其是“相关工作”部分,以及它们在其中完善前景对象的最后一位。