#include <fstream.h>
#include <iostream.h>
#include <iomanip.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#include <conio.h>
#include <math.h>
#include <WINDEF.H>
#include "cv.h"
#include "highgui.h"
#include "svm.h"
#include "malloc.h"
#define Malloc(type,n) (type *)malloc((n)*sizeof(type))
class CBmp
{
public:
// 图像匹配
//图像平移
double * contrastvector(IplImage *src); //由图像计算得出16为对比度特征
struct svm_model * Mysvmtrain(struct svm_parameter param,struct svm_problem prob);//计算训练图像文件夹,得到对比度与能见度,得到训练好的模型
double Mysvmtest(struct svm_model * model,double *cutcondata); //将测试对比度值输入训练好模型,输出能见度
struct svm_parameter setmyparameter();
void do_corss_validation();
struct svm_problem setmyproblem(char *ImageName,char *NameVisibility);
CBmp();
virtual ~CBmp();
double * cutcondata;
struct svm_parameter param; // set by parse_command_line
struct svm_problem prob;
struct svm_node *x_space;// set by read_problem
struct svm_model *model;
};
CBmp::CBmp()
{
cutcondata=NULL;
cutcondata=new double[16];
prob.y=NULL;
prob.x=NULL;
model=NULL;
}
CBmp::~CBmp()
{
if(cutcondata!=NULL)
{
delete [] cutcondata;
cutcondata = NULL;
}
if (prob.y!=NULL)
{
free (prob.y);
}
if (prob.x!=NULL)
{
free (prob.x);
}
if (¶m!=NULL)
{
svm_destroy_param(¶m);
}
if (model!=NULL)
{
svm_destroy_model(model);
}
}
//图像匹配
//图像平移
//////////////////////////////
//计算图像对比度,作为图像特征
//////////////////////////////
double * CBmp::contrastvector(IplImage *src)
{
if( src == 0 )
return 0;
int **imggray;
imggray=NULL;
double **condata;
condata=NULL;
int height,width;
IplImage* pImg8u;// 声明IplImage 变量,用于图像格式转换
cvSetImageROI( src, cvRect(0,10,600,400)); //设置ROI区域
pImg8u = cvCreateImage(cvGetSize(src), 8, 1); //创建1位8通道图像
cvCvtColor(src, pImg8u, CV_BGR2GRAY);//灰度化
cvResetImageROI(src); //重置ROI参数
height=pImg8u->height;//得到图像的高
width=pImg8u->width;//得到图像的宽
imggray=new int *[height]; //动态二维数组,分配内存
for(int i=0;i<height;i++)
imggray[i]=new int [width];
for(i=0;i<height;i++) //二维数组初始化为0
for(int j=0;j<width;j++)
imggray[i][j]=0;
//图像灰度值输入imggray[][],为后面计算对比度值
CvScalar s;
for( i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
s=cvGet2D(pImg8u,i,j); //得到像素点(i,j)的RGB值
int gray=s.val[0]; // 灰度图像R=G=B=gray
imggray[i][j]=gray;
}
}
double ap=0,cp=0;
double contrast=0;
int tp=0;
double temp=0;
condata=new double*[height];
for(i=0;i<height;i++)
condata[i]=new double[width];//存储对比度值矩阵,二维动态数组
for(i=0;i<height;i++)//读取imggray[][]中存储的灰度值
{
for(int j=0;j<width;j++)
{
if(j<=0) //越界
ap=0;
else //比较该点与左邻域点的对比度值
{
tp=max(imggray[i][j],imggray[i][j-1]);
if (tp=0)
ap=0;
else
{ ap=abs(imggray[i][j]-imggray[i][j-1]);
tp=max(imggray[i][j],imggray[i][j-1]);
ap=ap/tp;
}
}
if(i<=0)
cp=0;
else //比较该点与上邻域点的对比度值
{
tp=max(imggray[i][j],imggray[i-1][j]);
if (tp=0)
cp=0;
else
{ cp=abs(imggray[i][j]-imggray[i-1][j]);
tp=max(imggray[i][j],imggray[i-1][j]);