#include <stdio.h>
#include <string.h>
#include <math.h>
#include <csl_timer.h>
#include <csl.h>
#include <csl_irq.h>
#include <csl_chip.h>
#include <csl_emifa.h>
#include <stdlib.h>
#pragma DATA_ALIGN (r, 32);
#pragma DATA_SECTION (r, ".img_buf");
#pragma DATA_ALIGN (g, 32);
#pragma DATA_SECTION (g, ".img_buf");
#pragma DATA_ALIGN (b, 8*4);
#pragma DATA_SECTION (b, ".img_buf");
#pragma DATA_ALIGN (Y, 8*4);
#pragma DATA_SECTION (Y, ".img_buf");
#pragma DATA_ALIGN (Cb, 8*4);
#pragma DATA_SECTION (Cb, ".img_buf");
#pragma DATA_ALIGN (Cr, 8*4);
#pragma DATA_SECTION (Cr, ".img_buf");
#pragma DATA_ALIGN (Graydata, 8*4);
#pragma DATA_SECTION (Graydata, ".img_buf");
#pragma DATA_ALIGN (edgedata, 8*4);
#pragma DATA_SECTION (edgedata, ".img_buf");
//unsigned char srcImage[IMAGEWIDTH*IMAGEHEIGHT];//source image
//unsigned char threshImage[IMAGEWIDTH*IMAGEHEIGHT];//image threshed
int r[240*319]={0},g[240*319]={0},b[240*319]={0} ;
int Y[240*319]={0},Cb[240*319]={0},Cr[240*319]={0} ;
int Graydata[240*319]={0} ;
int edgedata[240*319]={0} ;
#define BM 19778 // 位图的标志
//判断是否是位图,在0-1字节
int IsBitMap(FILE *fp)
{
unsigned short s;
fread(&s,1,2,fp);
if(s==BM)
return 1;
else
return 0;
}
//获得图片的宽度,在18-21字节
/*long getWidth(FILE *fp)
{
long width;
fseek(fp,18,SEEK_SET);
fread(&width,1,4,fp);
return width;
}*/
//获得图片的高度 ,在22-25字节
/*long getHeight(FILE *fp)
{
long height;
fseek(fp,22,SEEK_SET);
fread(&height,1,4,fp);
return height;
} */
//获得每个像素的位数,在28-29字节
unsigned short getBit(FILE *fp)
{
unsigned short bit;
fseek(fp,28,SEEK_SET);
fread(&bit,1,2,fp);
return bit;
}
//获得数据的起始位置
unsigned int getOffSet(FILE *fp)
{
unsigned int OffSet;
fseek(fp,10L,SEEK_SET);
fread(&OffSet,1,4,fp);
return OffSet;
}
//获得图像的数据
void getData(FILE* fp,int *r,int *g,int *b,long height,long width)
{
int i, j=0;
unsigned char pix[240*3]={0};
fseek(fp, getOffSet(fp), SEEK_SET); //找到位图的数据区
for(j=height-1;j>=0;j--){
fread(pix, 1, 240*3, fp);
for(i=0;i<width;i++){
*(r+width*j+i)=pix[i*3+2];
*(g+width*j+i)=pix[i*3+1];
*(b+width*j+i)=pix[i*3];
}
}
return;
}
//边缘检测 Sobel算子
void Sobel_Image(int * Graydata,long width,long height,int *edgedata){
int Sobel_X[9] = {-1,0,1,-2,0,2,-1,0,1} ;
int Sobel_Y[9] = {1,2,1,0,0,0,-1,-2,-1} ;
int i,j ;
int Threshold = 90 ;
int temp1=0,temp2=0,temp3=0;
for(i=1;i<height-1;i++){
for(j=1;j<width-1;j++){
temp1 = Sobel_X[0]*(*(Graydata+(i-1)*width+j-1)) + Sobel_X[1]*(*(Graydata+(i-1)*width+j))+Sobel_X[2]*(*(Graydata+(i-1)*width+j+1))+
Sobel_X[3]*(*(Graydata+(i)*width+j-1)) + Sobel_X[4]*(*(Graydata+(i)*width+j))+Sobel_X[5]*(*(Graydata+(i)*width+j+1))+
Sobel_X[6]*(*(Graydata+(i+1)*width+j-1)) + Sobel_X[7]*(*(Graydata+(i+1)*width+j))+Sobel_X[8]*(*(Graydata+(i+1)*width+j+1)) ;
temp2 = Sobel_Y[0]*(*(Graydata+(i-1)*width+j-1)) + Sobel_Y[1]*(*(Graydata+(i-1)*width+j))+Sobel_Y[2]*(*(Graydata+(i-1)*width+j+1))+
Sobel_Y[3]*(*(Graydata+(i)*width+j-1)) + Sobel_Y[4]*(*(Graydata+(i)*width+j))+Sobel_Y[5]*(*(Graydata+(i)*width+j+1))+
Sobel_Y[6]*(*(Graydata+(i+1)*width+j-1)) + Sobel_Y[7]*(*(Graydata+(i+1)*width+j))+Sobel_Y[8]*(*(Graydata+(i+1)*width+j+1)) ;
temp3 = abs(temp1) + abs(temp2) ;
if(temp3 > Threshold)
*(edgedata+i*width+j) = 1 ;//Black
else
*(edgedata+i*width+j) = 0;//White
}
}
}
//提取特征值
void OriginMoment(int * edgedata,long width,long height,int * output){
int sum_00=0,sum_01=0,sum_10=0;
int miu_00=0,miu_20=0,miu_02=0,miu_21=0,miu_12=0;
int miu_11=0,miu_30=0,miu_03=0;
int ning_20=0,ning_02=0,ning_11=0;
int ning_21=0,ning_12=0,ning_30=0,ning_03=0;
int x_ba=0,y_ba=0;
int i,j ;
for(i=0;i<height;i++){
for(j=0;j<width;j++){
sum_00 = sum_00 + *(edgedata+width*i+j) ;
sum_01 = sum_01 + (*(edgedata+width*i+j))*j;
sum_10 = sum_10 + (*(edgedata+width*i+j))*i;
}
}
x_ba = sum_10/sum_00;//重心坐标x
y_ba = sum_01/sum_00;//重心坐标y
miu_00 = sum_00 ;
//perimeter = miu_00 ;
for(i=0;i<height;i++){
for(j=0;j<width;j++){
miu_11 = miu_11 + (i-x_ba)*(j-y_ba)*(*(edgedata+width*i+j)) ;
miu_20 = miu_20 + (i-x_ba)*(i-x_ba)*(*(edgedata+width*i+j)) ;
miu_02 = miu_02 + (j-y_ba)*(j-y_ba)*(*(edgedata+width*i+j)) ;
miu_21 = miu_21 + (i-x_ba)*(i-x_ba)*(j-y_ba)*(*(edgedata+width*i+j)) ;
miu_12 = miu_12 + (i-x_ba)*(j-y_ba)*(j-y_ba)*(*(edgedata+width*i+j)) ;
miu_30 = miu_30 + (i-x_ba)*(i-x_ba)*(i-x_ba)*(*(edgedata+width*i+j)) ;
miu_03 = miu_03 + (j-y_ba)*(j-y_ba)*(j-y_ba)*(*(edgedata+width*i+j)) ;
}
}
ning_20 = miu_20/(miu_00 * miu_00) ;
ning_02 = miu_02/(miu_00 * miu_00) ;
ning_11 = miu_11/(miu_00 * miu_00) ;
ning_21 = miu_21/(miu_00 * miu_00) ;
ning_12 = miu_12/(miu_00 * miu_00) ;
ning_30 = miu_30/(miu_00 * miu_00) ;
ning_03 = miu_03/(miu_00 * miu_00) ;
*(output) = ning_20 + ning_02 ;
*(output+1) = (ning_20 - ning_02 )*(ning_20 - ning_02 ) + 4*ning_11*ning_11 ;
*(output+2) = (ning_30 - 3*ning_12)*(ning_30 - 3*ning_12) + (3*ning_21-ning_03) * (3*ning_21-ning_03) ;
*(output+4) = sum_00 ;
return ;
}
//模板匹配
void templateCmp(int * output){
int template1[5] ={2 ,0 ,1889 ,49504 ,4915};//模板1
int template2[5] ={2 ,0 ,12010 ,46672 ,3860};//模板2
int template3[5] ={3 ,1 ,7261 ,46148 ,4037};//模板3
int template4[5] ={2 ,0 ,11650 ,44972 ,3976};//模板4
int template5[5] ={2 ,0 ,18866 ,38587 ,4910};//模板5
int temp[5]={0} ;
int num=0,chen=0,i=0;
int H1,H2,H3,area,perimeter ;
H1 = *output ;
H2 = *(output+1) ;
H3 = *(output+2) ;
area = *(output+3) ;
perimeter = *(output+4) ;
//以下是计算输入图片与模板间的欧式距离
temp[0] = (H1-template1[0])*(H1-template1[0])+(H2-template1[1])*(H2-template1[1])+(H3-template1[2])*(H3-template1[2])+
(area-template1[3])*(area-template1[3])+(perimeter-template1[4])*(perimeter-template1[4]) ;
temp[1] = (H1-template2[0])*(H1-template2[0])+(H2-template2[1])*(H2-template2[1])+(H3-template2[2])*(H3-template2[2])+
(area-template2[3])*(area-template2[3])+(perimeter-template2[4])*(perimeter-template2[4]) ;
temp[2] = (H1-template3[0])*(H1-template3[0])+(H2-template3[1])*(H2-template3[1])+(H3-template3[2])*(H3-template3[2])+
(area-template3[3])*(area-template3[3])+(perimeter-template3[4])*(perimeter-template3[4]) ;
temp[3] = (H1-template4[0])*(H1-template4[0])+(H2-template4[1])*(H2-template4[1])+(H3-template4[2])*(H3-template4[2])+
(area-template4[3])*(area-template4[3])+(perimeter-template4[4])*(perimeter-template4[4]) ;
temp[4] = (H1-template5[0])*(H1-template5[0])+(H2-template5[1])*(H2-template5[1])+(H3-template5[2])*(H3-template5[2])+
(area-template5[3])*(area-template5[3])+(perimeter-template5[4])*(perimeter-template5[4]) ;
//找出最小值
chen = temp[0] ;
for(i=0;i<5;i++){
if(chen>temp[i]){
chen = temp[i] ;
num = i ;
}
}
switch(num){
case 0:
printf("手势1\n");break;
case 1:
printf("手势2\n");break;
case 2:
printf("手势3\n");break;
case 3:
printf("手势4\n");break;
default:
printf("手势5\n");break;
}
return ;
}
int main()
{
long width=240,height=319;
long area =0 ;//手势面积
FILE *fp=NULL;
int i=0,j=0 ;
int output[5]={0} ;
int temp1=0,temp2=0,temp3=0;
fp=fopen("..//picture5.bmp","rb") ;
if(fp== NULL) {
printf("Failed to open bmp file!!!");
exit(1);
}
if(IsBitMap(fp))
printf("该文件是位图!\n");
else{
printf("该文件不是位图!\n");
fclose(fp);
return 0;
}
printf("width=%ld\nheight=%ld\n",width,height);
printf("该图像是%d�
评论0
最新资源