KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
I have the following code which performs background subtraction and then uses findContours to draw a boundary around the foreground object. // 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(); } The image is just a blank white background but findContours() is returning a contour with the 4 edges of the image. This ends up being the largest contour found, negating my logic in the code.Is there anyway to fix this ? I want it to return a null vec
Tags (comma-separated)
Save Edits
Cancel