返回信息流昨天写完程序出现问题,但今天上午已经跟踪调试发现问题出在这儿,就写了个下面的这个简单的程序来看,发现的确存在问题。
但从中午起一直在查资料,仍然不知道该怎么修改。
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char** argv)
{
int windowNum = atof(argv[1]);
CvMat* pLMat = NULL;
pLMat = cvCreateMat(1, windowNum, CV_8UC1);
int *pia = new int[windowNum];
for (int i = 0; i != windowNum; ++i){
pia[i] = i;
printf("%d\n", pia[i]);
}
cvInitMatHeader( pLMat, 1, windowNum, CV_8UC1, pia);
int *p = (int*)cvPtr1D(pLMat, 0);
int t = 0;
for (int j = 0; j != windowNum; j++){
printf("%f\n", *p);
++p;
}
cvReleaseMat(&pLMat);
return 0;
};
我想用数组pia[]给pLMat赋值,编译没问题,可是显示结果却是赋值失败的。我估计是cvInitMatHeader这一步失败。那是什么原因,该怎样修改呢?
谢谢!
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #4368同步于 2009/3/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖
【求助】用普通数组给CvMat*赋值失败
simon2062
2009/3/15镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
opencv?
【 在 simon2062 (Simon) 的大作中提到: 】
: 昨天写完程序出现问题,但今天上午已经跟踪调试发现问题出在这儿,就写了个下面的这个简单的程序来看,发现的确存在问题。
: 但从中午起一直在查资料,仍然不知道该怎么修改。
: #include <stdio.h>
: ...................
#include <stdio.h>
#include <cv.h>
#include <highgui.h>
int main(int argc, char** argv)
{
//int windowNum = atof(argv[1]); //应该是atoi()吧
int windowNum=9;
CvMat *pLMat;
pLMat = cvCreateMat(1, windowNum, CV_8UC1);
int *pia = new int[windowNum];
for (int i = 0; i != windowNum; ++i){
pia[i] = i;
printf("%d\n", pia[i]);
}
cvInitMatHeader( pLMat, 1, windowNum, CV_8UC1, pia);
int *p = (int*)cvPtr1D(pLMat, 0);
int t = 0;
for (int j = 0; j != windowNum; j++){
printf("%d\n", *p); //changed
++p;
}
cvReleaseMat(&pLMat);
return 0;
}
程序如果改成上面的运行没有问题,所以问题不是你说的那样,
嗯。对。谢谢你!
【 在 luoye 的大作中提到: 】
: #include <stdio.h>
: #include <cv.h>
: #include <highgui.h>
: ...................
我的确对这块相当不清楚。尤其是初始化矩阵时,下面这几个函数把我脑袋搅昏了。
cvCreateMatHeader
cvCreateMat
cvInitMatHeader
cvMat。
不知道用一个普通数组初始化时该用哪个。
另外,为什么会内存泄露?最后cvReleaseMat(&pLMat); 应该都释放了,是吗?
【 在 zixu1986 的大作中提到: 】
: 应该用cvsetdata吧 cvCreateMat应该是给数据分配内存了 应该只用做一个头 cvCreateMatHeader。
: 不然会内存泄露的
我发贴是就说啦。我做毕设,刚学着用OpenCV。毕设程序一直写得比较顺。但是昨天发现结果有问题。就找原因。最后发现是给矩阵赋值的问题,所以就写了个小程序来检验下是不是我用普通数组给CvMat*赋值的过程出错了。
这只是个检验下是不是我用普通数组给CvMat*赋值的过程出错了的程序,的确没实际作用。
【 在 bebekifis 的大作中提到: 】
: 说实话,没看懂程序想做什么。。。
: lz能解释一下吗?
o, 矩阵赋值啊。。。
CvMat * mat = cvCreateMat(rows, cols, type);
这个时候就已经分配了Mat的头,并且也分配了数据去,之后只要进行数据赋值就可以了。不用再做Header的初始化。
赋值的时候可以使用CV_MAT_ELEM宏来赋值,比较方便,用cvSetData会造成内存泄露,因为这个函数只是改变了Mat的数据指针所指的数据区。