我试图将templateMatch的结果Mat转换为以下代码(位于this question):
arch
当我检查输出的大小时,它与结果的列和行的乘积不同(当我尝试转换我创建的另一个Mat时,它是相同的): 结果:
使用以下内容创建的另一个Mat:
ir.ui.view
然后转换显示大小与产品相同:
所以我的问题是如何获得结果的数据,以便我可以进一步处理它,因为我假设矢量的大小应该与它显然不是的产品相同。吨。
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));
矢量大小如下:
答案 0 :(得分:1)
您的 const cv::Mat& m
似乎有四个频道。
需要考虑的另一件事:如果此Mat
是matchTemplate()
的结果,那么您应该使用vector<float>
,而不是vector<uchar>
。
答案 1 :(得分:1)
由于矩阵的类型为CV_32FC1
,因此向量中的元素数量是预期数量的4倍。如果您查看m.datastart
和m.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上阅读一下,以便更好地了解矩阵中的数据类型。