原创 [博客大赛]通过opencv来显示3D摄像头采集到的深度图像(二)

2013-8-27 14:20 4259 23 23 分类: FPGA/CPLD 文集: 3D图像
二、代码
 
#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;
}
 
运行结果:
20130826193427472.jpg

文章评论0条评论)

登录后参与讨论
我要评论
0
23
关闭 站长推荐上一条 /2 下一条