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

📄 shibie2.cpp

📁 卡车运输拉煤中丢煤现象严重,本程序为丢煤视频自动检测系统动态链接库,输出CoalChange函数供其它系统调用。
💻 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 + -