📄 omnivision.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 + -