Ho il seguente codice che esegue la sottrazione dello sfondo e quindi usa findContours per tracciare un contorno intorno all'oggetto in primo piano.OpenCV findContours issue
// 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();
}
L'immagine è solo un vuoto sfondo bianco ma findContours() restituisce un profilo con i 4 bordi dell'immagine. Questo finisce per essere il contorno più grande trovato, annullando la mia logica nel codice. C'è comunque da sistemare? Voglio che restituisca un vettore nullo quando lo schermo è vuoto.
Inoltre, questo codice può essere migliorato in alcun modo per migliorare l'efficienza?
Yikes! Silly error .. Si prega di inserire la risposta come commento separato in modo che io possa contrassegnarlo come corretto – Madman