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