Opencv 将Mat转换为矢量时矢量大小不正确
我正在尝试使用以下代码(在:)转换templateMatch的结果: 然后进行转换,显示大小与产品相同: 所以我的问题是,我怎样才能得到结果的数据,这样我才能进一步处理它,因为我假设向量的大小应该和乘积相同,而它显然不是 EDIT1:添加模板匹配代码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
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);