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; }