#include "stdafx.h"
#include
#include
#include "cv.h" //opencv头文件
//以下三行在vc6中不用写上,但在vc10中须添加,原因是matlab和vc10都
//对CHAR16T进行了定义,所以解决方法是在调用matlab头文件之前,
//先加上这三行,不然会产生重定义错误
#ifdef _CHAR16T
#define CHAR16_T
#endif
#include "mat.h"
#include "matrix.h"
#include "highgui.h"
int _tmain(int argc, _TCHAR* argv[])
{
MATFile *pmat=NULL;
mxArray *pa=NULL; //矩阵变量?
const char *file;
void *pmatdata;
double *D;
double *D_z;
unsigned char *D_uchar;
file="D:\\dist.mat"; //mat文件位置?
pmat=matOpen(file, "r");//载入mat文件
if (pmat==NULL)
{
printf("pmat==NULL");
}
pa=matGetVariable(pmat, "dist");//载入matlab文件中的变量dist,一个mat文件中可能有多个矩阵
if (pa==NULL)
{
printf("pmat==NULL");
}
pmatdata = mxGetData(pa);//获取矩阵变量中D的数据
if (pmatdata == NULL)
{
printf("Error reading existing matrix a(value)\n");
return(EXIT_FAILURE);
}
int m=mxGetM(pa);//获取变量中矩阵的行数
int n=mxGetN(pa);//获取变量中矩阵的列数
int elementnum = mxGetNumberOfElements(pa);//矩阵元素个数
int elementsize = mxGetElementSize(pa);
int demnum = mxGetNumberOfDimensions(pa);
printf("element num is %d\n",elementnum);
printf("element size is %d\n",elementsize);
printf("element dimension is %d\n",demnum);
printf("D(double) size is %d\n",sizeof(double));
D = (double *)malloc(m*n*sizeof(double));
D_z = (double *)malloc((m-5)*n*sizeof(double));//矩阵本来是165行DD的剔除最后五行的μ?
memset(D,0,m*n*sizeof(double));//初始化
memcpy(D,pmatdata,m*n*sizeof(double));//把矩阵中的值赋值给数组
//matlab中D矩阵是按列存储的,所以要转换成c中的按行存储
for(int c=0;c<160;c++)
for(int r=0;r<120;r++)
D_z[120*c+r]=D[165*r+c];
D_uchar = (unsigned char *)malloc((m-5)*n*sizeof(unsigned char));//分·?配?内ú存′?
memset(D_uchar,0,(m-5)*n*sizeof(unsigned char));//初3?始ê?化ˉ
// double minval;
// double maxval;
// CvPoint minlocation;
// CvPoint maxlocation;
// cvMinMaxLoc(a,&minval,&maxval,&minlocation,&maxlocation);
// printf("minval=lf%,maxval=lf%",minval,maxval);
// double scale=255/(maxval-minval);
// double shift=-minval*scale;
// cvConvertScale(a,a_8u,scale,shift);//归一化处理
//
// scaleImage(a,a_out,0.0,1.0,m,n,1);
IplImage*img=cvCreateImage(cvSize(120,160),IPL_DEPTH_8U,1);
// IplImage*img1=cvCreateImage(cvSize(120,160),IPL_DEPTH_8U,3);
int step = img->widthStep / sizeof (unsigned char);
unsigned char * imgPtr = (unsigned char *) img->imageData;
//这里使用了一种比较简单,粗鲁的办法来把距离信息转变成亮度,距离大于1m,亮度为0
for(int num=0;num<160*120;num++)
{
if(D_z[num]>1.0f)
D_uchar[num]=0;
else
D_uchar[num]=255-(unsigned char) (D_z[num] * 255.0f);
}
for(int j1=0;j1<160;j1++)
{
for(int i1=0;i1<120;i1++)
((unsigned char*) img->imageData)[j1*step+i1]=D_uchar[j1*120+i1]; //iplimage中的数据只能是uchar类型的,所以要进行类型转换
}
/* for(int j2=0;j2<5;j2++)
{
printf("\n");
for(int i2=0;i2<120;i2++)
printf("%8d",((unsigned char*)img->imageData)[j2*step+i2]);
}*/
// cvCvtColor(img,img1,CV_GRAY2BGR);
cvNamedWindow( "Image", 1 );//创建窗口
cvShowImage( "Image", img );//显示图像
//cvNamedWindow( "Image1", 1 );//创建窗口
//cvShowImage( "Image1", img1 );//显示图像
cvWaitKey(0); //等待按键
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &img ); //释放图像
matClose(pmat);
mxFree(pa);
mxFree(pmat);
free(D);
return 0;
}
运行结果:
文章评论(0条评论)
登录后参与讨论