?? imageprocess.c
字號(hào):
//*************************************************************************
//* *
//* *************************圖像處理函數(shù)*********************** *
//* *
//*************************************************************************
#include "includes.h"
//*************************************************************************
//* *
//* ***********************圖像二值化分割********************** *
//* *
//*************************************************************************
//通過閾值比較對(duì)圖像進(jìn)行二值化分割。
void vImageDivide(void)
{
unsigned char ucRow,ucColumn;
unsigned char *pucTemp;
for(ucColumn=COLUMN_MIN;ucColumn<COLUMN_MAX;ucColumn++)
{
for(ucRow=ROW_MIN;ucRow<ROW_MAX;ucRow++)
{
pucTemp=puca_BufferProcess+ucRow*IMAGE_COLUMN+ucColumn;
if(*pucTemp<2)
*pucTemp=BLACK_POINT;
else
*pucTemp=WHITE_POINT;
}
}
}
//*************************************************************************
//* *
//* ***************************圖像運(yùn)算************************ *
//* *
//*************************************************************************
//通過腐蝕膨脹運(yùn)算濾除噪聲,提取出圖像的基本特征。
void vImageCalculate(void)
{
unsigned char ucRow,ucColumn;
unsigned char *pucTemp;
//*************************************************************************
//膨脹運(yùn)算,對(duì)于每一列,如果一個(gè)白點(diǎn)的兩側(cè)為黑點(diǎn)則認(rèn)為改點(diǎn)為黑點(diǎn)。
for(ucColumn=COLUMN_MIN;ucColumn<COLUMN_MAX;ucColumn++)
{
for(ucRow=ROW_MIN+1;ucRow<ROW_MAX-3;ucRow++)
{
pucTemp=puca_BufferProcess+ucRow*IMAGE_COLUMN+ucColumn;
if(*pucTemp==WHITE_POINT)
{
if((*(pucTemp-IMAGE_COLUMN)==BLACK_POINT)
&&(*(pucTemp+IMAGE_COLUMN)==BLACK_POINT))
{
*pucTemp=BLACK_POINT;
ucRow++;
}
}
}
}
//*************************************************************************
//腐蝕運(yùn)算,對(duì)于每一列,如果一個(gè)黑點(diǎn)的兩側(cè)為白點(diǎn)則認(rèn)為改點(diǎn)為白點(diǎn)。
for(ucColumn=COLUMN_MIN;ucColumn<COLUMN_MAX;ucColumn++)
{
for(ucRow=ROW_MIN+1;ucRow<ROW_MAX-3;ucRow++)
{
pucTemp=puca_BufferProcess+ucRow*IMAGE_COLUMN+ucColumn;
if(*pucTemp==BLACK_POINT)
{
if((*(pucTemp-IMAGE_COLUMN)==WHITE_POINT)
&&(*(pucTemp+IMAGE_COLUMN)==WHITE_POINT))
{
*pucTemp=WHITE_POINT;
ucRow++;
}
}
}
}
}
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#define VIDEO_CENTER 42 //攝像頭中心位置參考
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
signed char sc_CenterEx=0; //黑線中心坐標(biāo)偏移
signed char sc_CenterExLast=0;
signed char sc_NearEx=0; //黑線中心坐標(biāo)偏移
signed char sc_NearExLast=0;
signed char sc_FarEx=0; //黑線中心坐標(biāo)偏移
signed char sc_FarExLast=0;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//檢測結(jié)果正誤標(biāo)志,如果為零則正確,如果大于零則錯(cuò)誤。
unsigned char uc_ErrorFlag=CORRECT;
//************************************************************************
//* *
//* ********************計(jì)算中心線坐標(biāo)************************ *
//* *
//************************************************************************
void vGetCenter(void)
{
unsigned char ucRow,ucColumn,ucCount;
unsigned char *pucTemp;
unsigned int uiSum;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//遠(yuǎn)處黑線坐標(biāo)中心值。
uiSum=0;
ucCount=0;
for(ucColumn=COLUMN_MIN;ucColumn<COLUMN_MAX-8;ucColumn++)
{
for(ucRow=ROW_MIN;ucRow<ROW_MAX;ucRow++)
{
pucTemp=puca_BufferProcess+ucRow*IMAGE_COLUMN+ucColumn;
if(*pucTemp==BLACK_POINT)
{
uiSum+=ucRow;
ucCount++;
}
}
}
if(ucCount>12)
{
sc_FarEx=(unsigned char)(uiSum/ucCount)-VIDEO_CENTER;
if((sc_FarEx-sc_FarExLast)<25&&(sc_FarEx-sc_FarExLast)>-25)
sc_FarExLast=sc_FarEx;
else
sc_FarEx=sc_FarExLast;
}
else
sc_FarEx=sc_FarExLast;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//中間黑線坐標(biāo)中心值。
uiSum=0;
ucCount=0;
for(ucColumn=COLUMN_MIN+3;ucColumn<COLUMN_MAX-5;ucColumn++)
{
for(ucRow=ROW_MIN;ucRow<ROW_MAX;ucRow++)
{
pucTemp=puca_BufferProcess+ucRow*IMAGE_COLUMN+ucColumn;
if(*pucTemp==BLACK_POINT)
{
uiSum+=ucRow;
ucCount++;
}
}
}
if(ucCount>12)
{
sc_CenterEx=(unsigned char)(uiSum/ucCount)-VIDEO_CENTER;
if((sc_CenterEx-sc_CenterExLast)<25&&(sc_CenterEx-sc_CenterExLast)>-25)
sc_CenterExLast=sc_CenterEx;
else
sc_CenterEx=sc_CenterExLast;
}
else
sc_CenterEx=sc_CenterExLast;
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//近處黑線坐標(biāo)中心值。
uiSum=0;
ucCount=0;
for(ucColumn=COLUMN_MIN+8;ucColumn<COLUMN_MAX;ucColumn++)
{
for(ucRow=ROW_MIN;ucRow<ROW_MAX;ucRow++)
{
pucTemp=puca_BufferProcess+ucRow*IMAGE_COLUMN+ucColumn;
if(*pucTemp==BLACK_POINT)
{
uiSum+=ucRow;
ucCount++;
}
}
}
if(ucCount>12)
{
sc_NearEx=(unsigned char)(uiSum/ucCount)-VIDEO_CENTER;
if((sc_NearEx-sc_NearExLast)<25&&(sc_NearEx-sc_NearExLast)>-25)
sc_NearExLast=sc_NearEx;
else
sc_NearEx=sc_NearExLast;
}
else
sc_NearEx=sc_NearExLast;
// sc_CenterEx=(signed char)((sc_CenterEx+sc_FarEx+sc_NearEx)/3);
}
//*************************************************************************
//* *
//* **********************圖像處理主函數(shù)*********************** *
//* *
//*************************************************************************
void vImageProcess(void)
{
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<圖像二值化分割>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//通過閾值比較對(duì)圖像進(jìn)行二值化分割。
vImageDivide();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<圖像運(yùn)算>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//濾除噪聲。
vImageCalculate();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<計(jì)算黑點(diǎn)區(qū)域>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//根據(jù)二值化后的圖像,從中分辨出正確的黑線,交叉線和起跑線。
// vGetDomain();
//<<<<<<<<<<<<<<<<<<<<<<<<<<<計(jì)算中心線坐標(biāo)>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//根據(jù)二值化后的圖像數(shù)據(jù)計(jì)算中心線位置。
vGetCenter();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -