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

Opencv 将Mat转换为矢量时矢量大小不正确,opencv,Opencv,我正在尝试使用以下代码(在:)转换templateMatch的结果: 然后进行转换,显示大小与产品相同: 所以我的问题是,我怎样才能得到结果的数据,这样我才能进一步处理它,因为我假设向量的大小应该和乘积相同,而它显然不是 EDIT1:添加模板匹配代码 void matchTemplatenoRotation(cv::Mat src, cv::Mat templ) { cv::Mat img_display, result; src.copyTo(img_display); int resu

我正在尝试使用以下代码(在:)转换templateMatch的结果:

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

所以我的问题是,我怎样才能得到结果的数据,这样我才能进一步处理它,因为我假设向量的大小应该和乘积相同,而它显然不是

EDIT1:添加模板匹配代码

void matchTemplatenoRotation(cv::Mat src, cv::Mat templ) {
cv::Mat img_display, result;

src.copyTo(img_display);

int result_cols = src.cols - templ.cols + 1;
int result_rows = src.rows - templ.rows + 1;

result.create(result_rows, result_cols, CV_32FC1);

cv::matchTemplate(src, templ, result, CV_TM_SQDIFF_NORMED);
cv::normalize(result, result, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());
cv::Point minLoc, maxLoc;
double minVal, maxVal;

cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());
cv::Point matchLoc = minLoc;

//end of templatematching
EDIT2后续问题:

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

cv::Mat test(cv::Size(result.cols, result.rows),true);
test.setTo(cv::Scalar(255));
//cv::imshow("test3", test);
std::vector<float> testVector;
convertmatVec(test, testVector);
cv::Mat测试(cv::Size(result.cols,result.rows),true);
test.setTo(cv::Scalar(255));
//cv::imshow(“测试3”,测试);
std::vector testVector;
convertmatVec(test,testVector);
矢量大小如下所示:

看起来您的
常量cv::Mat&m
有四个通道

另一件需要考虑的事情是:如果这个
match
matchTemplate()
的结果,那么你应该使用
向量,而不是
向量,它看起来像你的
常量cv::Mat&m
有四个通道


另一件需要考虑的事情是:如果这个
match
matchTemplate()
的结果,那么你应该使用
向量,而不是
向量,因为你的矩阵类型是
cv32fc1
,你的向量中的元素数量是预期的4倍。如果查看
m.datastart
m.dataend
的类型,您将看到它们是
uchar*
而不是
float*

要更正此问题,请更改
v.assign(m.datastart,m.dataend)
v.assign((float*)m.datastart,(float*)m.dataend)。您需要传递一个浮点向量,而不是
向量

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


为了回答您的后续问题,您似乎遇到了反问题。您正在将
CV_8U
类型矩阵传递给需要
CV_32F
类型1的函数。对8位矩阵使用旧的转换函数,对32位浮点值矩阵使用我建议的修复方法。您还可以在转换函数中添加测试,以自动选择正确的转换。我还建议您继续阅读,以便更好地了解矩阵中的数据类型。

您的向量中的元素数是预期的4倍,因为您的矩阵类型为
CV\u 32FC1
。如果查看
m.datastart
m.dataend
的类型,您将看到它们是
uchar*
而不是
float*

要更正此问题,请更改
v.assign(m.datastart,m.dataend)
v.assign((float*)m.datastart,(float*)m.dataend)。您需要传递一个浮点向量,而不是
向量

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


为了回答您的后续问题,您似乎遇到了反问题。您正在将
CV_8U
类型矩阵传递给需要
CV_32F
类型1的函数。对8位矩阵使用旧的转换函数,对32位浮点值矩阵使用我建议的修复方法。您还可以在转换函数中添加测试,以自动选择正确的转换。我还建议您继续阅读,以便更好地了解矩阵中的数据类型。

加载图像的初始MAT作为灰度图像加载,尽管结果只有一个channel@Rok您介意添加生成此
Mat
的代码吗?这是正确回答您问题的重要代码。加载图像的垫子还是生成测试的垫子?@Rok是带有problem@Rok正如我所说,您应该使用
向量
。加载图像的初始垫将作为灰度图像加载,尽管结果只有一个channel@Rok您介意添加生成此
Mat
的代码吗?这是正确回答您问题的重要代码。加载图像的垫子还是生成测试的垫子?@Rok是带有problem@Rok正如我所说,您应该使用
向量
。是的,它解决了我的问题。谢谢@Rok看看我编辑好的回答,我明天就要试一下了,因为我不在办公室了,但提前谢谢你解决了我的问题。谢谢@Rok看看我编辑好的回答,明天我要试试,因为我不在办公室了,但提前谢谢你
void matchTemplatenoRotation(cv::Mat src, cv::Mat templ) {
cv::Mat img_display, result;

src.copyTo(img_display);

int result_cols = src.cols - templ.cols + 1;
int result_rows = src.rows - templ.rows + 1;

result.create(result_rows, result_cols, CV_32FC1);

cv::matchTemplate(src, templ, result, CV_TM_SQDIFF_NORMED);
cv::normalize(result, result, 0, 1, cv::NORM_MINMAX, -1, cv::Mat());
cv::Point minLoc, maxLoc;
double minVal, maxVal;

cv::minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc, cv::Mat());
cv::Point matchLoc = minLoc;

//end of templatematching
cv::Mat test(cv::Size(result.cols, result.rows),true);
test.setTo(cv::Scalar(255));
//cv::imshow("test3", test);
std::vector<float> testVector;
convertmatVec(test, testVector);