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

📄 colorgrow.cpp

📁 使用大恒采集卡的图像显示
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ColorGrow.cpp: implementation of the CColorGrow class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "ColorGrow.h"

#include "math.h"
#include "Img.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#define ABS(x)	(((x) < 0) ? -(x) : (((x) > 0) ? (x) : 0))
#define MIN(a,b)	(((a) < (b)) ? (a) : (b))
#define MAX(a,b)	(((a) > (b)) ? (a) : (b))
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CColorGrow,CImagePointProcess)
CColorGrow::CColorGrow()
{

}

CColorGrow::~CColorGrow()
{

}
#ifdef _DEBUG
void CColorGrow::Dump(CDumpContext& dc)const
{
	CImagePointProcess::Dump(dc);
}
void CColorGrow::AssertValid()const
{
	CImagePointProcess::AssertValid();
}
#endif

static int imagein_r[200][200];
static int imagein_g[200][200];
static int imagein_b[200][200];
static int mm_x[2];
static int mm_y[2];
BOOL CColorGrow::GetImage(LPBYTE lpbyBits32, int* xx, int* yy, int nWidth, int nHeight, int nScanWidth, int nScanHeight,int* R, int* G,int* B)
{
	ASSERT(lpbyBits32);
	if((*xx>(nScanWidth-1))||(*yy>(nScanHeight-1))) return FALSE;
	int dx,dy,xw,yh,dw,dh,x0,y0;
	int i,j;
	int x,y;
	int r,g,b,rgb;
	int rgbmin=1000;
	x=*xx;
	y=*yy;
	
	DWORD dwWidthBytes=(DWORD)((nWidth*24+31)/32)*4;
	if(*R>-1)
	{
		dx=x-20;
		dy=y-20;
		dw=nWidth-x;
		dh=nHeight-y;
		if(dx<0) { dx=0;x0=x;xw=x+20;}
		else if(dw<20)
		{
			x0=20;xw=dw+20;
		}
		else
		{
			x0=20;xw=40;
		}
		if(dy<0) { dy=0;y0=y;yh=y+20;}
		else if(dh<20) 
		{y0=20;yh=dh+20;}
		else {y0=20;yh=40;}
//		DWORD dwWidthBytes=(DWORD)((nWidth*24+31)/32)*4;
		DWORD dwBaseIndex=dy*dwWidthBytes+3*dx;
		
		int imager0=*R;
		int imageg0=*G;
		int imageb0=*B;

		x=mm_x[1]+mm_x[0];
		y=mm_y[1]+mm_y[0];
		for(i=0;i<yh;i++)
		{
			BYTE* pbyRsc=lpbyBits32+dwBaseIndex;
			for(j=0;j<xw;j++)
			{
				BYTE* pbyBlue=pbyRsc++;
				BYTE* pbyGreen=pbyRsc++;
				BYTE* pbyRed=pbyRsc++;
//				pbyRsc++;

				int r=ABS((int)*pbyRed-(int)(*R));
				int g=ABS((int)*pbyGreen-(int)(*G));
				int b=ABS((int)*pbyBlue-(int)(*B));
				
				if(r==0) r=1;
				if(g==0) g=1;
				if(b==0) b=1;
				rgb=r*g*b+r+g+b;
				
				if(rgb<rgbmin)
				{
					rgbmin=rgb;
					x=j+dx;
					y=i+dy;
				}
			
			}
			dwBaseIndex+=dwWidthBytes;
		}
	}
	else 
	{
		mm_x[0]=x;
		mm_y[0]=y;
	}

	mm_x[1]=x-mm_x[0];
	mm_x[1]=y-mm_y[0];
	mm_x[0]=x;
	mm_y[0]=y;
	dx=x-20;
	dy=y-20;
	dw=nWidth-x;
	dh=nHeight-y;
	if(dx<0) { dx=0;x0=x;xw=x+20;}
	else if(dw<20)
	{
		x0=20;xw=dw+20;
	}
	else
	{
		x0=20;xw=40;
	}
	if(dy<0) { dy=0;y0=y;yh=y+20;}
	else if(dh<20) 
	{y0=20;yh=dh+20;}
	else {y0=20;yh=40;}
	
//	DWORD dwWidthBytes=(DWORD)((nWidth*24+31)/32)*4;
	DWORD dwBaseIndex=dy*dwWidthBytes+3*dx;
	
	for(i=0;i<yh;i++)
	{
		BYTE* pbyRsc=lpbyBits32+dwBaseIndex;
		for(j=0;j<xw;j++)
		{
			BYTE* pbyBlue=pbyRsc++;
			BYTE* pbyGreen=pbyRsc++;
			BYTE* pbyRed=pbyRsc++;
//			pbyRsc++;

			r=*pbyRed;
			g=*pbyGreen;
			b=*pbyBlue;
//			BYTE gray=(BYTE)(((WORD)r*30+(WORD)g*59+(WORD)b*11)/100);

			imagein_r[j][i]=r;
			imagein_g[j][i]=g;
			imagein_b[j][i]=b;
		}
		dwBaseIndex+=dwWidthBytes;
	}

	
	Grow(imagein_r,imagein_g,imagein_b,&x0,&y0,xw,yh,R,G,B);
//	Grow2(imagein_r,imagein_g,imagein_b,&x0,&y0,xw,yh,R,G,B);

	*xx=x0+dx;
	*yy=y0+dy;
	
	dwBaseIndex=dy*dwWidthBytes+3*dx;
	for(i=0;i<yh;i++)
	{
		BYTE* lpby=lpbyBits32+dwBaseIndex;
		for(j=0;j<xw;j++)
		{
			BYTE* pbyBlue=lpby++;
			BYTE* pbyGreen=lpby++;
			BYTE* pbyRed=lpby++;
//			lpby++;

			*pbyBlue=(BYTE)imagein_b[j][i];
			*pbyGreen=(BYTE)imagein_g[j][i];
			*pbyRed=(BYTE)imagein_r[j][i];
//			*pbyBlue=(BYTE)0;
//			*pbyGreen=(BYTE)0;
//			*pbyRed=(BYTE)0;
		}
		dwBaseIndex+=dwWidthBytes;
	}
	return TRUE;
}



void CColorGrow::Grow(int imageinr[][200],int imageing[][200],int imageinb[][200], int* x_x, int* y_y, int w, int h,int* R, int* G, int* B)
{
	int i,j,cnt1,cnt2,cnt3,cnt4;
/*	int xy5r,xy5g,xy5b;
	int xy2r,xy2g,xy2b;
	int xy4r,xy4g,xy4b;
	int xy6r,xy6g,xy6b;
	int xy8r,xy8g,xy8b;*/

	double y0,u0,v0;
	double y5,u5,v5;
//	int y2,u2,v2;
//	int y4,u4,v4;
//	int y6,u6,v6;
//	int y8,u8,v8;
	int s,l,sx,sy;
	int m1,m2,m3,m4,m10,m20,m30,m40;
	double fi,fs,fh;
	cnt1=cnt2=cnt3=cnt4=1;
	s=l=sx=sy=0;
	int x=*x_x;
	int y=*y_y;
	int imager0=imageinr[x][y];
	int imageg0=imageing[x][y];
	int imageb0=imageinb[x][y];

	*R=imager0;
	*G=imageg0;
	*B=imageb0;

	y0=0.3*imager0+0.59*imageg0+0.11*imageb0;
	u0=-0.17*imager0-0.33*imageg0+0.5*imageb0;
	v0=0.5*imager0-0.42*imageg0-0.08*imageb0;

	int max,mix,may,miy;
	max=may=0;
	mix=miy=0;
//	y0=0.3*imageinr[x][y]+0.59*imageing[x][y]+0.11*imageinb[x][y];
//	u0=-0.17*imageinr[x][y]-0.33*imageing[x][y]+0.5*imageinb[x][y];
//	v0=0.5*imageinr[x][y]-0.42*imageing[x][y]-0.08*imageinb[x][y];
	
	
	for(i=1;i<20;i++)
	{
		if(cnt1>0&&i<y)
		{
			s+=cnt1;
			cnt1=0;
			m10=MIN(i,x);
			m1=MIN(i,w-x);
			miy++;
		for(j=-m10;j<m1;j++)
		{
//			xy5r=imageinr[x+j][y-i]-imageinr[x][y];
//			xy5g=imageing[x+j][y-i]-imageing[x][y];
//			xy5b=imageinb[x+j][y-i]-imageinb[x][y];

			y5=0.3*imageinr[x+j][y-i]+0.59*imageing[x+j][y-i]+0.11*imageinb[x+j][y-i];
			u5=-0.17*imageinr[x+j][y-i]-0.33*imageing[x+j][y-i]+0.5*imageinb[x+j][y-i];
			v5=0.5*imageinr[x+j][y-i]-0.42*imageing[x+j][y-i]-0.08*imageinb[x+j][y-i];

//			sum=ABS(0.3*xy5r+0.59*xy5g+0.11*xy5b)*2+ABS(-0.1684*xy5r-0.3316*xy5g+0.5*xy5b)+
//						ABS(0.5*xy5r-0.4187*xy5g-0.0813*xy5b);
			fi=ABS(y5-y0);
			fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
			fh=(int)(100.0*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));
			if(fi<30&&fs<15&&fh<10)
			{
				cnt1++;
//				imageinr[x+j][y-i]=255-imager0;
//				imageing[x+j][y-i]=255-imageg0;
//				imageinb[x+j][y-i]=255-imageb0;

				imageinr[x+j][y-i]=0;
				imageing[x+j][y-i]=0;
				imageinb[x+j][y-i]=0;
				
				sx+=j;
				sy+=-i;
//				if(j<mix) mix=j;
//				if(j>max) max=j;
//				if(i<miy) miy=-i;
//				if(i>may) may=-i;
			}
/*			else 
			{
				xy2r=imageinr[x+j][y-i-1]-imageinr[x][y];
				xy2g=imageing[x+j][y-i-1]-imageing[x][y];
				xy2b=imageinb[x+j][y-i-1]-imageinb[x][y];

				xy4r=imageinr[x+j-1][y-i]-imageinr[x][y];
				xy4g=imageing[x+j-1][y-i]-imageing[x][y];
				xy4b=imageinb[x+j-1][y-i]-imageinb[x][y];

				xy6r=imageinr[x+j+1][y-i]-imageinr[x][y];
				xy6g=imageing[x+j+1][y-i]-imageing[x][y];
				xy6b=imageinb[x+j+1][y-i]-imageinb[x][y];

				xy8r=imageinr[x+j][y-i+1]-imageinr[x][y];
				xy8g=imageing[x+j][y-i+1]-imageing[x][y];
				xy8b=imageinb[x+j][y-i+1]-imageinb[x][y];

				sum=ABS(0.3*xy2r+0.59*xy2g+0.11*xy2b)*2+ABS(-0.1684*xy2r-0.3316*xy2g+0.5*xy2b)+ABS(0.5*xy2r-0.4187*xy2g-0.0813*xy2b)+
					ABS(0.3*xy4r+0.59*xy4g+0.11*xy4b)*2+ABS(-0.1684*xy4r-0.3316*xy4g+0.5*xy4b)+ABS(0.5*xy4r-0.4187*xy4g-0.0813*xy4b)+
					ABS(0.3*xy6r+0.59*xy6g+0.11*xy6b)*2+ABS(-0.1684*xy6r-0.3316*xy6g+0.5*xy6b)+ABS(0.5*xy6r-0.4187*xy6g-0.0813*xy6b)+
					ABS(0.3*xy8r+0.59*xy8g+0.11*xy8b)*2+ABS(-0.1684*xy8r-0.3316*xy8g+0.5*xy8b)+ABS(0.5*xy8r-0.4187*xy8g-0.0813*xy8b);

					if(sum<240)
					{
						imageinr[x+j][y-i]=0;
						imageing[x+j][y-i]=255;
						imageinb[x+j][y-i]=0;
						l++;
					}

			}*/
		}
		}

		if(cnt2>0&&i<w-x)
		{
			s+=cnt2;
			cnt2=0;
			m20=MIN(i,y);
			m2=MIN(i,h-y);
			max++;
		for(j=-m20;j<m2;j++)
		{			
//			xy5r=imageinr[x+i][y+j]-imageinr[x][y];
//			xy5g=imageing[x+i][y+j]-imageing[x][y];
//			xy5b=imageinb[x+i][y+j]-imageinb[x][y];

			y5=0.3*imageinr[x+i][y+j]+0.59*imageing[x+i][y+j]+0.11*imageinb[x+i][y+j];
			u5=-0.17*imageinr[x+i][y+j]-0.33*imageing[x+i][y+j]+0.5*imageinb[x+i][y+j];
			v5=0.5*imageinr[x+i][y+j]-0.42*imageing[x+i][y+j]-0.08*imageinb[x+i][y+j];

			fi=ABS(y5-y0);
			fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
			fh=(int)(100*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));

//			sum=ABS(0.3*xy5r+0.59*xy5g+0.11*xy5b)*2+ABS(-0.1684*xy5r-0.3316*xy5g+0.5*xy5b)+
//						ABS(0.5*xy5r-0.4187*xy5g-0.0813*xy5b);
			if(fi<30&&fs<15&&fh<10)
			{
				cnt2++;
//				imageinr[x+i][y+j]=255-imager0;
//				imageing[x+i][y+j]=255-imageg0;
//				imageinb[x+i][y+j]=255-imageb0;

				imageinr[x+i][y+j]=0;
				imageing[x+i][y+j]=0;
				imageinb[x+i][y+j]=0;

				sx+=i;
				sy+=j;

/*				if(j<mix) mix=i;
				if(j>max) max=i;
				if(i<miy) miy=j;
				if(i>may) may=j;*/
			}
/*			else 
			{
				
				xy2r=imageinr[x+i][y+j-1]-imageinr[x][y];
				xy2g=imageing[x+i][y+j-1]-imageing[x][y];
				xy2b=imageinb[x+i][y+j-1]-imageinb[x][y];

				xy4r=imageinr[x+i-1][y+j]-imageinr[x][y];
				xy4g=imageing[x+i-1][y+j]-imageing[x][y];
				xy4b=imageinb[x+i-1][y+j]-imageinb[x][y];

				xy6r=imageinr[x+i+1][y+j]-imageinr[x][y];
				xy6g=imageing[x+i+1][y+j]-imageing[x][y];
				xy6b=imageinb[x+i+1][y+j]-imageinb[x][y];

				xy8r=imageinr[x+i][y+j+1]-imageinr[x][y];
				xy8g=imageing[x+i][y+j+1]-imageing[x][y];
				xy8b=imageinb[x+i][y+j+1]-imageinb[x][y];

				sum=ABS(0.3*xy2r+0.59*xy2g+0.11*xy2b)*2+ABS(-0.1684*xy2r-0.3316*xy2g+0.5*xy2b)+ABS(0.5*xy2r-0.4187*xy2g-0.0813*xy2b)+
					ABS(0.3*xy4r+0.59*xy4g+0.11*xy4b)*2+ABS(-0.1684*xy4r-0.3316*xy4g+0.5*xy4b)+ABS(0.5*xy4r-0.4187*xy4g-0.0813*xy4b)+
					ABS(0.3*xy6r+0.59*xy6g+0.11*xy6b)*2+ABS(-0.1684*xy6r-0.3316*xy6g+0.5*xy6b)+ABS(0.5*xy6r-0.4187*xy6g-0.0813*xy6b)+
					ABS(0.3*xy8r+0.59*xy8g+0.11*xy8b)*2+ABS(-0.1684*xy8r-0.3316*xy8g+0.5*xy8b)+ABS(0.5*xy8r-0.4187*xy8g-0.0813*xy8b);

					if(sum<240)
					{
						imageinr[x+i][y+j]=0;
						imageing[x+i][y+j]=255;
						imageinb[x+i][y+j]=0;
						l++;
					}

			}*/
		}
		
		}

		if(cnt3>0&&i<h-y)
		{
			s+=cnt3;
			cnt3=0;
			m30=MIN(i,w-x);
			m3=MIN(i,x);
			may++;
		for(j=m30;j>-m3;j--)
		{
			
//			xy5r=imageinr[x+j][y+i]-imageinr[x][y];
//			xy5g=imageing[x+j][y+i]-imageing[x][y];
//			xy5b=imageinb[x+j][y+i]-imageinb[x][y];

			y5=0.3*imageinr[x+j][y+i]+0.59*imageing[x+j][y+i]+0.11*imageinb[x+j][y+i];
			u5=-0.17*imageinr[x+j][y+i]-0.33*imageing[x+j][y+i]+0.5*imageinb[x+j][y+i];
			v5=0.5*imageinr[x+j][y+i]-0.42*imageing[x+j][y+i]-0.08*imageinb[x+j][y+i];
			fi=ABS(y5-y0);
			fs=ABS(sqrt(u5*u5+v5*v5)-sqrt(u0*u0+v0*v0));
			fh=(int)(100*ABS((u5*v0-v5*u0)/(u5*u0+v5*v0)));

//			sum=ABS(0.3*xy5r+0.59*xy5g+0.11*xy5b)*2+ABS(-0.1684*xy5r-0.3316*xy5g+0.5*xy5b)+
//						ABS(0.5*xy5r-0.4187*xy5g-0.0813*xy5b);
			if(fi<30&&fs<15&&fh<10)
			{
				cnt3++;
//				imageinr[x+j][y+i]=255-imager0;
//				imageing[x+j][y+i]=255-imageg0;
//				imageinb[x+j][y+i]=255-imageb0;

				imageinr[x+j][y+i]=0;
				imageing[x+j][y+i]=0;
				imageinb[x+j][y+i]=0;

				sx+=j;
				sy+=i;

/*				if(j<mix) mix=j;
				if(j>max) max=j;
				if(i<miy) miy=i;
				if(i>may) may=i;*/
			}
/*			else 
			{				
				xy2r=imageinr[x+j][y+i-1]-imageinr[x][y];
				xy2g=imageing[x+j][y+i-1]-imageing[x][y];
				xy2b=imageinb[x+j][y+i-1]-imageinb[x][y];

				xy4r=imageinr[x+j-1][y+i]-imageinr[x][y];
				xy4g=imageing[x+j-1][y+i]-imageing[x][y];
				xy4b=imageinb[x+j-1][y+i]-imageinb[x][y];

				xy6r=imageinr[x+j+1][y+i]-imageinr[x][y];

⌨️ 快捷键说明

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