这几天在折腾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;