You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

105 lines
3.5 KiB

#include "ThermxRenderer.hpp"
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glu.h>
float RandomFloat(float a, float b) {
float random = ((float) rand()) / (float) RAND_MAX;
float diff = b - a;
float r = random * diff;
return a + r;
}
ThermxRenderer::ThermxRenderer(){
data = std::vector<float>();
data.reserve(32*24);
for(int i = 0; i < 24; i ++){
for(int j = 0; j < 32; j++){
data.push_back(RandomFloat(0.0,40.0));
}
}
refreshData(data);
}
void ThermxRenderer::refreshData(vector<float> newData){
try{
//std::cout << "copying data" << std::endl;
dataMutex.lock();
data.clear();
data = newData;
//std::cout << "setting minmax " << newData.size() << std::endl;
int size = data.size();
//std::cout << data[0];
//std::cout << "didn't segfault" << std::endl;
max = newData.at(0);
//std::cout << "set minmax" << std::endl;
for(int i = 0; i < 24; i++){
for(int j = 0; j < 32; j++){
if(i*32+j >= newData.size()) break;
float t = newData.at(i*32+j);
if(t > max) max = t;
if(t < min) min = t;
}
}
center = newData.at((24/2)*32+(32/2));
data.at((24/2)*32+(32/2)) = 0;
dataMutex.unlock();
//std::cout << "drawing data" << std::endl;
//matMutex.lock();
draw();
//matMutex.unlock();
//std::cout << "done refreshing data" << std::endl;
//std::cout << "didn't crash" << std::endl;
}catch(exception e){
//std::cout << "thermx render exception: " << e.what() << std::endl;
}
};
void ThermxRenderer::draw(){
int h = height/24;
int w = width/32;
UcurrentData = cv::UMat(cv::Size(32, 24), CV_8UC3, cv::Scalar(0,0,0));
currentData = cv::Mat(cv::Size(32, 24), CV_8UC3, cv::Scalar(0,0,0));
Mat greyActual = cv::Mat(cv::Size(32, 24), CV_8UC1, cv::Scalar(0)); //black heightxwidth umat
for(int i = 0; i < 24; i++){
for(int j = 0; j < 32; j++){
if(i*32+j >= data.size()) break;
float t = data.at(i*32+j);
t -= min;
t /= (max - min); //0.0 -> 1.0
int k = t*255; //0 -> 255
greyActual.at<uchar>(i, j) = k;
}
}
applyColorMap(greyActual,currentData,COLORMAP_INFERNO); //pass from grayscale to thermal vision
for(int i = 0; i < 24; i++){
for(int j = 0; j < 32; j++){
if(i*32+j >= data.size()) break;
float t = data.at(i*32+j);
if(t > 34 && t < 40)
currentData.at<Vec3b>(i, j) = Vec3b(255,0,0);
}
}
currentData.copyTo(UcurrentData);
}
void ThermxRenderer::processFrame(cv::UMat& input, cv::Point2d& cursorPos){
if(!input.rows <= 0 && !input.cols <= 0){
////std::cout << "drawing frame..." << std::endl;
cv::UMat output;
//matMutex.lock();
cv::resize(UcurrentData, output, cv::Size(input.cols, input.rows), cv::InterpolationFlags::INTER_NEAREST);
//matMutex.unlock();
////std::cout << input.cols << input.rows << input.type() << output.rows << output.cols << output.type()<<"\n";
cv::UMat k(input.size(), input.type());
cv::addWeighted(input, 1.0, output, 1.0, 0.0, k);
float fi = center;
cv::putText(k, cv::format("%.2f", fi), Point2i(400,250),cv::FONT_HERSHEY_DUPLEX, 2, cv::Scalar(100, 100, 100), 1, cv::LineTypes::FILLED, false);
input = k;
}
}