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

📄 areaindex.cpp

📁 通过使机器人进行简单的图像识别
💻 CPP
字号:
#include "stdafx.h"
#include "AreaIndex.h"

// 计算查找表
void CAreaIndex::Calculate(SHSVRGB::INCISECOLOR ic)
{
	SHSVRGB::HSV hsv;
	if (ic.low.H <= ic.top.H)
	{	// 夹角未包含0弧度
		for (unsigned int i= 0; i <= MAX_COLOR; i++)
		{
			SHSVRGB::RGB2HSVEx(i, hsv);

			if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
				((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
				((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
			{
				m_Index[i]= 1;
			}
			else
			{
				m_Index[i]= 0;
			}
		}
	}
	else
	{	// 夹角包含0弧度
		for (unsigned int i= 0; i <= MAX_COLOR; i++)
		{
			SHSVRGB::RGB2HSVEx(i, hsv);

			if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
				((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
				((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
			{
				m_Index[i]= 1;
			}
			else
			{
				m_Index[i]= 0;
			}
		}
	}
}
	
// 计算查找表,加速,不包含0弧度
void CAreaIndex::Calculate4Speed(SHSVRGB::INCISECOLOR ic)
{
	unsigned char cMaxV= ic.top.V * 255;
	unsigned char cMinV= ic.low.V * 255;

	SHSVRGB::HSV hsv;
		
	// 危险的汇编加速--在循环外部进行寄存器迭代
	unsigned char *pc= this->m_Index;
	__asm
	{
		mov edi, pc;
		add edi, MAX_COLOR;
		inc edi;
	}

	__asm
	{
loop_begin:
		mov esi, MAX_COLOR;
		inc esi;
	}
	__asm
	{
loop_again:
		dec esi;
		jz loop_end;
	}
	{
		// 迭代指针
		__asm
		{
			dec edi;
		}
		// RGB2SHSVRGB::HSV
			// 分解颜色
		unsigned char r, g, b;
		__asm
		{
			mov eax, esi;
			mov b, al;
			shr eax, 8;
			mov g, al;
			shr eax, 8;
			mov r, al;
		}
	
			// 找出最大最小值
		unsigned char cmax, cmin;
		__asm
		{	// al ah bl = r g b
			//mov al, r;
			mov ah, g;
			mov bl, b;
		}
		__asm
		{
			// cl ch = cmin cmax
			mov ch, al;
max_cmp_g:
			cmp ch, ah;
			ja max_cmp_b;
			mov ch, ah;		// (r <= g)
max_cmp_b:
			cmp ch, bl;
			ja max_cmp_end;
			mov ch, bl;		// (r <= b)
max_cmp_end:
			mov cmax, ch;
		}
		__asm
		{
			mov cl, al;
min_cmp_g:
			cmp cl, ah;
			jb min_cmp_b;
			mov cl, ah;		// (r >= g)
min_cmp_b:
			cmp cl, bl;
			jb min_cmp_end;
			mov cl, bl;		// (r >= b)
min_cmp_end:
			mov cmin, cl;
		}

		unsigned char submaxmin;
		__asm
		{
			sub ch, cl;
			mov submaxmin, ch;
		}

		if ((cmax < cMinV) || (cmax > cMaxV))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		hsv.S= (float) submaxmin / cmax;
		if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		if (r == cmax) 
			hsv.H = (float)( g - b) / submaxmin;
		else if (g == cmax) 
			hsv.H = 2 + (float)( b - r) / submaxmin;
		else if (b == cmax) 
			hsv.H = 4 + (float)( r - g)/ submaxmin;

		hsv.H *= 60;
		if (hsv.H <= 0)
			hsv.H+= 360;

		if ((hsv.H < ic.low.H) || (hsv.H > ic.top.H))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}
			
		//m_Index[i]= 1;
		__asm
		{
			mov [edi], 1;
			jmp loop_again;
		}
	}
	__asm
	{
loop_end:
	}
	// 特殊点0x00000000计算
	hsv.H= 0;hsv.S= 0;hsv.V= 0;
	if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
		((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
		((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
	{
		m_Index[0]= 1;
	}
	else
	{
		m_Index[0]= 0;
	}
}

// 计算查找表,加速,包含0弧度
void CAreaIndex::Calculate4SpeedEx(SHSVRGB::INCISECOLOR ic)
{
	unsigned char cMaxV= ic.top.V * 255;
	unsigned char cMinV= ic.low.V * 255;

	SHSVRGB::HSV hsv;
		
	// 危险的汇编加速--在循环外部进行寄存器迭代
	unsigned char *pc= this->m_Index;
	__asm
	{
		mov edi, pc;
		add edi, MAX_COLOR;
		inc edi;
	}

	__asm
	{
loop_begin:
		mov esi, MAX_COLOR;
		inc esi;
	}
	__asm
	{
loop_again:
		dec esi;
		jz loop_end;
	}
	{
		// 迭代指针
		__asm
		{
			dec edi;
		}
		// RGB2SHSVRGB::HSV
			// 分解颜色
		unsigned char r, g, b;
		__asm
		{
			mov eax, esi;
			mov b, al;
			shr eax, 8;
			mov g, al;
			shr eax, 8;
			mov r, al;
		}
	
			// 找出最大最小值
		unsigned char cmax, cmin;
		__asm
		{	// al ah bl = r g b
			//mov al, r;
			mov ah, g;
			mov bl, b;
		}
		__asm
		{
			// cl ch = cmin cmax
			mov ch, al;
max_cmp_g:
			cmp ch, ah;
			ja max_cmp_b;
			mov ch, ah;		// (r <= g)
max_cmp_b:
			cmp ch, bl;
			ja max_cmp_end;
			mov ch, bl;		// (r <= b)
max_cmp_end:
			mov cmax, ch;
		}
		__asm
		{
			mov cl, al;
min_cmp_g:
			cmp cl, ah;
			jb min_cmp_b;
			mov cl, ah;		// (r >= g)
min_cmp_b:
			cmp cl, bl;
			jb min_cmp_end;
			mov cl, bl;		// (r >= b)
min_cmp_end:
			mov cmin, cl;
		}

		unsigned char submaxmin;
		__asm
		{
			sub ch, cl;
			mov submaxmin, ch;
		}

		if ((cmax < cMinV) || (cmax > cMaxV))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		hsv.S= (float) submaxmin / cmax;
		if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		if (r == cmax) 
			hsv.H = (float)( g - b) / submaxmin;
		else if (g == cmax) 
			hsv.H = 2 + (float)( b - r) / submaxmin;
		else if (b == cmax) 
			hsv.H = 4 + (float)( r - g)/ submaxmin;

		hsv.H *= 60;
		if (hsv.H <= 0)
			hsv.H+= 360;

		if ((hsv.H < ic.low.H) && (hsv.H > ic.top.H))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}
			
		//m_Index[i]= 1;
		__asm
		{
			mov [edi], 1;
			jmp loop_again;
		}
	}
	__asm
	{
loop_end:
	}
	// 特殊点0x00000000计算
	hsv.H= 0;hsv.S= 0;hsv.V= 0;
	if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
		((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
		((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
	{
		m_Index[0]= 1;
	}
	else
	{
		m_Index[0]= 0;
	}
}
// *************************************************************************
// 计算查找表
void CAreaIndex555::Calculate(SHSVRGB::INCISECOLOR ic)
{
	SHSVRGB::HSV hsv;
	if (ic.low.H <= ic.top.H)
	{	// 夹角未包含0弧度
		for (unsigned int i= 0; i <= MAX_COLOR_555; i++)
		{
			unsigned int c= 0;
			unsigned int r, g, b;

			r= (i & 0x7C00)>>(10-3);
			g= (i & 0x3E0)>>(5-3);
			b= (i & 0x1F)<<3;
			
			c= (r<<16) | (g<<8) | b;

			SHSVRGB::RGB2HSVEx(c, hsv);

			if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
				((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
				((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
			{
				m_Index[i]= 1;
			}
			else
			{
				m_Index[i]= 0;
			}
		}
	}
	else
	{	// 夹角包含0弧度
		for (unsigned int i= 0; i <= MAX_COLOR_555; i++)
		{
			unsigned int c= 0;
			unsigned int r, g, b;

			r= (i & 0x7C00)>>(10-3);
			g= (i & 0x3E0)>>(5-3);
			b= (i & 0x1F)<<3;
			
			c= (r<<16) | (g<<8) | b;

			SHSVRGB::RGB2HSVEx(c, hsv);

			if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
				((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
				((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
			{
				m_Index[i]= 1;
			}
			else
			{
				m_Index[i]= 0;
			}
		}
	}
}
	
// 计算查找表,加速,不包含0弧度
void CAreaIndex555::Calculate4Speed(SHSVRGB::INCISECOLOR ic)
{
	unsigned char cMaxV= ic.top.V * 255;
	unsigned char cMinV= ic.low.V * 255;

	SHSVRGB::HSV hsv;
		
	// 危险的汇编加速--在循环外部进行寄存器迭代
	unsigned char *pc= this->m_Index;
	__asm
	{
		mov edi, pc;
		add edi, MAX_COLOR_555;
		inc edi;
	}

	__asm
	{
loop_begin:
		mov esi, MAX_COLOR_555;
		inc esi;
	}
	__asm
	{
loop_again:
		dec esi;
		jz loop_end;
	}
	{
		// 迭代指针
		__asm
		{
			dec edi;
		}
		// RGB2SHSVRGB::HSV
			// 分解颜色
		unsigned char r, g, b;
		__asm
		{
			mov eax, esi;
			shl eax, 3;
			mov b, al;

			shr eax, 8;
			shl eax, 3;
			mov g, al;

			shr eax, 8;
			shl eax, 3;
			mov r, al;
		}
	
			// 找出最大最小值
		unsigned char cmax, cmin;
		__asm
		{	// al ah bl = r g b
			//mov al, r;
			mov ah, g;
			mov bl, b;
		}
		__asm
		{
			// cl ch = cmin cmax
			mov ch, al;
max_cmp_g:
			cmp ch, ah;
			ja max_cmp_b;
			mov ch, ah;		// (r <= g)
max_cmp_b:
			cmp ch, bl;
			ja max_cmp_end;
			mov ch, bl;		// (r <= b)
max_cmp_end:
			mov cmax, ch;
		}
		__asm
		{
			mov cl, al;
min_cmp_g:
			cmp cl, ah;
			jb min_cmp_b;
			mov cl, ah;		// (r >= g)
min_cmp_b:
			cmp cl, bl;
			jb min_cmp_end;
			mov cl, bl;		// (r >= b)
min_cmp_end:
			mov cmin, cl;
		}

		unsigned char submaxmin;
		__asm
		{
			sub ch, cl;
			mov submaxmin, ch;
		}

		if ((cmax < cMinV) || (cmax > cMaxV))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		hsv.S= (float) submaxmin / cmax;
		if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		if (r == cmax) 
			hsv.H = (float)( g - b) / submaxmin;
		else if (g == cmax) 
			hsv.H = 2 + (float)( b - r) / submaxmin;
		else if (b == cmax) 
			hsv.H = 4 + (float)( r - g)/ submaxmin;

		hsv.H *= 60;
		if (hsv.H <= 0)
			hsv.H+= 360;

		if ((hsv.H < ic.low.H) || (hsv.H > ic.top.H))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}
			
		//m_Index[i]= 1;
		__asm
		{
			mov [edi], 1;
			jmp loop_again;
		}
	}
	__asm
	{
loop_end:
	}
	// 特殊点0x00000000计算
	hsv.H= 0;hsv.S= 0;hsv.V= 0;
	if (((hsv.H >= ic.low.H) && (hsv.H <= ic.top.H)) &&
		((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
		((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
	{
		m_Index[0]= 1;
	}
	else
	{
		m_Index[0]= 0;
	}
}

// 计算查找表,加速,包含0弧度
void CAreaIndex555::Calculate4SpeedEx(SHSVRGB::INCISECOLOR ic)
{
	unsigned char cMaxV= ic.top.V * 255;
	unsigned char cMinV= ic.low.V * 255;

	SHSVRGB::HSV hsv;
		
	// 危险的汇编加速--在循环外部进行寄存器迭代
	unsigned char *pc= this->m_Index;
	__asm
	{
		mov edi, pc;
		add edi, MAX_COLOR_555;
		inc edi;
	}

	__asm
	{
loop_begin:
		mov esi, MAX_COLOR_555;
		inc esi;
	}
	__asm
	{
loop_again:
		dec esi;
		jz loop_end;
	}
	{
		// 迭代指针
		__asm
		{
			dec edi;
		}
		// RGB2SHSVRGB::HSV
			// 分解颜色,将555分解为888
		unsigned char r, g, b;
		__asm
		{
			mov eax, esi;
			shl eax, 3;
			mov b, al;

			shr eax, 8;
			shl eax, 3;
			mov g, al;

			shr eax, 8;
			shl eax, 3;
			mov r, al;
		}
	
			// 找出最大最小值
		unsigned char cmax, cmin;
		__asm
		{	// al ah bl = r g b
			//mov al, r;
			mov ah, g;
			mov bl, b;
		}
		__asm
		{
			// cl ch = cmin cmax
			mov ch, al;
max_cmp_g:
			cmp ch, ah;
			ja max_cmp_b;
			mov ch, ah;		// (r <= g)
max_cmp_b:
			cmp ch, bl;
			ja max_cmp_end;
			mov ch, bl;		// (r <= b)
max_cmp_end:
			mov cmax, ch;
		}
		__asm
		{
			mov cl, al;
min_cmp_g:
			cmp cl, ah;
			jb min_cmp_b;
			mov cl, ah;		// (r >= g)
min_cmp_b:
			cmp cl, bl;
			jb min_cmp_end;
			mov cl, bl;		// (r >= b)
min_cmp_end:
			mov cmin, cl;
		}

		unsigned char submaxmin;
		__asm
		{
			sub ch, cl;
			mov submaxmin, ch;
		}

		if ((cmax < cMinV) || (cmax > cMaxV))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		hsv.S= (float) submaxmin / cmax;
		if ((hsv.S < ic.low.S) || (hsv.S > ic.top.S))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}

		if (r == cmax) 
			hsv.H = (float)( g - b) / submaxmin;
		else if (g == cmax) 
			hsv.H = 2 + (float)( b - r) / submaxmin;
		else if (b == cmax) 
			hsv.H = 4 + (float)( r - g)/ submaxmin;

		hsv.H *= 60;
		if (hsv.H <= 0)
			hsv.H+= 360;

		if ((hsv.H < ic.low.H) && (hsv.H > ic.top.H))
		{
			//m_Index[i]= 0;
			__asm
			{
				mov [edi], 0;
				jmp loop_again;
			}
			//continue;
		}
			
		//m_Index[i]= 1;
		__asm
		{
			mov [edi], 1;
			jmp loop_again;
		}
	}
	__asm
	{
loop_end:
	}
	// 特殊点0x00000000计算
	hsv.H= 0;hsv.S= 0;hsv.V= 0;
	if (((hsv.H >= ic.low.H) || (hsv.H <= ic.top.H)) &&
		((hsv.S >= ic.low.S) && (hsv.S <= ic.top.S)) &&
		((hsv.V >= ic.low.V) && (hsv.V <= ic.top.V)))
	{
		m_Index[0]= 1;
	}
	else
	{
		m_Index[0]= 0;
	}
}

⌨️ 快捷键说明

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