登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
51单片机论坛
›
看不懂的图象处理程序
更新自动建库工具PCB Footprint Expert 2024.04 Pro / Library Expert 破解版
看不懂的图象处理程序
[复制链接]
1174
0
ad***
管理员
发表于 2012-9-3 02:24:54
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
这是一个图象处理函数的一部分,图象是由摄像头采集,然后每帧图象分为几十行,这是对每一行的处理,我就看不太懂那,为什么要这么减,怎么判断什么黑线白线什么的,请高手给我指点一下!
/*********** 数据处理,每行处理一次 ***************************************/
void frame_data_process(void)
{
xuint8 p=0;
xint16 delta[Pixel_Num], pos=-route_center;
static xint16 pos_last=0, pos_last_last=0;
xuint8 j=0;
static xuint8 begin_valid=0; /* 起始若干行有效性判断 */
static xint16 begin_pos_last=0;
static xint16 slope_last=0, slope=0, slope_last_last=0; /* 斜率 */
static xuint8 slope_invalid=2; /* 斜率有效性,0时为有效 */
static xint16 width_last;
#define EDGE_LINE 42 /* 此行开始采用边沿定黑线 */
static xint8 edge_valid=0;
static xint8 last_line_invalid=0; /* 1:上一行为无效行 */
static xint16 frame_max, frame_min;
volatile xint16 position=0;
xint16 frame_slope=0;
/************* s-curve identification use ************************/
static xuint8 s_cnt=0;
#define S_CNT_VALVE 8
static xuint8 s_iden1=0, s_iden2=0;
static xint8 s_slope_now, s_slope_last;
static xint8 s_slope1; /* slope of the first part of S-Curve */
/********** changeable Valve *************************************/
xint8 D_slope_val=40; /* 斜率的变化率 or 斜率的导数 or 二阶导数 */
/*********** starting line identification use ************************/
static xint8 start_line_cnt=2;
/**********************************************************************/
if(line_num<20)
D_slope_val=40;
else
D_slope_val=60;
if(line_num==0)
{
begin_valid=0;
slope_invalid=2;
slope_last=0;
edge_valid=0;
last_line_invalid=0;
start_line_cnt=2;
}
if(line_num>EDGE_LINE)
edge_valid=1;
for(p=0;p<Pixel_Num-1;p++)
{
if((Frame_Data[line_num][p+1]==0)&&(begin_valid==0)) /* 起始无效行检测 */
{
begin_valid=0;
if(line_num==25)
Predict_invalid_cnt=25;
else if(line_num>30)
Predict_invalid_cnt++;
break;
}
if(Frame_Data[line_num][p]<Frame_Data[line_num][p+1]) /* 计算脉冲宽度 */
delta[p]=Frame_Data[line_num][p+1]-Frame_Data[line_num][p];
else
delta[p]=65536-Frame_Data[line_num][p]+Frame_Data[line_num][p+1];
slope = pos - pos_last + min(266,abs(delta[p]/2));
if(edge_valid == 1) /* 边沿检测时,不能用宽度 */
slope = pos - pos_last + 10;
if(p>=1 &&
(((delta[p]>27) && (delta[p]<266)) || edge_valid) && /* 线宽检验 */
((abs(slope)<150) || !line_num || !begin_valid) && /* 位置跳变检验 133 */
((abs(delta[p]-width_last)<75) || !line_num || !begin_valid || edge_valid) && /* 宽度不能跳变 50 */
((abs(pos+delta[p]/2-begin_pos_last)<266) || begin_valid || edge_valid || 1) && /* 起始端位置不能跳变 */
((abs(slope-slope_last)<D_slope_val) || (slope_invalid) || edge_valid) /* 斜率不能跳变 50 */
)
{
if(edge_valid==1) /* 只检测边沿时,其线宽给定 */
delta[p]=20;
Frame_Data_Processed[line_num][0] = pos + delta[p]/2;
Frame_Data_Processed[line_num][1] = delta[p];
if(begin_valid==0)
begin_pos_last = Frame_Data_Processed[line_num][0];
begin_valid=1;
if(slope_invalid>0)
slope_invalid--;
if(last_line_invalid==0)
{
slope_last_last = slope_last;
slope_last = slope;
}
last_line_invalid = 0;
break;
}
else if(p==(Pixel_Num - 2) && (line_num > 0)) /* 无效处理 */
{
Frame_Data_Processed[line_num][0] = pos_last_last + 2 * sign(slope_last_last) * min(50,abs(slope_last_last)); /* 20 */
Frame_Data_Processed[line_num][1] = Frame_Data_Processed[line_num-1][1];
last_line_invalid = 1;
if(line_num<=50)
Predict_invalid_cnt++;
}
pos += delta[p];
}
/**********************************************************************************/
#define FRAME_POS_MAX 1000
/* 饱和区 */
if(Frame_Data_Processed[line_num][0] > FRAME_POS_MAX)
Frame_Data_Processed[line_num][0] = -FRAME_POS_MAX;
if(Frame_Data_Processed[line_num][0] < -FRAME_POS_MAX)
Frame_Data_Processed[line_num][0] = -FRAME_POS_MAX;
pos_last_last = pos_last;
pos_last = Frame_Data_Processed[line_num][0];
width_last = Frame_Data_Processed[line_num][1];
/************** starting line identification *******************************/
if((p>=2) && line_num<=25 && Predict_invalid_cnt<=8)
{
if((delta[p]>40) && (delta[p]<200) && /* 黑线宽度 */
(delta[p-1]>20) && (delta[p-1]<200) && /* 白线宽度 */
(delta[p-2]>100) && (delta[p-2]<400) && /* 黑线宽度 */
(delta[p]>delta[p-1]) && /* 白缝比黑线窄 */
abs(delta[p]-delta[p-1])<abs(delta[p])/2 /* 黑线白缝宽度差 */
)
start_line_cnt--;
else
start_line_cnt=2;
}
else
start_line_cnt=2;
if(start_line_cnt==0)
{
start_line_cnt=2;
start_flag=1;
}
/*********** rudder control ***********************************/
if(line_num == 38)
{
position = Get_position();
frame_slope=Frame_Data_Processed[frame_slope_line_4][0]-Frame_Data_Processed[frame_slope_line_2][0]+Frame_Data_Processed[frame_slope_line_3][0]-Frame_Data_Processed[frame_slope_line_1][0];
#if record
position_temp[PULSE_CNT-frame_num]=position;
g_rudder_set_angle_p(position,frame_slope);
#else
g_rudder_set_angle_p(position,frame_slope);
#endif
}
/****************** Frame Amplitude calc ************************************/
if(line_num == 0)
{
frame_max = -700;
frame_min = 700;
Frame_Amp = 0;
}
if(line_num < Frame_Amp_Line_End)
{
if(Frame_Data_Processed[line_num][0] > frame_max)
frame_max = Frame_Data_Processed[line_num][0];
if(Frame_Data_Processed[line_num][0] < frame_min)
frame_min = Frame_Data_Processed[line_num][0];
}
else if(line_num == Frame_Amp_Line_End)
Frame_Amp = frame_max - frame_min;
/************* s-curve identification *********************************/
if(line_num == 0)
{
s_slope_last = 0;
s_cnt = 0;
s_iden1 = 0;
s_iden2 = 0;
Route_Status = STRAIGHT;
}
else if(line_num <= 50)
{
s_slope_now = (Frame_Data_Processed[line_num][0] - Frame_Data_Processed[line_num-1][0]);
if(abs(s_slope_now)<3)
s_slope_now = 0;
else
s_slope_now = sign(s_slope_now);
if(s_slope_now != 0)
{
if(s_slope_now == s_slope_last)
s_cnt++;
else
s_cnt = 0;
if(s_cnt>S_CNT_VALVE)
{
if(s_iden1 == 0)
{
s_iden1 = 1;
s_slope1 = s_slope_now;
}
else if(s_slope_now != s_slope1)
s_iden2 = 1;
}
s_slope_last = s_slope_now;
}
if(s_iden2 == 1)
Route_Status = S_CURVE;
}
/****************************************************************************/
}
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
抗干扰LED数码管显示屏驱动芯片/3线串行接
VK1Q68D是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片。内部集成有3线
抗干扰能力强/点阵数显LED屏驱动/数码管驱
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串
可支持14×4的点阵LED显示面板数码管LED驱
VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁 存
数显驱动器原厂-数显LED显示驱动芯片VK1620
VK1620B是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、 数据锁
抗干扰数显驱动数码管LED驱动芯片VK1618 SO
产品品牌:永嘉微电/VINKA 产品型号:VK1618 封装形式:SOP18/DIP18 概述 VK161
更多
精华推荐
抗干扰LED数码管显示屏驱动芯片/3线串行接
抗干扰能力强/点阵数显LED屏驱动/数码管驱
可支持14×4的点阵LED显示面板数码管LED驱
数显驱动器原厂-数显LED显示驱动芯片VK1620
抗干扰数显驱动数码管LED驱动芯片VK1618 SO
VK1616 SOP16/DIP16点阵LED数显驱动芯片/数
点阵数显驱动芯片/LED数码管显示屏驱动VK16
数显驱动电路LED显示驱动芯片VK1650 SOP16/
更多
社区学堂
抗干扰LED数码管显示屏驱动芯片/3线串
抗干扰能力强/点阵数显LED屏驱动/数码
抗干扰LED数码管显示屏驱动芯片/3线串行接
VK1Q68D是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片。内部集成有3线
抗干扰能力强/点阵数显LED屏驱动/数码管驱
VK1S68C是一种带键盘扫描接口的数码管或点阵LED驱动控制专用芯片,内部集成有3 线串
可支持14×4的点阵LED显示面板数码管LED驱
VK1624是一种数码管或点阵LED驱动控制专用芯片,内部集成有3线串行接口、数据锁 存
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表