?? ydpdview.cpp
字號:
{
lOffset = cDib.PixelOffset(0,i,wBytesPerLine);
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
}
GlobalUnlock(hDIBCurrent);
Invalidate();
}
void CYdpdView::OnMenuYdpdThing()
{
cDib.ThinningDIB(hDIBCurrent);
Invalidate();
}
//函數(shù)實現(xiàn)去除圖片中離散點的功能
void CYdpdView::OnMenuYdpdDeletescater()
{
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBCurrent);
int width = lpbi->biWidth;
int height = lpbi->biHeight;
//令lpdata指向數(shù)據(jù)區(qū)
LPBYTE lpData = cDib.FindDIBBits(hDIBCurrent);
//得到圖片每行的字節(jié)個數(shù)
WORD wBytesPerLine = cDib.BytePerLine(hDIBCurrent);
long lOffset;
int lenth;
bool lab[m_HEIGHT][m_WIDTH];
//掃描整個圖片,進行去離散操作
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{ lenth = 0;
//得到點在數(shù)據(jù)區(qū)中的偏移
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
if(*(lpData+lOffset) == 255)//象素為白色
{ //初始化標志數(shù)組
for(int k=0;k<m_HEIGHT;k++)
for(int kk=0;kk<m_WIDTH;kk++)
lab[k][kk] = false;
//初始化連續(xù)點長度
cDib.lenth =0;
//判斷是否為離散點
if(cDib.IsScaterPoint(j,i,width,height,lpData,wBytesPerLine,3,lab))
{ //不是是離散點
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
}
else
{ //是離散點,把點設置為黑色
*(lpData+lOffset++) = 0;
*(lpData+lOffset++) = 0;
*(lpData+lOffset++) = 0;
}
}
else
{ //否則設置為黑色
*(lpData+lOffset++) = 0;
*(lpData+lOffset++) = 0;
*(lpData+lOffset++) = 0;
}
}
GlobalUnlock(hDIBCurrent);
Invalidate();
}
void CYdpdView::OnMenuYdpdGuiji()
{
Track tk;
tk.m_YDGJ.m_Guiji[tk.m_YDGJ.m_Len].x =locax;
tk.m_YDGJ.m_Guiji[tk.m_YDGJ.m_Len].y = locay;
tk.m_YDGJ.m_Len++;
//tk.DoModal();
}
//得到物體的中心點
void CYdpdView::OnMenuYdpdCenter()
{
LPBYTE lpData;
int height,width;
LPBITMAPINFOHEADER lpbi;
WORD wBytesPerLine;
long lOffset;
int xsum = 0,ysum=0,pointnum;
//lpdata指向數(shù)據(jù)區(qū)
lpData = cDib.FindDIBBits(hDIBCurrent);
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBCurrent);
//得到圖片的長寬信息
height = lpbi->biHeight;
width = lpbi->biWidth;
//得到圖片的每行的字節(jié)數(shù)
wBytesPerLine = cDib.BytePerLine(hDIBCurrent);
//初始化 橫坐標,縱坐標和點數(shù)的值
xsum =0;ysum =0;pointnum =0;
//掃描整個圖片
for(int i = 0;i<height;i++)
for(int j=0;j<width;j++)
{
//得到點在圖片中的偏移
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
if(*(lpData+lOffset) !=0)//不是黑色點
{
//增加橫坐標,縱坐標的值
xsum +=j;
ysum +=i;
//增加點數(shù)值
pointnum++;
}
}
//得到中心點在數(shù)據(jù)區(qū)中的偏移
lOffset = cDib.PixelOffset(ysum/pointnum,xsum/pointnum,wBytesPerLine);
//把中心點設置為綠色
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =255;
*(lpData+lOffset++) =0;
GlobalUnlock(hDIBCurrent);
Invalidate();
}
void CYdpdView::OnMenuYcx()
{
FILE *fpname;
char a[15];
CString aa;
fpname = fopen("filename.txt","r");
fscanf(fpname,"%s",aa);
if(hDIBBK1)
GlobalFree(hDIBBK1);
hDIBBK1 = cDib.LoadDIB(aa);
LPBITMAPINFOHEADER lpbi;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBBK1);
this->m_bk_first_width = lpbi->biWidth;
this->m_bk_first_height = lpbi->biHeight;
GlobalUnlock(hDIBBK1);
int num;
LPBYTE lpData;
LPBYTE lpDataS;
int height,width;
WORD wBytesPerLine;
long lOffset;
fscanf(fpname,"%d",&num);
bool lab = false;
int xsum = 0,ysum=0,pointnum;
for(int i=0;i<num;i++)
{
fscanf(fpname,"%s",a);
if(hDIBCurrent)
GlobalFree(hDIBCurrent);
hDIBCurrent = cDib.LoadDIB(a);
if(!hDIBCurrent)
{
AfxMessageBox("Load DIB file failed");
fclose(fpname);
return;
}
lpData = cDib.FindDIBBits(hDIBCurrent);
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBCurrent);
height = lpbi->biHeight;
width = lpbi->biWidth;
lpDataS = cDib.FindDIBBits(hDIBBK1);
wBytesPerLine = cDib.BytePerLine(hDIBBK1);
for(int i=0;i<height;i++)
for(int j=0;j<width;j++)
{
int cr,cg,cb;
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
cr = abs(*(lpData+lOffset) - *(lpDataS+lOffset));
cg = abs(*(lpData+lOffset+1) - *(lpDataS+lOffset+1));
cb = abs(*(lpData+lOffset+2) - *(lpDataS+lOffset+2));
int gray = (cb*39+cg*50+cr*11)/100;
*(lpData+lOffset) = gray;
*(lpData+lOffset+1) = gray;
*(lpData+lOffset+2) = gray;
}
xsum =0;ysum =0;pointnum =0;
for(i = 0;i<height;i++)
for(int j=0;j<width;j++)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
if(*(lpData+lOffset) !=0)
{
xsum +=j;
ysum +=i;
pointnum++;
}
}
this->m_center[this->m_Pointnum].x = xsum/pointnum;
this->m_center[this->m_Pointnum].y = ysum/pointnum;
this->m_Pointnum++;
}
Track tk;
for(i=0;i<this->m_Pointnum;i++)
{
tk.m_YDGJ.m_Guiji[i].x = m_center[i].x;
tk.m_YDGJ.m_Guiji[i].y = m_center[i].y;
}
tk.m_YDGJ.m_Len = this->m_Pointnum;
tk.m_mapheight = height;
tk.m_mapwidth = width;
tk.DoModal();
}
//實現(xiàn)圖片特征區(qū)域的再次匹配
void CYdpdView::OnSecondPipei()
{
LPBITMAPINFOHEADER lpbi;
LPBYTE lpData;
WORD wBytesPerLine;
int height1,width1,height2,width2;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBBK1);
//下面的一段代碼設定第二個特征區(qū)域的查找范圍
//第一個特征區(qū)域的縱坐標大于原圖高度的一半
if(lpbi->biHeight/2 < ImportantPoint.y)
{
//設定考察的兩個縱坐標位置
height2 = lpbi->biHeight/2;
height1 = 0;
}
else//第一個特征區(qū)域的坐標小于等于原圖高度的一半
{ //設定縱坐標位置
height2 = lpbi->biHeight;
height1 = lpbi->biHeight/2;
}
//如果第一個特征區(qū)域的橫坐標大于原來圖片的一半
if(lpbi->biWidth/2 < ImportantPoint.x)
{ //設定考察區(qū)域橫坐標的兩個值
width1 = 0;
width2 = lpbi->biWidth/2;
}
else //第一個特征區(qū)域的橫坐標小于等于原來圖片的一半
{ //設定考察區(qū)域的橫坐標的兩個值
width1 = lpbi->biWidth/2;
width2 = lpbi->biWidth;
}
lpData = cDib.FindDIBBits(hDIBBK1);
//得到每行象素的字節(jié)數(shù)
wBytesPerLine = cDib.BytePerLine(hDIBBK1);
int tempsum=0,sum=0;
long lOffset;
//在設定的區(qū)域內部查找第二個特征區(qū)域
for(int i=height1+RADIUS;i<height2-RADIUS;i++)
for(int j=width2+ RADIUS;j<width2-RADIUS;j++)
{ tempsum =0;
//考察以RADIUS82+1為邊長的正方形區(qū)域
for(int k1=-RADIUS;k1<=RADIUS;k1++)
for(int k2 =-RADIUS;k2<=RADIUS;k2++)
{
//得到數(shù)據(jù)偏移
lOffset = cDib.PixelOffset(i+k1,j+k2,wBytesPerLine);
//得到顏色值
int color = *(lpData+lOffset);
//增加當前tempsum的值
tempsum +=color;
}
if(tempsum>sum)//當前區(qū)域特征更明顯
{
sum = tempsum;
//設定區(qū)域中心點坐標
ImportantPointSecond.x = j;
ImportantPointSecond.y = i;
}
}
GlobalUnlock(hDIBBK1);
//按照新找到的特征區(qū)域,再次匹配中心點
bool kk = cDib.MatchImportantPoint(hDIBCurrent,ImportantColorInfo,&ImportantPoint2);
//比較圖片的相似度
if(cDib.ComPareImg(hDIBBK1,hDIBCurrent,ImportantPoint,ImportantPoint2))
AfxMessageBox("match successed");
else
AfxMessageBox("match failed");
Invalidate();
}
void CYdpdView::OnMenuPengzhang()
{
LPBITMAPINFOHEADER lpbi;
int height,width;
WORD wBytesPerLine;
LPBYTE lpData;
long lOffset;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBCurrent);
height = lpbi->biHeight;
width = lpbi->biWidth;
lpData = cDib.FindDIBBits(hDIBCurrent);
wBytesPerLine = cDib.BytePerLine(hDIBCurrent);
HANDLE hNewDIB;
LPBYTE lpT;
hNewDIB = GlobalAlloc(GHND,lpbi->biSize+lpbi->biSizeImage);
if(!hNewDIB)
return ;
lpT = cDib.FindDIBBits(hNewDIB);
for(int i =1;i<height-1;i++)
for(int j=1;j<width-1;j++)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
if(*(lpData+lOffset) == 255)
{
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
continue;
}
else if(*(lpData+lOffset) == 0)
{
lOffset = cDib.PixelOffset(i+1,j,wBytesPerLine);
if(*(lpData+lOffset) == 255)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
continue;
}
lOffset = cDib.PixelOffset(i-1,j,wBytesPerLine);
if(*(lpData+lOffset) == 255)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
continue;
}
lOffset = cDib.PixelOffset(i,j+1,wBytesPerLine);
if(*(lpData+lOffset) == 255)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
continue;
}
lOffset = cDib.PixelOffset(i,j-1,wBytesPerLine);
if(*(lpData+lOffset) == 255)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
*(lpT+lOffset++) = 255;
}
}
}
for(i = 1;i<height-1;i++)
for(int j=1;j<width-1;j++)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
*(lpData + lOffset) = *(lpT+lOffset);
*(lpData + lOffset+1) = *(lpT+lOffset+1);
*(lpData + lOffset+2) = *(lpT+lOffset+2);
}
for(i =0;i<height;i++)
{
lOffset = cDib.PixelOffset(i,0,wBytesPerLine);
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
}
for(i =0;i<height;i++)
{
lOffset = cDib.PixelOffset(i,width-1,wBytesPerLine);
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
}
for(i =0;i<width;i++)
{
lOffset = cDib.PixelOffset(height-1,i,wBytesPerLine);
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
}
for(i =0;i<width;i++)
{
lOffset = cDib.PixelOffset(0,i,wBytesPerLine);
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
*(lpData+lOffset++) =0;
}
GlobalUnlock(hDIBCurrent);
GlobalUnlock(hNewDIB);
Invalidate();
}
void CYdpdView::OnMenuGetedge()
{
LPBITMAPINFOHEADER lpbi;
int height,width;
WORD wBytesPerLine;
LPBYTE lpData;
long lOffset;
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDIBCurrent);
height = lpbi->biHeight;
width = lpbi->biWidth;
lpData = cDib.FindDIBBits(hDIBCurrent);
wBytesPerLine = cDib.BytePerLine(hDIBCurrent);
HANDLE hNewDIB;
LPBYTE lpT;
hNewDIB = GlobalAlloc(GHND,lpbi->biSize+lpbi->biSizeImage);
if(!hNewDIB)
return ;
lpT = cDib.FindDIBBits(hNewDIB);
for(int i=1;i<height-1;i++)
for(int j=1;j<width-1;j++)
{
lOffset = cDib.PixelOffset(i-1,j+1,wBytesPerLine);
int color1 = *(lpData+lOffset);
lOffset = cDib.PixelOffset(i+1,j-1,wBytesPerLine);
int color2 = *(lpData+lOffset);
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
*(lpT +lOffset++) = abs(color1-color2);
*(lpT +lOffset++) = abs(color1-color2);
*(lpT +lOffset++) = abs(color1-color2);
}
for(i = 1;i<height-1;i++)
for(int j=1;j<width-1;j++)
{
lOffset = cDib.PixelOffset(i,j,wBytesPerLine);
*(lpData+lOffset) = *(lpT+lOffset);
*(lpData+lOffset+1) = *(lpT+lOffset+1);
*(lpData+lOffset+2) = *(lpT+lOffset+2);
}
GlobalUnlock(hDIBCurrent);
GlobalUnlock(hNewDIB);
GlobalFree(hNewDIB);
Invalidate();
}
void CYdpdView::OnMenuYdpdGray()
{
hDIBCurrent = cDib.ToGray(hDIBCurrent);
Invalidate();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -