如何在 vector<cv::Mat> 中找到相同的 cv::Mat

How to find the same cv::Mat in vector<cv::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 错误:输入参数的大小不匹配(操作既不是 'array op array'(其中数组具有相同的大小和相同的类型),也不是 'array op scalar',也不是 'scalar op array') 在比较中,文件 /tmp/opencv-HEsb4m/opencv-2.4.9/modules/core/src/arithm.cpp,第 2465 行 libc++abi.dylib: 以 cv::Exception 类型的未捕获异常终止:/tmp/opencv-HEsb4m/opencv-2.4.9/modules/core/src/arithm.cpp:2465: 错误: (-209) 操作既不是 'array op array'(其中数组具有相同的大小和相同的类型),也不是 'array op scalar',也不是 'scalar op array' 函数比较

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

垫垫Q;
矢量 MatV;

有什么想法吗?因为我是C++菜鸟

MatQ != MatV[i] 要求 MatQMatV[i] 大小相同,即宽度和高度相同。

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

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