gpt4 book ai didi

opencv - matchShapes 使用灰度图像 opencv

转载 作者:太空宇宙 更新时间:2023-11-03 21:45:49 25 4
gpt4 key购买 nike

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

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

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

更新

错误信息

  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

最佳答案

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

  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 是一个函数

returns N if the matrix is 1-channel (N x ptdim) or ptdim-channel (1 x N) or (N x 1); negative number otherwise

不幸的是,这是一条相当神秘的信息。据我了解,它正在检查输入维度的维度——在这种情况下,失败的断言传入 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;
}

关于opencv - matchShapes 使用灰度图像 opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855138/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com