opencv怎么给mat赋值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv怎么给mat赋值相关的知识,希望对你有一定的参考价值。

在OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式。今天主要讲容易方式:
最容易的方式是使用宏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个元素的地址相加,获得所需要的元素的地址。
所以,以上的方式虽然很容易使用,但是却不是获得矩阵元素的最好方式。特别是当你要顺序遍历整个矩阵中所有元素时,这种每次对地址的重复计算就更加显得不合理。
参考技术A   opencv给mat赋值,分二种,一种是是整体赋值操作,另一种是分别举赋值;
  例子分别如下:
  1、MatA.at<int>(1, 1) = 0;
  2、Mat MatA = imread("sss.jpg"); Mat MatB = MatA;

Opencv C++读取分配给特征向量的opencv Mat

【中文标题】Opencv C++读取分配给特征向量的opencv Mat【英文标题】:Opencv C++ Read opencv Mat assigned to Eigen Vector 【发布时间】:2016-04-05 14:29:52 【问题描述】:

我在 opencv 中有一个矩阵 data = 8 rows x 1 cols 声明。我想读取所有值并分配给特征向量。

#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
#include <set>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace Eigen;

int main(int argc, char** argv)

Mat data;
int unique = data.rows;
VectorXd actualLabel(unique);
for(int i=0;i<unique;i++)

   for(int k = 0; k < train_label.cols; k++)
   
       int val = train_label.at<double>(i, k);
       actualLabel(i) = val;
       cout<< actualLabel(i) << endl;
    


return 0;

但在 Vector actualLable 处输出全部为 0。 如何从 Mat 数据中检索实际值?

【问题讨论】:

为什么在写之前把值存入int变量? @user3896254 你能具体告诉我我应该在哪里改变吗? int val = train_label.at&lt;double&gt;(i, k);double val = train_label.at&lt;double&gt;(i, k); 【参考方案1】:

我在这里找到了解决方案想分享完整的程序

#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <vector>
#include <set>
#include <Eigen/Core>
#include <Eigen/Dense>
using namespace Eigen;

int main(int argc, char** argv)

//example if data with assigned value 
Mat kern = (Mat_<double>(8, 1) << 0, -1, 0,-1, 5, -1,0, -1);
cout << kern << endl;
int unique = data.rows;
VectorXd actualLabel(unique);
for(int i=0;i<unique;i++)

   for(int k = 0; k < train_label.cols; k++)
   
       double val = train_label.at<Vec2d>(i, k)[0];
       actualLabel(i) = val;
       cout<< actualLabel(i) << endl;
    


return 0;

如果有什么我仍然可以用最短的代码改进,请发表评论。 谢谢

【讨论】:

以上是关于opencv怎么给mat赋值的主要内容,如果未能解决你的问题,请参考以下文章

在 OpenCV 2.3 中为 Mat 数组赋值的问题 - 看起来很简单

简单的opencv问题,如何把一个vector中的值传递给mat?

opencv中Mat数据怎么保存为JPG格式的图片

OpenCV中对Mat的遍历访问与赋值

opencv学习-第四节:图像对象的创建与赋值

opencv mat的数据类型CV_32FC1变成CV_8UC1