如何在向量中找到相同的cv :: Mat <cv :: mat>

时间:2015-11-11 00:08:07

标签: c++ opencv vector mat

标题说明了一切......

对于我的小图像识别项目,我在queryDescriptors和vectorOfTrainingDescriptors之间进行匹配。

所以,我想补充的是,首先检查我的训练数据中是否已经使用相同的图像。

我认为这应该是一项简单的任务,并尝试了以下内容:

int findTheSameMat(const cv::Mat MatQ, const vector<cv::Mat> MatV) {
    int result = -1;
    for (int i = 0; i < MatV.size(); i++) {
        if (cv::countNonZero(MatQ != MatV[i]) == 0) {
            result = i;
            break;
        }
    }

    return result;
}

..但是我收到以下错误消息:

OpenCV错误:输入参数的大小不匹配(操作既不是&#39;数组操作数组&#39;(其中数组具有相同的大小和相同的类型),也不是&#39;数组操作标量&# 39;,也没有&#39;标量运算数组&#39;)比较,文件/tmp/opencv-HEsb4m/opencv-2.4.9/modules/core/src/arithm.cpp,第2465行 libc ++ abi.dylib:以cv类型的未捕获异常终止::异常:/tmp/opencv-HEsb4m/opencv-2.4.9/modules/core/src/arithm.cpp:2465:错误:( - 209)操作既不是阵列操作阵列&#39; (其中数组具有相同的大小和相同的类型),也没有&#39;数组操作标量&#39;也没有&#39;标量运算数组&#39;在功能比较中

这很奇怪,因为MatQ&amp;&amp ;; MatV [i]应该是一样的.. 它们被定义为

Mat MatQ;
矢量&lt;&垫GT;美亚;

有什么想法吗?因为我是C ++ noob。

1 个答案:

答案 0 :(得分:1)

MatQ != MatV[i]要求MatQMatV[i]具有相同的尺寸,即相同的宽度和高度。

要使其正常工作,您可以先检查它们的尺寸是否相同。如果它们具有相同的大小,您只需要进行下一次检查。像

if (MatQ.size() == MatV[i].size()) {
    if (cv::countNonZero(MatQ != MatV[i]) == 0) {
        result = i;
        break;
    }
}