【问题标题】:matchShapes using grayscale images opencvmatchShapes 使用灰度图像 opencv
【发布时间】:2015-04-24 18:40:56
【问题描述】:

根据 ma​​tchShapes 文档,输入可以是灰度图像或轮廓。但是当我尝试两张灰度图像时,我得到了一个断言失败的错误。经过进一步探索,我从here 发现 Mat 对象必须是一维向量,并且类型为 CV_32FC2 或 CV_32SC2。

使用this 答案,我将图像转换为 CV_32FC2 后的浮点矢量数组。我仍然收到断言错误。

谁能告诉我如何使用 ma​​tchShapes 函数比较两张灰度图像?

更新

错误信息

  OpenCV Error: Assertion failed (contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0 && (contour1.depth() == CV_32F || contour1.depth() == CV_32S) && contour1.depth() == contour2.depth()) in matchShapes, file /home/tonystark/Opencv/modules/imgproc/src/contours.cpp, line 1936
  terminate called after throwing an instance of 'cv::Exception'
  what():  /home/tonystark/Opencv/modules/imgproc/src/contours.cpp:1936: error: (-215) contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0 && (contour1.depth() == CV_32F || contour1.depth() == CV_32S) && contour1.depth() == contour2.depth() in function matchShapes

我用的时候

    pkg-config --modversion opencv

它表示版本为 2.4.9

【问题讨论】:

  • 你用的是什么版本的opencv?断言错误信息是什么?
  • 请查看编辑。 @alrikai

标签: opencv template-matching


【解决方案1】:

如果我们分解断言消息,它会检查一些东西 --

  1. contour1.checkVector(2) >= 0 && contour2.checkVector(2) >= 0
  2. contour1.depth() == CV_32F || contour1.depth() == CV_32S
  3. contour1.depth() == contour2.depth()

听起来你知道上面的第 2 部分和第 3 部分,所以我会冒险猜测它在第 1 部分中失败了。

根据 OpenCV 文档,checkVector 是一个函数,

如果矩阵是 1 通道 (N x ptdim) 或 ptdim 通道 (1 x N) 或 (N x 1),则返回 N;否则为负数

不幸的是,这是一条相当神秘的信息。据我了解,它正在检查输入维度的维度——在这种情况下,失败的断言传入 2,并验证其维度是否大于 0。这排除了拥有空数组的可能性,并验证了另一个维度存在。 TLDR;它正在检查输入是否是一个足够维度的一维数组。

我猜你的错误是传入点向量向量的结果——相反,你必须一次将一个“形状”传递给matchShapes,即点向量

这里有一个小测试用例,虽然不是特别有趣,但应该可以毫无问题地运行 --

#include <cstdlib>
#include <ctime>    
#include <iostream> 
#include <vector>
#include <opencv2/opencv.hpp>

int main(int argc, char* argv[]) {

    std::srand(std::time(0));

    std::vector<cv::Point> random_pointsA;
    for (int i = 0; i < 1000; ++i) {
      auto rand_x = std::rand() % 255; 
      auto rand_y = std::rand() % 255; 
      random_pointsA.emplace_back(rand_x, rand_y);
    }

    std::vector<cv::Point> random_pointsB;
    for (int i = 0; i < 1000; ++i) {
      auto rand_x = std::rand() % 255; 
      auto rand_y = std::rand() % 255; 
      random_pointsB.emplace_back(rand_x, rand_y);
    }

    auto match_val = cv::matchShapes(random_pointsA, random_pointsB, CV_CONTOURS_MATCH_I1, 0);
    std::cout << "match val: " << match_val << std::endl;
}

【讨论】:

  • matchShapes() 实际上 - 如文档中所述 - 将图像作为输入吗?
猜你喜欢
  • 2017-08-30
  • 2012-05-28
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多