📄 shibie2.cpp
字号:
// shibie2.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include "shibie2.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//
// Note!
//
// If this DLL is dynamically linked against the MFC
// DLLs, any functions exported from this DLL which
// call into MFC must have the AFX_MANAGE_STATE macro
// added at the very beginning of the function.
//
// For example:
//
// extern "C" BOOL PASCAL EXPORT ExportedFunction()
// {
// AFX_MANAGE_STATE(AfxGetStaticModuleState());
// // normal function body here
// }
//
// It is very important that this macro appear in each
// function, prior to any calls into MFC. This means that
// it must appear as the first statement within the
// function, even before any object variable declarations
// as their constructors may generate calls into the MFC
// DLL.
//
// Please see MFC Technical Notes 33 and 58 for additional
// details.
//
/////////////////////////////////////////////////////////////////////////////
// CShibie2App
BEGIN_MESSAGE_MAP(CShibie2App, CWinApp)
//{{AFX_MSG_MAP(CShibie2App)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CShibie2App construction
CShibie2App::CShibie2App()
{
// TODO: add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CShibie2App object
CShibie2App theApp;
CImage image;
LPBYTE lpimc,lpImage;
int nWidth,nHeight,nWidthBytes,nBits,ii1,ii2,jj1,jj2;
int xy[10][10],xy1[10][10];
HDIB dib;
DLLEXPORT_API int __stdcall IsCoalChange(LPCSTR szFile1,LPCSTR szFile2)
{
RECT rRect1,rRect2;
int iNum1,iNum2,i,j,iRes;
DrawCheXiang(szFile1,&rRect1);
iNum1=Bianyuan(szFile1,0);
DrawCheXiang(szFile2,&rRect2);
iNum2=Bianyuan(szFile2,1);
iRes=0;
for(i=1;i<9;i++)
for(j=1;j<9;j++)
if(abs(xy[i][j]-xy1[i][j])>200)
iRes++;
// iRes=abs(iNum1-iNum2);
return(iRes);
}
DLLEXPORT_API int __stdcall NumCoal(LPCSTR szFile)
{
RECT rRect;
DrawCheXiang(szFile,&rRect);
int i,j,iGray,iRes;
if(image.GetDIB()==NULL)
{
return -1;
}
//请在此添加您需要的程序
LPBYTE lpdata;
HLOCAL hNewDIBBits;
hNewDIBBits = LocalAlloc(LHND, nWidth * nHeight);
if (hNewDIBBits== NULL)
return -1;
lpdata= (unsigned char * )LocalLock(hNewDIBBits);
memset((char *)lpdata, (BYTE)0, nWidth * nHeight);
//////////////////////////////////////////////////////
for(i=0;i<nWidth;i++)
{
for(j=0;j<nHeight;j++)
{
//灰度信息
*(lpdata+j*nWidth+i)=(unsigned char)(0.299**(lpimc+j*nWidthBytes+nBits*i/8+2)+
0.587**(lpimc+j*nWidthBytes+nBits*i/8+1)+
0.114**(lpimc+j*nWidthBytes+nBits*i/8));
}
}
//平均亮度
iGray=0;
for(i=0;i<nWidth;i++)
{
for(j=0;j<nHeight;j++)
{
//灰度信息
iGray=iGray+*(lpdata+j*nWidth+i);
}
}
iGray=iGray/(nWidth*nHeight);
iRes=0;
for(j=jj2;j<jj1;j++)
{
for(i=ii2;i<ii1;i++)
{
if(*(lpdata+j*nWidth+i)<(iGray-20))
{
iRes=iRes+1;
}
}
}
LocalFree(hNewDIBBits);
return iRes;
}
void DrawCheXiang(LPCSTR szFile,RECT* pRect)
{
image.Load(szFile);
lpimc=image.FindDibBits();
nWidth=image.GetWidth();
nHeight=image.GetHeight();
nWidthBytes=image.GetWidthBytes();
nBits=image.GetBits();
dib=image.GetDIB();
LPBYTE lpdata;
HLOCAL hNewDIBBits;
hNewDIBBits = LocalAlloc(LHND, nWidth * nHeight);
if (hNewDIBBits== NULL)
return ;
lpdata= (unsigned char * )LocalLock(hNewDIBBits);
memset((char *)lpdata, (BYTE)0, nWidth * nHeight);
//////////////////////////////////////////////////////
int k1,k2,i,j,k3,k4,k5,k6;
int i1,i2,j1,j2,ch[800],s,jm,j0,i0,im;
BYTE imag[704][576];
int g[4],max,kp;
int rx1,rx2,lx1,lx2,m,n,kps,xy[10][10],ii,jj,ii3,ii4;
float dx1,dx2,dy,a,b;
kp=10;
i1=10;i2=690;j1=60;j2=500;
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
//灰度信息
*(lpdata+j*nWidth+i)=(unsigned char)(0.299**(lpimc+j*nWidthBytes+nBits*i/8+2)+
0.587**(lpimc+j*nWidthBytes+nBits*i/8+1)+
0.114**(lpimc+j*nWidthBytes+nBits*i/8));
}
}
for(i=0;i<256;i++)
{
ch[i]=0;
}
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(*(lpdata+(j-1)*nWidth+i)-*(lpdata+(j+1)*nWidth+i)>0)
imag[i][j]=*(lpdata+(j+1)*nWidth+i)-*(lpdata+(j-1)*nWidth+i);
else
imag[i][j]=0;
}
}
s=0;
kp=5;
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(imag[i][j]>kp)
{
imag[i][j]=0;
}
else
imag[i][j]=*(lpdata+j*nWidth+i);
}
}
/* for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
*(lpimc+j*nWidthBytes+nBits*i/8)=imag[i][j];
*(lpimc+j*nWidthBytes+nBits*i/8+1)=imag[i][j];
*(lpimc+j*nWidthBytes+nBits*i/8+2)=imag[i][j];
}
}
*/
////////////////////////////////////////////////////////////////////////////
jm=(j1+j2)/2;
for(j=jm;j<j2;j++) ch[j]=0;
for(i=i1;i<i2;i++)
{
for(j=jm;j<j2;j++)
{
if(imag[i][j]==0)
{
ch[j]++;
ch[j+1]++;
ch[j-1]++;
// break;
}
}
}
max=0;
j0=jm;
for(j=jm;j<j2-10;j++)
{
if(ch[j]>max)
{
max=ch[j];
j0=j;
}
}
// j0=404;
if(j0<350)
j0=450;
/* for(i=i1;i<i2;i++)
{
*(lpimc+j0*nWidthBytes+nBits*i/8)=255;
*(lpimc+j0*nWidthBytes+nBits*i/8+1)=255;
*(lpimc+j0*nWidthBytes+nBits*i/8+2)=255;
}*/
jj1=j0;
/////////////////////////////////////////////////////////////////////////
jm=(j1+j2)/2;
for(j=jm;j>j1;j--) ch[j]=0;
for(i=i1;i<i2;i++)
{
for(j=jm;j>j1;j--)
{
if(imag[i][j]==0)
{
ch[j]++;
ch[j+1]++;
ch[j-1]++;
// break;
}
}
}
max=0;
j0=jm;
for(j=jm;j>j1+10;j--)
{
if(ch[j]>max)
{
max=ch[j];
j0=j;
}
}
// j0=50;
if(j0>200)
j0=100;
/* for(i=i1;i<i2;i++)
{
*(lpimc+j0*nWidthBytes+nBits*i/8)=255;
*(lpimc+j0*nWidthBytes+nBits*i/8+1)=255;
*(lpimc+j0*nWidthBytes+nBits*i/8+2)=255;
}*/
jj2=j0;
/////////////////////////////////////////////////////////////////////////////
////查找竖边
////////////////////////////////////////////////////////////////////////////
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(abs(*(lpdata+(j)*nWidth+i-1)-*(lpdata+(j)*nWidth+i+1))>0)
imag[i][j]=abs(*(lpdata+(j)*nWidth+i+1)-*(lpdata+(j)*nWidth+i-1));
}
}
s=0;
kp=10;
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(imag[i][j]>kp)
{
imag[i][j]=0;
}
else
imag[i][j]=*(lpdata+j*nWidth+i);
}
}
im=(i1+i2)/2;
for(i=im;i<i2;i++) ch[i]=0;
for(j=j1;j<j2;j++)
{
for(i=im;i<i2;i++)
{
if(imag[i][j]==0)
{
ch[i]++;
ch[i+1]++;
ch[i-1]++;
// break;
}
}
}
max=0;
i0=im;
for(i=im;i<i2-10;i++)
{
if(ch[i]>max)
{
max=ch[i];
i0=i;
}
}
// j0=404;
if(max<400)
i0=i2-10;
/* for(j=j1;j<j2;j++)
{
*(lpimc+j*nWidthBytes+nBits*i0/8)=255;
*(lpimc+j*nWidthBytes+nBits*i0/8+1)=255;
*(lpimc+j*nWidthBytes+nBits*i0/8+2)=255;
}*/
ii1=i0;
// ii1=i0;
/////////////////////////////////////////////////////////////////////////
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(abs(*(lpdata+(j)*nWidth+i+1)-*(lpdata+(j)*nWidth+i-1))>0)
imag[i][j]=abs(*(lpdata+(j)*nWidth+i+1)-*(lpdata+(j)*nWidth+i-1));
}
}
s=0;
kp=10;
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(imag[i][j]>kp)
{
imag[i][j]=0;
}
else
imag[i][j]=*(lpdata+j*nWidth+i);
}
}
im=(i1+i2)/2;
for(i=im;i>i1;i--) ch[i]=0;
for(j=j1;j<j2;j++)
{
for(i=im;i>i1;i--)
{
if(imag[i][j]==0)
{
ch[i]++;
ch[i+1]++;
ch[i-1]++;
// break;
}
}
}
max=0;
i0=im;
for(i=im;i>i1+10;i--)
{
if(ch[i]>max)
{
max=ch[i];
i0=i;
}
}
// j0=50;
if(max<600)
i0=i1+10;
/* for(j=j1;j<j2;j++)
{
*(lpimc+j*nWidthBytes+nBits*i0/8)=255;
*(lpimc+j*nWidthBytes+nBits*i0/8+1)=255;
*(lpimc+j*nWidthBytes+nBits*i0/8+2)=255;
}*/
ii2=i0;
pRect->left=ii2;
pRect->top=jj2;
pRect->right=ii1;
pRect->bottom=jj1;
LocalFree(hNewDIBBits);
}
int Bianyuan(LPCSTR szFile,int iOne)
{
//任意方向边缘检测
LPBYTE lpdata;
if(dib==NULL)
{
return -1;
}
//---------------------------------------------------------------
//请在此添加您需要的程序!
HLOCAL hNewDIBBits;
hNewDIBBits = LocalAlloc(LHND, nWidth * nHeight);
if (hNewDIBBits== NULL)
return -1;
lpdata= (unsigned char * )LocalLock(hNewDIBBits);
memset((char *)lpdata, (BYTE)0, nWidth * nHeight);
//////////////////////////////////////////////////////
int k1,k2,i,j,k3,k4,k5,k6;
int i1,i2,j1,j2,ch[800],s,jm,j0,i0,im;
BYTE imag[704][576],imag1[704][576];
int g[4],max,kp;
int rx1,rx2,lx1,lx2,m,n,kps,ii,jj,ii3,ii4,jj3,jj4;
float dx1,dx2,dy,a,b;
kp=10;
i1=10;i2=690;j1=60;j2=500;
ii2=10;
ii1=680;
jj1=450;
jj2=100;
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
//灰度信息
*(lpdata+j*nWidth+i)=(unsigned char)(0.299**(lpimc+j*nWidthBytes+nBits*i/8+2)+
0.587**(lpimc+j*nWidthBytes+nBits*i/8+1)+
0.114**(lpimc+j*nWidthBytes+nBits*i/8));
}
}
for(i=0;i<256;i++)
{
ch[i]=0;
}
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(*(lpdata+(j-1)*nWidth+i)-*(lpdata+(j+1)*nWidth+i)>0)
imag[i][j]=*(lpdata+(j+1)*nWidth+i)-*(lpdata+(j-1)*nWidth+i);
else
imag[i][j]=0;
}
}
s=0;
kp=5;
for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
if(imag[i][j]>kp)
{
imag[i][j]=0;
}
else
imag[i][j]=*(lpdata+j*nWidth+i);
}
}
/* for(i=i1;i<i2;i++)
{
for(j=j1;j<j2;j++)
{
*(lpimc+j*nWidthBytes+nBits*i/8)=imag[i][j];
*(lpimc+j*nWidthBytes+nBits*i/8+1)=imag[i][j];
*(lpimc+j*nWidthBytes+nBits*i/8+2)=imag[i][j];
}
}
*/
////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
CString str;
FILE* fp;
kps=200;
kp=20;
int iVer=0;
// fp = fopen("e:\\jg.txt","w");
//查找 边缘
g[0]=0;
g[1]=0;
g[2]=0;
g[3]=0;
dy=float(jj1-jj2)/10.0;
dx1=float(ii1-ii2)/10.0;
for(i=ii2;i<ii1;i++)
for(j=jj2;j<jj1;j++)
imag[i][j]=255;
for(int xx=0;xx<10;xx++)
{
for(int yy=0;yy<10;yy++)
{
ii3=ii2+xx*dx1;
ii4=ii3+dx1;
jj3=jj2+yy*dy;
jj4=jj3+dy;
for(i=ii3;i<ii4;i++)
for(j=jj3;j<jj4;j++)
{
g[0]=*(lpdata+(j-1)*nWidth+i-1)
+*(lpdata+(j-1)*nWidth+i+1)
-*(lpdata+j*nWidth+i-1)*2
+*(lpdata+(j)*nWidth+i+1)*2
-*(lpdata+(j+1)*nWidth+i-1)
+*(lpdata+(j+1)*nWidth+i+1);
g[1]=*(lpdata+(j-1)*nWidth+i-1)
+*(lpdata+(j-1)*nWidth+i)*2
+*(lpdata+(j-1)*nWidth+i+1)
-*(lpdata+(j+1)*nWidth+i-1)
-*(lpdata+(j+1)*nWidth+i)*2
-*(lpdata+(j+1)*nWidth+i+1);
imag[i][j]=(int)(sqrt((double)(g[0]*g[0]+g[1]*g[1]))/4.0);
/* g[0]=(*(lpdata+j*nWidth+i+1)-*(lpdata+j*nWidth+i-1));
g[1]=(*(lpdata+(j+1)*nWidth+i)-*(lpdata+(j-1)*nWidth+i));
g[2]=(*(lpdata+(j+1)*nWidth+i+1)-*(lpdata+(j-1)*nWidth+i-1));
g[3]=(*(lpdata+(j-1)*nWidth+i+1)-*(lpdata+(j+1)*nWidth+i-1));
max=0;
for(ii=0;ii<4;ii++)
{
if(g[ii]>max)
max=g[ii];
}
if(max>kp
//&& imag[i-1][j]!=0 //&& imag[i-1][j-1]!=0
//&& imag[i+1][j]!=0 //&& imag[i+1][j+1]!=0
//&& imag[i][j-1]!=0 && imag[i][j+1]!=0
)
imag[i][j]=0;
else
imag[i][j]=255;//*(lpdata+j*nWidth+i);*/
}
for(i=ii3;i<ii4;i++)
for(j=jj3;j<jj4;j++)
{
iVer+=imag[i][j];
}
iVer=iVer/((ii4-ii3)*(jj4-jj3));
for(i=ii3;i<ii4;i++)
for(j=jj3;j<jj4;j++)
{
if(imag[i][j]>(iVer+3))
imag[i][j]=255;
else
imag[i][j]=0;
}
iVer=0;
for(i=ii3;i<ii4;i+=5)
for(j=jj3;j<jj4;j+=5)
{
for(n=i;n<i+5;n++)
for(m=j;m<j+5;m++)
if(imag[n][m]==0)
iVer++;
if(iVer<10)
for(n=i;n<i+5;n++)
for(m=j;m<j+5;m++)
imag[n][m]=255;
iVer=0;
}
for(i=ii3+1;i<ii4-1;i+=5)
for(j=jj3+1;j<jj4-1;j+=5)
{
for(n=i;n<i+5;n++)
for(m=j;m<j+5;m++)
if(imag[n][m]==0)
iVer++;
if(iVer>10)
for(n=i;n<i+5;n++)
for(m=j;m<j+5;m++)
imag[n][m]=0;
iVer=0;
}
for(i=ii3;i<ii4;i++)
for(j=jj3;j<jj4;j++)
{
g[0]=imag[i+1][j]-imag[i-1][j];
g[1]=imag[i][j+1]-imag[i][j-1];
g[2]=imag[i+1][j+1]-imag[i-1][j-1];
g[3]=imag[i+1][j-1]-imag[i-1][j+1];
max=0;
for(ii=0;ii<4;ii++)
{
if(g[ii]>max)
max=g[ii];
}
if(max>kp
//&& imag[i-1][j]!=0 //&& imag[i-1][j-1]!=0
//&& imag[i+1][j]!=0 //&& imag[i+1][j+1]!=0
//&& imag[i][j-1]!=0 && imag[i][j+1]!=0
)
imag1[i][j]=0;
else
imag1[i][j]=255;//*(lpdata+j*nWidth+i);
}
for(i=ii3;i<ii4;i++)
for(j=jj3;j<jj4;j++)
{
*(lpimc+j*nWidthBytes+nBits*i/8)=imag1[i][j];
*(lpimc+j*nWidthBytes+nBits*i/8+1)=imag1[i][j];
*(lpimc+j*nWidthBytes+nBits*i/8+2)=imag1[i][j];
}
}
}
dy=float(jj1-jj2)/10.0;
dx1=float(ii1-ii2)/10.0;
dx2=float(ii1-ii2)/10.0;
lx1=ii2;
lx2=ii1;
// m=0;
// xy[m][n]=1;
n=0;
m=0;
s=0;
for(j=jj2;j<jj1-dy/2;j=j+dy)
{
n=0;
for(i=ii2;i<ii1-dx1/2;i=i+dx1){
for(jj=j;jj<j+dy;jj++)
{
ii=i;
*(lpimc+jj*nWidthBytes+nBits*ii/8)=0;
*(lpimc+jj*nWidthBytes+nBits*ii/8+1)=0;
*(lpimc+jj*nWidthBytes+nBits*ii/8+2)=0;
for(ii=i;ii<i+dx1;ii++)
if(imag[ii][jj]==0)
s++;
}
if(iOne==0)
xy[n][m]=s;
else
xy1[n][m]=s;
s=0;
n++;
}
for(ii=ii2;ii<ii1;ii++){
*(lpimc+j*nWidthBytes+nBits*ii/8)=0;
*(lpimc+j*nWidthBytes+nBits*ii/8+1)=0;
*(lpimc+j*nWidthBytes+nBits*ii/8+2)=0;
}
m++;
}
if(iOne==0)
fp = fopen("e:\\jg.txt","w");
else
fp = fopen("e:\\jg1.txt","w");
for(j=9;j>-1;j--)
{
for(int kk=0;kk<10;kk++)
{
if(iOne==0)
str.Format("%d ",xy[kk][j]);
else
str.Format("%d ",xy1[kk][j]);
fprintf(fp,str);
}
str.Format("\n");
fprintf(fp,str);
}
fclose(fp);
int iRes=0;
if(iOne==0){
for(j=1;j<9;j++)
{
for(int kk=1;kk<9;kk++)
iRes=iRes+xy[kk][j];
}
}
else
for(j=1;j<9;j++)
{
for(int kk=1;kk<9;kk++)
iRes=iRes+xy1[kk][j];
}
LocalFree(hNewDIBBits);
return iRes;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -