From f208cda1ed2c86b4f851e906924dd44f72b1c94d Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 29 Nov 2022 18:10:16 +0100 Subject: [PATCH] Resolve mixing of std::string and cv::String, more work on new img processing approach. --- AutonomousMode/Input/input.cpp | 4 +-- AutonomousMode/Spielwiese/spielwiese.cpp | 45 +++++++++++++++++++----- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/AutonomousMode/Input/input.cpp b/AutonomousMode/Input/input.cpp index 7ae1321..96b392a 100644 --- a/AutonomousMode/Input/input.cpp +++ b/AutonomousMode/Input/input.cpp @@ -15,8 +15,8 @@ Mat Input::readFile(String filePath) { std::srand(std::time(0)); // Read all .jpg files from the specified folder - std::string folder = filePath; - std::vector filenames; + cv::String folder = filePath; + std::vector filenames; cv::glob(folder, filenames); // Random shuffle diff --git a/AutonomousMode/Spielwiese/spielwiese.cpp b/AutonomousMode/Spielwiese/spielwiese.cpp index a699702..bd44bf1 100644 --- a/AutonomousMode/Spielwiese/spielwiese.cpp +++ b/AutonomousMode/Spielwiese/spielwiese.cpp @@ -1,4 +1,4 @@ -#include +//#include #include #include @@ -37,15 +37,15 @@ void in_depth_processing_chain(int thresholdBinary, int videoHeight, int videoWi { Input input(videoHeight, videoWidth); - std::string outputFolder = "C:\\Users\\User\\Desktop\\temp"; - std::string inputFolder = "C:\\Users\\User\\Desktop\\Studium\\02_Master_MSY\\2. Semester Winter 22 23\\Projekt\\Line-Following-Robot\\AutonomousMode\\Test_data"; + cv::String outputFolder = "C:\\Users\\tim-z\\Desktop\\temp"; + cv::String inputFolder = "C:\\Users\\tim-z\\Desktop\\Studium\\02_Master MSY\\2. Semester Winter 2022 2023\\Projekt\\Repo\\Line-Following-Robot\\AutonomousMode\\Test_data"; - std::vector filenames; + std::vector filenames; cv::glob(inputFolder, filenames); //filenames.begin(), filenames.end() int i = 0; - for(std::vector::iterator it = filenames.begin(); it != filenames.end(); it++) + for(std::vector::iterator it = filenames.begin(); it != filenames.end(); it++) { std::string current_output = outputFolder + "\\" + to_string(i); std::cout << current_output << std::endl; @@ -56,7 +56,8 @@ void in_depth_processing_chain(int thresholdBinary, int videoHeight, int videoWi Mat original_image = input.readFile(inputFile); imwrite(current_output + "\\00_input.jpg", original_image); - Rect roi = Rect(0, original_image.rows*(7.5/12.0), original_image.cols, original_image.rows/12); + Point roiOrigin(0, original_image.rows*(7.5/12.0)); + Rect roi = Rect(roiOrigin.x, roiOrigin.y, original_image.cols, original_image.rows/12); Mat image = original_image(roi); @@ -78,15 +79,41 @@ void in_depth_processing_chain(int thresholdBinary, int videoHeight, int videoWi vector > contours; vector hierarchy; + vector vectorOfRects; + vector vectorOfLeftEdges; findContours(image,contours, hierarchy, RETR_LIST, CHAIN_APPROX_SIMPLE); - + int amountOfValidRects = 0; for( int i = 0; i< contours.size(); i++ ) // iterate through each contour. { double a = contourArea( contours[i],false); // Find the area of contour if(a > 3500) { - drawContours(original_image, contours, i, Scalar(0,255,255), 1, 8, hierarchy, 0, Point(0,original_image.rows*(7.5/12.0))); + drawContours(original_image, contours, i, Scalar(0,255,255), 1, 8, hierarchy, 0, roiOrigin); + + Rect currentBoundingRect = boundingRect(contours[i]); + //Handle roi offset: + currentBoundingRect.x += roiOrigin.x; + currentBoundingRect.y += roiOrigin.y; + vectorOfRects.push_back(currentBoundingRect); + + rectangle(original_image, currentBoundingRect, Scalar(0,255,0)); + + // get mid-point of rect + Point midRect = Point(currentBoundingRect.x+currentBoundingRect.width/2, currentBoundingRect.y+currentBoundingRect.height/2); + + // Draw middle as small rect instead of circle because for whatever reasons drawing a circle doesnt work. + Rect testRect(Point(midRect.x-2, midRect.y-2), Point(midRect.x+2, midRect.y+2)); + rectangle(original_image, testRect, Scalar(0,0,255)); + // get the left edge of rect + // used as offset as raspicam is not + // mounted on mid of regbot + Point leftEdge(currentBoundingRect.x, currentBoundingRect.y+currentBoundingRect.height/2); + vectorOfLeftEdges.push_back(leftEdge); + + testRect = Rect(Point(leftEdge.x-2, leftEdge.y-2), Point(leftEdge.x+2, leftEdge.y+2)); + rectangle(original_image, testRect, Scalar(0,0,255)); + amountOfValidRects++; } } imwrite(current_output + "\\06_contours.jpg", original_image); @@ -98,7 +125,7 @@ void in_depth_processing_chain(int thresholdBinary, int videoHeight, int videoWi int main(void) { //Disable opencv logging messages - cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_WARNING); + //cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_WARNING); const int thresholdBinary = 140; const int videoHeight = 720;