#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);
//
//}
//
//
存档
最新推荐文章于 2020-08-25 18:21:39 发布