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

📄 basevision.cpp

📁 比赛足球机器人系统中的DCT追球程序
💻 CPP
字号:
/*
* Copyright (c) 2005-2006,华南理工大学机器人实验室
* All rights reserved.
* 
* 文件名称:BaseVision.cpp
* 文件标识:
* 摘    要:视觉处理基类的实现
* 
* 当前版本:1.0
* 作    者:孙广成
* 完成日期:
*
* 取代版本:
* 作    者:
* 完成日期:
*/


#include "StdAfx.h"
#include ".\basevision.h"

CBaseVision::CBaseVision(void)
{
	ZERO(h_class);
	ZERO(i_class);
	ZERO(s_class);

	ZERO(colors);

	pMap = NULL;
}

CBaseVision::~CBaseVision(void)
{
	clear();
}
/**
*初始化变量,指针赋值为空
*/
bool CBaseVision::initialize(char* filename,int nwidth,int nheight){
	if(!readConfigFile(filename))
		return false;

	width = nwidth;
	height = nheight;

	if(pMap)
		delete pMap;

	pMap = new BYTE[width * height + 1];
	if(pMap==NULL) 
		return false;

	return true;
}

/**
*设置阀值,ColorLimit有3(0-2)套阀值,viewID制定使用哪一套
*/
bool  CBaseVision::setThreshold (ColorLimit *pViewColorLimit, int viewID){
	color_info *c;
	BYTE k;

	for ( int j=0; j<8; j++ )
	{

		//移位
		c = &colors[j];
		k = 1 << (BYTE)j;

		c->h_low = pViewColorLimit->limit[viewID][j].m_Hmin;  
		c->h_high = pViewColorLimit->limit[viewID][j].m_Hmax;
		c->s_low =  pViewColorLimit->limit[viewID][j].m_Smin;
		c->s_high = pViewColorLimit->limit[viewID][j].m_Smax;
		c->i_low = pViewColorLimit->limit[viewID][j].m_Imin; 
		c->i_high = pViewColorLimit->limit[viewID][j].m_Imax;
		int a ;

		//set h class
		//如果j == 0 那就说明设置第一位也就是红色,红色要特殊对待,详细请参见hsi颜色空间模型
		if(j == 0) 
		{ //red color
			for( a =0;a<H_COLOR_LEVELS; a++ )
			{
				if( (a <= pViewColorLimit->limit[viewID][j].m_Hmin) || (a >= pViewColorLimit->limit[viewID][j].m_Hmax))
					h_class[a] |= k;  //设1
				else
					h_class[a] &= ~k;  //清0
			}
		}
		else  
		{//other color
			for ( a=0; a<H_COLOR_LEVELS; a++ ) 
			{
				if( (a >= pViewColorLimit->limit[viewID][j].m_Hmin) && (a <= pViewColorLimit->limit[viewID][j].m_Hmax))
					h_class[a] |= k;  //设1	
				else
					h_class[a]  &= ~k;  //清0 
			}
		}

		//set s class
		for ( a=0; a<S_COLOR_LEVELS; a++ ) 
		{
			if( (a >= pViewColorLimit->limit[viewID][j].m_Smin) && (a <= pViewColorLimit->limit[viewID][j].m_Smax) )
				s_class[a] |= k;   //设1		
			else
				s_class[a] &= ~k;  //清0
		}

		//set i class
		for( a=0; a<I_COLOR_LEVELS; a++ )
		{
			if( (a >= pViewColorLimit->limit[viewID][j].m_Imin) && (a <= pViewColorLimit->limit[viewID][j].m_Imax) )
				i_class[a] |= k;  //设1 
			else
				i_class[a] &= ~k;  //清0
		}
	}
	return true;
}



BYTE* CBaseVision::getMap(){
	return pMap;
}


/**
*输入图像buffer,输出使用8通道颜色编码的map
*/
void CBaseVision::classifyColorUsingHSI(BYTE *pBuffer, BYTE *map){
	if(pBuffer==NULL || map==NULL){
		cout<<"pbuffer或map指针为空"<<endl;
		return;
	}

	BYTE *hclas = h_class; 
	BYTE *sclas = s_class; 
	BYTE *iclas = i_class;

	BYTE r,g,b;
	short h,s,i;
	long index;
	long temp;


	for(int y=0; y<height; y++)
	{
		for(int x=0; x<width; x++) 
		{
			temp=y*width+x;				   
			index= ((height-y-1)*width+x) * 3;
			b = pBuffer[index];
			g = pBuffer[index+1];
			r = pBuffer[index+2];

			if((r==g)&&(r==b)) {// rgb=(0 0 0) 或者 r=g=b
				map[temp]=(r<128)?32:16; //根据亮度来判断是黑色还是白色
			}
			else {
				RGB2HSI(r,g,b,&h,&s,&i);
				map[temp] = hclas[h] & sclas[s] & iclas[i];				   
			}

		}

	}
}

/**
*做清除工作
*/
void CBaseVision::clear(){
	ZERO(h_class);
	ZERO(i_class);
	ZERO(s_class);

	ZERO(colors);

	if(pMap!=NULL){
		delete []pMap;
		pMap=NULL;
	}
}

bool CBaseVision::readConfigFile(const char* filename){
	return true;
}

⌨️ 快捷键说明

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