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.
 
 
 
 
 
 

246 lines
5.6 KiB

#include "multipoint.h"
#include "QDebug"
#include <QFile>
#include <QFileDialog>
MultiPoint::MultiPoint(QObject *parent)
: QObject{parent}
{
thread = new QThread();
thread->start();
this->moveToThread(thread);
ready = false;
b_save = false;
n_save = 0;
}
void MultiPoint::saveData(cv::Mat img)
{
cv::Mat temp;
img.copyTo(temp);
datas[cv::mean(img)[0]/4] = temp;
emit signalNewFrame(cv::mean(img)[0]/4);
}
void MultiPoint::calcData(QVector<double> vct)
{
qDebug()<<__FILE__<<__LINE__;
ready = false;
// stagecount = datas.size();
stagecount = vct.length();
if(stagecount<2)
return;
qDebug()<<"statge count = "<< stagecount;
// double v0 = datas[vct.at(0)].key();
double v0 = vct.first();
// double vn =( datas.begin()+stagecount-1).key();
double vn = vct.last();
stages = (double*)malloc(sizeof(double)*512*640*(stagecount+1));
kstages = (double*)malloc(sizeof(double)*512*640*(stagecount+1));
bstages = (double*)malloc(sizeof(double)*512*640*(stagecount+1));
// QMap<double,cv::Mat>::Iterator start = datas.begin();
// QMap<double,cv::Mat>::Iterator end ;
memset(kstages,0,sizeof(double)*512*640);
memset(bstages,0,sizeof(double)*512*640);
int k = 1;
// for(;k<stagecount;start++,k++){
for(;k<stagecount;k++){
// end = start+1;
// double vs = start.key();
// double ve = end.key();
// cv::Mat ms = start.value();
// cv::Mat me = end.value();
double vs = vct.at(k-1);
double ve = vct.at(k);
cv::Mat ms = datas[vs];
cv::Mat me = datas[ve];
vs = (vs-v0)/(vn-v0)*65535;
ve = (ve-v0)/(vn-v0)*65535;
double* ss = stages+(k-1)*512*640;
double* ks = kstages+k*512*640;
// *(bstages+k) = vs;
double* bs = bstages+k*512*640;
/// y = kx+b
/// vs = k*x0+b
/// ve = k*x1+b
/// k = (ve-vs)/(x1-x0)
/// b = vs-k*x0
///
for(int i = 0;i<ms.rows;i++){
for(int j = 0;j< ms.cols;j++){
*(ss+i*ms.cols+j) = ms.at<float>(i,j);
*(ks+i*ms.cols+j) = (ve-vs)/(me.at<float>(i,j) - ms.at<float>(i,j));
*(bs+i*ms.cols+j) = vs ;
//- k*ms.at<float>(i,j);
}
}
}
qDebug()<<__FILE__<<__LINE__;
double* ss = stages+(k-1)*512*640;
double* ks = kstages+k*512*640;
double* bs = bstages+k;
// *(bs) = 65535;
// cv::Mat ms = end.value();
cv::Mat ms = datas[vct.last()];
for(int i = 0;i<512;i++){
for(int j = 0;j<640;j++){
*(ss+i*640+j) = ms.at<float>(i,j);
*(ks+i*640+j) = 0;
*(bs+i*640+j) = 65535;
}
}
ready = true;
}
void MultiPoint::runData(cv::Mat img)
{
if(b_save)
meanmat(img);
if(ready){
cv::Mat dst(img.rows,img.cols,img.type());
for(int i = 0; i< img.rows;i++){
for(int j = 0; j< img.cols;j++){
int k = 0;
for(; k<stagecount;k++)
{
if( img.at<ushort>(i,j) < stages[k*img.rows*img.cols+i*img.cols+j])
break;
}
if(k == 0)
dst.at<ushort>(i,j) = 0;
else
// dst.at<ushort>(i,j) = kstages[k*img.rows*img.cols+i*img.cols+j]*img.at<ushort>(i,j)+ bstages[k];
dst.at<ushort>(i,j) = kstages[k*img.rows*img.cols+i*img.cols+j]*(img.at<ushort>(i,j)-stages[(k-1)*img.rows*img.cols+i*img.cols+j])+ bstages[k];
}
}
emit signalsendimg(dst);
}
else{
emit signalsendimg(img);
}
}
void MultiPoint::meanmat(cv::Mat img)
{
if(n_save == 32){
img.convertTo(msave,CV_32FC1,1.0/32.0);
}
else if(n_save>0){
for(int i = 0;i<img.rows;i++){
for(int j = 0;j<img.cols;j++){
msave.at<float>(i,j) += img.at<ushort>(i,j)/32.0;
}
}
}
else{
saveData(msave);
b_save = false;
}
n_save --;
}
void MultiPoint::save()
{
n_save = 32;
b_save = true;
}
void MultiPoint::savedata(QString path)
{
// int k =0;
// for(QMap<double,cv::Mat>::Iterator iter = datas.begin();iter!= datas.end();iter++){
// cv::imwrite(QString::number(k).toStdString()+ ".tiff",iter.value());
// k+=1;
// }
QFile fs(path+ "/s.bin");
fs.open(QIODevice::ReadWrite);
fs.write((char*)stages,(stagecount+1)*640*512*8);
fs.close();
QFile fk(path+ "/k.bin");
fk.open(QIODevice::ReadWrite);
fk.write((char*)kstages,(stagecount+1)*640*512*8);
fk.close();
QFile fb(path+"/b.bin");
fb.open(QIODevice::ReadWrite);
fb.write((char*)bstages,(stagecount+1)*640*512*8);
fb.close();
}
void MultiPoint::loaddata(QString path )
{
QFile fk(path+"/k.bin");
fk.open(QIODevice::ReadOnly);
QByteArray data = fk.readAll();
kstages = (double*)malloc(data.length());
memcpy(kstages,data.data(),data.size());
QFile fb(path+"/b.bin");
fb.open(QIODevice::ReadOnly);
data = fb.readAll();
bstages = (double*)malloc(data.length());
memcpy(bstages,data.data(),data.length());
QFile fs(path+"/s.bin");
fs.open(QIODevice::ReadOnly);
data = fs.readAll();
stages = (double*)malloc(data.length());
memcpy(stages,data.data(),data.length());
stagecount = data.length()/8/512/640 - 1;
qDebug()<<"stagecount"<<stagecount;
ready = true;
}
void MultiPoint::off()
{
ready= false;
}