存档

#include "global.h"


/**
 * 说明:
 * HOG特征的提取:
 * 首先需要将raw图像转为RGB图像
 * 再将rgb图像转为灰度图像
 * 针对灰度图像进行伽马校正、
 * 归一化
 * 然后计算图像的梯度值
 * 再归一化
 *
 *
 * 最后计算整体的特征
 * 目前的问题:不确定如何实现最后的特征归一化
 * ~~~~
 * 确定了
 * 看懂了
 * 哈哈哈哈哈哈
 */
int hog_raw2rgbw(int Y1, int X1, int Y2, int X2){
	if (2 < X1 && X1 < 2616 && X1 % 2 != 1) {
		X1 = X1 - 2;
	}
	if (2 < Y1 && Y1 < 1990 && Y1 % 2 != 1) {
		Y1 = Y1 - 2;
	}
	if (2 < X1 && X1 < 2616 && X1 % 2 == 1) {
		X1 = X1 - 1;
	}
	if (2 < Y1 && Y1 < 1990 && Y1 % 2 == 1) {
		Y1 = Y1 - 1;
	}

	int sum_R=0;
	int sum_G=0;
	int sum_B=0;
	int heigth;
	int width;
	unsigned int SON_IMAGE_ADDR;
	SON_IMAGE_ADDR = IMX178_FRAME1_IMG_ADDR;
	heigth = Y2 - Y1;
	width = X2 - X1;
	int i, j;
	unsigned char core[3][3]={{0,0,0},{0,0,0},{0,0,0}};
	unsigned int r,g,b;
	unsigned int temp1=1;
	for (i = 1; i < heigth; i++) {
		for (j = 1; j < width; j++) {
			core[0][0]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i-1)  * XSIZE + X1 + j-1);
			core[0][1]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i-1)  * XSIZE + X1 + j);
			core[0][2]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i-1)  * XSIZE + X1 + j+1);
			core[1][0]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i)  * XSIZE + X1 + j-1);
			core[1][1]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i)  * XSIZE + X1 + j);
			core[1][2]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i)  * XSIZE + X1 + j+1);
			core[2][0]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i+1)  * XSIZE + X1 + j-1);
			core[2][1]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i+1)  * XSIZE + X1 + j);
			core[2][2]=(*(unsigned char*) SON_IMAGE_ADDR + (Y1 + i+1)  * XSIZE + X1 + j+1);
			if (1 == (Y1 + i) % 2) {
				if (1 == (X1 + j) % 2) {
					r = core[1][1];
					g = (core[0][1] + core[2][1] + core[1][0] + core[1][2]) / 4;
					b = (core[0][0] + core[0][2] + core[2][0] + core[2][2]) / 4;

				} else {
					g = core[1][1];
					b = (core[0][1] + core[2][1]) / 2;
					r = (core[1][0] + core[1][2]) / 2;
				}

			} else {
				if (1 == (X1 + j) % 2) {
					g = core[1][1];
					b = (core[1][0] + core[1][2]) / 2;
					r = (core[0][1] + core[2][1]) / 2;

				} else {
					b = core[1][1];
					g = (core[2][1] + core[1][0] + core[1][2] + core[0][1]) / 4;
					r = (core[0][0] + core[0][2] + core[2][0] + core[2][2]) / 4;
				}
			}
			*(unsigned char *) (IMX178_SON_IMG_ADDR+temp1)=r;
			*(unsigned char *) (IMX178_SON_IMG_ADDR+temp1+1)=g;
			*(unsigned char *) (IMX178_SON_IMG_ADDR+temp1+2)=b;
			if(i%2==0&&j%2==0){
				sum_R=sum_R+r;
				sum_G=sum_G+g;
				sum_B=sum_B+b;
			}
			temp1=temp1+3;
		}
	}
	*(unsigned int *) (IMAGE_RGB)=sum_R;
	*(unsigned int *) (IMAGE_RGB+16)=sum_G;
	*(unsigned int *) (IMAGE_RGB+24)=sum_B;
	int obj=hog_rgb2gray(temp1,width-1,heigth-1);
	return obj;
}
/**
 * 尺寸变换 变换为64*128
 */
void hog_resize_image(int Y1, int X1, int Y2, int X2){
	int Send_image_row;
	int Send_image_col;
	int row;
	int col;
	double x=0.0;
	double y=0.0;
	double u=0.0;
	double v=0.0;
	char a,b,c,d;
	row=Y2-Y1;
	col=X2-X1;
	//图像resize 长宽比大一1时 横长条 小于一 竖直长条
	if ((row/col) < 1) {
		//縮小
		Send_image_row = 125;
		Send_image_col = 240;
	} else {
		//放大
		Send_image_row = 125;
		Send_image_col = 240;
	}
	//设置图像的尺寸
	for (int i = 0; i < Send_image_row; i++) {
		for (int j = 0; j < Send_image_col; j++) {
			x=(((i+1)*row)*1.00/Send_image_row*1.00)*1.00;
			y=(((j+1)*col)*1.00/Send_image_col*1.00)*1.00;
			u = (x - floor(x))*1.00; //向下取整
			v = (y - floor(y))*1.00; //取小数部分
			//边界处理
			if(x < 1)
				x = 1;
			if(y < 1)
				y = 1;
			int x1=floor(x);
			int x2=ceil(x);
			int y1=floor(y);
			int y2=ceil(y);
			a=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x1-1) * XSIZE + X1+y1+1);
			b=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x1-1) * XSIZE + X1+y2-1);
			c=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x2-1) * XSIZE + X1+y1+1);
			d=*(unsigned char*) (IMX178_FRAME1_IMG_ADDR + (Y1+x2-1) * XSIZE + X1+y2-1);
			double a1,a2,a3,a4;
			double b1,b2,b3,b4;
			a1 = a * 1.00 * (1 - u);
			a1=hog_nearest_new(a1);
			b1=a1* (1 - v);
			a1=hog_nearest_new(b1);
			a2 = b * 1.00 * (1 - u);
			a2=hog_nearest_new(a2);
			b2=a2* v;
			a2=hog_nearest_new(b2);
			a3 = c * 1.00 * u ;
			a3=hog_nearest_new(a3);
			b3=a3* (1 - v);
			a3=hog_nearest_new(b3);
			a4 = d * 1.00 * u;
			a4=hog_nearest_new(a4);
			b4=a4* v;
			a4=hog_nearest_new(b4);
			char temp=0;
			temp=a1+a2+a3+a4;
			*(unsigned char *) (SPI_SEND_IMG_ADDR+j + i * Send_image_col)= temp;
		}
	}
}
int hog_nearest_new(double x){
	int a=0;
	a=ceil(x);
	if((a-x)>0.5){
		a=floor(x);
	}else{
		a=ceil(x);
	}
	return a;
}


/**
 * RGB2GRAY
 */
int hog_rgb2gray(int temp,int X,int Y){
	unsigned int j=0;
	unsigned char r,g,b;
	for(int i=0;i<temp;i=i+3){
		r=*(unsigned char *) (IMX178_SON_IMG_ADDR + i);
		g=*(unsigned char *) (IMX178_SON_IMG_ADDR + i + 1);
		b=*(unsigned char *) (IMX178_SON_IMG_ADDR + i + 2);
		*(unsigned char *) (IMAGE_ADDR2+j)=0.3 * r + 0.59 * g + 0.11 * b;
		j++;
	}
	//int obj=SVM_lbp(j,X;,Y);
	//return obj;
}

//typedef struct hog{
//	char numBins;
//	char numHorizCells;
//	char numVertCells;
//	char cellSize;
//} hog;

/**
 * 计算梯度及角度
 */

void gradientimg(int height,int width) {
	unsigned char temp;
	for (int i = 0; i < height; i++) {
		for (int j = 0; j < width; j++) {
			if (i == 0 || j == 0 || i == height - 1 || j == width - 1) {
				*(unsigned char *) (IMAGE_ADDR2 + j + i * width) = 0;	///需要更改
			} else {
				float Gx = *(unsigned char *) (IMX178_SON_IMG_ADDR + (j + 1)+ i * width)- *(unsigned char *) (IMX178_SON_IMG_ADDR + (j - 1)+ i * width);
				float Gy = *(unsigned char *) (IMX178_SON_IMG_ADDR + j+ (i + 1) * width)- *(unsigned char *) (IMX178_SON_IMG_ADDR + j+ (i - 1) * width);
				float gradient = sqrt(Gx * Gx + Gy * Gy);
				//float theta = abs((atan2(Gy,Gx)*180)/3.141592653);
				float theta = atan2(Gy,Gx);
				//float theta = (atan((float) Gy / (float) Gx) * 180/ 3.1415926);
				*(unsigned char *) (IMAGE_ADDR2 + j + i * width) = theta;///需要更改  存储角度值
				*(unsigned char *) (IMAGE_ADDR1 + j + i * width) = gradient;///需要更改 存储梯度值
			}
		}
	}
	//nomolize_GraGm(height,width);
}



double *getHistogram(double magnitudes[],double angles[],int numBins){

	double binSize = 3.1416 / numBins;
	double H[numBins];
	double sum1=0;
	double sum2=0;
 	double leftBinIndex[64];
	double rightBinIndex[64];
	double leftBinCenter[64];
	double rightPortions[64];
	double leftPortions[64];
	double pixels[64]={0};
	for (int i = 0; i < 64; i++) {
		leftBinIndex[i] = round(angles[i] / binSize);
	}

	for (int i = 0; i < 64; i++) {
		rightBinIndex[i] = leftBinIndex[i] + 1;
	}

	for (int i = 0; i < 64; i++) {
		leftBinCenter[i] = (leftBinIndex[i] - 0.5) * binSize;
	}

	for (int i = 0; i < 64; i++) {
		rightPortions[i] = angles[i] - leftBinCenter[i];
	}

	for (int i = 0; i < 64; i++) {
		leftPortions[i] = binSize - rightPortions[i];
	}

	for (int i = 0; i < 64; i++) {
		rightPortions[i] = rightPortions[i] / binSize;
	}

	for (int i = 0; i < 64; i++) {
		leftPortions[i] = leftPortions[i] / binSize;
	}

	for (int i = 0; i < 64; i++) {
		if (leftBinIndex[i] == 0) {
			leftBinIndex[i] = numBins;
		}
	}

	for (int i = 0; i < 64; i++) {
		if (rightBinIndex[i] == (numBins + 1)) {
			rightBinIndex[i] = 1;
		}
	}



	for (int j = 0; j < numBins; j++) {
		for (int i = 0; i < 64; i++) {
			if (leftBinIndex[i] == j){
				pixels[i] = 1;
			}
		}
		for (int i = 0; i < 64; i++) {
			if(pixels[i]==1){
				sum1=sum1+leftPortions[i]*magnitudes[i];
			}
		}
		H[j]=H[j]+sum1;
		for (int i = 0; i < 64; i++) {
			if (rightBinIndex[i] == j) {
				pixels[i] = 1;
			}else{
				pixels[i] = 0;
			}
		}
		for (int i = 0; i < 64; i++) {
			if (pixels[i] == 1) {
				sum2 = sum2 + rightPortions[i] * magnitudes[i];
			}
		}
		H[j]=H[j]+sum2;
	}
	return magnitudes;
}



/**
 * 统计直方图
 * step=8;步长为8
 * cell_size=8; 8*8的统计框
 * His_Num  统计直方图的长度
 * His_Gra_All  最后的特征统计
 */

int numBins = 9;

int numHorizCells = 8;

int numVertCells = 16;

int cellSize = 8;



int step=8;//步长为8 网格大小为8*8

int cell_size=8;

int His_Num=9;
//int His_Gra=zeros(1,9);
//int His_Gra_all=[];
int G_t=1;

int G_sum=0;

unsigned int His_Gra[9]={0};



unsigned int His_Gra_all[1152]={0};

void His_Hog_Feature(int height,int width){

	double histograms[16*9][8];

	double Gd_cell[64]={0};

	double Gm_cell[64]={0};

	unsigned char temp0;

	unsigned char temp1;

	int num=0;

	int i,j,m,n,k;
	for (i = 0; i < height/step; i++) {
		for (j = 0; j < width/step; j++) {
			for (m = i*8; m <(i+1)*8; m++) {
				for ( n = 0; n < 8; n++) {
					temp0 = *(unsigned char *) (IMAGE_ADDR2 + m*64 +8*j+n);
					temp1 = *(unsigned char *) (IMAGE_ADDR1 + m*64 +8*j+n);
					Gd_cell[num] = temp0;
					Gm_cell[num] = temp1;
					num++;
				}
			}
			num=0;
			double *a=getHistogram(Gd_cell,Gd_cell,1);
			for( k=1;k<10;k++){
				histograms[16*(k-1)+i][j]=a[k-1];
			}

 		}
	}

	double blockHists[9*2][2];

	for(int i=0;i<numVertCells;i++){
		for(int j=0;j<numHorizCells;j++){
			for(int k=1;k<10;k++){
				blockHists[0][k]=histograms[16*(k-1)+i][k-1];
			}

		}
	}

//
//	int H_d0 = 0;
//	int H_m0 = 0;
//	int H_d1 = 0;
//	int H_m1 = 0;
//	int H_d2 = 0;
//	int H_m2 = 0;
//	for(int i=0;i<8;i++){
//		for(int j=0;j<8;j++){
//			H_d0=Gd_cell[i*8+j];
//			H_d1=floor(H_d0/20);
//			H_d2=ceil(H_d0/20);
//			if(H_d1==0){
//				H_d1=1;
//			}
//			if (H_d2 == 0) {
//				H_d2 = 1;
//			}
//			H_m0 = Gm_cell[i * 8 + j];
//			H_m1 = ((H_d2 * 20 - H_d0) / 20) * H_m0;
//			H_m2 = (1 - (H_d2 * 20 - H_d0) / 20) * H_m0;
//		//	His_Gra(H_d1)= His_Gra(H_d1)+H_m1;
//		//	His_Gra(H_d2)=His_Gra(H_d2)+H_m2;
//		}
//	}
//	int G_sum=0;
//	for(int i=0;i<9;i++){
//		G_sum+=His_Gra[i];
//	}

}



double norm(double blockHists[], int n) {
	double sum = 0;
	for (int i = 0; i < n; i++) {
		sum = sum + blockHists[i] * blockHists[i];
	}
	return sqrt(sum+0.01);
}










/**
 * Gamma矫正
 */

void hog_gamma(int height,int width){
	unsigned char temp;
	//unsigned char gamma;
	for (int i = 0; i < height; i++) {
		for (int j = 0; j < width; j++) {
			temp=*(unsigned char *) (IMX178_SON_IMG_ADDR + j+i*width);//需要更改
			*(unsigned char *) (IMAGE_ADDR2+j+i*width)=(unsigned char )sqrt(temp);///需要更改
		}
	}
	nomolize_gamma(height,width);
}

/**
 * Gamma校正的归一化
 */
void nomolize_gamma(int height,int width)
{
	unsigned char temp;
	unsigned char img_val;
	int max = 0, min = 255;
	for (int i = 0; i < height; i++) {
		for (int j = 0; j < width; j++) {
			temp = *(unsigned char *) (IMX178_SON_IMG_ADDR + j + i * width);///需要更改
			if (temp > max) {
				max = temp;
			}
			if (temp < min) {
				min = temp;
			}
		}
	}

	for (int i = 0; i<height; i++) {
		for (int j = 0; j<width; j++) {
			temp=*(unsigned char *) (IMX178_SON_IMG_ADDR + j+i*width);///需要更改
			if(temp==max){
				img_val=1;
			}else if(temp == min){
				img_val=0;
			}else{
				img_val=temp/(max-min);
			}
			*(unsigned char *) (IMAGE_ADDR2+j+i*width) = img_val*255;///需要更改
		}
	}
}




///**
// * 统计直方图
// * step=8;步长为8
// * cell_size=8; 8*8的统计框
// * His_Num  统计直方图的长度
// * His_Gra_All  最后的特征统计
// */
//int step=8;//步长为8 网格大小为8*8
//int cell_size=8;
//int His_Num=9;
int His_Gra=zeros(1,9);
int His_Gra_all=[];
//int G_t=1;
//int G_sum=0;
//unsigned int His_Gra[9]={0};
//unsigned char Gd_cell[64]={0};
//unsigned char Gm_cell[64]={0};
//unsigned int His_Gra_all[1152]={0};
//void His_Hog_Feature(int height,int width){
//
//	unsigned char temp0;
//	unsigned char temp1;
//	int num=0;
//	for (int i = 0; i < height/step; i++) {
//		for (int j = 0; j < width/step; j++) {
//			for (int m = i*8; m <(i+1)*8; m++) {
//				for (int n = 0; n < 8; n++) {
//					temp0 = *(unsigned char *) (IMAGE_ADDR2 + m*64 +8*j+n);
//					temp1 = *(unsigned char *) (IMAGE_ADDR1 + m*64 +8*j+n);
//					Gd_cell[num] = temp0;
//					Gm_cell[num] = temp1;
//					num++;
//				}
//			}
//			num=0;
// 		}
//	}
//	int H_d0 = 0;
//	int H_m0 = 0;
//	int H_d1 = 0;
//	int H_m1 = 0;
//	int H_d2 = 0;
//	int H_m2 = 0;
//	for(int i=0;i<8;i++){
//		for(int j=0;j<8;j++){
//			H_d0=Gd_cell[i*8+j];
//			H_d1=floor(H_d0/20);
//			H_d2=ceil(H_d0/20);
//			if(H_d1==0){
//				H_d1=1;
//			}
//			if (H_d2 == 0) {
//				H_d2 = 1;
//			}
//			H_m0 = Gm_cell[i * 8 + j];
//			H_m1 = ((H_d2 * 20 - H_d0) / 20) * H_m0;
//			H_m2 = (1 - (H_d2 * 20 - H_d0) / 20) * H_m0;
//		//	His_Gra(H_d1)= His_Gra(H_d1)+H_m1;
//		//	His_Gra(H_d2)=His_Gra(H_d2)+H_m2;
//		}
//	}
//	int G_sum=0;
//	for(int i=0;i<9;i++){
//		G_sum+=His_Gra[i];
//	}
	His_Gra=His_Gra/sqrt(G_sum);
//
//}
//
//

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值