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.
248 lines
5.7 KiB
248 lines
5.7 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; |
|
// } |
|
QDir d; |
|
d.mkdir(path); |
|
|
|
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; |
|
}
|
|
|