From 8c7d4c0b43fba0f93d902fb6d2be0f7ebd355ccd Mon Sep 17 00:00:00 2001 From: Grant Terris Date: Mon, 2 Sep 2019 18:01:06 -0700 Subject: [PATCH] Add ImageManager --- CMakeLists.txt | 3 ++- FaultFinder.cpp | 40 ++++++++++++++++++++------------------ FaultManager.cpp | 21 ++++++++++++++++++++ FaultManager.hpp | 30 +++++++++++++++++++++++++++++ ImageAnalyzer.cpp | 48 ++++++++++++++++++++++++++++++++++++++++++++++ ImageAnalyzer.hpp | 7 +++++++ ImageProcessor.cpp | 25 ------------------------ ImageProcessor.hpp | 15 --------------- StreamManager.cpp | 11 ++++------- StreamManager.hpp | 5 +++-- 10 files changed, 136 insertions(+), 69 deletions(-) create mode 100644 FaultManager.cpp create mode 100644 FaultManager.hpp delete mode 100644 ImageProcessor.cpp delete mode 100644 ImageProcessor.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 87ac93c..8f0fd10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,7 +14,8 @@ include_directories( add_executable( FaultFinder FaultFinder.cpp StreamManager.cpp - ImageProcessor.cpp + ImageAnalyzer.cpp + FaultManager.cpp ) target_link_libraries( FaultFinder diff --git a/FaultFinder.cpp b/FaultFinder.cpp index 68cc2ba..9d2fa9d 100644 --- a/FaultFinder.cpp +++ b/FaultFinder.cpp @@ -1,32 +1,34 @@ #include #include "StreamManager.hpp" -#include "ImageProcessor.hpp" +#include "ImageAnalyzer.hpp" +#include "FaultManager.hpp" using namespace std; -int main() +int main(int argc, char **argv) { - ImageProcessor processor; - StreamManager manager; + StreamManager stream_mgr; + ImageAnalyzer analyzer; + FaultManager fault_mgr(stoi(argv[1]), stod(argv[2])); PvString lConnectionID; - - // If no devies are found, exit. - if (manager.FindDevice(&lConnectionID).IsFailure()) - { - return -1; - } - - if (manager.ConnectToDevice(lConnectionID).IsFailure()) - { - return -1; - } - - manager.OpenStream(lConnectionID); - manager.AcquireImages(processor); + // If no devies are found, exit. + if (stream_mgr.FindDevice(&lConnectionID).IsFailure()) + { + return -1; + } - manager.Disconnect(); + if (stream_mgr.ConnectToDevice(lConnectionID).IsFailure()) + { + return -1; + } + + stream_mgr.OpenStream(lConnectionID); + + stream_mgr.AcquireImages(analyzer, fault_mgr); + + stream_mgr.Disconnect(); return 0; } \ No newline at end of file diff --git a/FaultManager.cpp b/FaultManager.cpp new file mode 100644 index 0000000..ddb8dbe --- /dev/null +++ b/FaultManager.cpp @@ -0,0 +1,21 @@ +#include + +#include "FaultManager.hpp" + +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; +} \ No newline at end of file diff --git a/FaultManager.hpp b/FaultManager.hpp new file mode 100644 index 0000000..4403144 --- /dev/null +++ b/FaultManager.hpp @@ -0,0 +1,30 @@ +#ifndef FAULTMANAGER_H +#define FAULTMANAGER_H + +#include + +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 e69de29..2f107f0 100644 --- a/ImageAnalyzer.cpp +++ b/ImageAnalyzer.cpp @@ -0,0 +1,48 @@ +#include +#include +#include +#include + +#include "ImageAnalyzer.hpp" +#include "FaultManager.hpp" + +using namespace cv; + +bool ImageAnalyzer::ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer, FaultManager fault_mgr) +{ + Mat mask; + 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(); + + threshold(frame, mask, temp_threshold, temp_threshold, THRESH_BINARY); + + findContours(mask, contours, RETR_TREE, CHAIN_APPROX_NONE); + + for(int i = 0; i< contours.size(); i++) + { + auto area = contourArea(contours[i]); + + if (area > fault_area) + { + drawContours(frame, contours[i], -1, Scalar(0, 255, 0), 3); + fault_mgr.SaveImage(frame); + } + } + + //scaled.convertTo(scaled, CV_8UC1); + //applyColorMap(scaled, color, COLORMAP_JET); + + namedWindow("FLIR", WINDOW_AUTOSIZE); + imshow("FLIR", frame); + + if (waitKey(1) == 27) + { + destroyAllWindows(); + return false; + } + + return true; +} \ No newline at end of file diff --git a/ImageAnalyzer.hpp b/ImageAnalyzer.hpp index a65a49c..bddfdbb 100644 --- a/ImageAnalyzer.hpp +++ b/ImageAnalyzer.hpp @@ -1,9 +1,16 @@ #ifndef IMAGEANALYZER_H #define IMAGEANALYZER_H +#include +#include "FaultManager.hpp" + class ImageAnalyzer { + +public: + bool ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer, FaultManager fault_mgr); + }; #endif \ No newline at end of file diff --git a/ImageProcessor.cpp b/ImageProcessor.cpp deleted file mode 100644 index 9b94d07..0000000 --- a/ImageProcessor.cpp +++ /dev/null @@ -1,25 +0,0 @@ -#include -#include -#include -#include - -#include "ImageProcessor.hpp" - -using namespace cv; - -void ImageProcessor::ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer) -{ - Mat frame(height, width, CV_16U, imgPointer, Mat::AUTO_STEP); - - //normalize(frame, scaled, 0, 255, NORM_MINMAX); - //scaled.convertTo(scaled, CV_8UC1); - - //applyColorMap(scaled, color, COLORMAP_JET); - - //namedWindow("FLIR", WINDOW_AUTOSIZE); - //imshow("FLIR", color); - int key = waitKey(1); - //if key == 27, then break - //release() - //destroyAllWindows() -} \ No newline at end of file diff --git a/ImageProcessor.hpp b/ImageProcessor.hpp deleted file mode 100644 index fea1b3b..0000000 --- a/ImageProcessor.hpp +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef IMAGEPROCESSOR_H -#define IMAGEPROCESSOR_H - -#include - -class ImageProcessor -{ - -public: - - void ProcessImage(uint32_t width, uint32_t height, uint8_t *imgPointer); - -}; - -#endif \ No newline at end of file diff --git a/StreamManager.cpp b/StreamManager.cpp index 30c8667..8cd66ec 100644 --- a/StreamManager.cpp +++ b/StreamManager.cpp @@ -7,6 +7,7 @@ #include #include "StreamManager.hpp" +#include "FaultManager.hpp" PvResult StreamManager::FindDevice(PvString *aConnectionID) { @@ -133,7 +134,7 @@ void StreamManager::CreateStreamBuffers() } } -void StreamManager::AcquireImages(ImageProcessor processor) +void StreamManager::AcquireImages(ImageAnalyzer analyzer, FaultManager fault_mgr) { if (lDevice == NULL || lStream == NULL) { @@ -178,11 +179,6 @@ void StreamManager::AcquireImages(ImageProcessor processor) { PvPayloadType lType; - // - // We now have a valid buffer. This is where you would typically process the buffer. - // ----------------------------------------------------------------------------------------- - // ... - lFrameRate->GetValue(lFrameRateVal); lBandwidth->GetValue(lBandwidthVal); @@ -200,7 +196,8 @@ void StreamManager::AcquireImages(ImageProcessor processor) lHeight = lImage->GetHeight(); // Process Image - processor.ProcessImage(lWidth, lHeight, lImage->GetDataPointer()); + if (!analyzer.ProcessImage(lWidth, lHeight, lImage->GetDataPointer(), fault_mgr)) + break; std::cout << " W: " << std::dec << lWidth << " H: " << lHeight; } diff --git a/StreamManager.hpp b/StreamManager.hpp index 148d32b..0519c0c 100644 --- a/StreamManager.hpp +++ b/StreamManager.hpp @@ -4,7 +4,8 @@ #include #include -#include "ImageProcessor.hpp" +#include "ImageAnalyzer.hpp" +#include "FaultManager.hpp" #define BUFFER_COUNT (32) typedef std::list BufferList; @@ -17,7 +18,7 @@ public: PvResult FindDevice(PvString *aConnectionID); PvResult ConnectToDevice(const PvString &aConnectionID); PvResult OpenStream(const PvString &aConnectionID); - void AcquireImages(ImageProcessor processor); + void AcquireImages(ImageAnalyzer analyzer, FaultManager fault_mgr); void Disconnect(); private: