opencv3 怎么为自定义的Mat赋值呢?我为什么一直报下面的错误

发布时间:2019-08-28 05:57:12

推荐回答

  opencv给mat赋值,分二种,一种是是整体赋值操作,另一种是分别举赋值;  例子分别如下:  1、MatA.at<int>(1, 1) = 0;  2、Mat MatA = imread("sss.jpg"); Mat MatB = MatA;

最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵,不是指针,网上有很多人说是指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素。CV_MAT_ELEM可以给矩阵赋值,也可以访问矩阵元素。CV_MAT_ELEM宏实际上会调用CV_MAT_ELEM_PTR(matrix,row,col)宏来完成任务。 CV_MAT_ELEM_PTR()宏的参数是矩阵,行,列。CV_MAT_ELEM()宏和CV_MAT_ELEM_PTR()宏的区别是,在调用CV_MAT_ELEM时,指向矩阵元素的指针的数据类型已经依据输入参数中的元素类型而做了强制转换:

如下程序:

CvMat* mat = cvCreateMat(3,3,CV_32FC1);//创建矩阵

cvZero(mat);//将矩阵置0

//为矩阵元素赋值

CV_MAT_ELEM( *mat, float, 0, 0 ) = 1.f; 

CV_MAT_ELEM( *mat, float, 0, 1 ) = 2.f;

CV_MAT_ELEM( *mat, float, 0, 2 ) = 3.f;

CV_MAT_ELEM( *mat, float, 1, 0 ) = 4.f;

CV_MAT_ELEM( *mat, float, 1, 1 ) = 5.f;

CV_MAT_ELEM( *mat, float, 1, 2 ) = 6.f;

CV_MAT_ELEM( *mat, float, 2, 0 ) = 7.f;

CV_MAT_ELEM( *mat, float, 2, 1 ) = 8.f;

CV_MAT_ELEM( *mat, float, 2, 2 ) = 9.f;

//获得矩阵元素的值

float element = CV_MAT_ELEM(*mat,float,2,2);

float element_1_1 = 7.7f;

*((float*)CV_MAT_ELEM_PTR(m, 1, 1)) = element_1_1;

float element = CV_MAT_ELEM(m,float, 1,1 );

cout<<element<<endl;

以上使用矩阵中元素的方式很方便,但不幸的是,该宏在每次调用时,都会重新计算指针的位置。这意味着,先查找矩阵数据区中第0个元素的位置,然后,根据参数中的行和列,计算所需要的元素的地址偏移量,然后将地址偏移量与第0个元素的地址相加,获得所需要的元素的地址。

所以,以上的方式虽然很容易使用,但是却不是获得矩阵元素的最好方式。特别是当你要顺序遍历整个矩阵中所有元素时,这种每次对地址的重复计算就更加显得不合理。

matlab:zeros(),ones(),eyes()的初始化方法:

  cv::Mat M = cv::Mat::eye(height,width,<Type>)

  cv::Mat M = cv::Mat::ones(height,width,<Type>)

  cv::Mat M = cv::Mat::zeros(height,width,<Type>)

以上问题属网友观点,不代表本站立场,仅供参考!