#include "stdafx.h"
#include "ShapeExtend.h"
#include "MainFrm.h"
#include "NewFeatureofStormDoc.h"
#include "NewFeatureofStormView.h"
bool CShapeExtend::FlagOfRead=TRUE;
CShapeExtend::CShapeExtend()
://反射率对应的颜色表
Refminus5to0(156,156,156),Ref0to5(118,118,118),Ref5to10(170,170,254),
Ref10to15(140,140,238),Ref15to20(112,112,200),Ref20to25(144,250,0),
Ref25to30(0,186,0),Ref30to35(112,254,254),Ref35to40(96,208,208),
Ref40to45(96,96,254),Ref45to50(0,0,218),Ref50to55(0,0,174),
Ref55to60(254,0,0),Ref60to65(254,254,160),Ref65to70(254,0,230),RefBlack(0,0,0)
//, topbound(0)
//, bottombound(0)
//, leftbound(0)
//, rightbound(0)
//, rectcenter(0)
, vecx(0)
, vecy(0)
, FlagOfReadBaseData(false)
, crtcellorgpt(0)
, lstcellorgpt(0)
, nextrealorpt(0)
, ccoeff(0)
{
}
CShapeExtend::~CShapeExtend()
{
}
//============= 将原图像上的像素赋值给目标图像 =======================
//( 其中full表示是否完全复制,当为False时,原图像的黑色像素点不被复制 )
void CShapeExtend::MatCopy(const Mat& Src,Mat Dst,BOOL full)
{
if (Src.data==NULL&&Dst.data==NULL)
{
//MessageBox("赋值时图像为空");
return;
}
for (int Row=0;Row<Src.rows;Row++)
{
for (int Col=0;Col<Src.cols;Col++)
{
Point2i poi(Col,Row);
if (full)
{
Dst.at<Vec3b>(poi)=Src.at<Vec3b>(poi);
}
else
{
Dst.at<BYTE>(poi)=Src.at<BYTE>(poi);
}
}
}
}
//========从反射率值得到对应的颜色值============
Vec3b CShapeExtend::ReflectionValue(const int Ref)
{
if (Ref>=-5&&Ref<0)
{
return Refminus5to0;
}
else if(Ref>=0&&Ref<5)
{
return Ref0to5;
}
else if(Ref>=5&&Ref<10)
{
return Ref5to10;
}
else if(Ref>=10&&Ref<15)
{
return Ref10to15;
}
else if(Ref>=15&&Ref<20)
{
return Ref15to20;
}
else if(Ref>=20&&Ref<25)
{
return Ref20to25;
}
else if(Ref>=25&&Ref<30)
{
return Ref25to30;
}
else if(Ref>=30&&Ref<35)
{
return Ref30to35;
}
else if(Ref>=35&&Ref<40)
{
return Ref35to40;
}
else if(Ref>=40&&Ref<45)
{
return Ref40to45;
}
else if(Ref>=45&&Ref<50)
{
return Ref45to50;
}
else if(Ref>=50&&Ref<55)
{
return Ref50to55;
}
else if(Ref>=55&&Ref<60)
{
return Ref55to60;
}
else if(Ref>=60&&Ref<65)
{
return Ref60to65;
}
else if(Ref>=65&&Ref<70)
{
return Ref65to70;
}
else
{
return RefBlack;
}
}
//===============从像素颜色取得对应的反射率值=====================
//返回值为反射率范围的起始数值
int CShapeExtend::GetReflectionValue(Vec3b color)
{
if(color==RefBlack)
{
return -10;
}
else if (color==Refminus5to0)
{
return -5;
}
else if(color==Ref0to5)
{
return 0;
}
else if(color==Ref5to10)
{
return 5;
}
else if(color==Ref10to15)
{
return 10;
}
else if(color==Ref15to20)
{
return 15;
}
else if(color==Ref20to25)
{
return 20;
}
else if(color==Ref25to30)
{
return 25;
}
else if(color==Ref30to35)
{
return 30;
}
else if(color==Ref35to40)
{
return 35;
}
else if(color==Ref40to45)
{
return 40;
}
else if(color==Ref45to50)
{
return 45;
}
else if(color==Ref50to55)
{
return 50;
}
else if(color==Ref55to60)
{
return 55;
}
else if(color==Ref60to65)
{
return 60;
}
else if(color==Ref65to70)
{
return 65;
}
}
//================去除关注反射率范围外的反射率值=========
//反射率值过低的置成黑色,过高的置成阈值上限的颜色
void CShapeExtend::Filter(Mat Mat2P)
{
for (int Row=0;Row<Mat2P.rows;++Row)//开始遍历图像
{
for (int Col=0;Col<Mat2P.cols;++Col)
{
Point2i dot(Col,Row);
int value=GetReflectionValue(Mat2P.at<Vec3b>(dot));
if (value<25)//反射率在25以下的置成黑色
{
Mat2P.at<Vec3b>(dot)=RefBlack;
}
else if (value>55)//反射率在55以上的置成Ref55to60
{
Mat2P.at<Vec3b>(dot)=Ref55to60;
}
}
}
}
//===================得到图像的7层单反射率层=============
void CShapeExtend::GetLayer(Mat srcMat)
{
Mat25.create(srcMat.rows,srcMat.cols,CV_8UC3);
Mat30.create(srcMat.rows,srcMat.cols,CV_8UC3);
Mat35.create(srcMat.rows,srcMat.cols,CV_8UC3);
Mat40.create(srcMat.rows,srcMat.cols,CV_8UC3);
Mat45.create(srcMat.rows,srcMat.cols,CV_8UC3);
Mat50.create(srcMat.rows,srcMat.cols,CV_8UC3);
Mat55.create(srcMat.rows,srcMat.cols,CV_8UC3);
Mattemp.create(srcMat.rows,srcMat.cols,CV_8UC3);
MatCopy(srcMat,Mat25,1);
MatCopy(srcMat,Mat30,1);
MatCopy(srcMat,Mat35,1);
MatCopy(srcMat,Mat40,1);
MatCopy(srcMat,Mat45,1);
MatCopy(srcMat,Mat50,1);
MatCopy(srcMat,Mat55,1);
MatCopy(srcMat,Mattemp,1);
vector<Mat> MatLayer; //定义Mat容器存放7层Mat图层
MatLayer.clear();
MatLayer.push_back(Mat25); //把7个Mat图层压入容器
MatLayer.push_back(Mat30);
MatLayer.push_back(Mat35);
MatLayer.push_back(Mat40);
MatLayer.push_back(Mat45);
MatLayer.push_back(Mat50);
MatLayer.push_back(Mat55);
vector<Mat>::iterator ite_mat;//指向Mat容器的迭代器
//vector<const char*> WindowName;//定义一容器存放窗口名称
//const char* window1="25DBz分届图层";
//const char* window2="30DBz分届图层";
//const char* window3="35DBz分届图层";
//const char* window4="40DBz分届图层";
//const char* window5="45DBz分届图层";
//const char* window6="50DBz分届图层";
//const char* window7="55DBz分届图层";
//WindowName.clear();
//WindowName.push_back(window1);
//WindowName.push_back(window2);
//WindowName.