用于矩阵乘法的Opencv STL向量

时间:2012-01-17 16:45:54

标签: c++ stl opencv vector matrix-multiplication

矩阵乘法是图像处理中的一项非常基本的任务,OpenCV负责使用重载*运算符。点的STL向量可以通过强制转换为Mat。

vector<Point2f> p1(2);
p1[0].x=1;p1[0].y=0;
p1[1].x=0;p1[1].y=1;
Mat p1M=Mat(p1);

正如OpenCV文档中所提到的,这将创建一个矩阵,其中包含一个列(包含2个元素),行的行数等于向量:

[1 0;0 1]------>p1M.rows=2;p1M.cols=1

当你想要矩阵乘法(p1M * p1M)... [2x1] * [2x1]时会产生一个问题......基本上我相信Matrix的所有投射向量都是将向量合并为它是....

但是,命令p1M.at<float> (0,1)p1M.at<float> (1,0)会返回0和1。这让我觉得p1M * p1M是可能的,但不幸的是它只编译并生成运行时错误:

  

OpenCV错误:gemm中的断言失败(a_size.width == len),文件/home/james/OpenCV-2.3.1/modules/core/src/matmul.cpp,第708行   在抛出'cv :: Exception'的实例后终止调用     what():/ home / _james/OpenCV-2.3.1/modules/core/src/matmul.cpp:708:错误:(-215)a_size.width == len in function gemm

我正在考虑编写一个函数来做到这一点!矢量到Mat,反之亦然......我错过了什么?

1 个答案:

答案 0 :(得分:2)

您可能想要查看cv :: Mat :: reshape http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-reshape

当您从点列表创建Mat时,它会为每个点组件创建一个通道。因此,如果你使用Point3f,它会产生一个包含3个通道的单列Mat。

您可以尝试通过调用

将p1M转换为您期望的矩阵
p1M.reshape(1);