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.

215 lines
4.8 KiB

#include "util.h"
vector<string> Utils::get_filelist(string foldname)
{
string mainPath = foldname;
foldname += "/*.*";
const char * mystr=foldname.c_str();
vector<string> flist;
string lineStr;
vector<string> extendName;
extendName.push_back("jpg");
extendName.push_back("png");
extendName.push_back("tif");
extendName.push_back("JPG");
extendName.push_back("bmp");
HANDLE file;
WIN32_FIND_DATA fileData;
char line[1024];
wchar_t fn[1000];
mbstowcs(fn,mystr,999);
file = FindFirstFile(fn, &fileData);
FindNextFile(file, &fileData);
while(FindNextFile(file, &fileData))
{
wcstombs(line,(const wchar_t*)fileData.cFileName,259);
lineStr = line;
for (int i = 0; i < 5; i ++) //排除非图像文件
{
if (lineStr.find(extendName[i]) < 999)
{
lineStr = mainPath + "/" + lineStr;
flist.push_back(lineStr);
break;
}
}
}
cout<<"loaded "<<flist.size()<<" files"<<endl;
return flist;
}
Mat Utils::grayToPesudoColor(Mat grayMap)
{
//! 红 255, 0, 0 -> 255
//! 橙 255, 127, 0 -> 204
//! 黄 255, 255, 0 -> 153
//! 绿 0, 255, 0 -> 102
//! 青 0, 255, 255 -> 51
//! 蓝 0, 0, 255 -> 0
int row = grayMap.rows, col = grayMap.cols;
Mat colorMap(row, col, CV_8UC3, Scalar(0,0,0));
uchar *dataPtr = (uchar*)grayMap.data;
uchar *dataPtrT = (uchar*)colorMap.data;
for (int i = 0; i < row; i ++)
{
for (int j = 0; j < col; j ++)
{
int pix = dataPtr[i*col+j];
int B = 0, G = 0, R = 0;
if (pix <= 51)
{
B = 255;
G = pix*5;
R = 0;
}
else if (pix <= 102)
{
pix-=51;
B = 255-pix*5;
G = 255;
R = 0;
}
else if (pix <= 153)
{
pix-=102;
B = 0;
G = 255;
R = pix*5;
}
else if (pix <= 204)
{
pix-=153;
B = 0;
G = 255-uchar(128.0*pix/51.0+0.5);
R = 255;
}
else
{
pix-=204;
B = 0;
G = 127-uchar(127.0*pix/51.0+0.5);
R = 255;
}
dataPtrT[3*(i*col+j)+0] = B;
dataPtrT[3*(i*col+j)+1] = G;
dataPtrT[3*(i*col+j)+2] = R;
//colorMap.at<Vec3b>(i,j)[0] = B;
//colorMap.at<Vec3b>(i,j)[1] = G;
//colorMap.at<Vec3b>(i,j)[2] = R;
}
}
return colorMap;
}
bool Utils::loadMatchPts(int imgIndex1, int imgIndex2, vector<Point2d> &pointSet1, vector<Point2d> &pointSet2)
{
bool exchanged = false;
if (imgIndex1 > imgIndex2) //set a consistent standard: smaller index in the left
{
int temp = imgIndex2;
imgIndex2 = imgIndex1;
imgIndex1 = temp;
exchanged = true;
}
char fileName[1024];
sprintf(fileName, "Cache/matchPtfile/match%d&%d.txt", imgIndex1, imgIndex2);
string filePath = Utils::baseDir + string(fileName);
FILE *fin = fopen(filePath.c_str(), "r");
if (fin == nullptr)
{
return false;
}
int PtNum = 0;
fscanf(fin, "%d", &PtNum);
if (!exchanged)
{
for (int i = 0; i < PtNum; i ++)
{
double x1, y1, x2, y2;
fscanf(fin, "%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
Point2d point1(x1,y1), point2(x2,y2);
pointSet1.push_back(point1);
pointSet2.push_back(point2);
}
}
else
{
for (int i = 0; i < PtNum; i ++)
{
double x1, y1, x2, y2;
fscanf(fin, "%lf %lf %lf %lf", &x1, &y1, &x2, &y2);
Point2d point1(x1,y1), point2(x2,y2);
pointSet1.push_back(point2);
pointSet2.push_back(point1);
}
}
fclose(fin);
// cout<<"Loaded "<<pointSet1.size()<<" points between image "<<imgIndex1<<" and image "<<imgIndex2<<endl;
}
Mat_<double> Utils::buildCostGraph(const Mat_<int> &similarMat)
{
int nodeNum = similarMat.rows;
//! considering the precise and robustness, we take logarithm as the weight function
Mat_<double> costGraph = Mat(nodeNum, nodeNum, CV_64FC1, Scalar(-1));
for (int i = 0; i < nodeNum-1; i ++)
{
for (int j = i+1; j < nodeNum; j ++)
{
int num = similarMat(i,j);
if (num == 0)
{
continue;
}
double cost = 6/log(num+50.0);
costGraph(i,j) = cost;
costGraph(j,i) = cost;
}
}
return costGraph;
}
Point2d Utils::pointTransform(Mat_<double> homoMat, Point2d srcPt)
{
Mat_<double> srcX = (Mat_<double>(3,1)<< srcPt.x, srcPt.y, 1);
Mat_<double> dstX = homoMat * srcX;
Point2d dstPt = Point2d(dstX(0)/dstX(2), dstX(1)/dstX(2));
return dstPt;
}
void Utils::pointTransform(Mat_<double> homoMat, Point2d srcPt, Point2d &dstPt)
{
Mat_<double> srcX = (Mat_<double>(3,1)<< srcPt.x, srcPt.y, 1);
Mat_<double> dstX = homoMat * srcX;
dstPt = Point2d(dstX(0)/dstX(2), dstX(1)/dstX(2));
}
void Utils::pointTransform(Mat_<double> homoMat, vector<Point2d> &pointSet)
{
for (int i = 0; i < pointSet.size(); i ++)
{
Mat_<double> srcX = (Mat_<double>(3,1)<< pointSet[i].x, pointSet[i].y, 1);
Mat_<double> dstX = homoMat * srcX;
Point2d dstPt = Point2d(dstX(0)/dstX(2), dstX(1)/dstX(2));
pointSet[i] = dstPt;
}
}
double Utils::calPointDist(Point2d point1, Point2d point2)
{
return sqrt((point1.x-point2.x)*(point1.x-point2.x) + (point1.y-point2.y)*(point1.y-point2.y));
}
double Utils::calVecDot(Point2d vec1, Point2d vec2)
{
return vec1.x*vec2.x+vec1.y*vec2.y;
}