【问题标题】:Compare 2 cv::Mat [duplicate]比较 2 cv::Mat [重复]
【发布时间】:2014-09-04 07:51:02
【问题描述】:

我有 2 个 cv::Mat 数组(大小相同),当我想比较它们时(如果相同),我使用了 cv::compare

cv::compare(mat1,mat2,dst,cv::CMP_EQ);

有没有返回真/假的函数?

【问题讨论】:

  • 你会得到一整张充满真/假的垫子;)
  • 我只想获取真/假作为返回值。
  • “我想比较它们” - 这可能是您问题的弱点。你在寻找相似之处吗?逐像素身份?两个图像中都显示了相同的对象?所有这一切都需要采取不同的措施。
  • 我的错误。我想比较它们是否相同。

标签: c++ opencv


【解决方案1】:

如果您需要按大小比较 2 个 cv::Mat,那么您可以检查

if(mat1.size() == mat2.size())
    //do stuff
else
    //do other stuff

如果需要检查2个cv::Mat是否相等,可以执行AND XOR运算符,检查结果是否为一个cv::Mat full零:

cv::bitwise_xor(mat1, mat2, dst);        
if(cv::countNonZero(dst) > 0) //check non-0 pixels
   //do stuff in case cv::Mat are not the same
else
  //do stuff in case they are equal

【讨论】:

  • 不确定哪个更快,但 dst = mat1-mat2; 后跟 countNonZero 会做同样的事情(结果反转)。
  • 位运算符的执行速度比差异快一点,这就是我提出bitwose_and的原因
  • 查看 J. Roy 的回答:应该使用 bitwise_xor 而不是 bitwise_and。
  • @sircolinton 我已经更正了,谢谢
  • dst = mat1-mat2 返回一个钳位值范围,因此 mat2 的任何大于 mat 1 中相应像素的像素都返回 0。所以只有 dst = (mat1-mat2) + ( mat2-mat1) 将起作用,现在很明显,按位必须更快!
【解决方案2】:

如果你需要检查两个 cv::Mat 是否相等,你可以执行 AND 运算符并检查结果是否是一个满是零的 cv::Mat:

AND 运算符不适合此任务。如果一个矩阵全为 0,无论另一个矩阵是否全为 0,它都会返回 true。

在这种情况下必须使用 XOR。

这里是blackibiza代码的修改版:

cv::bitwise_xor(mat1, mat2, dst);        
if(cv::countNonZero(dst) > 0) //check non-0 pixels
   //do stuff in case cv::Mat are not the same
else
  //do stuff in case they are equal

【讨论】:

    【解决方案3】:

    此函数根据相似度返回真/假(未经测试)

    bool MyCompare(Mat img1, Mat img2)
    {
        int threshold = (double)(img1.rows * img1.cols) * 0.7; 
    
        cv::compare(img1 , img2  , result , cv::CMP_EQ );
        int similarPixels  = countNonZero(result);
    
        if ( similarPixels  > threshold ) {
            return true;
        }
        return false;
    }
    

    【讨论】:

    • 在这里您可以根据阈值对它们进行比较。如果您想了解它们是否完全相等,则必须比较单个位或将阈值设置为零
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2019-09-14
    • 1970-01-01
    • 2016-12-29
    • 2011-12-17
    • 2011-05-26
    • 2017-08-01
    相关资源
    最近更新 更多