У меня есть следующий код, который выполняет вычитание фона, а затем использует findContours, чтобы нарисовать границу вокруг объекта переднего плана.
// frame - Input frame from a camera.
// output - Output frame to be displayed.
void process(cv:: Mat &frame, cv:: Mat &output) {
cv::cvtColor(frame, gray, CV_BGR2GRAY);
// initialize background to 1st frame
if (background.empty())
gray.convertTo(background, CV_32F);
// convert background to 8U
background.convertTo(backImage,CV_8U);
// compute difference between current image and background
cv::absdiff(backImage,gray,foreground);
// apply threshold to foreground image
cv::threshold(foreground,output,threshold,255,cv::THRESH_BINARY_INV);
// accumulate background
cv::accumulateWeighted(gray, background, learningRate, output);
// Find regions of interest
std::vector<std::vector<cv::Point> > v; // Detected foreground points
cv::findContours(output,v,CV_RETR_LIST,CV_CHAIN_APPROX_NONE);
// Sort to find the entry with the most points at the beginning.
// This is done to overcome noisy input.
std::sort(v.begin(), v.end(), DescendingCompare);
cv::Mat drawing = frame;
std::vector<std::vector<cv::Point>> contours_poly(1);
// Determine an approximate polygon for v[0] which is the largest contour
cv::approxPolyDP( cv::Mat(v[0]), contours_poly[0], 3, false );
// Draw polygonal contour
cv::Scalar color = cv::Scalar( 0,0,255 );
cv::drawContours( drawing, contours_poly, 0, color, 2, 8, std::vector<cv::Vec4i>(), 0, cv::Point() );
// Show in a window
output = drawing;
v.clear();
}
Изображение - это просто пустой белый фон, но findContours () возвращает контурс 4 краями изображения.В конечном итоге это самый большой найденный контур, сводящий на нет мою логику в коде. Есть ли способ исправить это?Я хочу, чтобы он возвращал нулевой вектор, когда экран пуст.
![http://imgur.com/a/hJCQl](https://i.stack.imgur.com/kd9TU.jpg)
![http://imgur.com/a/hJCQl](https://i.stack.imgur.com/vidDr.jpg)
Кроме того, может ли этот код быть улучшен в любом случае для повышения эффективности