www.gusucode.com > VC++遥感原理与数字摄影测量实习源码程序 > VC++遥感原理与数字摄影测量实习源码程序\code\ChangeDetection\ChangeDetection.cpp

    // ChangeDetection.cpp : Defines the entry point for the console application.
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "ChangeDetection.h"
#include <string>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;

using namespace std;

/*
void Process()
{
	int method(0);
	while(cout << "请选择 1:差运算 2:比值运算 3:退出  >> ", cin >> method)
	{
		if(method == 1)
		{
			//
			break;
		}
		else if(method == 2)
		{
			//
			break;
		}
		else if(method == 3)
		{
			cout << endl;
			return;
		}
	}

	CString file1("D:\\left-7.bmp");
	CString file2("D:\\left-5.bmp");
	CString file("D:\\change.bmp");
	string a;
	
	//开始读取影像
	FILE* pFile1 = NULL;
	FILE* pFile2 = NULL;
	pFile1 = fopen(file1,"rb");
	if(pFile1 == NULL)
	{
		cout << "第1副影像打开失败" << endl;
		return;
	}
	pFile2 = fopen(file2,"rb");
	if(pFile2 == NULL)
	{
		cout << "第2副影像像打开失败" << endl;
		return;
	}

	BITMAPFILEHEADER bmfh1, bmfh2;
	BITMAPINFOHEADER bmih1, bmih2;

	fread(&bmfh1, sizeof(BITMAPFILEHEADER), 1, pFile1);
	fread(&bmfh2, sizeof(BITMAPFILEHEADER), 1, pFile2);

	fread(&bmih1, sizeof(BITMAPINFOHEADER), 1, pFile1);
	fread(&bmih2, sizeof(BITMAPINFOHEADER), 1, pFile2);

	if(bmih1.biBitCount != 8 || bmih2.biBitCount != 8)
	{
		cout << ("只支持8位位图\n");
		return;
	}

	DWORD width = bmih1.biWidth;
	DWORD height = bmih1.biHeight;
	DWORD _width = (width*8 + 31)/32*4;	//saved width in files
	DWORD pixelCount = _width*height;

	if(width != bmih2.biWidth || height != bmih2.biHeight)
	{
		cout << ("两幅影像尺寸不一致\n");
		return;
	}

//	cout << "width:" << width << "  height:" << height << endl;

	RGBQUAD rgbquad_1[256];
	RGBQUAD rgbquad_2[256];

	fread(rgbquad_1,sizeof(RGBQUAD),256,pFile1);
	fread(rgbquad_2,sizeof(RGBQUAD),256,pFile2);

	BYTE* pBits1 = new BYTE[pixelCount];
	BYTE* pBits2 = new BYTE[pixelCount];

	fread(pBits1,sizeof(BYTE),pixelCount,pFile1);
	fread(pBits2,sizeof(BYTE),pixelCount,pFile2);

	fclose(pFile1);
	fclose(pFile2);

	double* pChange = new double[pixelCount];		//存储差值或比值

	DWORD i(0);
	double max = -100;
	double min = 100;
	BYTE* p1 = pBits1;
	BYTE* p2 = pBits2;
	double* pEx = pChange;

	//逐点计算
	if(method == 1)	//计算差值
	{
		int a(0);
		while(cout << "请选择 1: A-B  -1: B-A  >> ", cin >> a)
		{
			if(a == 1 || a == -1)
				break;
		}
		for(i = 0; i < pixelCount; ++ i)
		{
			int aa = *p1;
			int bb = *p2;
			
			*pEx = (*p1 - *p2) * a;	//实际计算
			
			if(max < *pEx)
				max = *pEx;
			else if(min > *pEx)
				min = *pEx;
			
			pEx++;
			p1++;
			p2++;
		}
		int breakpoint = 0;
	}
	else			//计算比值
	{
		int a(0);
		while(cout << "请选择 1: A/B  2: B/A  >> ", cin >> a)
		{
			if(a == 1 || a == 2)
				break;
		}

		if(a == 1)	//	A/B
		{
			for(i = 0; i < pixelCount; ++ i)
			{
				int a = *p1;
				int b = *p2;
				
				if(*p2 != 0)	//如果 第2副影像的像素点灰度值不为0,则计算该点比值
				{
					*pEx = (float)*p1 / (float)*p2;
					
					if(max < *pEx)
						max = *pEx;
					else if(min > *pEx)
						min = *pEx;
				}
				else			//如果 为0,则比值置为255
					*pEx = 255;
				
				pEx++;
				p1++;
				p2++;
			}
		}
		else if(a == 2)	//	B/A
		{
			for(i = 0; i < pixelCount; ++ i)
			{
				int a = *p1;
				int b = *p2;
				
				if(*p1 != 0)	//如果 第2副影像的像素点灰度值不为0,则计算该点比值
				{
					*pEx = (float)*p2 / (float)*p1;
					
					if(max < *pEx)
						max = *pEx;
					else if(min > *pEx)
						min = *pEx;
				}
				else			//如果 为0,则比值置为255
					*pEx = 255;
				
				pEx++;
				p1++;
				p2++;
			}
		}
	}
		
//	cout << "Max:" << max << " Min:" <<min << endl;

	//将指数归化到0-255的范围内保存为位图
	pEx = pChange;
	double A = (255-0)/(max-min);
	double B = -A*min + 0;
	for(i = 0; i < pixelCount; ++i)
	{
		//灰度线性变换
//		*pEx = *pEx *((255-0)/(max-min)) + 
		*pEx = A * *pEx + B;
		pEx++;
	}

	//保存位图
	BITMAPINFOHEADER bmih = bmih1;
	bmih.biWidth = _width;

	FILE* pFile = fopen(file,"wb");
	if(pFile == NULL)
	{
		cout << ("结果文件创建失败\n");
		return;
	}
	
	fwrite(&bmfh1,sizeof(BITMAPFILEHEADER),1,pFile);
	fwrite(&bmih,sizeof(BITMAPINFOHEADER),1,pFile);
	fwrite(rgbquad_1,sizeof(RGBQUAD),256,pFile);

	pEx = pChange;
	BYTE grayscale(0);
	for(i = 0; i < pixelCount; ++i)
	{
		grayscale = (byte)*pEx++;
		fwrite(&grayscale,1,1,pFile);
	}
	fclose(pFile);

	//clean up
	delete[] pBits1;
	delete[] pBits2;
	delete[] pChange;
	pBits1 = p1 = NULL;
	pBits2 = p2 = NULL;
	pChange = pEx = NULL;

	ShellExecute(NULL, "open", file, NULL, NULL, SW_SHOWNORMAL);	
}*/

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	if (argc != 5)
	{
		::MessageBox(NULL,"启动参数不正确,请从GUI.exe启动","",MB_ICONASTERISK);
		return -1;
	}
	system("Mode con: COLS=30 LINES=15");
	system("title Change_Detection");
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}

//	Process();
//////////////////////////////////////////////////////////////////////////
	CString file1,file2,file,flag;	//启动参数
	file1 = argv[1];
	file2 = argv[2];
	file = argv[3];
	flag = argv[4];		//判断是否在创建结果文件后显示
	int m_flag = atoi(flag);
	
	if (GetFileAttributes(file1) == -1)
	{
		//the module does not exist
		CString err;
		err.Format("文件:%s不存在", file1);		
		::MessageBox(NULL,err, "Error", MB_ICONERROR);
		return -1;
	}
	if (GetFileAttributes(file2) == -1)
	{
		//the module does not exist
		CString err;
		err.Format("文件:%s不存在", file2);		
		::MessageBox(NULL,err, "Error", MB_ICONERROR);
		return -1;
	}


	int method(0);
	while(cout << "请选择 1:差运算 2:比值运算 3:退出  >> ", cin >> method)
	{
		if(method == 1)
		{
			//
			break;
		}
		else if(method == 2)
		{
			//
			break;
		}
		else if(method == 3)
		{
			cout << endl;
			return -1;
		}
	}

//	CString file1("D:\\left-7.bmp");
//	CString file2("D:\\left-5.bmp");
//	CString file("D:\\change.bmp");
	
	//开始读取影像
	FILE* pFile1 = NULL;
	FILE* pFile2 = NULL;
	pFile1 = fopen(file1,"rb");
	if(pFile1 == NULL)
	{
		cout << "第1副影像打开失败" << endl;
		return -1;
	}
	pFile2 = fopen(file2,"rb");
	if(pFile2 == NULL)
	{
		cout << "第2副影像像打开失败" << endl;
		return -1;
	}

	BITMAPFILEHEADER bmfh1, bmfh2;
	BITMAPINFOHEADER bmih1, bmih2;

	fread(&bmfh1, sizeof(BITMAPFILEHEADER), 1, pFile1);
	fread(&bmfh2, sizeof(BITMAPFILEHEADER), 1, pFile2);

	fread(&bmih1, sizeof(BITMAPINFOHEADER), 1, pFile1);
	fread(&bmih2, sizeof(BITMAPINFOHEADER), 1, pFile2);

	if(bmih1.biBitCount != 8 || bmih2.biBitCount != 8)
	{
		cout << ("只支持8位位图\n");
		return -1;
	}

	DWORD width = bmih1.biWidth;
	DWORD height = bmih1.biHeight;
	DWORD _width = (width*8 + 31)/32*4;	//saved width in files
	DWORD pixelCount = _width*height;

	if(width != bmih2.biWidth || height != bmih2.biHeight)
	{
		cout << ("两幅影像尺寸不一致\n");
		return -1;
	}

//	cout << "width:" << width << "  height:" << height << endl;

	RGBQUAD rgbquad_1[256];
	RGBQUAD rgbquad_2[256];

	fread(rgbquad_1,sizeof(RGBQUAD),256,pFile1);
	fread(rgbquad_2,sizeof(RGBQUAD),256,pFile2);

	BYTE* pBits1 = new BYTE[pixelCount];
	BYTE* pBits2 = new BYTE[pixelCount];

	fread(pBits1,sizeof(BYTE),pixelCount,pFile1);
	fread(pBits2,sizeof(BYTE),pixelCount,pFile2);

	fclose(pFile1);
	fclose(pFile2);

	double* pChange = new double[pixelCount];		//存储差值或比值

	DWORD i(0);
	double max = -100;
	double min = 100;
	BYTE* p1 = pBits1;
	BYTE* p2 = pBits2;
	double* pEx = pChange;

	//逐点计算
	if(method == 1)	//计算差值
	{
		int a(0);
		while(cout << "请选择 1: A-B  -1: B-A  >> ", cin >> a)
		{
			if(a == 1 || a == -1)
				break;
		}
		for(i = 0; i < pixelCount; ++ i)
		{
			int aa = *p1;
			int bb = *p2;
			
			*pEx = (*p1 - *p2) * a;	//实际计算
			
			if(max < *pEx)
				max = *pEx;
			else if(min > *pEx)
				min = *pEx;
			
			pEx++;
			p1++;
			p2++;
		}
		int breakpoint = 0;
	}
	else			//计算比值
	{
		int a(0);
		while(cout << "请选择 1: A/B  2: B/A  >> ", cin >> a)
		{
			if(a == 1 || a == 2)
				break;
		}

		if(a == 1)	//	A/B
		{
			for(i = 0; i < pixelCount; ++ i)
			{
				int a = *p1;
				int b = *p2;
				
				if(*p2 != 0)	//如果 第2副影像的像素点灰度值不为0,则计算该点比值
				{
					*pEx = (float)*p1 / (float)*p2;
					
					if(max < *pEx)
						max = *pEx;
					else if(min > *pEx)
						min = *pEx;
				}
				else			//如果 为0,则比值置为255
					*pEx = 255;
				
				pEx++;
				p1++;
				p2++;
			}
		}
		else if(a == 2)	//	B/A
		{
			for(i = 0; i < pixelCount; ++ i)
			{
				int a = *p1;
				int b = *p2;
				
				if(*p1 != 0)	//如果 第2副影像的像素点灰度值不为0,则计算该点比值
				{
					*pEx = (float)*p2 / (float)*p1;
					
					if(max < *pEx)
						max = *pEx;
					else if(min > *pEx)
						min = *pEx;
				}
				else			//如果 为0,则比值置为255
					*pEx = 255;
				
				pEx++;
				p1++;
				p2++;
			}
		}
	}
		
//	cout << "Max:" << max << " Min:" <<min << endl;

	//将指数归化到0-255的范围内保存为位图
	pEx = pChange;
	double A = (255-0)/(max-min);
	double B = -A*min + 0;
	for(i = 0; i < pixelCount; ++i)
	{
		//灰度线性变换
//		*pEx = *pEx *((255-0)/(max-min)) + 
		*pEx = A * *pEx + B;
		pEx++;
	}

	//保存位图
	BITMAPINFOHEADER bmih = bmih1;
	bmih.biWidth = _width;

	FILE* pFile = fopen(file,"wb");
	if(pFile == NULL)
	{
		cout << ("结果文件创建失败\n");
		return -1;
	}
	
	fwrite(&bmfh1,sizeof(BITMAPFILEHEADER),1,pFile);
	fwrite(&bmih,sizeof(BITMAPINFOHEADER),1,pFile);
	fwrite(rgbquad_1,sizeof(RGBQUAD),256,pFile);

	pEx = pChange;
	BYTE grayscale(0);
	for(i = 0; i < pixelCount; ++i)
	{
		grayscale = (byte)*pEx++;
		fwrite(&grayscale,1,1,pFile);
	}
	fclose(pFile);

	//clean up
	delete[] pBits1;
	delete[] pBits2;
	delete[] pChange;
	pBits1 = p1 = NULL;
	pBits2 = p2 = NULL;
	pChange = pEx = NULL;

	if (m_flag == 1)
	{
		ShellExecute(NULL, "open", file, NULL, NULL, SW_SHOWNORMAL);
	}
	
	return nRetCode;
}