From 1662d8616db1ec08d47d7452a8a45489e1fddca3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Sun, 18 Sep 2022 16:51:07 +0200 Subject: [PATCH] chore: add files --- BUILD.md | 63 +++ CMakeLists.txt | 17 + DEP_LINUX.md | 79 +++ DEP_OSX.md | 62 +++ DEP_WINDOWS.md | 89 +++ data/images/HappyFish.png | Bin 0 -> 43515 bytes data/images/cat.jpg | Bin 0 -> 65555 bytes data/images/texture11.png | Bin 0 -> 140604 bytes data/images/texture11_VT.png | Bin 0 -> 17958 bytes data/images/texture3.png | Bin 0 -> 114088 bytes data/images/texture3_VT.png | Bin 0 -> 10484 bytes data/images/texture8.png | Bin 0 -> 148614 bytes data/images/texture8_VT.png | Bin 0 -> 16800 bytes src/CMakeLists.txt | 2 + src/tp/CMakeLists.txt | 9 + src/tp/main.cpp | 507 ++++++++++++++++++ src/tp/ocv_utils.cpp | 40 ++ src/tp/ocv_utils.hpp | 24 + src/tp/ocv_utils.hpp.gch | Bin 0 -> 12755 bytes src/tutorials/CMakeLists.txt | 17 + src/tutorials/display_image.cpp | 37 ++ src/tutorials/load_modify_image.cpp | 45 ++ .../mat_the_basic_image_container.cpp | 89 +++ 23 files changed, 1080 insertions(+) create mode 100644 BUILD.md create mode 100644 CMakeLists.txt create mode 100644 DEP_LINUX.md create mode 100644 DEP_OSX.md create mode 100644 DEP_WINDOWS.md create mode 100644 data/images/HappyFish.png create mode 100644 data/images/cat.jpg create mode 100644 data/images/texture11.png create mode 100644 data/images/texture11_VT.png create mode 100644 data/images/texture3.png create mode 100644 data/images/texture3_VT.png create mode 100644 data/images/texture8.png create mode 100644 data/images/texture8_VT.png create mode 100644 src/CMakeLists.txt create mode 100644 src/tp/CMakeLists.txt create mode 100644 src/tp/main.cpp create mode 100644 src/tp/ocv_utils.cpp create mode 100644 src/tp/ocv_utils.hpp create mode 100644 src/tp/ocv_utils.hpp.gch create mode 100644 src/tutorials/CMakeLists.txt create mode 100644 src/tutorials/display_image.cpp create mode 100644 src/tutorials/load_modify_image.cpp create mode 100644 src/tutorials/mat_the_basic_image_container.cpp diff --git a/BUILD.md b/BUILD.md new file mode 100644 index 0000000..a2b6cdf --- /dev/null +++ b/BUILD.md @@ -0,0 +1,63 @@ +# Dependencies + +This projet requires: + +* opencv >= 3.4.4 +* cmake >= 3.10 + +## Installing the dependencies + +* [Linux](DEP_LINUX.md) +* [Windows](DEP_WINDOWS.md) +* [OSx](DEP_OSX.md) + +# Building + +## Linux & OSX + +From the root of the project: + +``` +mkdir build +cd build +cmake .. -DOpenCV_DIR=${tpTIBasePath}/opencv-3.4.13/build/install/share/OpenCV/ +``` + +and then to compile + +``` +make -j$(nproc) +``` + +All the executables are placed in `build/bin` + +## Windows + +### Create the Visual Studio Solution. + +* open a Terminal and go to the directory containing the code. + +* execute: + + * `md build` + + * `cd build` + + * `cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE:STRING=Release -DCMAKE_PREFIX_PATH:PATH= ..` + + Replace `` with the location where you installed opencv (e.g. C:/User/Toto/Opencv) + + * `dir` + + > if you had a different version of VS installed (not the latest) you may need to adapt the string `Visual Studio 16 2019` to your version: e.g. Visual Studio 15 2017, Visual Studio 14 2015, Visual Studio 12 2013 + +* if everything went well you should find a file named `tpTI.sln` inside the directory. + + +### Compile, build, execute + +* open `tpTI.sln` inside VS either by double clicking on it or opening from inside VS + +* build the solution (**Build Solution** from the **Build menu**) + + diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..1cae6f5 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,17 @@ +cmake_minimum_required(VERSION 3.10) +project(tpTI VERSION 0.1 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +include(GNUInstallDirs) + +# set the output path for the generated files +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_BINDIR}) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR}) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/${CMAKE_INSTALL_LIBDIR} ) + +find_package(OpenCV 4.0 REQUIRED) +message(STATUS "OpenCV found, version ${OpenCV_VERSION}") + +add_subdirectory(src) \ No newline at end of file diff --git a/DEP_LINUX.md b/DEP_LINUX.md new file mode 100644 index 0000000..1b21705 --- /dev/null +++ b/DEP_LINUX.md @@ -0,0 +1,79 @@ +# Linux + +These are the steps to build all you need for the TP. + + +## Prerequisites + +In order to develop in C++ some system packages are required (you may already have it installed on your machine since the opengl tp of last semester): + +``` +sudo apt-get install libglu1-mesa-dev freeglut3-dev build-essential mesa-common-dev libxi-dev libxmu-dev automake libgtk+2.0-dev pkg-config libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libv4l-dev gstreamer1.0-plugins-bad ubuntu-restricted-extras +``` + +To build this code we use the CMake build system. +You can install CMake from the system package manager but you need a recent version >= 3.10. +Check the version that is provided by your linux distribution and if it is suitable usually you just need to + + + ``` + sudo apt-get install cmake + ``` + +otherwise you can install the binaries from here: https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1-Linux-x86_64.sh + + To install: + + ``` + wget https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1-Linux-x86_64.sh + chmod +x cmake-3.17.1-Linux-x86_64.sh + sudo cmake-3.17.1-Linux-x86_64.sh --prefix=/usr/local/ --skip-license + ``` + + +## Setting up your working environment + +* create a folder `tpTI` where you will have all the dependencies and the sources of the tp. + Please avoid paths containing spaces, weird characters or accents. + +* to make your life easier, set up an environment variable that refer to this location + + * You can define it for a single session with (e.g.) `export tpTIBasePath=/home/sgaspari/dev/tpTI` + + * or you can define it once for all by adding the previous instruction to your `~/.bashrc` (or `~/.profile`) files, so that you don't need to run the instruction for each terminal session. + + * you can verify that the variable is set with `echo ${tpTIBasePath}` + + +## opencv + +OpenCV is a computer vision library that contains some of the algorithms we are using for image processing and pose estimation. +To install it: + +* download the library from the repository https://github.com/opencv/opencv/archive/3.4.13.zip + +* unzip the file into `${tpTIBasePath}` (a folder named `opencv-3.4.13` should appear). + +* from `${tpTIBasePath}\opencv-3.4.13` create a `build` directory (`mkdir build`) + +* from the shell, go to `${tpTIBasePath}/opencv-3.4.13/build` and execute the following: + + ``` + cmake .. -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/install -DCMAKE_BUILD_TYPE=Release -DWITH_CUDA:BOOL=OFF -DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_TESTS:BOOL=OFF + ``` + +* then build and install the library by running + + ``` + make install -j$(nproc) + ``` + and go grab a cup of coffee or a beverage of your choice ;-) + + +* in order to run the tp code later on you have to add the built libraries to the `LD_LIBRARY_PATH` environment variable. + + ``` + export LD_LIBRARY_PATH=${tpTIBasePath}/opencv-3.4.13/build/install/lib:$LD_LIBRARY_PATH + ``` + + Again, you can add this to your `~/.bashrc` (or `~/.profile`) file so that you have it available for all shell sessions. \ No newline at end of file diff --git a/DEP_OSX.md b/DEP_OSX.md new file mode 100644 index 0000000..5e43ad2 --- /dev/null +++ b/DEP_OSX.md @@ -0,0 +1,62 @@ +# OSX + +These are the steps to build all you need for the TP. + + +## Prerequisites + +* If you do not have it already installed, you need to install XCode from the `Mac App Store`, see here for more details https://developer.apple.com/support/xcode/ + +* everything will be smoother if you have homebrew installed (https://brew.sh/): it is a package manager similar in spirit to the one you find in Linux. + + * `brew install automake cmake` will install everything you need for building the code. + + * if you don't have homebrew you can install CMake by downloading https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1-Darwin-x86_64.dmg + +## Setting up your working environment + +* create a folder `tpTI` where you will have all the dependencies and the sources of the tp. + Please avoid paths containing spaces, weird characters or accents. + +* to make your life easier, set up an environment variable that refer to this location + + * You can define it for a single session with (e.g.) `export tpTIBasePath=/home/sgaspari/dev/tpTI` + + * or you can define it once for all by adding the previous instruction to your `~/.profile` file, so that you don't need to run the instruction for each terminal session. + + * you can verify that the variable is set with `echo ${tpTIBasePath}` + + +## opencv + +OpenCV is a computer vision library that contains some of the algorithms we are using for image processing and pose estimation. +To install it: + +* download the library from the repository https://github.com/opencv/opencv/archive/3.4.13.zip + +* unzip the file into `${tpTIBasePath}` (a folder named `opencv-3.4.13` should appear). + +* from `${tpTIBasePath}\opencv-3.4.13` create a `build` directory (`mkdir build`) + +* from the shell, go to `${tpTIBasePath}/opencv-3.4.13/build` and execute the following: + + ``` + cmake .. -DCMAKE_INSTALL_PREFIX:PATH=`pwd`/install -DCMAKE_BUILD_TYPE=Release -DWITH_CUDA:BOOL=OFF -DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_TESTS:BOOL=OFF + ``` + +* then build and install the library by running + + ``` + make install -j4 + ``` + You can replace 4 with the number of threads that you machine can support, it will speed up the building. + Then go grab a cup of coffee or a beverage of your choice ;-) + + +* in order to run the tp code later on you have to add the built libraries to the `DYLD_LIBRARY_PATH` environment variable. + + ``` + export DYLD_LIBRARY_PATH=${tpTIBasePath}/opencv-3.4.13/build/install/lib:$DYLD_LIBRARY_PATH + ``` + + Again, you can add this to your `~/.profile` file so that you have it available for all shell sessions. \ No newline at end of file diff --git a/DEP_WINDOWS.md b/DEP_WINDOWS.md new file mode 100644 index 0000000..13e7b1a --- /dev/null +++ b/DEP_WINDOWS.md @@ -0,0 +1,89 @@ +# Windows + +These are the steps to build all you need for the TP. + + +## Prerequisites + +The building process requires CMake and MS Visual Studio. +You may already have it installed on your machine since the opengl tp of last semester. + +If it is not the case: + +* download and install the latest version of CMake + + * download here: https://github.com/Kitware/CMake/releases/download/v3.17.1/cmake-3.17.1-win64-x64.msi + + * !!! When installing make sure that the checkbox "ne pas ajouter cmake au PATH" is **NOT** checked + + +* if you don't have it already, download and install MS Visual Studio Community Edition (free for students): https://visualstudio.microsoft.com/downloads/ + + * install instructions here: https://docs.microsoft.com/en-us/cpp/build/vscpp-step-0-installation?view=vs-2019 + + * !!! install the "Desktop development with C++" + + * If you have VS already installed, you can go in **Tools** --> **Get Tools and Features...** to install "Desktop development with C++" if it is missing. + + +## Setting up your working environment + +* create a folder `tpTI` where you will have all the dependencies and the sources of the tp. + Please avoid paths containing spaces, weird characters or accents. + +* to make your life easier, set up an environment variable that refer to this location + + * from the prompt (`cmd.exe`) execute `c:\Windows\System32\SystemPropertiesAdvanced.exe ` + + * click `Environment Variables...` (`Variables d'environnement...`) + + * in `User Variables for ...` ( `Variables utilisateur pour...`) click `New...` and set a new variable named + `tpTIBasePath` and set its value to the full path to the working directory, e.g. `C:\Users\Simone\source\tpTI` + + * once you set it, in order to be usable at command line you need to open a new session of prompt/powershell + + * if you open the session you can check it is working by running `echo %tpTIBasePath%` in command prompt (or `$env:tpTIBasePath` in powershell) + This should display the whole path to tpTI. + + +## opencv + +OpenCV is a computer vision library that contains some of the algorithms we are using for image processing and pose estimation. +To install it: + +* download the library from the repository https://github.com/opencv/opencv/archive/3.4.13.zip + +* unzip the file into %tpTIBasePath% (a folder named `opencv-3.4.13` should appear). + +* from `%tpTIBasePath%\opencv-3.4.13` create a `build` directory (`mkdir build`) + +* from the terminal/prompt, go to `%tpTIBasePath%\opencv-3.4.13\build` and execute the following: + + ``` + cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE=Release -DWITH_CUDA:BOOL=OFF -DBUILD_PERF_TESTS:BOOL=OFF -DBUILD_TESTS:BOOL=OFF + ``` + +> if you had a different version of VS installed (not the latest) you may need to adapt the string `Visual Studio 16 2019` to your version: e.g. `Visual Studio 15 2017`, `Visual Studio 14 2015`, `Visual Studio 12 2013` etc + +* then execute + + ``` + cmake --build . --config Release + ``` + + and go grab a cup of coffee or a beverage of your choice ;-) + + +## Setting up the runtime environment variables + +The last step before start working on the TP is to set up the environment variables that allows the system to find the libraries you just installed/built. + +* from the prompt execute `c:\Windows\System32\SystemPropertiesAdvanced.exe ` + + * click `Environment Variables...` (`Variables d'environnement...`) + + * in `User Variables for ...` (`Variables utilisateur pour...`), select the variable `Path` and then click `Edit...` + + * add at the bottom of the list the following paths: + + * `%tpTIBasePath%\opencv-2.4.13.4\build\bin\Release` diff --git a/data/images/HappyFish.png b/data/images/HappyFish.png new file mode 100644 index 0000000000000000000000000000000000000000..5193089477e5b2fcb2294d10470f61e3e16f2edd GIT binary patch literal 43515 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 TotvvV>c9Rx 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 SNF6{604oby^GEw=@&5-ypRXkV literal 0 HcmV?d00001 diff --git a/data/images/cat.jpg b/data/images/cat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df4a907e5fd1e40bbfd0d3bb7ad633d6d7211b4f GIT binary patch literal 65555 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

$u*kpa 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 UZ=*<|Av*w&msXalmNW|bA4vr?+yDRo literal 0 HcmV?d00001 diff --git a/data/images/texture8_VT.png b/data/images/texture8_VT.png new file mode 100644 index 0000000000000000000000000000000000000000..74619488ab8addd7af0d8983c75fdb27e9469d67 GIT binary patch literal 16800 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 fZJ+eGPfNO^^IyN4Jcj@CLQvAI)P& +#include +#include +#include +#include +#include +#include + +using namespace cv; +using namespace std; + +// ------------------------------------------------------------------------------------------------------------------------ + +void printHelp(const string &progName) +{ + cout << "Usage:\n\t " << progName << " []" << endl; +} + +int min(int a, int b) +{ + return a < b ? a : b; +} + +int max(int a, int b) +{ + return a > b ? a : b; +} + +/** + * @brief Calculate the euclidean distance between {r,it_max,b} and {R,G,B} + * + * @param r red + * @param g green + * @param b blue + * @param R Red + * @param G Green + * @param B Blue + * @return distance between {r,it_max,b} and {R,G,B} + */ +int distance(int r, int g, int b, int R, int G, int B) +{ + return sqrt((r - R) * (r - R) + (g - G) * (g - G) + (b - B) * (b - B)); +} + +/** + * @brief Calculate the index of the closest center from the color + * + * @param color + * @param centers + * @return index of the closest center + */ +int closestCenter(Vec3b color, Mat centers) +{ + // Extract r it_max b values + int r = color[0]; + int it_max = color[1]; + int b = color[2]; + + // Initialize variables + int minDistance = sqrt(3 * 255 * 255) + 1; + int closest; + + // Test each centers + for (int i = 0; i < centers.rows; i++) + { + // Extract R G B values from the current center + int R = centers.at(i, 0); + int G = centers.at(i, 1); + int B = centers.at(i, 2); + + // Replace varibales with new values if necessary + int curDistance = distance(r, it_max, b, R, G, B); + if (curDistance < minDistance) + { + minDistance = curDistance; + closest = i; + } + } + return closest; +} + +// ------------------------------------------------------------------------------------------------------------------------ + +/** + * @brief Calculate the k-means of the vect + * + * @param vect + * @param k + * @return Centers of vect + */ +Mat kmeans(Mat vect, int k) +{ + Mat centers(k, 1, CV_32FC3); + + // initialisation des centres + for (int i = 0; i < k; i++) + { + centers.at(i) = vect.at(i * vect.rows / k); + } + + int it = 0; + int it_max = 20000; + int counters[k]; + Mat prevCenters; + + do + { + // initialiser les varibales de boucle + prevCenters = centers.clone(); + for (int i = 0; i < k; i++) + { + counters[i] = 0; + } + + // compter les centres + // sommer les pixels de chaque classe + centers = Mat::zeros(k, 1, CV_32FC3); + for (int i = 0; i < vect.cols; i++) + { + Vec3f color = vect.at(i); + int closest = closestCenter(color, prevCenters); + centers.at(closest) += color; + counters[closest]++; + } + + // faire la moyennes des pixels de chaque classe + for (int i = 0; i < k; i++) + { + if (counters[i] != 0) + centers.at(i) /= counters[i]; + } + + } while (it++ < it_max && sum(centers != prevCenters) != Scalar(0, 0, 0, 0)); + cout << "kmeans terminé en " << it << " itérations." << endl << endl; + + return centers; +} + +// ------------------------------------------------------------------------------------------------------------------------ + +/** + * @brief + * + * @param s_i + * @param s_j + * @param d_i + * @param d_j + * @param matIMG + * @param matMOY + * @param matCOUNT + * @param hc + * @return float + */ +float compute(int s_i, int s_j, int d_i, int d_j, Mat *matIMG, Mat *matMOY, Mat *matCOUNT, double hc) +{ + Vec3f centre = matIMG->at(s_i, s_j); + Vec3f dest = matIMG->at(d_i, d_j); + + // seuil chromatique + float dist = cv::norm(dest - centre); + if (dist < hc) + { + matMOY->at(s_i, s_j) += dest; + matMOY->at(d_i, d_j) += centre; + + matCOUNT->at(s_i, s_j)++; + matCOUNT->at(d_i, d_j)++; + + return dist; + } + + return 0; +} + +/** + * @brief Calculate the k-means of the matIMG + * + * @param hs + * @param hc + * @param eps + * @param itMax + * @param matIMG + * @return Mat + */ +Mat meanshift(uint hs, double hc, double eps, uint itMax, Mat matIMG) +{ + Mat matMOY, matCOUNT; + float maxDist, dist; + int i, j; + + int it = 0; + + #pragma omp parallel shared(it) + + do { + #pragma omp single + { + cout << " mean-shit (" << it << "/" << itMax << ")" << endl; + + matMOY = Mat::zeros(matIMG.rows, matIMG.cols, CV_32FC3); + matCOUNT = Mat::zeros(matIMG.rows, matIMG.cols, CV_32FC1); + maxDist = 0; + it++; + } + + #pragma omp for private(i, j) + for (i = 0; i < matIMG.rows; i++) + { + for (j = 0; j < matIMG.cols; j++) + { + // pixels à droite du centre + for (int j2 = j; j2 < min(j + hs + 1, matIMG.cols); j2++) + { + dist = compute(i, j, i, j2, &matIMG, &matMOY, &matCOUNT, hc); + if (dist > maxDist) + { + maxDist = dist; + } + } + + // pixels en dessous du centre + for (int i2 = i + 1; i2 < min(i + hs + 1, matIMG.rows); i2++) + { + for (int j2 = max(j - hs, 0); j2 < min(j + hs + 1, matIMG.cols); j2++) + { + dist = compute(i, j, i2, j2, &matIMG, &matMOY, &matCOUNT, hc); + if (dist > maxDist) + { + maxDist = dist; + } + } + } + + matIMG.at(i, j) = matMOY.at(i, j) / matCOUNT.at(i, j); + } + } + // cout << "maxDist = " << maxDist << endl; + } + while (it < itMax); + + return matIMG; +} + +// ------------------------------------------------------------------------------------------------------------------------ + +/** + * @brief + * + * @param argc + * @param argv + * @return int + */ +int main(int argc, char **argv) +{ + if (argc != 3 && argc != 4) + { + cout << " Incorrect number of arguments." << endl; + printHelp(string(argv[0])); + return EXIT_FAILURE; + } + + const auto imageFilename = string(argv[1]); + const string groundTruthFilename = (argc == 4) ? string(argv[3]) : string(); + const int k = stoi(argv[2]); + + if (k < 1) + { + cout << " k must be a positive integer" << endl; + printHelp(string(argv[0])); + return EXIT_FAILURE; + } + + // trust file used ? + bool useTrust = !groundTruthFilename.empty() && k == 2; + + // just for debugging + { + cout << endl + << " Program called with the following arguments:" << endl; + cout << " \timage file: " << imageFilename << endl; + cout << " \tk: " << k << endl; + if (useTrust) + cout << " \tground truth segmentation: " << groundTruthFilename << endl + << endl; + } + + // load the color image to process from file + Mat sourceMatrix = imread(imageFilename, IMREAD_COLOR); + Mat trustMatrix = imread(groundTruthFilename, IMREAD_COLOR); + + // for debugging use the macro PRINT_MAT_INFO to print the info about the matrix, like size and type + PRINT_MAT_INFO(sourceMatrix); + + // convert the image into floats (CV_32F), for kmeans + Mat sourceMatrix32f; + sourceMatrix.convertTo(sourceMatrix32f, CV_32F); + + // reshape the image into a 1D array, for kmeans + Mat sourceMatrixReshaped = sourceMatrix32f.reshape(3, 1); + + // Call OpenCV's kmeans function + Mat labels, centers; + kmeans( + sourceMatrixReshaped, + k, + labels, + TermCriteria(TermCriteria::EPS + TermCriteria::COUNT, 10, 1.0), + 3, + KMEANS_PP_CENTERS, + centers); + + // Call ou kmeans function + centers = kmeans(sourceMatrixReshaped, k); + + // Create result matrix + Mat resultMatrix = sourceMatrix.clone(); + Mat diffMatrix = trustMatrix.clone(); + + // Some usefull colors + Vec3b white(255, 255, 255); + Vec3b black(0, 0, 0); + Vec3b red(255, 0, 0); + Vec3b blue(0, 0, 255); + + Vec3b colorMaj, colorMin; + if (useTrust) + { + // Count the number of pixel per class in the trust matrix + int n = 0, p = 0; + for (int i = 0; i < trustMatrix.rows; i++) + { + for (int j = 0; j < trustMatrix.cols; j++) + { + if (trustMatrix.at(i, j) == white) + { + n++; + } + else + { + p++; + } + } + } + + // Assign black/white to colorMaj/colorMin + if (n > p) + { + colorMaj = white; + colorMin = black; + } + else + { + colorMaj = black; + colorMin = white; + } + + // Count the number of pixel per class in the source matrix + n = 0; + p = 0; + for (int i = 0; i < resultMatrix.rows; i++) + { + for (int j = 0; j < resultMatrix.cols; j++) + { + Vec3b color = sourceMatrix.at(i, j); + int closest = closestCenter(color, centers); + if (closest == 0) + { + n++; + } + else + { + p++; + } + } + } + + // Reorganize centers to match with the trust matrix + if (n < p) + { + Vec3f tmp = centers.at(0); + centers.at(0) = centers.at(1); + centers.at(1) = tmp; + } + } + + // Quality counters + float TP = 0; + float FP = 0; + float TN = 0; + float FN = 0; + + // Loop for each pixel + for (int i = 0; i < resultMatrix.rows; i++) + { + for (int j = 0; j < resultMatrix.cols; j++) + { + Vec3b color = sourceMatrix.at(i, j); + + int closest = closestCenter(color, centers); + + // Set pixel color to the color of the closest center + // (Or black/white if we are using a trust image) + if (useTrust && closest == 0) + { + resultMatrix.at(i, j) = colorMaj; + } + else if (useTrust && closest == 1) + { + resultMatrix.at(i, j) = colorMin; + } + else + { + resultMatrix.at(i, j) = centers.at(closest); + } + + // Increment counters for the quality evaluations + if (useTrust) + { + if (trustMatrix.at(i, j) != resultMatrix.at(i, j)) + { + diffMatrix.at(i, j) = trustMatrix.at(i, j) == colorMaj ? red : blue; + + if (trustMatrix.at(i, j) == colorMaj) + { + // False negative + FN++; + } + else + { + // False positive + FP++; + } + } + else + { + if (trustMatrix.at(i, j) == colorMaj) + { + // True positive + TP++; + } + else + { + // True negative + TN++; + } + } + } + } + } + + // Trust comparison results + if (useTrust) + { + float P = TP / (TP + FP); + float S = TP / (TP + FN); + float DSC = 2 * TP / (2 * TP + FP + FN); + + cout << endl + << "counters = " << endl + << " TP = " << TP << endl + << " TN = " << TN << endl + << " FP = " << FP << endl + << " FN = " << FN << endl + << " Total (debug) = " << (TP + TN + FP + FN) << endl + << endl + << " Precision = " << P << endl + << " Sensibility = " << S << endl + << " DICE Similarity Coefficient = " << DSC << endl; + } + + // compute meanshift for the image + int hs = 2; + int hc = 10; + double eps = 1.0; + int ite = 5; + + Mat msMatrix = meanshift(hs, hc, eps, ite, sourceMatrix32f); + Mat msMatrixU; + msMatrix.convertTo(msMatrixU, CV_8U); + + // create image windows + namedWindow("Source", cv::WINDOW_AUTOSIZE); + namedWindow("Result", cv::WINDOW_AUTOSIZE); + if (useTrust) + { + namedWindow("Trust", cv::WINDOW_AUTOSIZE); + namedWindow("Diff", cv::WINDOW_AUTOSIZE); + } + namedWindow("Mean Shift", cv::WINDOW_AUTOSIZE); + + // show images + imshow("Source", sourceMatrix); + imshow("Result", resultMatrix); + if (useTrust) + { + imshow("Trust", trustMatrix); + imshow("Diff", diffMatrix); + } + imshow("Mean Shift", msMatrixU); + + // press q to end + while (waitKey(0) != 113); + + return EXIT_SUCCESS; +} diff --git a/src/tp/ocv_utils.cpp b/src/tp/ocv_utils.cpp new file mode 100644 index 0000000..a4d77d1 --- /dev/null +++ b/src/tp/ocv_utils.cpp @@ -0,0 +1,40 @@ +#include "ocv_utils.hpp" + +#include +std::string getMatType(int number) +{ + // find type + const int imgTypeInt = number % 8; + std::string imgTypeString; + + switch(imgTypeInt) + { + case 0: imgTypeString = "8U"; break; + case 1: imgTypeString = "8S"; break; + case 2: imgTypeString = "16U"; break; + case 3: imgTypeString = "16S"; break; + case 4: imgTypeString = "32S"; break; + case 5: imgTypeString = "32F"; break; + case 6: imgTypeString = "64F"; break; + default: break; + } + + // find channel + const int channel = (number / 8) + 1; + + std::stringstream type; + type << "CV_" << imgTypeString << "C" << channel; + + return type.str(); +} + +void printMatInfo(const std::string& message, const cv::Mat& m) +{ + std::cout << message << ": " << m.size() << " ch: "<< m.channels() << " type: " << getMatType(m.type()) << std::endl; +} + + +std::string getMatType(const cv::Mat& m) +{ + return getMatType(m.type()); +} \ No newline at end of file diff --git a/src/tp/ocv_utils.hpp b/src/tp/ocv_utils.hpp new file mode 100644 index 0000000..770109c --- /dev/null +++ b/src/tp/ocv_utils.hpp @@ -0,0 +1,24 @@ +#pragma once + +#include + +#include + +/** + * @brief Print the information about the matrix (size, channels and type). + * @param message A message to print before the matrix info: the output is in the format "message: [RxC] ch: #channels type: CV_XXTCY" + * @param m The matrix. + */ +void printMatInfo(const std::string& message, const cv::Mat& m); + +/** + * @brief Print the information about a matrix with the name given by variable name. + */ +#define PRINT_MAT_INFO(mat) printMatInfo(#mat, mat) + +/** + * @brief Return the matrix type in readable string format + * @param m The matrix + * @return A string with the matrix type in string format, e.g. "CV_8UC3" + */ +std::string getMatType(const cv::Mat& m); \ No newline at end of file diff --git a/src/tp/ocv_utils.hpp.gch b/src/tp/ocv_utils.hpp.gch new file mode 100644 index 0000000000000000000000000000000000000000..a5bcd703a0ee6b442992c1332a8820d0e1fee19c GIT binary patch literal 12755 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 RC+>22U0gdJahJ&1{{d=sYNP-F literal 0 HcmV?d00001 diff --git a/src/tutorials/CMakeLists.txt b/src/tutorials/CMakeLists.txt new file mode 100644 index 0000000..c77865d --- /dev/null +++ b/src/tutorials/CMakeLists.txt @@ -0,0 +1,17 @@ +######################################################### +# +# OPENCV TUTORIALS +# +######################################################### + +add_executable( display_image display_image.cpp ) +target_link_libraries( display_image ${OpenCV_LIBS} ) + +add_executable( load_modify_image load_modify_image.cpp ) +target_link_libraries( load_modify_image ${OpenCV_LIBS} ) + +add_executable( mat_the_basic_image_container mat_the_basic_image_container.cpp ) +target_link_libraries( mat_the_basic_image_container ${OpenCV_LIBS} ) + + +add_custom_target( tutorials DEPENDS load_modify_image display_image mat_the_basic_image_container ) diff --git a/src/tutorials/display_image.cpp b/src/tutorials/display_image.cpp new file mode 100644 index 0000000..b06927e --- /dev/null +++ b/src/tutorials/display_image.cpp @@ -0,0 +1,37 @@ +#include +#include + +#include + +using namespace cv; +using namespace std; + +int main(int argc, char **argv) +{ + if (argc != 2) + { + cout << " Usage: display_image ImageToLoadAndDisplay" << endl; + return EXIT_FAILURE; + } + + // Read the file + Mat image = imread(argv[1], cv::IMREAD_COLOR); + + // Check for invalid input + if (image.empty()) + { + cout << "Could not open or find the image" << std::endl; + return EXIT_FAILURE; + } + + // Create a window for display. + namedWindow("Display window", cv::WINDOW_AUTOSIZE); + + // Show our image inside it. + imshow("Display window", image); + + // Wait for a keystroke in the window + waitKey(0); + + return EXIT_SUCCESS; +} \ No newline at end of file diff --git a/src/tutorials/load_modify_image.cpp b/src/tutorials/load_modify_image.cpp new file mode 100644 index 0000000..432a391 --- /dev/null +++ b/src/tutorials/load_modify_image.cpp @@ -0,0 +1,45 @@ +#include +#include +#include + +#include + +using namespace cv; +using namespace std; + +int main(int argc, char **argv) +{ + // Read the filename + char *imageName = argv[1]; + + // load image from file + Mat image = imread(imageName, IMREAD_COLOR); + + if (argc != 2 || image.empty()) + { // verify the image was correctly loaded + cerr << " No image data " << endl; + return EXIT_FAILURE; + } + + // create new Mat, for the grey image + Mat gray_image; + + // convert the loaded image to grey, and copy it to gray_image + cvtColor(image, gray_image, cv::COLOR_BGR2GRAY); + + // write greyscale image to file + imwrite("Gray_Image.jpg", gray_image); + + // create windows + namedWindow(imageName, cv::WINDOW_AUTOSIZE); + namedWindow("Gray image", cv::WINDOW_AUTOSIZE); + + // show on windows + imshow(imageName, image); + imshow("Gray image", gray_image); + + // Wait for a keystroke in the window + waitKey(0); + + return EXIT_SUCCESS; +} diff --git a/src/tutorials/mat_the_basic_image_container.cpp b/src/tutorials/mat_the_basic_image_container.cpp new file mode 100644 index 0000000..f1fb728 --- /dev/null +++ b/src/tutorials/mat_the_basic_image_container.cpp @@ -0,0 +1,89 @@ +/* For description look into the help() function. */ + +#include "opencv2/core/core.hpp" + +#include + +using namespace std; +using namespace cv; + +static void help(char *progName) +{ + cout << "\n--------------------------------------------------------------------------" << endl + << "This program shows how to create matrices(cv::Mat) in OpenCV and its serial" + << " out capabilities" << endl + << "That is, cv::Mat M(...); M.create and cout << M. " << endl + << "Shows how output can be formatted to OpenCV, python, numpy, csv and C styles." << endl + << "Usage:" << endl + << std::string(progName) << endl + << "--------------------------------------------------------------------------" << endl + << endl; +} + +int main(int, char** argv) +{ + help(argv[0]); + // create by using the constructor + Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255)); + cout << "M = " << endl << " " << M << endl << endl; + + // create by using the create function() + M.create(4, 4, CV_8UC(2)); + cout << "M = " << endl << " " << M << endl << endl; + + // create multidimensional matrices + int sz[3] = {2, 2, 2}; + Mat L(3, sz, CV_8UC(1), Scalar::all(0)); + // Cannot print via operator << + + // Create using MATLAB style eye, ones or zero matrix + Mat E = Mat::eye(4, 4, CV_64F); + cout << "E = " << endl << " " << E << endl << endl; + + Mat O = Mat::ones(2, 2, CV_32F); + cout << "O = " << endl << " " << O << endl << endl; + + Mat Z = Mat::zeros(3, 3, CV_8UC1); + cout << "Z = " << endl << " " << Z << endl << endl; + + // create a 3x3 double-precision identity matrix + Mat C = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); + cout << "C = " << endl << " " << C << endl << endl; + + Mat RowClone = C.row(1).clone(); + cout << "RowClone = " << endl << " " << RowClone << endl << endl; + + // Fill a matrix with random values + Mat R = Mat(3, 2, CV_8UC3); + randu(R, Scalar::all(0), Scalar::all(255)); + + // Demonstrate the output formating options +#if CV_MAJOR_VERSION < 3 + cout << "R (default) = " << endl << R << endl << endl; + cout << "R (python) = " << endl << format(R, "python") << endl << endl; + cout << "R (numpy) = " << endl << format(R, "numpy") << endl << endl; + cout << "R (csv) = " << endl << format(R, "csv") << endl << endl; + cout << "R (c) = " << endl << format(R, "C") << endl << endl; +#endif + + Point2f P(5, 1); + cout << "Point (2D) = " << P << endl << endl; + + Point3f P3f(2, 6, 7); + cout << "Point (3D) = " << P3f << endl << endl; + + vector v; + v.push_back((float)CV_PI); + v.push_back(2); + v.push_back(3.01f); + + cout << "Vector of floats via Mat = " << Mat(v) << endl << endl; + + vector vPoints(20); + for(size_t i = 0; i < vPoints.size(); ++i) + vPoints[i] = Point2f((float)(i * 5), (float)(i % 7)); + + cout << "A vector of 2D Points = " << vPoints << endl << endl; + + return EXIT_SUCCESS; +} \ No newline at end of file