📄 myimagedbdoc.cpp
字号:
// 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 + -