⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myimagedbdoc.cpp

📁 这是一个分水岭程序
💻 CPP
📖 第 1 页 / 共 5 页
字号:
 // MyImageDBDoc.cpp : implementation of the CMyImageDBDoc class
//

#include "stdafx.h"
#include "MyImageDB.h"

#include "MyImageDBDoc.h"
#include "mainfrm.h"

#include "include\imageobject.h"
#include "include\imageload.h"
#include "MyColorFeature.h"
#include "MyColorSpace.h"
#include <DLGS.H>
#include "mygabor.h"
#include "mytexture.h"
#include "myregutex.h"
#include <LIST>
#include <afxtempl.h>
#include <queue>

#include "SegmenterMS.h"//mean shift算法;
#include "ResultImageDlg.h"//mean shift算法结果图像;

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

/////////////////////////////////////////////////////////////////////////////
// CMyImageDBDoc

IMPLEMENT_DYNCREATE(CMyImageDBDoc, CDocument)

BEGIN_MESSAGE_MAP(CMyImageDBDoc, CDocument)
	//{{AFX_MSG_MAP(CMyImageDBDoc)
	ON_COMMAND(ID_SQUAREFUZZY, OnSquareFuzzy)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
	ON_COMMAND(ID_HIS1D2DB, OnHis1d2Db)
	ON_COMMAND(ID_QUERYBYHISD1, OnQueryByHisd1)
	ON_COMMAND(ID_RESETRANK, OnResetRank)
	ON_COMMAND(ID_CANCELPROCESS, OnCancelProcess)
	ON_COMMAND(ID_COLORCHANNEL, OnColorChannel)
	ON_COMMAND(ID_GREENLUMINOSITY, OnGreenLuminosity)
	ON_COMMAND(ID_ITULUMINOSITY, OnItuLuminosity)
	ON_COMMAND(ID_LOFLUV, OnLofLuv)
	ON_COMMAND(ID_VOFHSV, OnVofHsv)
	ON_COMMAND(ID_NEIERROR, OnNeiError)
	ON_COMMAND(ID_MINMAXTEX, OnMinmaxTex)
	ON_COMMAND(ID_INVERSEIMAGE, OnInverseImage)
	ON_COMMAND(ID_IMAGESEGMENT, OnImageSegment)
	ON_COMMAND(ID_GABORTRANSFORM, OnGaborTransform)
	ON_COMMAND(ID_LIGHTUP, OnLightUp)
	ON_COMMAND(ID_DIRECTIONHIS, OnDirectionHis)
	ON_COMMAND(ID_ENTROPY, OnEntropy)
	ON_COMMAND(ID_DIRECTIONHISALL, OnDirectionHisAll)
	ON_COMMAND(ID_HSIPIC, OnHsiPic)
	ON_COMMAND(ID_REVERSECOPY, OnReverseCopy)
	ON_COMMAND(ID_ORDERDETECT, OnOrderDetect)
	ON_COMMAND(ID_EDGEDETECT, OnEdgeDetect)
	ON_COMMAND(ID_GRIDIENT, OnGridient)
	ON_COMMAND(ID_QUICKSORT, OnQuickSort)
	ON_COMMAND(ID_WATERSHEDSEGMENT, OnWaterShedSegment)
	ON_COMMAND(ID_WATERSHEDSEGMENTINVER, OnWatershedSegmentInver)
	ON_COMMAND(ID_WATERSHEDSEGMENTVINCENT, OnWatershedSegmentVincent)
	ON_COMMAND(ID_FIFOQUEUE, OnFifoQueue)
	ON_COMMAND(ID_MEANSHIFT, OnMeanShift)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyImageDBDoc construction/destruction

CMyImageDBDoc::CMyImageDBDoc()
{
    myClassVector = NULL;
	imageName = "";
	imageData = NULL;
	luvData = NULL;
	isImageLoaded = FALSE;
	myImageObject = NULL;
	imageNei = NULL;
	resultDlg.Create(IDD_RESULTIMAGE);	
}

CMyImageDBDoc::~CMyImageDBDoc()
{
	if (imageNei!=NULL)
	{
		for (INT y=0; y<imageHeight; y++)
		{
			for (INT x=0; x<imageWidth; x++)
			{
				INT pos = y*imageWidth + x;
				delete [] imageNei[pos].ptneiarr;
				imageNei[pos].ptneiarr = NULL;
			}
		}
		delete [] imageNei;
		imageNei = NULL;
	}

	if (myClassVector!=NULL)
	{
		delete [] myClassVector;
		myClassVector = NULL;
	}
	if (imageData!=NULL)
	{
		delete [] imageData;
		imageData = NULL;
	}
	if (luvData!=NULL)
	{
		delete [] luvData;
		luvData = NULL;
	}
	
	if (myImageObject!=NULL)
	{
		delete myImageObject;
		myImageObject = NULL;
	}
}

BOOL CMyImageDBDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMyImageDBDoc serialization

BOOL CMyImageDBDoc::OnOpenDocument(LPCTSTR lpszPathName) 
{
//	if (!CDocument::OnOpenDocument(lpszPathName))
//		return FALSE;
	
	// TODO: Add your specialized creation code here

	CString strPathName = lpszPathName;
	imageName = strPathName;
	while ( imageName.Find("\\", 0)>=0 && imageName!="") 
	{
		imageName.Delete(0, 1);
	} 

	myImageObject = new CImageObject(strPathName);
	if(myImageObject==NULL)
	{
		AfxMessageBox("Could not create image class!");
		return FALSE;
	}
	isImageLoaded = TRUE;

	//以下将RGB数据存入数组以备处理;
	LONG width = myImageObject->GetWidth();
	LONG height = myImageObject->GetHeight();
	dataLen = width*height*3;
	if ( imageData != NULL )
	{
		delete [] imageData;
		imageData = NULL;
	}
	imageData = new BYTE[width*height*3];
	imageWidth = width;
	imageHeight = height;
	myImageObject->LoadDIBToBuf(imageData);

    //以下保存LUV数据;
	if ( luvData != NULL )
	{
		delete [] luvData;
		luvData = NULL;
	}
	luvData = new MyLUV[width*height];
	myColorSpace.RgbtoLuvPcm(imageData, width, height, luvData);

/*
	//以下计算各点邻域并保存;
	if (imageNei!=NULL)
	{
		for (INT y=0; y<imageHeight; y++)
		{
			for (INT x=0; x<imageWidth; x++)
			{
				INT pos = y*imageWidth + x;
				delete [] imageNei[pos].ptneiarr;
				imageNei[pos].ptneiarr = NULL;
			}
		}
		delete [] imageNei;
		imageNei = NULL;
	}
	imageNei = new MyPtNei[imageWidth*imageHeight];
	for (INT y=0; y<imageHeight; y++)
	{
		for (INT x=0; x<imageWidth; x++)
		{
			INT pos = y*imageWidth + x;
			//imageNei[pos].ptneiarr = new BYTE[(2*NEIRADIUS+1) * 3];//邻域宽度;
			INT radius = NEIRADIUS;
			imageNei[pos].ptneiarr = GetNearPixelsExt(x, y, imageData, imageWidth, imageHeight, radius);
		}
	}
*/
	
	return TRUE;
}

BOOL CMyImageDBDoc::OnSaveDocument(LPCTSTR lpszPathName) 
{
	// TODO: Add your specialized code here and/or call the base class
	
//	return CDocument::OnSaveDocument(lpszPathName);
	if( myImageObject != NULL )
	{
		CString strPathName = myImageObject->GetImageName();
		myImageObject->SaveToFile( strPathName );
    	SetModifiedFlag(FALSE);
	}

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CMyImageDBDoc diagnostics

#ifdef _DEBUG
void CMyImageDBDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CMyImageDBDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyImageDBDoc commands
void CMyImageDBDoc::RefreshView()
//数据表中所选图片改变,刷新显示;
{
	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd();
	CString tablename = pFrame->tableName;
	CString selname   = pFrame->selName;
	//CString imageid = pFrame->selID;//更新文档中的图像文件名;
	
	CString sqlquery;
	sqlquery.Format("select width,height,rgbval,datalen from %s where name=\'%s\'",
		tablename, selname);
	myImagedataRs = new CADORecordset( &(pFrame->myAdoDb) );
	if (!myImagedataRs->Open(sqlquery, CADORecordset::openUnknown))
	{
		//未正常连接指定表;
		CString tempstr;
		tempstr.Format("打不开图像数据表!!!");
		AfxMessageBox(tempstr,NULL,MB_OK);			
		return;
	}else
	{
		LONG templong;
		BOOL tempbool = myImagedataRs->GetFieldValue("datalen", templong);
		tempbool = myImagedataRs->GetFieldValue("height", imageHeight);
		tempbool = myImagedataRs->GetFieldValue("width", imageWidth); 	
		
		if (imageData!=NULL)
		{
			delete imageData;
			imageData = NULL;
		}
		imageData = new BYTE[templong];
		if ( myImagedataRs->GetChunk("rgbval", imageData) )
		{
			INT temp = 0;
		}
		myImagedataRs->Close();		
	}

	//以下刷新imageobject对象的图像内容;
	RefreshImageObject();
	isImageLoaded = TRUE;
	pFrame->pImageView->Invalidate(FALSE);//刷新VIEW显示;
}

void CMyImageDBDoc::AddImageToDb()
//将图像加到数据库中去;
{
	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd();
	if (!pFrame->isDbOK)
	{
		CString tempstr = "先连接数据库!!,:)";
		AfxMessageBox(tempstr);
		return;
	}
	CString tablename = pFrame->tableName;

	CString imagename;
	if ( imageName != "" )
	{
		imagename = imageName;
	}else
	{
		imagename = pFrame->selName;
	}


	LONG width = myImageObject->GetWidth();
	LONG height = myImageObject->GetHeight();
	dataLen = width*height*3;	
	
	CString sqlquery;
	sqlquery.Format("select * from %s where name=\'%s\'",
		tablename, imagename);
	myImagedataRs = new CADORecordset( &(pFrame->myAdoDb) );
	if (!myImagedataRs->Open(sqlquery, CADORecordset::openUnknown))
	{
		//未正常连接指定表;
		CString tempstr;
		tempstr.Format("打不开图像数据表!!!");
		AfxMessageBox(tempstr,NULL,MB_OK);			
		return;
	}else
	{
		if (myImagedataRs->GetRecordCount() > 0)
		{
			CString tempstr = "表中已有同名图像存在!";
			AfxMessageBox(tempstr);
			return;
		}else
		{
			//myImagedataRs->MoveLast();
			myImagedataRs->AddNew();
			BOOL tempbool = myImagedataRs->SetFieldValue("id", pFrame->recordCount+1);
			tempbool = myImagedataRs->SetFieldValue("name", imagename); 
			tempbool = myImagedataRs->SetFieldValue("width", width);
			tempbool = myImagedataRs->SetFieldValue("height", height);			
     		tempbool = myImagedataRs->SetFieldValue("datalen", dataLen);
    		tempbool = myImagedataRs->AppendChunk("rgbval", imageData, dataLen);
			tempbool = myImagedataRs->Update();
			pFrame->recordCount++;//准备重复插入多幅图像;
		}
		myImagedataRs->Close();		
	}

	//刷新数据表显示;
	pFrame->RefreshRs();
}

void CMyImageDBDoc::RefreshImageObject()
//刷新图像对象的颜色数据;
{
	if(NULL!=myImageObject)
	{
		delete myImageObject;		
		myImageObject = NULL;
	}
	myImageObject = new CImageObject;
	myImageObject->CreateDIBFromBits(imageWidth, imageHeight, imageData);
    //以下保存LUV数据;
	LONG width = myImageObject->GetWidth();
	LONG height = myImageObject->GetHeight();
	if ( luvData != NULL )
	{
		delete [] luvData;
		luvData = NULL;
	}
	luvData = new MyLUV[width*height];
	myColorSpace.RgbtoLuvPcm(imageData, width, height, luvData);
}

void CMyImageDBDoc::SquareFuzzy()
//测试图像数据处理;
{
	BeginWaitCursor();

	BYTE* processarr = new BYTE[imageWidth*imageHeight*3];
	for (INT x=0; x<imageWidth; x++)
	{
		for (INT y=0; y<imageHeight; y++)
		{
			LONG pos = (y*imageWidth + x) * 3;
			processarr[pos] = imageData[pos];
			processarr[pos+1] = imageData[pos+1];
			processarr[pos+2] = imageData[pos+2];
		}
	}

	//以下试对图像作模糊处理;
	INT neiscale = 1;//邻域范围;
	LONG pos = 0;

	for (x=0; x<imageWidth; x++)
	{
		for (INT y=0; y<imageHeight; y++)
		{
			pos = ( y*imageWidth + x ) * 3;//修改该位置的颜色分量值;
			
			INT nearwidth, nearheight;//邻域宽度;
			nearwidth = 0;
			nearheight = 0;
			BYTE* neararr = GetNearPixels(x, y, imageData,
				imageWidth, imageHeight, neiscale, 
				nearwidth, nearheight);
			//计算邻域均值;
			LONG total1, total2, total3;
			total1 = total2 = total3 = 0;//存放累加和;
			for (INT nearx=0; nearx<nearwidth; nearx++)
			{
				for (INT neary=0; neary<nearheight; neary++)
				{
					LONG nearpos = (neary*nearheight + nearx) * 3;
					total1 += neararr[nearpos];
					total2 += neararr[nearpos+1];
     				total3 += neararr[nearpos+2];					
				}
			}

			delete [] neararr;//删除邻域数组;
			neararr = NULL;

			//用均值更新临时数组中的元素;
			processarr[pos] = total1 / (nearwidth*nearheight);
			processarr[pos+1] = total2 / (nearwidth*nearheight);
			processarr[pos+2] = total3 / (nearwidth*nearheight);
		}
	}

	//用临时数组替换原数组;
	for (x=0; x<imageWidth; x++)
	{
		for (INT y=0; y<imageHeight; y++)
		{
			LONG pos = (y*imageWidth + x) * 3;
			imageData[pos] = processarr[pos];
			imageData[pos+1] = processarr[pos+1];
			imageData[pos+2] = processarr[pos+2];
		}
	}


	if(NULL!=myImageObject)
	{
		delete myImageObject;		
		myImageObject = NULL;
	}
	myImageObject = new CImageObject;
	myImageObject->CreateDIBFromBits(imageWidth, imageHeight, processarr);

	delete [] processarr;//删除临时数组;
	processarr = NULL;

	CMainFrame* pFrame = (CMainFrame*) AfxGetApp()->GetMainWnd();

	EndWaitCursor();
	
	pFrame->pImageView->Invalidate(FALSE);
}

MyLUV CMyImageDBDoc::GetMinmaxTexLUV(INT posx, INT posy)
//得到指定点处的最小最大纹理,用LUV计算;
{
	MyLUV outluv;//各分量纹理;	

	INT nearwidth, nearheight;//返回的邻域宽度;
	INT neiscale;//设定的计算范围;
	nearwidth = nearheight =  0;
	neiscale = 3;
	
	MyLUV* neararr = GetNearPixelsLUV(posx, posy, luvData,
		imageWidth, imageHeight, neiscale, 
		nearwidth, nearheight);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -