void DkPageSegmentation::findRectanglesLab(const cv::Mat & img, std::vector<DkPolyRect>& rects, int channel, int thr) const { cv::Mat imgLab; cv::cvtColor(img, imgLab, CV_RGB2Lab); // luminance channel is better than grayscale std::vector<int> indexes; // if the last channel is cached - take that one if (channel == -1) { for (int idx = 0; idx < img.channels(); idx++) { indexes.push_back(idx); } } else indexes.push_back(channel); for (int idx : indexes) { int ch[] = {idx, 0}; cv::Mat imgL(img.size(), CV_8UC1); cv::mixChannels(&imgLab, 1, &imgL, 1, ch, 1); std::vector<DkPolyRect> cr; findRectangles(imgL, rects, idx, thr); //std::cout << rects.size() << " after channel " << idx << std::endl; } }
std::vector<Rectangle> RectangleDetector::processImage(cv::Mat input) { // Variable Initializations input.copyTo(image); preprocessImage(); findRectangles(); if (! foundRectangle) return std::vector<Rectangle>(); populateRectangles(); if (! foundRectangle) return std::vector<Rectangle>(); filterUniqueRectangles(); removeSimilarRectangles(); if (! foundRectangle) return std::vector<Rectangle>(); removeMarkedRectangles(); std::cout << "Returning output Rectangles..." << std::endl; return outputRectangles; }
int main(int argc, char *argv[]) { timeval now, prev; gettimeofday(&now, NULL); gettimeofday(&prev, NULL); std::cout<<"Entering crossroad"<<std::endl; std::string * filename = 0; if (argc > 1) { filename = new std::string(argv[1]); } cv::Mat frame; cv::Mat back; cv::Mat fore; cv::VideoCapture * capture; //capture->set(CV_CAP_PROP_FRAME_WIDTH,64); //capture->set(CV_CAP_PROP_FRAME_HEIGHT,64); if (filename != NULL) { std::cout<<"Reading from "<<*filename<<std::endl; capture = new cv::VideoCapture(*filename); } else { std::cout<<"Reading from default camera"<<std::endl; capture = new cv::VideoCapture(0); capture->set(CV_CAP_PROP_FRAME_WIDTH, 160); capture->set(CV_CAP_PROP_FRAME_HEIGHT, 120); } if (!capture->isOpened()) { std::cout<<"Could not open video source\n"; return -1; } cv::BackgroundSubtractorMOG2 bg(3, 16, true); std::vector<std::vector<cv::Point> > contours; std::vector<std::vector<cv::Point> > rectangles; cv::namedWindow("Frame", CV_WINDOW_AUTOSIZE); //cv::namedWindow("Background", CV_WINDOW_AUTOSIZE); //cv::namedWindow("Foreground", CV_WINDOW_AUTOSIZE); ObjectTracker * objectTracker = new ObjectTracker(5000, 10000.); while (true) { *capture >> frame; if (frame.empty()) { std::cout<<"Frame empty"<<std::endl; } bg(frame, fore, 0.01); bg.getBackgroundImage(back); cv::erode(fore, fore, cv::Mat()); cv::dilate(fore, fore, cv::Mat()); cv::findContours(fore, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_TC89_KCOS); findRectangles(contours, rectangles); filterSmall(rectangles, 100 * 100); objectTracker->refresh(); objectTracker->record(rectangles); cv::drawContours(frame, rectangles, -1, cv::Scalar(0, 0, 255), 2); drawTraces(frame, objectTracker); cv::imshow("Frame", frame); //cv::imshow("Background", back); //cv::imshow("Foreground", fore); if (cv::waitKey(30) >= 0) break; gettimeofday(&now, NULL); double sec = (double)getTimeDifferenceInMS(now, prev) / 1000.; gettimeofday(&prev, NULL); std::cout<<1./sec<<" fps"<<std::endl; std::cout<<"Total objects present: "<<objectTracker->getTrackedCount()<<std::endl; } if (filename != NULL) { delete filename; } delete capture; delete objectTracker; return 0; }