📄 comlib.h
字号:
/********************** CCOMLIB Class *******************************/
// Comlib.h: interface for the CComlib class.
/*
* 2000/7/18:am yang w.d. add
* ModelBasedMatch() ModelBased match function
*
*
*
*
*/
#if !defined(AFX_COMLIB_H__D54B1D06_0CE8_11D3_B159_204C4F4F5020__INCLUDED_)
#define AFX_COMLIB_H__D54B1D06_0CE8_11D3_B159_204C4F4F5020__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
#include "math.h"
#define WINDOWS 100
#define DOS 101
#define OS WINDOWS
#define PALVERSION 0x300
#define ITERATION_NUM 43
#define MAXGRAYLEVEL 255
#define MAXGRAYSIZE 256
#define ZERO 0
#define ONE 255
#define WSHED 0
#define MASK -2
#define INIT -1
#define CONT_RAW 0
#define CONT_PIC 1
#define CONT_BMP 2
#define ISDBS 1
#define ISREL 0
#define IMAGESUBPATH "\\image\\wd\\"
#define PI 3.141592654
#define START 8
#define DIR 20
#define MPP 10 //meter per pixle
#define HALF 9
#define THETA2 34 // 30 ; 32
#define THETA1 10
#define SAMPLE_DIST 12 // 50ns--7.5 ; 80ns--12
#define RELIMGSIZE 128 // 采样图象大小
#define REFIMGSIZE 192 // 参考图象大小
#define SIGMA 0.8f // 相对最大值比例
#define PEAKPROPB 1.25f // 峰显著度
#define CSPEED 0.3 // 光速(0.3m/ns)
#define S2N 0 // 飞行方向由南向北
#define N2S 1 // 飞行方向由北向南
#define E2W 2 // 飞行方向由东向西
#define W2E 3 // 飞行方向由西向东
#define CLOCKWISE 0 // 顺时针扫描
#define NOCLOCKWISE 1 // 逆时针扫描
#define STARTANGLE 8 // 波束半功率点的内角(8度)
#define ENDANGLE 32 // 波束半功率点的外角(32度)
#define ALPHA 10 // 对成象有贡献的角度范围(+-10度)
//#define MPP 10 // 原始图采样率(m/pixle)
#define PULSEWID 80 // 脉冲宽度(ns)
#define SAMPLEFRE 10 // 采样频率(MHz)
#define DEG2RAD(x) ((x)*PI/180.0) // 度数转换为弧度
#define RAD2DEG(x) ((x)*180.0/PI) // 弧度转换为度数
#define K(x) (15-0.5*fabs(x)) // 根据方位角计算波宽改善因子
typedef struct tagDPOINT{
double x;
double y;
}DPOINT;
typedef struct tagFPOINT{
float x;
float y;
int time;
}FPOINT;
typedef struct tagELEMENT{
float x;
float y;
float z;
int time;
float value;
}ELEMENT;
typedef struct tagDREGION{
double x0;
double y0;
double x1;
double y1;
}DREGION;
typedef struct tagSPARMS{
int x0;
int y0;
double localx;
double localy;
float hight;
float rad0;
float rad1;
float res;
int findx;
int findy;
BOOL bType;
BOOL bFlightDir;
BOOL bValid;
// 转换相关面坐标到原始大参考图象坐标
FPOINT TranToOrg(int x , int y)
{
FPOINT ret = {0.0 ,0.0 ,0};
if( ! bValid )
return ret;
if( bType == ISDBS )
{
if( bFlightDir == E2W || bFlightDir == W2E )
{
ret.x = x0 + ( x + 64 ) * res/MPP ;
ret.y = y0 + ( y* res + hight*tan(32.0/180*PI) ) /MPP ;
}
else
{
ret.x = x0 + ( x* res + hight*tan(32.0/180*PI) ) /MPP ;
ret.y = y0 + ( y + 64 ) * res/MPP ;
}
}
else
{
ret.x = x0 + ( x + 64 ) * res/MPP ;
ret.y = y0 + ( y + 64) * res/MPP ;
}
return ret;
}
}SPARMS;
typedef struct tagRADARMSG {
BOOL bType;
BOOL bFlightDir;
float fHight ;
float fRes ;
int BigSizeX;
int BigSizeY;
DREGION BigRefGuass;
DPOINT LocalGuass;
}RADARMSG;
typedef struct tagNPOT {
int x;
int y;
double cor;
}NPOT;
typedef struct tagCOORDINATE{
int x;
int y;
int cx;
int cy;
int numb;
}COORDINATE;
typedef struct tagIMAGE{
int Row,Col;
unsigned char **Image;
void init(){ Row=Col=0; Image=NULL; }
void ffree()
{
for(int i=0;i<Row;i++)
free(Image[i]);
free(Image);
Image=NULL;
}
}IMAGE;
typedef struct tagBOX{
int x;
int y;
int dx;
int dy;
}BOX;
typedef struct tagSIMAGEBOX{
int row;
int col;
BOX box1;
BOX box2;
BOX boxL;
BOX boxR;
BOOL bs1; // 1-pic 0-raw open as
BOOL bs2; // 1-pic 0-raw
BOOL bd1; // 1-pic 0-raw save as
BOOL bd2; // 1-pic 0-raw
char src1[80];
char src2[80];
char dig1[80];
char dig2[80];
BOOL type; // 0-real 1-dbs 2-other
BOOL bEmult; // 1-for Emult 0-dig for matching
float res;
}SIMAGEBOX;
typedef struct tagSEMULT{
BOOL bType; // Emult radar type : ISDBS(1) or ISREL(0)
int nExtOrgimage; // 原始SAR图外扩象素,对应模拟时中心点
float hight;
int numbs;
int scale;
float res;
// for dbs
int cx;
int cy;
int size;
int row;
int col;
float fdstScale ;
float fdstTheta ;
int bFlightDir;
float fFlightRate;
float startscanangle;
int bScanDir;
float fScanRate;
float dd;
float fScanTheta; // 成像扫描角度
// reserved
BOOL brel; // 1-pic 0-raw open as
BOOL bsar; // 1-pic 0-raw
char pos[80];
char rel[80];
char sar[80];
char PathName[80];
}SEMULT;
// struct for rel matching parms
typedef struct tagSMATCH{
BOOL bType; // ISDBS or ISREL(0)
char PathName[80]; // working PathName
char RelFile[80];
char RefFile[80];
char CorFile[80];
char PosFile[80];
char ResultFile[80];
int numbs;
int bsize;
int nErrMax;
// float fSigma ; // reserved
// for Rel radar image match
int height;
float res;
// for dbs radar image match
float fRatioLR; // L和R匹配概率权重比
int bFlightDir;
float fScanTheta; // 成像扫描角度
BOOL bVerL;
BOOL bVerR;
// calulate new value
float rad0 , rad1 ;
}SMATCH;
// struct for rel matching parms
typedef struct tagSPRCSCALE{
BOOL bType;
char PathName[80]; // working PathName
int col;
int row;
int nHalfSize;
char SrcFile[80];
char DesFile[80];
}SPRCSCALE;
class CComlib
{
public:
CComlib();
virtual ~CComlib();
// add new function here in version 2.2
public:
static SEMULT * ReadEmultProcessItem( int &numb , CString filename);
static SMATCH * ReadMatchProcessItem( int &numb , CString filename);
static SPRCSCALE * ReadPrcScaleItem( int &numb , CString filename);
static BOOL PrcThenScale( SPRCSCALE in);
public:
static void Bmp2Pic(CString FileName);
static void Bmp24To256(CString FileName, CString OutFileName, float fScale, int x1, int x2, int y1, int y2, BOOL bPic = TRUE);
/****************** 数据统计 *****************/
// 统计高斯分布数据的均值和标准差Sigma
static void GuassStatics(float *p, int length , float &avg, float &dev);
// 对图象局部去均值处理
static BYTE ** PreProcess(BYTE ** Src , int row , int col , int nHalfSize);
// 均值平滑图象
static void ImgSmooth(BYTE **Src,int nRow,int nCol,int nrRatio, int ncRatio, BYTE **Des);
// 图象比较
static BOOL CompareImage(CString file1, CString file2, CString outfile);
static BOOL AverageImage(CString file1, CString file2, CString outfile);
/****************** 图象变换 *****************/
// 图象反转
static void Inverse(BYTE** lpOrgImg, BYTE** lpOutImg, int Row, int Col);
// 图象放缩变换
static void ImgScale(BYTE ** src , int sr, int sc, BYTE ** des , int dr, int dc, int nScaleFactor = 3);
// 图象旋转变换
static BYTE ** ImgRotate(BYTE ** src , int sr, int sc , int& dr, int& dc, float theta , BOOL dir = CLOCKWISE, BYTE nBackgrd = 192);
// 三次线性插值放缩图象
static BYTE ** ImgScaleCubicLinear(BYTE ** src , int row, int col, int desR , int desC ) ;
// 图象以某点为中心进行放缩与旋转变换,并对应截取某尺寸大小的子图
// 考虑插值放大后再旋转变形等(精细)
static BYTE ** DigDistortSubImgFine(BYTE ** src , int sRow, int sCol, int dRow, int dCol, float cR , float cC , float scale = 1 , float theta = 0) ;
// 直接用变换矩阵变形处理(粗糙)
static BYTE ** DigDistortSubImgFast(BYTE ** src , int sRow, int sCol, int dRow, int dCol, float cR , float cC , float scale = 1 , float theta = 0) ;
/****************** 图象统计 *****************/
// 计算有效范围的均值
static float Average(BYTE ** image , BYTE ** Mask /*= NULL*/ , int r, int c);
// 计算有效范围的标准差
static float Deviation( BYTE ** image, BYTE ** Mask , int r, int c);
// 统计有效范围的直方图
static int * Histogram( BYTE ** image, BYTE ** Mask , int r, int c);
static float ucAverage(unsigned char **a,int YStart,int XStart,int row,int col, int margin);
static float ucDeviation(unsigned char **a,int YStart,int XStart,int row,int col, float average,int margin);
/************ DSP数据格式转反与保存 ***********/
// 保存为DSP数据格式文件
static void SaveAsDspDataFile(void * data, int size, DWORD address, CString outfile, char cTYPE);
// 读取DSP数据格式文件到数组
static void LoadAsDspDataFile(void * data, int *psize, CString outfile, char cType);
/************** 数据归一化为图象 *************/
// 将float数据归一化为图象数据输出
static BOOL NormalizeToByte(float ** p, int r, int c, CString outfile, BOOL bVert = TRUE);
static BOOL NormalizeToByte3(float ** p, int r, int c, CString outfile);
static BOOL NormalizeToByte(float ** p, BYTE ** q, int r, int c, BOOL bVert = FALSE);
static BOOL NormalizeToByte(float * p, int r, int c, CString outfile, BOOL bVert = TRUE);
static BYTE** NormalizeFloat(float **Float,short YStart,short XStart,
short Row,short Col,short Min,short Max,short Margin);
static float fMax2d(float **a,short YStart,short XStart,short row,short col,short margin,float *minp);
/***************** 搜索极值点 ****************/
// 搜索二维数组中前N个极值点,保存极值点坐标和对应值
static void GetNMinisum(float ** p , int r, int c, int N , NPOT * q);
static void GetNMaxisum(float ** p , int r, int c, int N , NPOT * q);
// 搜索二维或一维数组中极值点,保存极值点坐标和对应值
// 搜索面间隔step+1
static NPOT GetMinisum(float ** p , int r, int c, int step=0);
static NPOT GetMaxisum(float ** p , int r, int c, int step=0);
static NPOT GetMinisum(float * p , int r, int c, int step=0);
static NPOT GetMaxisum(float * p , int r, int c, int step=0);
// 求二维数组中的极值
static float GetMinisumValue(float ** p , int r, int c);
static float GetMaxisumValue(float ** p , int r, int c);
/***************** 随机点操作 ****************/
// 输出随机点坐标到文件
static void OutputPostData(COORDINATE * p, int n, CString txtfile);
// 从文件中读取随机点坐标
static COORDINATE * InputPostData(int* n, CString txtfile);
// 在某框中等距产生随机点
static COORDINATE * GenRandomPost( int &n, int x1, int x2, int y1, int y2, int step);
/***************** 存储空间 ****************/
static void *fspace_1d(int col,int length);
static void **fspace_2d(int row,int col,int lenth);
static void ***fspace_3d(int row1,int row2,int row3,int lenth);
static void ffree_1d(void *a);
static void ffree_2d(void **a,int row);
static void ffree_3d(void ***a,int row1,int row2);
/***************** 数组变维 ****************/
// 将二维数组转换到一维数组
static BYTE * Trans2To1( BYTE ** p, CSize s);
// 将一维数组转换到二维数组
static BYTE ** Trans1To2( BYTE * p, CSize s);
/*************** 图象文件操作 **************/
static FILE *wfwrite1(int row,int col,int type, CString filename);
static FILE *wfread1(int *row,int *col,int *type, CString filename);
// 输入PIC格式文件
static unsigned char **InputImageWithName(int *Row,int *Col, CString FileName);
// 输入PIC格式文件到一维数组
static unsigned char *InputImageWithName_1d(int *Row,int *Col, CString FileName);
// 输入PIC格式文件并返回图象数据到数组
static unsigned char *InputImageWithName(CString FileName);
// 输出PIC格式图象文件
static BOOL OutputImageWithName(unsigned char **Image,int Row,int Col, CString FileName);
static BOOL OutputImageWithName(unsigned char *Image,int Row, int Col, CString FileName);
static BOOL InputImageWithName(IMAGE *p , CString FileName);
static BOOL OutputImageWithName(IMAGE p , CString FileName);
// 输入PIC格式文件并返回图象数据到数组
static double *InputImageWithName_d(int *Row,int *Col, CString FileName);
//////////////////
// 输出RAW格式文件,输入参数包括图象行、列、文件头字节数
static BOOL OutputImageDataWithName( void **Image,int Row, int Col, CString FileName , int HeadBytes = 0 , int nPixelBytes = 1);
// 输入RAW格式文件,输入参数包括图象行、列、文件头字节数
static void **InputImageDataWithName(int Row,int Col, CString FileName , int HeadBytes = 0 , int nPixelBytes = 1);
// 将PIC格式图象文件转换为BMP格式文件 8bit/p
static BOOL TransPicToBmp(CString PicFileName, CString OutFileName, float fScale=1.0f, int x1=0, int x2=0, int y1=0, int y2=0, BOOL bPic = FALSE);
static BOOL WriteAsBmp(BYTE ** image , int Row , int Col ,CString FileName);
/*************** 图象大小估计 **************/
static CSize GuessSize(int Len);
static int GuessImageSizeWithName(int *Row,int *Col, CString FileName , BOOL bIsPic = FALSE);
// 通过文件名判断文件类型
static BOOL CheckFileType(CString file);
// 对话框输入文件名
static BOOL GetImageFileName(CString &file , CString title);
// 图象序列间K-L变换滤波, n帧
static void ImageFilterByK_L(CString filename , int n);
// 图象按行K-L变换滤波, 共n帧
static void ImageFilterByK_LRow(CString filename , int n);
// 图象按列K-L变换滤波, 共n帧
static void ImageFilterByK_LCol(CString filename , int n);
};
#endif // !defined(AFX_COMLIB_H__D54B1D06_0CE8_11D3_B159_204C4F4F5020__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -