【问题标题】:Opencv STL vector to Mat for matrix multiplicationOpencv STL 向量到 Mat 用于矩阵乘法
【发布时间】: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&lt;float&gt; (0,1)p1M.at&lt;float&gt; (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


【解决方案1】:

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

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

您可以尝试通过调用将 p1M 转换为您期望的矩阵

p1M.reshape(1);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-01-25
    • 2020-03-16
    • 2020-01-17
    相关资源
    最近更新 更多