From 6b0c05f541ff55d0e024ea1b30b76f3f6640ee12 Mon Sep 17 00:00:00 2001 From: Grant Terris Date: Mon, 16 Sep 2019 20:57:05 -0700 Subject: [PATCH] Add Test Mode and Viewfinder --- .vscode/launch.json | 2 +- FaultFinder.cpp | 13 +++++++++- FaultManager.cpp | 12 +--------- FaultManager.hpp | 15 ------------ ImageAnalyzer.cpp | 58 +++++++++++++++++++++++++++++++++------------ ImageAnalyzer.hpp | 4 ++-- StreamManager.cpp | 2 +- 7 files changed, 60 insertions(+), 46 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 3387a10..aab0671 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -9,7 +9,7 @@ "type": "cppdbg", "request": "launch", "program": "${workspaceFolder}/FaultFinder", - "args": [], + "args": ["test"], "stopAtEntry": false, "cwd": "${workspaceFolder}", "environment": [], diff --git a/FaultFinder.cpp b/FaultFinder.cpp index 9d2fa9d..b309469 100644 --- a/FaultFinder.cpp +++ b/FaultFinder.cpp @@ -10,8 +10,19 @@ int main(int argc, char **argv) { StreamManager stream_mgr; ImageAnalyzer analyzer; - FaultManager fault_mgr(stoi(argv[1]), stod(argv[2])); + FaultManager fault_mgr; PvString lConnectionID; + + // If running in test mode + if (argc > 1 && !strcmp(argv[1], "test")) + { + while(1) + { + if (!analyzer.ProcessImage(0, 0, 0, fault_mgr, true)) + break; + } + return 0; + } // If no devies are found, exit. if (stream_mgr.FindDevice(&lConnectionID).IsFailure()) diff --git a/FaultManager.cpp b/FaultManager.cpp index ddb8dbe..164c259 100644 --- a/FaultManager.cpp +++ b/FaultManager.cpp @@ -7,15 +7,5 @@ using namespace cv; void FaultManager::SaveImage(Mat image) { // Tag date, time, gps in file meta data - imwrite( "/tmp/uniquetime.png", image); -} - -int FaultManager::GetTemp() -{ - return temp; -} - -double FaultManager::GetArea() -{ - return area; + //imwrite( "/tmp/uniquetime.png", image); } \ No newline at end of file diff --git a/FaultManager.hpp b/FaultManager.hpp index 4403144..326de9a 100644 --- a/FaultManager.hpp +++ b/FaultManager.hpp @@ -8,23 +8,8 @@ class FaultManager public: - FaultManager(int temp, double area) - { - if (temp) - temp = temp; - if (area) - area = area; - } - void SaveImage(cv::Mat image); - - int GetTemp(); - double GetArea(); - -private: - int temp = 100; - double area = 100; }; #endif \ No newline at end of file diff --git a/ImageAnalyzer.cpp b/ImageAnalyzer.cpp index 2f107f0..edbec61 100644 --- a/ImageAnalyzer.cpp +++ b/ImageAnalyzer.cpp @@ -6,39 +6,67 @@ #include "ImageAnalyzer.hpp" #include "FaultManager.hpp" +#define ZERO 0 +#define BITS8 0xff +#define BITS14 0x3fff +#define BITS16 0xffff + using namespace cv; -bool ImageAnalyzer::ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer, FaultManager fault_mgr) +bool ImageAnalyzer::ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer, FaultManager fault_mgr, bool test = false) { - Mat mask; + Mat frame, mask, viewfinder; std::vector> contours; - Mat frame(height, width, CV_16UC1, imgPointer, Mat::AUTO_STEP); - int temp_threshold = fault_mgr.GetTemp(); - double fault_area = fault_mgr.GetArea(); + static int lower_bound = ZERO; + static int upper_bound = BITS14; + static int temp_threshold = BITS14; + static int fault_area = ZERO; - threshold(frame, mask, temp_threshold, temp_threshold, THRESH_BINARY); + // Read in frame + if (!test) + frame = Mat(height, width, CV_16UC1, imgPointer, Mat::AUTO_STEP); + else + frame = imread("/home/midstate/Documents/image.png", CV_16UC1); - findContours(mask, contours, RETR_TREE, CHAIN_APPROX_NONE); + // Create mask and then flatten + GaussianBlur(frame, mask, cv::Size(0, 0), 1); + threshold(mask, mask, temp_threshold, BITS16, THRESH_BINARY); // use inrange for mask in range of values + mask.convertTo(mask, CV_8UC1); + // Analyze mask + findContours(mask, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE); + + // Create viewfinder with results + viewfinder = frame.clone(); + viewfinder.setTo(lower_bound, viewfinder < lower_bound); + viewfinder.setTo(upper_bound, viewfinder > upper_bound); + normalize(viewfinder, viewfinder, ZERO, BITS8, NORM_MINMAX, CV_8UC1); + applyColorMap(viewfinder, viewfinder, COLORMAP_HOT); + + // Apply contours to viewfinder for(int i = 0; i< contours.size(); i++) { - auto area = contourArea(contours[i]); + double area = contourArea(contours[i]); if (area > fault_area) { - drawContours(frame, contours[i], -1, Scalar(0, 255, 0), 3); + drawContours(viewfinder, contours, i, Scalar(ZERO, BITS8, ZERO), 2); fault_mgr.SaveImage(frame); } } - //scaled.convertTo(scaled, CV_8UC1); - //applyColorMap(scaled, color, COLORMAP_JET); + // Create Viewfinder Window + createTrackbar("Lower Bound", "FLIR Viewfinder", &lower_bound, BITS14, NULL); + createTrackbar("Upper Bound", "FLIR Viewfinder", &upper_bound, BITS14, NULL); + createTrackbar("Temperature Threshold", "FLIR Viewfinder", &temp_threshold, BITS14, NULL); + createTrackbar("Fault Area", "FLIR Viewfinder", &fault_area, 0x50280, NULL); + // Make clicking a pixel display the temp value + //setMouseCallback("FLIR Viewfinder", NULL); + namedWindow("FLIR Viewfinder", WINDOW_AUTOSIZE); + imshow("FLIR Viewfinder", viewfinder); - namedWindow("FLIR", WINDOW_AUTOSIZE); - imshow("FLIR", frame); - - if (waitKey(1) == 27) + if (waitKey(1) == 27 || getWindowProperty("FLIR Viewfinder", WND_PROP_FULLSCREEN) == -1) { destroyAllWindows(); return false; diff --git a/ImageAnalyzer.hpp b/ImageAnalyzer.hpp index bddfdbb..3b4be4e 100644 --- a/ImageAnalyzer.hpp +++ b/ImageAnalyzer.hpp @@ -8,8 +8,8 @@ class ImageAnalyzer { public: - - bool ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer, FaultManager fault_mgr); + + bool ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer, FaultManager fault_mgr, bool test); }; diff --git a/StreamManager.cpp b/StreamManager.cpp index 8cd66ec..669873f 100644 --- a/StreamManager.cpp +++ b/StreamManager.cpp @@ -196,7 +196,7 @@ void StreamManager::AcquireImages(ImageAnalyzer analyzer, FaultManager fault_mgr lHeight = lImage->GetHeight(); // Process Image - if (!analyzer.ProcessImage(lWidth, lHeight, lImage->GetDataPointer(), fault_mgr)) + if (!analyzer.ProcessImage(lWidth, lHeight, lImage->GetDataPointer(), fault_mgr, false)) break; std::cout << " W: " << std::dec << lWidth << " H: " << lHeight;