/* 这是一个命令行程序,以图像作为文件输入变量
编译时选择“#if 1”或“#if 0”,可以使用标准和概率HOUGH变换两种方法 */
#include <cv.h>
#include <highgui.h>
#include <math.h>
#include "stdio.h"
#include <time.h>
#define multiple 10000000
long pixRoadLimit = 50, heightLimit = 70;
static const double pi = 3.14159265358979323846;
inline static double square(int a)
{
return a * a;
}
/////////////////////////////////////
double calcu_GS(long W,long H,unsigned char* pData)
{
double GS=0;
long i=0,j=0;
double sum=0;
for(i=0;i<H;i++)
for(j=0;j<W/2;j++)
{
double temp=(double)(*(pData+i*W+W/2-j)-*(pData+i*W+W/2+j));
sum+=fabs(temp);
}
GS=sum/(H*W);
return GS*(-1);
}
double calcu_Entropy(long Width,long Height,unsigned char* pData)
{
double H=0;
long i=0,j=0,k=0;
long HueCount[256]={0};
double HueP[256]={0};
for(k=0;k<256;k++)
{
for(i=0;i<Height;i++)
for(j=0;j<Width;j++)
{
if(*(pData+i*Width+j)==k)
HueCount[k]++;
}
HueP[k]=(double)HueCount[k]/(Width*Height);
}
for(i=0;i<256;i++)
{
if(HueP[i]>0)
{
H+=HueP[i]*(log(HueP[i])/log(2));
}
}
return H*(-1);
}
double calcu_Edge(long W,long H,unsigned char* pData)
{
double m_edgehue=0;
long i=0,j=0;
long sum=0;
for(i=0;i<H;i++)
for(j=0;j<W;j++)
{
sum+=(long)*(pData+i*W+j);
}
m_edgehue=(double)sum/(H*W);
return m_edgehue;
}
//////////////////////////距离变换函数////////////////////
void Distance_Trans(int *edgeimage,long edgewidth,long edgeheight)
{
long j=0,k=0;
int *edgeimage1=new int[edgewidth*edgeheight];
for(int K=0; ;K++)
{
memcpy(edgeimage1,edgeimage,edgewidth*edgeheight*sizeof(int));
for(j=1;j<edgeheight-1;j++)
for(k=1;k<edgewidth-1;k++)
{
int V[9]={edgeimage[(j-1)*edgewidth+k-1]+4,edgeimage[j*edgewidth+k-1]+3,edgeimage[(j+1)*edgewidth+k-1]+4,
edgeimage[(j-1)*edgewidth+k]+3,edgeimage[j*edgewidth+k],edgeimage[(j+1)*edgewidth+k]+3,
edgeimage[(j-1)*edgewidth+k+1]+4,edgeimage[j*edgewidth+k+1]+3,edgeimage[(j+1)*edgewidth+k+1]+4};
int min=V[0];
for(int t=0;t<9;t++)
{
if(min>V[t])
min=V[t];
}
edgeimage[j*edgewidth+k]=min;
}
int flag=0;
for(j=0;j<edgeheight;j++)
for(k=0;k<edgewidth;k++)
{
if(edgeimage[j*edgewidth+k]!=edgeimage1[j*edgewidth+k])
{
flag++;
}
}
if(flag==0)
break;
}
////////////处理模板边缘//////////////////
for(j=0;j<edgewidth;j++)
{
*(edgeimage+0*edgewidth+j)=0;
*(edgeimage+(edgeheight-1)*edgewidth+j)=0;
}
for(j=0;j<edgeheight;j++)
{
*(edgeimage+j*edgewidth+0)=0;
*(edgeimage+j*edgewidth+edgewidth-1)=0;
}
}
//////////////////边缘提取////////////////////
void Prewitt(IplImage *pImage)
{
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l;
// 指向DIB象素指针
unsigned char *lpDIBBits=(unsigned char*)pImage->imageData;
// DIB的宽度
LONG lWidth = pImage->width;
// DIB的高度
LONG lHeight = pImage->height;
// 计算图像每行的字节数
LONG lLineBytes = pImage->widthStep;
// 不能用char,也不能用::strcpy()
unsigned char* m_temp;
m_temp = new unsigned char [lLineBytes*lHeight];
// 中间变量
int v_r_v, v_g_v, v_b_v, g_v;
int v_r_h, v_g_h, v_b_h, g_h;
// 复制图象数据到中间缓存
for (i = 0; i < pImage->imageSize; i++)
m_temp[i] = 0;
// 3X3 模版
for (i = 0; i < lWidth; i++) //被处理像素在i列
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
v_r_v = v_g_v = v_b_v = v_r_h = v_g_h = v_b_h = 0;
for (k = i - 1; k < i + 2; k++) //3*3模版
{
for (l = j - 1; l < j + 2; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
// 检测模版
if (k == i - 1)
g_v = -1;
if (k == i + 1)
g_v = 1;
if (k == i)
g_v = 0;
if (l == j - 1)
g_h = 1;
if (l == j + 1)
g_h = -1;
if (l == j)
g_h = 0;
v_r_v += *(lpDIBBits + l * lLineBytes + k * 3) * g_v;
v_r_h += *(lpDIBBits + l * lLineBytes + k * 3) * g_h;
v_g_v += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_v;
v_g_h += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_h;
v_b_v += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_v;
v_b_h += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_h;
}
}
}
m_temp[j * lLineBytes + i * 3] = (int)sqrt(v_r_v * v_r_v + v_r_h * v_r_h);
m_temp[j * lLineBytes + i * 3 + 1] = (int)sqrt(v_g_v * v_g_v + v_g_h * v_g_h);
m_temp[j * lLineBytes + i * 3 + 2] = (int)sqrt(v_b_v * v_b_v + v_b_h * v_b_h);
}
}
// 回存处理结果到DIB
for(i = 0; i < pImage->imageSize; i++)
*(lpDIBBits + i) = m_temp[i];
// 释放内存
delete[] m_temp;
}
/////////////////////////////////////////////
void Roberts(IplImage *pImage)
{
// 循环变量
LONG i;
LONG j;
LONG k;
LONG l;
// 指向DIB象素指针
LPBYTE lpDIBBits=(unsigned char*)pImage->imageData;
// DIB的宽度
LONG lWidth = pImage->width;
// DIB的高度
LONG lHeight = pImage->height;
// 计算图像每行的字节数
LONG lLineBytes = pImage->widthStep;
// 不能用char,也不能用::strcpy()
unsigned char* m_temp;
m_temp = new unsigned char [lLineBytes * lHeight];
// 中间变量
int v_r_v, v_g_v, v_b_v, g_v;
int v_r_h, v_g_h, v_b_h, g_h;
// 复制图象数据到中间缓存
for (i = 0; i < lLineBytes * lHeight; i++)
m_temp[i] = *(lpDIBBits + i);
// 2X2 模版
for (i = 0; i < lWidth; i++) //被处理像素在i列
{
for (j = 0; j < lHeight; j++) //被处理像素在j行
{
v_r_v = v_g_v = v_b_v = v_r_h = v_g_h = v_b_h = 0;
for (k = i - 1; k < i + 1; k++) //2*2模版
{
for (l = j - 1; l < j + 1; l++)
{
// 防止内存溢出
if (k >= 0 && l >= 0 && k < lWidth && l < lHeight)
{
// 检测模版
if (k == i - 1 && l == j - 1)
g_v = 1;
else if (k == i && l == j)
g_v = -1;
else
g_v = 0;
if(k == i - 1 && l == j)
g_h = -1;
else if (k == i && l == j - 1)
g_h = 1;
else
g_h = 0;
v_r_v += *(lpDIBBits + l * lLineBytes + k * 3) * g_v;
v_r_h += *(lpDIBBits + l * lLineBytes + k * 3) * g_h;
v_g_v += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_v;
v_g_h += *(lpDIBBits + l * lLineBytes + k * 3 + 1) * g_h;
v_b_v += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_v;
v_b_h += *(lpDIBBits + l * lLineBytes + k * 3 + 2) * g_h;
}
}
}
m_temp[j * lLineBytes + i * 3] = (int)sqrt(v_r_v * v_r_v + v_r_h * v_r_h);
m_temp[j * lLineBytes + i * 3 + 1] = (int)sqrt(v_g_v * v_g_v + v_g_h * v_g_h);
m_temp[j * lLineBytes + i * 3 + 2] = (int)sqrt(v_b_v * v_b_v + v_b_h * v_b_h);
}
}
// 回存处理结果到DIB
for(i = 0; i < lLineBytes * lHeight; i++)
*(lpDIBBits + i) = m_temp[i];
// 释放内存
delete[] m_temp;
}
///////////////////////////////////////////////////////////
struct constant_Matrix
{
double C[7];
};
struct mean_RGB
{
unsigned char meanRGB[3];
};
/////////////////////////////////////////////////////
struct Image
{
CvPoint downleft[20];
CvPoint upright[20];
int ROInum;
int TargetTag[20];
constant_Matrix TargetMatrix[20];
mean_RGB TargetRGB[20];
CvPoint carShadowLine0[20];
CvPoint carShadowLine1[20];
double m_Vel[20];
double m_Distence[20];
};
//////////////////////////////////////////
int main()
{
int iFrame=0;
Image *imagedetect=new Image[100];
int imagedetectnum=0;
long width=720,height=576;
long i=0,j=0,k=0,m=0,l=0;
////////////跟踪变量////////////////
int x_Predrange0=0,y_Predrange0=0;
int x_Predrange1=0,y_Predrange1=0;
/////////////////////////////////////
CvFont font;
cvInitFont( &font, CV_FONT_HERSHEY_COMPLEX, 0.5f, 0.5f, 0, 1, CV_FONT_HERSHEY_SIMPLEX);
//////////////总时