智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2990|回复: 11
打印 上一主题 下一主题

图像横向矫正和纵向矫正时,单片机跑步过来了,白写了

[复制链接]

22

主题

191

帖子

0

精华

常驻嘉宾

天才

Rank: 8Rank: 8

积分
3615
威望
1795
贡献
1146
兑换币
1173
注册时间
2014-12-13
在线时间
337 小时
毕业学校
南京气象学校
跳转到指定楼层
1#
发表于 2016-4-14 14:31:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/**
* @breif 横向畸变矫正
**/
Status ReviseTransDistortion(unsigned char PicPoint[][CAMERA_W]){
//u->Col v->row M->RowNum
//U = u*(1+(AB/CD-1)*(v/(M-1))) //矫正公式
//x=(CD/(N-1))(u-N/2) //矫正后图像坐标与真实坐标对应关系
float Pro = -0.18; //AB/CD-1
int Loc = 0;

unsigned char PicTemp[CAMERA_H][CAMERA_W] = { 0 };
for (int i = 0; i < CAMERA_H; i++){
  for (int j = 0; j < CAMERA_W; j++){
   PicTemp[i][j] = PicPoint[i][j];
  }
}

for (int i = 0; i < CAMERA_H; i++){
  for (int j = 0; j < CAMERA_W; j++){
   Loc = (int)(j*(1 + (Pro*((float)i / (float)(CAMERA_H - 1)))));
   PicPoint[i][Loc] = PicTemp[i][j];
  }
}
return OK;
}
////////////////////////////////////////////
/**
* @breif 求解二元一次方程
**/
static Status CalLinearEquation(int Point[],float *a,float* b){
//ax+by=e
//cx+dy=f
//x=(de-bf)/(ad-bc)
//y=(af-ce)/(ad-bc)
int PointX_X1 = Point[0] * Point[0];
int PointX_X2 = Point[2] * Point[2];
float denominator = PointX_X1 * Point[2] - Point[0] * PointX_X2;
if (fabs(denominator) < 0.00001) return false;    //垂直于X轴
*a = (Point[2] * Point[1] - Point[0] * Point[3]) / denominator;
*b = (PointX_X1 * Point[3] - PointX_X2 * Point[1]) / denominator;
return OK;
}
////////////////////////////////////////////
/**
* @breif 纵向畸变矫正
**/
Status ReviseLongiDistortion(unsigned char PicPoint[][CAMERA_W]){
//y=vd
float RealY = 260.0f; //260cm
float ActualY = 0.0f;
float a = 0.0, b = 0.0f;
int Point[4] = { 14, 16, 33, 150 };
CalLinearEquation(Point, &a, &b);

unsigned char PicTemp[CAMERA_H][CAMERA_W] = { 0 };
for (int i = 0; i < CAMERA_H; i++){
  for (int j = 0; j < CAMERA_W; j++){
   PicTemp[i][j] = PicPoint[i][j];
  }
}

int LocLoc[CAMERA_H] = { 0 };
for (int i = 0; i < CAMERA_H; i++){
  ActualY = a*(float)(i*i) + b*(float)i;
  float Pro = ActualY / RealY;
  if (Pro < 0)Pro = 0;
  if (Pro > 1)Pro = 1;
  LocLoc[i] = (int)(Pro * (float)(CAMERA_H - 1));
  for (int j = 0; j < CAMERA_W; j++){
   PicPoint[LocLoc[i]][j] = PicTemp[i][j];
  }
}
for (int i = 0; i < CAMERA_H; i++){
  if (LocLoc[i] != LocLoc[i + 1]){
   for (int j = LocLoc[i]+1; j < LocLoc[i + 1]; j++){
    for (int k = 0; k < CAMERA_W; k++){
     PicPoint[j][k] = PicTemp[i][k];
    }
   }
  }
}
return OK;
}
////////////////////////////////////////////
算法献上,已痛哭,耗了一早上,还测了好几个参数

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

22

主题

191

帖子

0

精华

常驻嘉宾

天才

Rank: 8Rank: 8

积分
3615
威望
1795
贡献
1146
兑换币
1173
注册时间
2014-12-13
在线时间
337 小时
毕业学校
南京气象学校
推荐
 楼主| 发表于 2016-4-15 22:03:33 | 只看该作者
miaobrother 发表于 2016-4-15 10:13
因为我把摄像头反着装,所以来一行处理一行,这样采集完一副也就处理完一副了,你这个矫正需要上下行关联 ...

你可以试一试,很好理解
回复 支持 0 反对 1

使用道具 举报

7

主题

177

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2881
威望
1376
贡献
841
兑换币
925
注册时间
2014-10-12
在线时间
332 小时
推荐
发表于 2016-4-14 15:27:57 | 只看该作者
:lol:lol
回复 支持 1 反对 0

使用道具 举报

34

主题

452

帖子

0

精华

杰出人士

Rank: 12Rank: 12Rank: 12

积分
14046

优秀会员奖章活跃会员奖章在线王奖章

威望
6066
贡献
2554
兑换币
4050
注册时间
2013-7-29
在线时间
2713 小时
毕业学校
南京气象学院
2#
发表于 2016-4-14 15:06:13 | 只看该作者
哪有这么用的。。。存个表,然后对提取的线校正。
回复 支持 反对

使用道具 举报

18

主题

339

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4010
威望
1832
贡献
1022
兑换币
1206
注册时间
2013-2-20
在线时间
579 小时
毕业学校
SEU
3#
发表于 2016-4-14 15:17:46 | 只看该作者
咋不拿个广角的镜头试试
回复 支持 反对

使用道具 举报

9

主题

176

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5483
QQ
威望
2705
贡献
1632
兑换币
1725
注册时间
2015-7-29
在线时间
573 小时
毕业学校
5#
发表于 2016-4-14 16:05:46 | 只看该作者
向量表是指的里面的哪些参数?
回复 支持 反对

使用道具 举报

22

主题

191

帖子

0

精华

常驻嘉宾

天才

Rank: 8Rank: 8

积分
3615
威望
1795
贡献
1146
兑换币
1173
注册时间
2014-12-13
在线时间
337 小时
毕业学校
南京气象学校
6#
 楼主| 发表于 2016-4-14 17:41:10 | 只看该作者
9802344 发表于 2016-4-14 16:05
向量表是指的里面的哪些参数?

point(4)测出来的点坐标,用二次函数去描述
回复 支持 反对

使用道具 举报

20

主题

136

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1634
威望
828
贡献
432
兑换币
509
注册时间
2015-10-20
在线时间
187 小时
7#
发表于 2016-4-14 18:08:18 | 只看该作者
如果采集一行 处理一行行么?
回复 支持 反对

使用道具 举报

22

主题

191

帖子

0

精华

常驻嘉宾

天才

Rank: 8Rank: 8

积分
3615
威望
1795
贡献
1146
兑换币
1173
注册时间
2014-12-13
在线时间
337 小时
毕业学校
南京气象学校
8#
 楼主| 发表于 2016-4-14 23:08:39 | 只看该作者
miaobrother 发表于 2016-4-14 18:08
如果采集一行 处理一行行么?

一行数据没有处理的必要,我的图像是因为失真严重了,才想起来用的
回复 支持 反对

使用道具 举报

20

主题

136

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1634
威望
828
贡献
432
兑换币
509
注册时间
2015-10-20
在线时间
187 小时
9#
发表于 2016-4-15 10:13:52 | 只看该作者
shen1994 发表于 2016-4-14 23:08
一行数据没有处理的必要,我的图像是因为失真严重了,才想起来用的

因为我把摄像头反着装,所以来一行处理一行,这样采集完一副也就处理完一副了,你这个矫正需要上下行关联吗
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-11-5 20:48 , Processed in 0.108328 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表