Add Test Mode and Viewfinder

This commit is contained in:
Grant Terris
2019-09-16 20:57:05 -07:00
parent 1da6d9de31
commit 6b0c05f541
7 changed files with 60 additions and 46 deletions

2
.vscode/launch.json vendored
View File

@@ -9,7 +9,7 @@
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/FaultFinder",
"args": [],
"args": ["test"],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],

View File

@@ -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())

View File

@@ -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);
}

View File

@@ -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

View File

@@ -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<std::vector<Point>> 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;

View File

@@ -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);
};

View File

@@ -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;