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.
 
 
 
 
 
 

177 lines
3.9 KiB

#include "multipoint.h"
#include "QDebug"
#include <QFile>
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]] = temp;
}
void MultiPoint::calcData()
{
ready = false;
if(stagecount<2)
return;
double v0 = datas.begin().key();
stagecount = datas.size();
double vn =( datas.begin()+stagecount-1).key();
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++){
end = start+1;
double vs = start.key();
double ve = end.key();
vs = (vs-v0)/(vn-v0)*65535;
ve = (ve-v0)/(vn-v0)*65535;
cv::Mat ms = start.value();
cv::Mat me = end.value();
double* ss = stages+(k-1)*512*640;
double* ks = kstages+k*512*640;
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);
}
}
}
double* ss = stages+(k-1)*512*640;
double* ks = kstages+k*512*640;
double* bs = bstages+k*512*640;
cv::Mat ms = end.value();
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;
}
}
qDebug()<<__FILE__<<__LINE__;
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;
}
dst.at<ushort>(i,j) = kstages[k*img.rows*img.cols+i*img.cols+j]*img.at<ushort>(i,j)+ bstages[k*img.rows*img.cols+i*img.cols+j];
}
}
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()
{
qDebug()<<__FILE__<<__LINE__;
n_save = 32;
b_save = true;
}
void MultiPoint::savedata()
{
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 fk("k.bin");
fk.open(QIODevice::ReadWrite);
fk.write((char*)kstages,(k+1)*640*512*4);
fk.close();
QFile fb("b.bin");
fb.open(QIODevice::ReadWrite);
fb.write((char*)bstages,(k+1)*640*512*4);
fb.close();
}