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

📄 omnivision.h

📁 比赛足球机器人系统中的DCT追球程序
💻 H
字号:
#ifndef _OMNI_VISION_H_
#define _OMNI_VISION_H_

#include "BaseVision.h"

#include <vector>
#include <queue>

using namespace::std;


const int RADIUS_SIZE= 360; 
const int MAX_RADIUS_LENGTH= 130; 

const MAX_SECTOR = 6;

const BYTE _RED=1;
const BYTE _YELLOW=2;
const BYTE _BLUE=4;
const BYTE _GREEN=8;
const BYTE _WHITE=16;
const BYTE _BLACKROBOT=32;
const BYTE _PURPLE=64;
const BYTE _AZURY=128;

enum ENUMTranType{ NOTR,YELLOWTR,BLUETR,YBYTR,BYBTR,OBSTACLETR,TEAMCOLORTR,OPPCOLORTR,OTHERTR};

//以图像左上角为坐标原点,x正方向向右,y正方向向下
//x对应column,y对应row
struct Transition{
	int radiusID;//第radiusID条半径上的点,顺时针方向
	int index;//半径上第index个点
	int row ,col;  //转换点的像素的位置
	ENUMTranType enTranType;
	Transition* next;  
	};


struct Sector{
	double centerAngle;//0-359度
	int count;//符合sector要求的半径条数
	int unitAngle;//两条相邻半径的角度差
	int beginAngle;//开始角度
	int endAngle;//结束角度
	int averageImageDistance;
	};

struct PixelPosition{
	int row;//y
	int col;//x
};


class CRectArea{
public:
	PixelPosition leftUp;
	PixelPosition rightDown;
	int redCount;
	PixelPosition center(){
		PixelPosition pos;
		pos.row=(int)(leftUp.row+rightDown.row)/2;
		pos.col=(int)(leftUp.col+rightDown.col)/2;
		return pos;
	}
	int area(){
		return (rightDown.row-leftUp.row+1)*(rightDown.col-leftUp.col+1);
	}
	double density(){
		int a = area()>0?area():1;
		double d=(float)redCount/(float)a;
		return d;
	}
	CRectArea(){
		redCount=0;
	}
};


typedef vector<PixelPosition> XYVector;
typedef queue<PixelPosition> XYQueue;




class COmniVision:public CBaseVision
{
public:
	COmniVision();
	virtual ~COmniVision();

	//重载基类函数
	bool initialize(char* filename,int nwidth,int nheight);

	//实现基类虚函数
	void process(BYTE *pbuffer);

private:

	void findtransition(Transition* array,BYTE* pbuffer);
		
	int encodeSector(Transition* transArray,ENUMTranType colorType, Sector* colorSector,double* conf);

	bool searchBall(XYVector &redVector,BYTE* pbuffer);

	int searchObstacle(Transition* transArray, Sector* obstacleSector,int obst_beginLimit, int obst_sizeLimit, int obst_intervalLimit);

	int searchTeamColor(Transition* transArray, Sector* teammateSector,int tec_beginLimit, int tec_sizeLimit, int tec_intervalLimit);

	bool position2pixel(int radius, int number,int &r ,int &c);

	int position(Sector* sector1, Sector* sector2);

	//重载基类函数
	bool readConfigFile(const char* filename);


	
private:

	Transition transitionArray[RADIUS_SIZE];

	int radiusLength[RADIUS_SIZE];

	XYVector redVector;

	int Window1Size; //5 窗口1的大小
    int Color1Hold; //3 颜色一阀值
    int  Window2Size; //4 窗口2的大小
    int Color2Hold; //颜色2的大小

	int Window3Size;
	int BlueHold;
	int YellowHold;

	int  r_center;
	int  c_center;

	int R ;//黑色镜头的半径

	int sizeLimit;
	int beginLimit;
	int intervalLimit;

	BYTE data[MAX_RADIUS_LENGTH];

	Sector sectorArray[MAX_SECTOR];

	bool isVisited[240][320];


	//used in search ball,read from config
	int min_dis[4];
	int max_dis[4];
	double min_dens[4];
	int min_redpoint[4];
	int max_redpoint[4];
	int min_distance;
	/****************以上正在修改*************************/
public:
	//information will be stored in world model
	 CRectArea ball;
	 int ball_imagex,ball_imagey;
	 double ball_conf;

	 Sector blueSector,yellowSector;
	 double blueSector_conf,yellowSector_conf;

	 //障碍物
	Sector obstacleSector[3];
	double obst_conf[3];

	Transition obstacleTran[RADIUS_SIZE];

	//本队色标
	Sector teammateSector[3];
	double te_conf[3];

	Transition teammateTran[RADIUS_SIZE];

	BYTE teamColor;

	ENUMTranType teamColorTr;


	//机器人边界
	int selfEdge[RADIUS_SIZE];//测量机器人的边缘长度,防止把自己的黑色认为是障碍物

	void initSelfEdge(BYTE* pBuffer);//


	//图像边界
	void initRadiusLength();

	//像素距中心点的距离
	int distance2center(int row,int col); 
};


#endif

⌨️ 快捷键说明

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