BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #4368同步于 2009/3/15
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

【求助】用普通数组给CvMat*赋值失败

simon2062
2009/3/15镜像同步12 回复
昨天写完程序出现问题,但今天上午已经跟踪调试发现问题出在这儿,就写了个下面的这个简单的程序来看,发现的确存在问题。 但从中午起一直在查资料,仍然不知道该怎么修改。 #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这一步失败。那是什么原因,该怎样修改呢? 谢谢!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
winton机器人#1 · 2009/3/15
opencv? 【 在 simon2062 (Simon) 的大作中提到: 】 : 昨天写完程序出现问题,但今天上午已经跟踪调试发现问题出在这儿,就写了个下面的这个简单的程序来看,发现的确存在问题。 : 但从中午起一直在查资料,仍然不知道该怎么修改。 : #include <stdio.h> : ...................
simon2062机器人#2 · 2009/3/15
嗯。是。 【 在 winton 的大作中提到: 】 : opencv?
luoye机器人#3 · 2009/3/15
#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; } 程序如果改成上面的运行没有问题,所以问题不是你说的那样,
simon2062机器人#4 · 2009/3/15
嗯。对。谢谢你! 【 在 luoye 的大作中提到: 】 : #include <stdio.h> : #include <cv.h> : #include <highgui.h> : ...................
zixu1986机器人#5 · 2009/3/15
应该用cvsetdata吧 cvCreateMat应该是给数据分配内存了 应该只用做一个头 cvCreateMatHeader。 不然会内存泄露的
simon2062机器人#6 · 2009/3/15
我的确对这块相当不清楚。尤其是初始化矩阵时,下面这几个函数把我脑袋搅昏了。 cvCreateMatHeader cvCreateMat cvInitMatHeader cvMat。 不知道用一个普通数组初始化时该用哪个。 另外,为什么会内存泄露?最后cvReleaseMat(&pLMat); 应该都释放了,是吗? 【 在 zixu1986 的大作中提到: 】 : 应该用cvsetdata吧 cvCreateMat应该是给数据分配内存了 应该只用做一个头 cvCreateMatHeader。 : 不然会内存泄露的
bebekifis机器人#7 · 2009/3/16
说实话,没看懂程序想做什么。。。 lz能解释一下吗?
simon2062机器人#8 · 2009/3/16
我发贴是就说啦。我做毕设,刚学着用OpenCV。毕设程序一直写得比较顺。但是昨天发现结果有问题。就找原因。最后发现是给矩阵赋值的问题,所以就写了个小程序来检验下是不是我用普通数组给CvMat*赋值的过程出错了。 这只是个检验下是不是我用普通数组给CvMat*赋值的过程出错了的程序,的确没实际作用。 【 在 bebekifis 的大作中提到: 】 : 说实话,没看懂程序想做什么。。。 : lz能解释一下吗?
bebekifis机器人#9 · 2009/3/16
o, 矩阵赋值啊。。。 CvMat * mat = cvCreateMat(rows, cols, type); 这个时候就已经分配了Mat的头,并且也分配了数据去,之后只要进行数据赋值就可以了。不用再做Header的初始化。 赋值的时候可以使用CV_MAT_ELEM宏来赋值,比较方便,用cvSetData会造成内存泄露,因为这个函数只是改变了Mat的数据指针所指的数据区。