【发布时间】:2012-02-12 11:32:09
【问题描述】:
矩阵乘法是图像处理中的一项非常基本的任务,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]???... 时,这会产生问题它是……
但是,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' 的实例后调用终止 什么():/home/james/OpenCV-2.3.1/modules/core/src/matmul.cpp:708:错误:(-215)a_size.width ==函数gemm中的len
我正在考虑编写一个函数来做到这一点!矢量到垫子,反之亦然......我错过了什么吗?
【问题讨论】:
-
从断言中我猜矩阵不是从你的向量以 2x2 的形式构建的。我建议你看看 Mat contrustor,看看矩阵是如何设置的,给出一个 std:vector。
-
我认为你是对的,它会创建一个 2*1 矩阵,但它会创建一个两通道 2*1 矩阵。这意味着矩阵中的每个元素都不是一个浮点数,而是一个 cv::Vec2f。因此,如果您打印以下值:p1M.channels(), p1M.at<:vec2f>(0, 0)[0], p1M.at<:vec2f>(0, 0)[1], p1M.at<:vec2f>(1, 0)[0], p1M.at<:vec2f>(1, 0)[1],你应该得到 2, 1.0, 0.0, 0.0, 1.0。而且我认为 OpenCV 的矩阵乘法不支持多通道矩阵,这就是您收到错误消息的原因。
-
我推荐 ImageWatch(VS 插件)或调试器,你可以很容易地发现生成的 Mat 的类型。或者计算频道的数量。
标签: c++ stl opencv vector matrix-multiplication