标题说明了一切。

对于我的小图像识别项目,我正在执行我的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错误:比较中输入参数的大小不匹配(操作既不是“数组操作数组”(数组具有相同的大小和相同的类型),也不是“数组操作标量”或“标量操作数组”),文件/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)The函数比较中既不是'array op array'(数组具有相同大小和相同类型),也不是'array op scalar',也不是'scalar op array'

这很奇怪,因为MatQ && MatV [i]的类型应该相同。
它们被定义为

Mat MatQ;
vector MatV;

有任何想法吗?因为我是C++新手。

最佳答案

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

要使其正常工作,您可以首先检查它们的大小是否相同。如果它们的大小相同,则只需进行下一步检查。喜欢

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

关于c++ - 如何在vector <cv::Mat>中找到相同的cv::Mat,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33642043/

10-14 19:13