📄 process_gaode.c
字号:
#include "math.h"
#include "../target.h"
#define threnum 28001
#define halfthrenum 14000
#define CROSSSIZE 12
#define RECTSIZE 6
#pragma DATA_SECTION(str,"STORE_IN_IRAM");
short str[threnum];
#pragma DATA_SECTION(table,"STORE_IN_IRAM");
static unsigned short table[threnum];
#define SIZE 11 //模板大小为5
#define HALFSIZE 6
//根据输入原始图像,统计直方图,寻找分割门限及max,min
void findthrehold(short *image, int Row, int Col,short *max,short *min,short *threhold)
{
int i,j;
short temp;
for(i=0;i<threnum;i++)
str[i] = 0;
for(i=5;i<Row-5;i++) {
for(j=5;j<Col-5;j++) {
temp = image[i*Col+j];
if(temp > halfthrenum ) temp = halfthrenum;
if(temp < -halfthrenum) temp = -halfthrenum;
str[temp + halfthrenum]++;
}
}
temp = 0;
for( i=threnum-1;i>=0;i--)
{
temp += str[i];
if(temp >3000)
break;
}
*threhold = i-halfthrenum;
//统计%5低灰度值
temp = 0;
for( i=0; i<threnum;i++)
{
temp += str[i];
if(temp > 100) break;
}
*min = i-halfthrenum;
//统计%5高灰度值
temp = 0;
for( i=threnum-1;i>=0;i--)
{
temp += str[i];
if(temp > 500) break;
}
*max = i-halfthrenum;
}
void display(short *raw_img,unsigned short *result_img,short max,short min,int Row, int Col,int gray)
{
int i,j,data;
int gene;
float value;
value = (float)gray;
gene = (int)(value*64/(max-min));
//生成动态归一化结果表
for(i=-halfthrenum;i<= min;i++) table[i+halfthrenum] = 0;
for(i=min+1;i<max;i++)
{
data = ((i-min)*gene)>>6;
if(data>255) table[i+halfthrenum]= gray;
if(data<0) table[i+halfthrenum]= 0;
table[i+halfthrenum]= data;
}
for(i=max;i<= halfthrenum;i++) table[i+halfthrenum] = gray;
//查表得出相应灰度值的动态归一化结果
for(j=0;j<Row*Col;j++)
{
data = raw_img[j];
if(data>max) data = max;
if(data<min) data = min;
result_img[j] =(table[data+halfthrenum]);
}
}
void AddCross(unsigned short *pImgdata, int row, int col, int x, int y)
{
int i,x1,x2,y1,y2;
int start, end;
start = (x>=CROSSSIZE)? (x-CROSSSIZE):0;
end = (x<(col-CROSSSIZE))? (x+CROSSSIZE): col;
for(i = start; i<=end; i++)
{
pImgdata[y*col + i] = ~pImgdata[y*col + i];
}
start = (y>=CROSSSIZE)? (y-CROSSSIZE):0;
end = (y<(row-CROSSSIZE))? (y+CROSSSIZE):row;
for(i = start; i<=end; i++)
{
pImgdata[i*col + x ] = ~pImgdata[i*col + x ];
}
start = (x>=RECTSIZE)?(x-RECTSIZE):0;
end = (x<(col-RECTSIZE))? (x+RECTSIZE): col;
y1 = y + RECTSIZE;
y2 = y - RECTSIZE;
for(i = start; i<=end; i++)
{
if((x-i)>1||(i-x)>1)
{
pImgdata[y1*col + i] = ~pImgdata[y1*col + i];
pImgdata[y2*col + i] = ~pImgdata[y2*col + i];
}
}
start = (y>=RECTSIZE)? (y-RECTSIZE):0;
end = (y<(row-RECTSIZE))? (y+RECTSIZE):row;
x1 = x + RECTSIZE;
x2 = x - RECTSIZE;
for(i = start; i<=end; i++)
{
if((y-i)>1||(i-y)>1)
{
pImgdata[i*col + x1 ] = ~pImgdata[i*col + x1 ];
pImgdata[i*col + x2 ] = ~pImgdata[i*col + x2 ];
}
}
}
void TransformData(unsigned short *pdata, int size, unsigned char bits)
{
int i;
for(i=1;i<size;i++)
pdata[i] = pdata[i]<<bits;
pdata[0] = pdata[1];
}
void ContiDet1(unsigned short *image, int Row, int Col,unsigned short threhold,volatile target *objtemp)
{
int i,j,px,py;
int miny,minx,maxy,maxx;
int value = 0;
int robjx = 320,robjy = 240;
int incs = 1;
//int flag = 0;
int max = -3000000;
miny = SIZE; maxy = Row-SIZE-5;
minx = SIZE; maxx = Col-SIZE-5;
for (py=miny;py<maxy;py+=incs)
{
for (px=minx;px<maxx;px+=incs)
{
if(image[py*Col+px]>threhold)
{
value = 0;
for (i=-HALFSIZE;i<=HALFSIZE;i++)
{
for (j=-HALFSIZE;j<=HALFSIZE;j++)
{
value += image[(py-i)*Col+px-j];
}
}
if (value > max)
{
max = value;
robjx = px;
robjy = py;
}
}
}
}
objtemp->objx = robjx;
objtemp->objy = robjy;
}
void manhattan(unsigned short *result_img,int Row, int Col,int *pmanhattan)
{
int i,j;
//int temp;
short str[1024];
unsigned int m = 0;
int manhattan_value = 0;
for(i=0;i<1024;i++)
str[i] = 0;
for(i=1;i<Row-5;i++)
{
for(j=1;j<Col-5;j++)
{
str[result_img[i*Col+j]]++;
m += result_img[i*Col+j];
}
}
m = m/73476;
for(i=0;i<1024;i++)
{
manhattan_value += str[i]*abs(i-m);
}
//*pmanhattan = manhattan_value/73476;
*pmanhattan = manhattan_value;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -