Tengo el siguiente código que realiza la resta de fondo y luego usa findContours para dibujar un límite alrededor del objeto de primer plano.OpenCV findContours problema
// 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();
}
La imagen es simplemente un fondo blanco en blanco pero findContours() devuelve un contorno con los 4 bordes de la imagen. Esto termina siendo el contorno más grande encontrado, negando mi lógica en el código. ¿Hay alguna forma de arreglar esto? Quiero que devuelva un vector nulo cuando la pantalla está en blanco.
Además, este código puede ser mejorado en ningún modo a mejorar la eficiencia?
¡Yikes! Error tonto. Por favor, haga su respuesta como un comentario separado para que pueda marcarlo como correcto – Madman