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);
%+++
c++实现:
//fourmi-2018-09-06
/******************************include the head files********************************************/
#include<iostream>
#include<math.h>
#include<vector>
#include<cmath>
#include"/home/gaoshengjun/opencv-2.4.13/include/opencv/cv.h"
#include "/home/gaoshengjun/opencv-2.4.13/include/opencv/highgui.h"
#include <stdio.h>
#include <unistd.h>
#include <dirent.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <string.h>
/***********************************************************************************************/ /*******************************Macro definition************************************************/ //define PI , coordinate type, matrix type #define PI 3.1415926
#define POINT std::pair<int,int>
#define MATRIX std::vector<std::vector<float> >
#define VECT std::vector<float>
/***********************************************************************************************/ using namespace cv;//using opencv /*****************************calculate the angle***********************************************/
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;
};
/***********************************************************************************************/ /****************************calculate the distance********************************************/
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;
}
/***********************************************************************************************/ /********produce xmap(size:regionH X 1) according linspace(-regionW/2,regionW/2,regionW)********/
MATRIX produce_xmap_Matrix(float regionW,float regionH)
{
MATRIX 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); }
}
return array;
}
/***********************************************************************************************/ /******produce ymap(size:1 X regionW) according linspace(-regionH/2,regionH/2,regionH)**********/
MATRIX produce_ymap_Matrix(float regionW,float regionH)
{
MATRIX 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;
}
/***********************************************************************************************/ /******************************make SCALED MATRIX***********************************************/
MATRIX matrix_multi_const_number(MATRIX array,float scale)
{
MATRIX 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; } }
return result;
}
/***********************************************************************************************/ /*****************************MATRIX-I + MATRIX-II**********************************************/
MATRIX matrix_add_matrix(MATRIX array0,MATRIX array1)
{
MATRIX 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;
}
/***********************************************************************************************/ /************************MATRIX-I + const-number***********************************************/
MATRIX matrix_ADD_const_number(MATRIX array0,float num)
{
MATRIX 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;
}
/***********************************************************************************************/ /******************roudn each value in the array***********************************************/
VECT round(VECT array,char kind)
{
VECT 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;
}
/***********************************************************************************************/ /*****************************VECTER-I-VECTOR-II***********************************************/
VECT vector_sub_vector(VECT array0,VECT array1)
{
VECT result(array0.size());
int n=0;
for(int i=0;i<array0.size();i++)
{
result[i]=array0[i]-array1[i]; } return result;
}
/***********************************************************************************************/ /****************************MATRIX to VECTOR**************************************************/
VECT change_format(MATRIX array)
{
VECT 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;
}
/***********************************************************************************************/ /************************VECTOR-I.*VECTOR-II****************************************************/
VECT interpolation_by_dot_multi(VECT deltacxx,VECT deltaxfx,VECT deltacyy,VECT deltayfy,VECT imfxfy,
VECT imfxcy,VECT imcxfy, VECT imcxcy)
{
VECT roi(deltacxx.size()); for(int i=0;i<deltacxx.size();i++)
{ roi[i]=(imfxfy[i]*deltacxx[i]*deltacyy[i]+ imfxcy[i]* deltacxx[i]* deltayfy[i]+
imcxfy[i]* deltaxfx[i]* deltacyy[i] + imcxcy[i]* deltaxfx[i]* deltayfy[i]);
}
return roi; }
/***********************************************************************************************/ /******************************produce ZERO MATRIX**********************************************/
MATRIX zeros(int length,float num)
{
MATRIX 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;
}
/***********************************************************************************************/ /*****************************produce ONES MATRIX**********************************************/
MATRIX ones(int length,float num)
{
MATRIX 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]=1;
}
}
return result;
} /***********************************************************************************************/ /********************make sure each position of the two points*********************************/ POINT * compare_2_points_left_right(POINT &pt1,POINT &pt2)
{
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; };
/***********************************************************************************************/ /**************************calculate the mid of two points*************************************/
POINT cal_two_points_mid(POINT &pt1,POINT &pt2)
{
POINT midPoint;
midPoint.first=(pt1.first+pt2.first)/2;
midPoint.second=(pt1.second+pt2.second)/2;
return midPoint;
}
/***********************************************************************************************/ /**********************************MATRIX-I + MATRIX-II*****************************************/
MATRIX VECT_TO_MATRIX(VECT input,int h,int w)
{
MATRIX result(h);
int i,j;
int n=0;
for(i=0;i<h;i++)
result[i].resize(w);
for(i=0;i<w;i++)
{
for(j=0;j<h;j++)
{
result[j][i]=input[n++];
}
}
return result;
}
/***********************************************************************************************/ /*********************************if anyone is non-zero return true*****************************/
bool any_compare(VECT vec)
{
for(int i=0;i<vec.size();i++)
{
if (vec[i]!=0)
{
return true;
}
else
{
return false;
}
}
}
/***********************************************************************************************/ /********************VECT compare with const number*********************************************/
VECT vec_compare_const_number(VECT vec,int num,char type)
{
VECT result(vec.size());
for(int i=0;i<vec.size();i++)
{
if (type=='s')
{
if (vec[i]<num)
{
result[i]=1;
}
else result[i]=0;
}
else
{
if (vec[i]>num)
{
result[i]=1;
}
else result[i]=0;
}
}
return result;
}
/*******************************extract_Image_pixel in a special way****************************/
VECT extract_Image_pixel(Mat img,VECT map1,VECT map2,VECT map3,int channel_choose)
{
VECT result(map1.size());
for(int i=0;i<map1.size();i++)
{
int k0,k1,k2;
k0=map1[i];
k1=map2[i];
k2=map3[i];
Vec3b pix = img.at<Vec3b>(k0-1,k1-1);
result[i]=pix[channel_choose];
}
return result;
}
/***********************************************************************************************/ /***********************************extract_ROI*************************************************/
MATRIX extract_ROI( Mat img, MATRIX xmapInImage, MATRIX ymapInImage)
{
MATRIX roi_new;
int h,w,length;
int channel_choose=2;
VECT xmapInImage0,ymapInImage0,fxmap,fymap,cxmap
,cymap,deltacxx,deltaxfx,deltacyy,deltayfy,roi,zmap,imfxfy,imfxcy,imcxfy,imcxcy; 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=vector_sub_vector(cxmap,xmapInImage0);
deltaxfx=vector_sub_vector(xmapInImage0,fxmap);
deltacyy=vector_sub_vector(cymap,ymapInImage0);
deltayfy=vector_sub_vector(ymapInImage0,fymap); roi=change_format(zeros(length,1));
zmap=change_format(ones(length,1));
imfxfy=change_format(zeros(length,1));
imfxcy=change_format(zeros(length,1));
imcxfy=change_format(zeros(length,1));
imcxcy=change_format(zeros(length,1)); imfxfy=extract_Image_pixel(img,fymap,fxmap,zmap,channel_choose);
imfxcy=extract_Image_pixel(img,cymap,fxmap,zmap,channel_choose);
imcxfy=extract_Image_pixel(img,fymap,cxmap,zmap,channel_choose);
imcxcy=extract_Image_pixel(img,cymap,cxmap,zmap,channel_choose); roi=interpolation_by_dot_multi(deltacxx,deltaxfx,deltacyy,deltayfy,imfxfy, imfxcy,imcxfy, imcxcy); roi_new=VECT_TO_MATRIX(roi,h,w); return roi_new;
}
/***********************************************************************************************/ /***********************************extractEntranceLineRegion***********************************/
MATRIX extractEntranceLineRegion(POINT &pt1,POINT &pt2,Mat img)
{
const float regionW=96;
const float regionH=24;
const int offset=24;
int ImageHeight=img.rows;
int ImageWidth=img.cols;
double angle;
bool outofboundary=false;
MATRIX xmap,ymap,xmapScaled,ymapScaled,xmapInImage,ymapInImage,roi;
POINT new_pt1,new_pt2,midPoint;
POINT * arr;
float widthOfTheRealRegion ;
xmap=produce_xmap_Matrix(regionW,regionH);
ymap=produce_ymap_Matrix(regionW,regionH); arr=compare_2_points_left_right(pt1,pt2);
new_pt1=arr[0];
new_pt2=arr[1]; angle=cal_angle(new_pt1,new_pt2); widthOfTheRealRegion=cal_distance(new_pt1,new_pt2,offset); midPoint=cal_two_points_mid(new_pt1,new_pt2); xmapScaled=matrix_multi_const_number(xmap,widthOfTheRealRegion/regionW);
ymapScaled=matrix_multi_const_number(ymap,regionH/regionH); xmapInImage=matrix_ADD_const_number(matrix_add_matrix(matrix_multi_const_number(xmapScaled,cos(angle)),matrix_multi_const_number(ymapScaled,sin(angle))),midPoint.first);
ymapInImage=matrix_ADD_const_number(matrix_add_matrix(matrix_multi_const_number(xmapScaled,-sin(angle)),matrix_multi_const_number(ymapScaled,cos(angle))),midPoint.second);
/*make sure the pixel is bigger than 1 and the size of the point is under the readed image */
if (any_compare(vec_compare_const_number(change_format(xmapInImage),1,'s'))or (any_compare(vec_compare_const_number(change_format(xmapInImage),ImageWidth,'b'))) or
(any_compare(vec_compare_const_number(change_format(ymapInImage),1,'s')))or(any_compare(vec_compare_const_number(change_format(ymapInImage),ImageHeight,'b'))))
{
outofboundary = true;
}
if (!outofboundary)
{
roi = extract_ROI(img,xmapInImage,ymapInImage);
}
else
roi=zeros(regionH,regionW); return roi;
}
/***********************************************************************************************/ /*******************************FUNCTION MAIN()*************************************************/
int main()
{
MATRIX roi;
POINT point1(171,213);
POINT point2(171,145);
Mat img=imread("./000338.jpg", CV_LOAD_IMAGE_UNCHANGED); roi=extractEntranceLineRegion(point1,point2,img);
for(int i=0;i<roi.size();i++)
{
for(int j=0;j<roi[0].size();j++)
{
std::cout<<roi[i][j]<<" ";
}
std::cout<<std::endl<<std::endl;
}
return 0;
} /*******************************END***********************************************************/