矩阵乘法是图像处理中的一项非常基本的任务,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,反之亦然......我错过了什么?
答案 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);