From f445a8d6fc578a2b57e6a84ae21711e826a2819f Mon Sep 17 00:00:00 2001 From: Thierry Bissem Date: Fri, 24 May 2024 10:24:38 +0200 Subject: [PATCH] Saved color param data --- -f | 0 -i | 0 -s | 0 bin/RedBallDetection | Bin 0 -> 39896 bytes data/color_params_data.xml | 9 ++ lib/RedBallDetection.o | Bin 0 -> 39680 bytes makefile | 8 +- src/RedBallDetection.cpp | 199 +++++++++++++++++++++++++++++++++++++ 8 files changed, 213 insertions(+), 3 deletions(-) create mode 100644 -f create mode 100644 -i create mode 100644 -s create mode 100755 bin/RedBallDetection create mode 100644 data/color_params_data.xml create mode 100644 lib/RedBallDetection.o create mode 100644 src/RedBallDetection.cpp diff --git a/-f b/-f new file mode 100644 index 0000000..e69de29 diff --git a/-i b/-i new file mode 100644 index 0000000..e69de29 diff --git a/-s b/-s new file mode 100644 index 0000000..e69de29 diff --git a/bin/RedBallDetection b/bin/RedBallDetection new file mode 100755 index 0000000000000000000000000000000000000000..43650d85c17652e631e90587b9f0d795ff6b04a2 GIT binary patch literal 39896 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 literal 0 HcmV?d00001 diff --git a/data/color_params_data.xml b/data/color_params_data.xml new file mode 100644 index 0000000..823590f --- /dev/null +++ b/data/color_params_data.xml @@ -0,0 +1,9 @@ + + +11 +22 +173 +255 +39 +255 + diff --git a/lib/RedBallDetection.o b/lib/RedBallDetection.o new file mode 100644 index 0000000000000000000000000000000000000000..353db8445bf86ba49ee4a22624c5a73a7d945303 GIT binary patch literal 39680 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 +#include +#include +#include +#include + +#include +#include +#include + +#define CAM_PARAMS_FILENAME "./data/microsoft_livecam_hd3000.xml" +#define COLOR_PARAMS_FILENAME "./data/color_params_data.xml" +#define FPS 30.0 +#define STRUCTURAL_ELEMENTS_SIZE 5 + +bool readCameraParameters(std::string filename, cv::Mat &camMatrix, cv::Mat & distCoeffs) +{ + cv::FileStorage fs(filename, cv::FileStorage::READ); + if (!fs.isOpened()) + { + std::cout << "[ERROR] Could not open the camera parameter file storage: " << filename << " !"<< std::endl; + return false; + } + + fs["camera_matrix"] >> camMatrix; + fs["distortion_coefficients"] >> distCoeffs; + + return true; +} + +bool writeColorParameters(std::string filename, int iLowH, int iHighH, int iLowS, int iHighS, int iLowV, int iHighV) +{ + cv::FileStorage fs(filename, cv::FileStorage::WRITE); + if (!fs.isOpened()) + { + std::cout << "[ERROR] Could not open the file storage: " << filename << " !"<< std::endl; + return false; + } + fs << "lowH" << iLowH; + fs << "highH" << iHighH; + + fs << "lowS" << iLowS; + fs << "highS" << iHighS; + + fs << "lowV" << iLowV; + fs << "highV" << iHighV; + + // releases the writer + fs.release(); + + return true; +} + +int main(int argc, char** argv) +{ + // initializes main parameters + std::string sCameraParamFilename = CAM_PARAMS_FILENAME; + std::string sColorParamFilename = COLOR_PARAMS_FILENAME; + int iStructuralElementSize = STRUCTURAL_ELEMENTS_SIZE; + float fFPS = FPS; + + // updates main parameters from arguments + int opt; + while ((opt = getopt (argc, argv, ":i:f:o:s:")) != -1) + { + switch (opt) + { + case 'o': + sColorParamFilename = optarg; + break; + case 'f': + fFPS = atof(optarg); + break; + case 'i': + sCameraParamFilename = optarg; + break; + case 's': + iStructuralElementSize = atoi(optarg); + break; + case '?': + if (optopt == 'o' || optopt == 'f' || optopt == 'i' || optopt == 's') + fprintf (stderr, "Option -%c requires an argument.\n", optopt); + else if (isprint (optopt)) + fprintf (stderr, "Unknown option `-%c'.\n", optopt); + else + fprintf (stderr, "Unknown option character `\\x%x'.\n", optopt); + return 1; + default: + abort (); + } + } + + // distorted/undistorted image + bool bIsImageUndistorted = true; + + // reads camera intrinsic parameters + cv::Mat cameraMatrix, distCoeffs; + bool isCamParamsSet = readCameraParameters(sCameraParamFilename, cameraMatrix, distCoeffs); + + // checks if the camera parameters were successfully read + if (!isCamParamsSet) + { + std::cout << "[WARNING] Camera intrinsic parameters could not be loaded!" << std::endl; + } + + // creates a camera grabber + cv::VideoCapture cap(0, cv::CAP_V4L2); + + // checks if the camera was successfully opened + if (!cap.isOpened()) + { + std::cout << "[ERROR] Cannot open the webcam" << std::endl; + return 1; + } + + cv::namedWindow("Control", cv::WINDOW_AUTOSIZE); //create a window called "Control" + + // sets min/max value for HSV color representation + int iLowH = 0; + int iHighH = 179; + + int iLowS = 0; + int iHighS = 255; + + int iLowV = 0; + int iHighV = 255; + + // creates trackbars in "Control" window + cv::createTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179) + cv::createTrackbar("HighH", "Control", &iHighH, 179); + + cv::createTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255) + cv::createTrackbar("HighS", "Control", &iHighS, 255); + + cv::createTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255) + cv::createTrackbar("HighV", "Control", &iHighV, 255); + + while (true) + { + cv::Mat imgOriginal; + + bool bSuccess = cap.read(imgOriginal); // read a new frame from video + + if (!bSuccess) //if not success, break loop + { + std::cout << "[WARNING] Cannot read a frame from video stream" << std::endl; + break; + } + + if (bIsImageUndistorted && isCamParamsSet) + { + cv::Mat temp = imgOriginal.clone(); + cv::undistort(temp, imgOriginal, cameraMatrix, distCoeffs); + } + + //Convert the captured frame from BGR to HSV + cv::Mat imgHSV; + cvtColor(imgOriginal, imgHSV, cv::COLOR_BGR2HSV); + + //Threshold the image based on the trackbar values + cv::Mat imgThresholded; + inRange(imgHSV, cv::Scalar(iLowH, iLowS, iLowV), cv::Scalar(iHighH, iHighS, iHighV), imgThresholded); + + //morphological opening (remove small objects from the foreground) + cv::erode(imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + cv::dilate( imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + + //morphological closing (fill small holes in the foreground) + cv::dilate( imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + cv::erode(imgThresholded, imgThresholded, cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(iStructuralElementSize, iStructuralElementSize)) ); + + cv::imshow("Thresholded Image", imgThresholded); //show the thresholded image + cv::imshow("Original", imgOriginal); //show the original image + + // waits for awhile depending on the FPS value + // checks if ESC was pressed to exit + char key = (char)cv::waitKey(1000.0/fFPS); + //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop + if (key == 27) + { + std::cout << "[INFO] esc key is pressed by user -> Shuting down!" << std::endl; + break; + } + if (key == 'u') + { + bIsImageUndistorted = !bIsImageUndistorted; + std::cout << "[INFO] Image undistorted: " << bIsImageUndistorted<< std::endl; + } + if (key == 's') + { + writeColorParameters(sColorParamFilename, iLowH, iHighH, iLowS, iHighS, iLowV, iHighV); + std::cout << "[INFO] Color parameters saved to file: " << sColorParamFilename << std::endl; + } + + + } + + return 0; +}