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