标签:out data points map ima str include har pac
MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] 等差数列 ymap = repmat( linspace( -regionH/2, regionH/2, regionH)‘, 1, regionW); %转置 %compute the angle of the vector p1-->p2 vecp1p2 = labelData(2,:) - labelData(1,:); angle = -atan2(vecp1p2(2), vecp1p2(1)); %角度计算 四象限反正切 widthOfTheRealRegion = norm(vecp1p2) + offset; % 求p1p2点距离,开根号 +offset midPoint = mean(labelData,1); % 取中点 xmapScaled = xmap * widthOfTheRealRegion / regionW; %对坐标进行scale ymapScaled = ymap * 24 / regionH;%add for Alexnet %ymapScaled = ymap * 24 / regionH;%add for Alexnet bywxq xmapInImage = cos(angle) * xmapScaled + sin(angle) * ymapScaled + midPoint(1); % 顺时针旋转 ymapInImage = -sin(angle) * xmapScaled + cos(angle) * ymapScaled + midPoint(2); %++++++++++++++++++++++++++++++++++++++
[h, w] = size(xmap); length = h * w; xmap = xmap(:); ymap = ymap(:); fxmap = floor( xmap ); %向下取整 fymap = floor( ymap ); cxmap = ceil( xmap ); %向上取整 cymap = ceil( ymap ); %插值系数 deltacxx = cxmap - xmap; deltaxfx = xmap - fxmap; deltacyy = cymap - ymap; deltayfy = ymap - fymap; roi = zeros(length, 1);
C++实现:
//author: fourmi-2018-09-04
#include<iostream>
#include<math.h>
#include<vector>
#include<cmath>
#define pi 3.1415926
#define POINT std::pair<int,int>
#define VECT std::vector<std::vector<float> >
const float regionW=96;
const float regionH=24;
const int offset=24;
float cal_angle(POINT &pt1,POINT &pt2)
{
double angle;
if ((pt2.first-pt1.first)==0)
{
angle=pi/2;
}
else
{
angle=std::abs(atan((pt2.second-pt1.second)/(pt2.first-pt1.first)));
}
return angle;
};
float cal_distance(POINT &pt1,POINT &pt2,const int offset)
{
float distance;
distance=sqrt(pow((pt2.second-pt1.second),2)+pow((pt2.first-pt1.first),2))+offset;
std::cout<<"1111:"<<distance<<std::endl;
return distance;
}
VECT make_xmap(float regionW,float regionH)
{
VECT array(regionH);
int i,j;
for(i=0;i<array.size();i++)
array[i].resize(regionW);
for(i=0;i<array.size();i++)
{
for(j=0;j<array[0].size();j++)
{
array[i][j]=-regionW/2+j*(regionW)/(regionW-1);
}
//std::cout<<array.size()<<std::endl;
}
return array;
}
VECT make_ymap(float regionW,float regionH)
{
VECT array(regionH);
int i,j;
for(i=0;i<array.size();i++)
array[i].resize(regionW);
for(i=0;i<array[0].size();i++)
{
for(j=0;j<array.size();j++)
{
array[j][i]=-regionH/2+j*(regionH)/(regionH-1);
//std::cout<<j<<" "<<i<<" ";
}
//std::cout<<std::endl;
}
return array;
}
VECT Scaled(VECT array,float scale)
{
VECT result(array.size());
int i,j;
for(i=0;i<array.size();i++)
result[i].resize(array[0].size());
for(i=0;i<array.size();i++)
{
for(j=0;j<array[0].size();j++)
{
result[i][j]=array[i][j]*scale;
//std::cout<<result[i][j]<<" ";
}
//std::cout<<std::endl;
}
return result;
}
VECT ADD(VECT array0,VECT array1)
{
VECT result(array0.size());
int i,j;
for(i=0;i<array0.size();i++)
result[i].resize(array0[0].size());
for(i=0;i<array0.size();i++)
{
for(j=0;j<array0[0].size();j++)
{
result[i][j]=array0[i][j]+array1[i][j];
}
}
return result;
}
VECT ADD_const(VECT array0,float num)
{
VECT result(array0.size());
int i,j;
for(i=0;i<array0.size();i++)
result[i].resize(array0[0].size());
for(i=0;i<array0.size();i++)
{
for(j=0;j<array0[0].size();j++)
{
result[i][j]=array0[i][j]+num;
}
}
return result;
}
std::vector<float> round(std::vector<float> array,char kind)
{
std::vector<float> result(array.size());
int n=0;
for(int i=0;i<array.size();i++)
{
if (kind==‘f‘)
{
result[i]=floor(array[i]);
}
else
{
result[i]=ceil(array[i]);
}
}
return result;
}
std::vector<float> sub_vector(std::vector<float> array0,std::vector<float> array1)
{
std::vector<float> result(array0.size());
int n=0;
for(int i=0;i<array0.size();i++)
{
result[i]=array0[i]-array1[i];
}
return result;
}
std::vector<float> change_format(VECT array)
{
std::vector<float> result(array.size()*array[0].size());
int n=0;
for(int i=0;i<array[0].size();i++)
{
for(int j=0;j<array.size();j++)
{
result[n]=array[j][i];
n++;
}
}
return result;
}
VECT zeros(int length,float num)
{
VECT result(length);
int i,j;
for(i=0;i<length;i++)
result[i].resize(num);
for(i=0;i<length;i++)
{
for(j=0;j<num;j++)
{
result[i][j]=0;
}
}
return result;
}
POINT * compare_2_points(POINT &pt1,POINT &pt2,double angle,int offset)
{
int x_left,x_right,y_down,y_up;
POINT new_pt1,new_pt2;
static POINT arr[2];
/*
pt1.first=std::abs(pt1.first);
pt2.first=std::abs(pt2.first);
pt1.second=-std::abs(pt1.second);
pt2.second=-std::abs(pt2.second);
*/
if (pt2.first<pt1.first)
{
x_left=pt2.first;
x_right=pt1.first;
}
else
{
x_left=pt1.first;
x_right=pt2.first;
}
std::cout<<"x_left: "<<x_left<<"x_right:"<<x_right<<std::endl;
if(pt2.second<pt1.second)
{
y_down=pt2.second;
y_up=pt1.second;
}
else
{
y_down=pt1.second;
y_up=pt2.second;
}
std::cout<<"y_down: "<<y_down<<"y_up:"<<y_up<<std::endl;
new_pt1.first=x_left;
new_pt1.second=y_up;
new_pt2.first=x_right;
new_pt2.second=y_down;
arr[0]=new_pt1;
arr[1]=new_pt2;
return arr;
};
POINT make_mid(POINT &pt1,POINT &pt2)
{
POINT midPoint;
midPoint.first=(pt1.first+pt2.first)/2;
midPoint.second=(pt1.second+pt2.second)/2;
return midPoint;
}
POINT * make_new_points(POINT &pt1,POINT &pt2,double angle,int offset)
{
double x_offset,y_offset;
POINT new_pt1,new_pt2;
static POINT arr[2];
x_offset=(offset)/2.0*cos(angle);
y_offset=(offset)/2.0*sin(angle);
new_pt1.first=pt1.first-x_offset;
new_pt1.second=pt1.second+y_offset;
new_pt2.first=pt2.first+x_offset;
new_pt2.second=pt2.second-y_offset;
arr[0]=new_pt1;
arr[1]=new_pt2;
return arr;
};
int main()
{
double angle;
VECT xmap,ymap,xmapScaled,ymapScaled,xmapInImage,ymapInImage;
POINT point1(171,213);
POINT point2(171,145);
POINT new_pt1,new_pt2,midPoint;
POINT * arr;
float widthOfTheRealRegion ;
int h,w,length;
std::vector<float> xmapInImage0,ymapInImage0,fxmap,fymap,cxmap,cymap,deltacxx,deltaxfx,deltacyy,deltayfy,roi;
xmap=make_xmap(regionW,regionH);
ymap=make_ymap(regionW,regionH);
arr=compare_2_points(point1,point2,0,0);
new_pt1=arr[0];
new_pt2=arr[1];
angle=cal_angle(new_pt1,new_pt2);
std::cout<<angle<<std::endl;
widthOfTheRealRegion=cal_distance(new_pt1,new_pt2,offset);
midPoint=make_mid(new_pt1,new_pt2);
std::cout<<midPoint.first<<" "<<midPoint.second<<std::endl;
xmapScaled=Scaled(xmap,widthOfTheRealRegion/regionW);
ymapScaled=Scaled(ymap,24/regionH);
xmapInImage=ADD_const(ADD(Scaled(xmapScaled,cos(angle)),Scaled(ymapScaled,sin(angle))),midPoint.first);
ymapInImage=ADD_const(ADD(Scaled(xmapScaled,-sin(angle)),Scaled(ymapScaled,cos(angle))),midPoint.second);
h=xmapInImage.size();
w=xmapInImage[0].size();
length=h*w;
xmapInImage0=change_format(xmapInImage);
ymapInImage0=change_format(ymapInImage);
fxmap=round(xmapInImage0,‘f‘);
fymap=round(ymapInImage0,‘f‘);
cxmap=round(xmapInImage0,‘c‘);
cymap=round(ymapInImage0,‘c‘);
deltacxx=sub_vector(cxmap,xmapInImage0);
deltaxfx=sub_vector(xmapInImage0,fxmap);
deltacyy=sub_vector(cymap,ymapInImage0);
deltayfy=sub_vector(ymapInImage0,fymap);
roi=change_format(zeros(length,1));
for (int i=0;i<ymapScaled.size()*ymapScaled[0].size();i++)
{
std::cout<<i<<" "<<roi[i]<<std::endl;
}
//std::cout<<xmapInImage.size()<<" "<<xmapInImage[0].size()<<std::endl;
//std::cout<<ymapInImage.size()<<" "<<ymapInImage[0].size()<<std::endl;
/*
arr=make_new_points(new_pt1,new_pt2,angle,offset);
new_pt1=arr[0];
new_pt2=arr[1];
std::cout<<"1111111111111:"<<new_pt1.first<<" "<<new_pt1.second<<std::endl;
std::cout<<"2222222222222:"<<new_pt2.first<<" "<<new_pt2.second<<std::endl;
for(int i=0;i<ymap[0].size();i++)
{
for(int j=0;j<ymap.size();j++)
{
std::cout<<ymap[j][i]<<" ";
}
std::cout<<std::endl<<std::endl;
std::cout<<xmap.size()<<" "<<xmap[0].size()<<std::endl;
}
*/
return 0;
}
matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量等内容)
标签:out data points map ima str include har pac
原文地址:https://www.cnblogs.com/fourmi/p/9585978.html