opencv中Mat矩阵初始化之不解_霄星_新浪博客

    这几天在折腾opencv,vs2008和matlab混合编程,刚开始就遇到难题了。

    首先是matlab不能找到vs2008编译器:mex -setup和mbuild -setup都不行。网上找了一些资料,提示的方法都试了遍,都无效。都还将我用的matlab2007b换成了matlab2009a,总算可以了。哎,看来还是用{zx1}版本的东西比较有优势。

    现在的问题是,用静态数组初始化mat矩阵xx没有问题,但是如果用动态分配的数组初始化mat就会发现数据有问题。不知道有没有同学遇到相似的问题。下面的这个例子中,无论是用s_data,s_data1,还是n_data初始化mat_data都没有问题,但是如果用data初始化mat_data就会发现数据有误。

    难道如想将动态数组中的数据初始化mat矩阵,必须先将其赋值给一个静态数组?没有直接的方法?

#include "stdafx.h"
#include "iostream"
#include "stdlib.h"
#include "stdio.h"

#include <cv.h>
#include <highgui.h>


using namespace std;

float s_data[4][8]={{1006,932,1006,1006,859,1006,932,1006},
                   {1333,1333,1247,1333,1247,1247,1247,1247},
                   {1840,1840,1840,1778,1778,1778,1716,1778},
                   {3374,3328,3465,3419,3419,3419,3374,3419}};

float s_data1[32]={1006,932,1006,1006,859,1006,932,1006,
                  1333,1333,1247,1333,1247,1247,1247,1247,
                  1840,1840,1840,1778,1778,1778,1716,1778,
                  3374,3328,3465,3419,3419,3419,3374,3419};

int _tmain(int argc, _TCHAR* argv[])
{
 float **data=NULL;

 data=new float*[4];                  //初始化二维数组
 for (int i=0;i<4;i++)
  data[i]=new float[8];

 for (int i=0;i<4;i++)
 {
  for (int j=0;j<8;j++)
   data[i][j]=s_data[i][j];
 }

 for (int i=0;i<4;i++)
 {
  for (int j=0;j<8;j++)
   cout<<data[i][j]<<" ";

  cout<<endl;
 }

 float n_data[4][8];
 for (int i=0;i<4;i++)
 {
  for (int j=0;j<8;j++)
   n_data[i][j]=data[i][j];
 }


// CvMat *mat_data=cvCreateMat(5,7,CV_32SC1);
// cvInitMatHeader(mat_data,5,7,CV_32SC1,data);

 CvMat mat_data=cvMat(4,8,CV_32FC1,s_data1);

// CvMat mat_data;
// cvInitMatHeader(&mat_data,5,7,CV_32FC1,data);

 for (int i=0;i<4;i++)
 {
  for (int j=0;j<8;j++)
   cout<<cvmGet(&mat_data,i,j)<<" ";

  cout<<endl;
 }


 getchar();
 return 0;
}

 

    (⊙o⊙)…,我知道了,原来mat中*data是一维指针,如果用二维动态数组初始化的话,读取的是地址,而不是其中的数据:

例如:

int cols = 300, rows = 200;
float* myarr = new float[rows*cols];
// {dy}步,初始化 CvMat 头
CvMat mat = cvMat( rows, cols,
                  CV_32FC1, // 32 位浮点单通道类型
                  myarr // 用户数据指针(数据没有被复制)
                  );
// 第二步,使用 cv 函数, 例如计算 l2 (Frobenius) 模
double norm = cvNorm( &mat, 0, CV_L2 );
...
delete myarr;


已投稿到:
郑重声明:资讯 【opencv中Mat矩阵初始化之不解_霄星_新浪博客】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——