diff --git a/src/pointbase.cpp b/src/pointbase.cpp index 5bc555b..0fa8444 100644 --- a/src/pointbase.cpp +++ b/src/pointbase.cpp @@ -1,3 +1,14 @@ +/** + * @file pointbase.cpp + * @author Bc. Pavol Debnár + * This is the main file for the thesis implementing the pointBase class + * 2022/23 + */ + + + + + #include "opencv2/highgui.hpp" #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" @@ -26,9 +37,10 @@ namespace fs = std::filesystem; //sudo ln -s /usr/include/jsoncpp/json/ /usr/include/json +/** + * @brief struct necessary for comparison between 2 opencv points - when using std::map ; used to sort points according to X value + */ -//struct necessary for comparison between 2 opencv points - when using std::map -//used to sort points according to X value struct ComparePoints { bool operator () (const cv::Point& a, const cv::Point& b) const @@ -37,21 +49,30 @@ struct ComparePoints } } CP; - +/** + * @brief class implemented as solution for the thesis providing stitching and stitching features + * + */ class PointBase { public: - vector points; //all points - points are being removed as adjacencies are found - vector doneVector; //points that have been successfully searched for adjacencies - vector toDoVector; //points yet to be searched for adjacent points - std::map pathMap; //map for file paths - get the path of a file via pathMap[Point2d(x,y)] + vector points; /**< all points - points are being removed as adjacencies are found */ + vector doneVector; /**< points that have been successfully searched for adjacencies */ + vector toDoVector; /**< points yet to be searched for adjacent points*/ + std::map pathMap; /**< map for file paths - get the path of a file via pathMap[Point2d(x,y)] */ - double imgWidthDeg; - double imgHeightDeg; + double imgWidthDeg; /**< image width in degress taken from file */ + double imgHeightDeg; /**< image height in sensor format */ - //loaded points in pointbase are sorted according to X value + /** + * @brief load the points from a database - necessary for the offline algorithm + * + * loaded points in pointbase are sorted according to X value + * @param path - location where images and their jsons are stored in string format + * @return int - 0 if success, -1 if no points were loaded + */ int load(string path) { //std::string path = "../data/"; @@ -97,7 +118,11 @@ class PointBase { - + /** + * @brief prints the points from the database into the terminal + * + * @param which - if which is 0, the points vector is printed; 1 prints the complete contents of pathMap + */ void printPoints(int which=0) { if (which==1) // prints current points vector @@ -128,7 +153,13 @@ class PointBase { - + /** + * @brief returns the path of a point specified by x and y values + * + * @param x - x-value of the point + * @param y - y-value of the point + * @return string - path of the point + */ string getPath(double x, double y) { string path = pathMap[Point2d(x,y)]; @@ -142,9 +173,13 @@ class PointBase { + - //shows the location of loaded points on an images - //useful for debugging + /** + * @brief shows the location of loaded points on an images + * useful for debugging + * images have to be loaded using the load() function + */ void showPointImg() { Mat img(1200, 360, CV_8UC3, Scalar(0, 0, 0)); @@ -157,9 +192,13 @@ class PointBase { } - /*DESTRUCTIVE!! - removes found adj. points from points vector, adds them to the toBeDone vector - Searches for adjacent points to a given point - Returns either empty vector, or a vector with the found adjacent points + + /** + * @brief DESTRUCTIVE!! - removes found adj. points from points vector, adds them to the toBeDone vector + * Searches for adjacent points to a given point + * Returns either empty vector, or a vector with the found adjacent points + * @param inputPoint - opencv Point2d of the searched point + * @return vector of - points of images which are adjacent to the inputPoint */ vector getAdjacents(Point2d inputPoint) { @@ -224,8 +263,13 @@ class PointBase { } - //rotation function - //https://stackoverflow.com/questions/22041699/rotate-an-image-without-cropping-in-opencv-in-c + /** + * @brief rotation function + * https://stackoverflow.com/questions/22041699/rotate-an-image-without-cropping-in-opencv-in-c + * @param src - input image + * @param angle - angle in degrees + * @return rotated image + */ Mat rotate(Mat src, double angle) { cv::Point2f center((src.cols-1)/2.0, (src.rows-1)/2.0); @@ -245,10 +289,15 @@ class PointBase { - //blends using distance transform - //roi - original roi with 1 or more stitched images - //tranformedRoi - roi-sized image with the new image in the appropriate location - //showImg - bool, switch to enable showing of the new roi + + /** + * @brief blends using distance transform + * + * @param roi original roi with 1 or more stitched images + * @param transformedRoi roi-sized! image with the new image in the appropriate location + * @param showImg bool, switch to enable showing of the new roi + * @return Mat - the blended image + */ Mat dtBlend(Mat roi, Mat transformedRoi, bool showImg = false) { @@ -380,15 +429,14 @@ class PointBase { - - - - - - - - - + /** + * @brief blends using image pyramids transform + * + * @param roi original roi with 1 or more stitched images + * @param transformedRoi roi-sized! image with the new image in the appropriate location + * @param showImg bool, switch to enable showing of the new roi + * @return Mat - the blended image + */ Mat pyramidBlend(Mat roi, Mat transformedRoi, bool showImg = false) { /*roi.convertTo(roi,CV_32F); @@ -494,12 +542,11 @@ class PointBase { - /* - stitches images - points have to be loaded in the pointBase first - uses public toDoVector, points - BUG: not all adjacent images are used for stitching - OpenCV evaluates them as not appropriate for stitching - */ + /** + * @brief stitches images using opencv pipeline + * points have to be loaded in the pointBase first + * saves the result image in current directory + */ void stitchImgs() { int imgIdx = 0; @@ -636,6 +683,11 @@ class PointBase { /*returns minimum and maximum X and Y values from pointbase minX,maxX,minY,maxY */ + /** + * @brief gets the values of the top right, left and bottom right left images in pointBase + * + * @return vector, where the values are [minX,maxX,minY,maxY] + */ std::vector getEdgeValues() { double minX=999; @@ -661,6 +713,23 @@ class PointBase { + + + + + + + + + + + /** + * @brief image stitching using SIFT + * saves the source image to the current directory + * + * @param imgW source image width + * @param imgH source image height + */ void cumdump(int imgW,int imgH) { //sift takes too long if images are large, so we shrink them int imgWidth = imgW; @@ -1093,7 +1162,7 @@ class PointBase { } - imwrite("result0GIOJSDFI.png", img); + imwrite("result.png", img); } @@ -1218,7 +1287,12 @@ class PointBase { - + /** + * @brief stitches images using pattern matching + * saves the source image to the current directory + * @param imgW width of the source images + * @param imgH height of the source images + */ void patternMatchTry(int imgW,int imgH) { int imgWidth = imgW; @@ -1356,7 +1430,7 @@ class PointBase { if (qIdx==0) { imgSmall.copyTo(img(cv::Rect((int)round(coords.x)*(int)(imgWidth/imgWidthDeg),(int)round(coords.y)*(int)(imgHeight/imgHeightDeg),imgSmall.cols, imgSmall.rows))); - cout<<"DINGUS WAS PLACED \n"; + cout<<"IMAGE WAS PLACED \n"; } else { //default ROI location and size @@ -1645,7 +1719,7 @@ class PointBase { } - imwrite("result0GIOJSDFI.png", img); + imwrite("result.png", img); } @@ -1672,7 +1746,14 @@ class PointBase { - + /** + * @brief online image stitching using pattern matching + * saves the result image to the current directory + * do not load() any database previous to using this function + * @param imgW source image width + * @param imgH source image height + * @param path path to the images + */ void onlineStitch(int imgW,int imgH, string path) { @@ -1909,7 +1990,7 @@ class PointBase { imshow("Location of Images", dotImage);//Showing the circle// //imshow("img",img); waitKey(10); - imwrite("result0GIOJSDFI.png", img); + imwrite("result.png", img); qIdx++; } //string resultName = "result" + to_string(imgIdx) +".png"; @@ -1924,7 +2005,14 @@ class PointBase { - + /** + * @brief online image stitching using SIFT + * saves the result image to the current directory + * do not load() any database previous to using this function + * @param imgW source image width + * @param imgH source image height + * @param path path to the images + */ void onlineStitchSIFT(int imgW,int imgH, string path) { @@ -2192,7 +2280,7 @@ class PointBase { imshow("Location of Images", dotImage);//Showing the circle// //imshow("img",img); waitKey(10); - imwrite("result0GIOJSDFI.png", img); + imwrite("result.png", img); qIdx++; } //string resultName = "result" + to_string(imgIdx) +".png"; diff --git a/src/test.cpp b/src/test.cpp index 414a9f5..cbcfa17 100644 --- a/src/test.cpp +++ b/src/test.cpp @@ -1,3 +1,12 @@ +/** + * @file pointbase.cpp + * @author Bc. Pavol Debnár + * This is the test file with sample usage of the pointBase class + * 2022/23 + */ + + + #include "opencv2/highgui.hpp" #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" @@ -37,15 +46,26 @@ int main(int argc, char** argv) } */ + //////////////////////////////////////////////////// + //offline stitching + //test pointbase load PointBase pb; + pb.load("../155/2022-11-15_07-18-56/snapshots/"); + pb.patternMatchTry(770,605); + pb.cumdump(770,605); + + /* + here are sample inputs + + //pb.load("../data/"); //120/2022-11-15_09-35-09 //155/2022-11-15_07-18-56 //2/2022-10-13_13-33-22 //v //pb.load("../1/2022-10-13_11-50-12/snapshots/"); - pb.load("../155/2022-11-15_07-18-56/snapshots/"); + */ //test print all point info //pb.printPoints(0); @@ -55,24 +75,16 @@ int main(int argc, char** argv) x: 206.5; y: 1051; */ - cout << pb.getPath(206.500,1051.00) << '\n'; + //cout << pb.getPath(206.500,1051.00) << '\n'; //pb.showPointImg(); - /* - vector res = pb.getAdjacents(Point2d(75.1,3220.80)); - for (Point2d p :res) - { - cout << "x: " << p.x << std::endl; - cout << "y: " << p.y << std::endl; - } - */ - //pb.stitchImgs(); - //cout <<"IMG HEIGHT:" << pb.imgHeightDeg <<"\n"; - //cout <<"IMG WIDTH DEG:" << pb.imgWidthDeg <<"\n"; - //pb.cumdump(770,605); - pb.patternMatchTry(770,605); + ///////////////////////////////////////////////////// + //online stitching + ///////////////////////////////////////////////////// + + //PointBase pb; //pb.onlineStitchSIFT(1280,720,"online/"); } \ No newline at end of file