将Mat转换为Vector时矢量大小不正确

时间:2016-07-20 12:32:30

标签: opencv

我试图将templateMatch的结果Mat转换为以下代码(位于this question):

arch

当我检查输出的大小时,它与结果的列和行的乘积不同(当我尝试转换我创建的另一个Mat时,它是相同的): 结果: result

使用以下内容创建的另一个Mat:

ir.ui.view

然后转换显示大小与产品相同:

test

所以我的问题是如何获得结果的数据,以便我可以进一步处理它,因为我假设矢量的大小应该与它显然不是的产品相同。吨。

EDIT1 :添加了templateMatching代码

void convertmatVec(const cv::Mat& m, std::vector<uchar>& v) {
    if (m.isContinuous()) {
        v.assign(m.datastart, m.dataend);
    }
    else {
        printf("failed to convert / not continuous");           
        return;
    }
}

EDIT2 跟进问题:

为什么我用以下代码创建另一个Mat:

cv::Mat test(result.size(),false);
test.setTo(cv::Scalar(255));

矢量大小如下:

enter image description here

2 个答案:

答案 0 :(得分:1)

您的const cv::Mat& m似乎有四个频道。

需要考虑的另一件事:如果此MatmatchTemplate()的结果,那么您应该使用vector<float>,而不是vector<uchar>

答案 1 :(得分:1)

由于矩阵的类型为CV_32FC1,因此向量中的元素数量是预期数量的4倍。如果您查看m.datastartm.dataend的类型,您会看到它们是uchar*而不是float*

要更正此问题,请将v.assign(m.datastart, m.dataend);更改为v.assign((float*)m.datastart, (float*)m.dataend);。而且你需要传递一个浮点数而不是vector<uchar>

当然,您的转换函数仅适用于浮点型矩阵。你可以添加一些测试来检测函数内部矩阵的类型。

要回答您的跟进问题,您似乎遇到了反问题。您正在将CV_8U类型矩阵传递给期望CV_32F类型的函数。将旧的转换函数用于8位矩阵,并使用我为32位浮点值矩阵建议的修复。您还可以在转换功能中添加测试,以自动选择正确的转换。我还建议您在OpenCV Mat class上阅读一下,以便更好地了解矩阵中的数据类型。