一、前言
逆透视的原理在网上有许多的说明,但是实际可以使用的代码却并不多。
代码并非完全原创,但是这种形式对于初学者会更友好
二、代码说明
1、定义部分
定义输入输出图像尺寸及数组
//输入图片尺寸
#define CAMERA_H 60
#define CAMERA_W 94
//输出图片尺寸
#define OUT_H 60
#define OUT_W 94
uint8 image[CAMERA_H][CAMERA_W]; //原图像
uint8 image_final[OUT_H][OUT_W]; //逆变换图像
double map_square[CAMERA_H][CAMERA_W][2];//现实映射
int map_int[OUT_H][OUT_W][2];//图像映射
2、模型计算部分
此部分用于计算现实与图像之间的映射关系
同一摄像头角度和高度对应的模型完全相同,只需要在主程序开始前计算一次即可
具体的参数调节详见注释
void Calculate(void)//计算逆变换模型 一般放在最早只运算一次 比较费时间 同一摄像头角度以及高度模型完全一样
{
double angle = 0.8;//摄像头俯仰角 必须小于1 摄像头越平值越大
double dep = 3.8;//视点到投影面距离
double prop_j = 1;//上下宽度矫正,大于1
double prop_i = 0;//密度修正系数,大于-1,小于1
double j_large = 1.6;//横向放大倍数
uint8 i_abodon = 7;//上方舍弃的行距离 舍弃行数越多图像前瞻越少,图像也越宽
double hight = 50;//摄像头高度(调节也没有效果,只改变参数坐标)
uint8 i;//图像从上到下行数
uint8 j;//图像从左到右行数
uint8 ii;
//图片坐标
double xg;
double yg;
//原始坐标
double x0;
double y0;
double zt;
double sin_a;
double cos_a;
sin_a = sin(angle);
cos_a = cos(angle);
//初始化摄像头坐标系
for (i=0; i<CAMERA_H; i++)
{
for (j=0; j<CAMERA_W; j++)
{
map_square[i][j][0] = ((float)CAMERA_H/2 - (float)i + 0.5)/10;
map_square[i][j][1] = ((float)j - (float)CAMERA_W/2 + 0.5)/10;
}
}
//横向拉伸(微调)
for (i=0; i<CAMERA_H; i++)
{
for (j=0; j<CAMERA_W; j++)
{