【问题标题】:opencv: check if two iplimages is equal to each other in c/c++?opencv:在c/c++中检查两个iplimages是否相等?
【发布时间】:2015-10-18 04:39:08
【问题描述】:

我想检查两个 Iplimage 对象以查看它们包含的图像是否相同。这怎么可能在 C/C++ 中完成?

例如:

bool equal (Iplimage *source1, IplImage *source2) {
if (source1 == source2)
    return true;
return false;
}

【问题讨论】:

  • 您只是在比较 指针,而不是它们指向的内容。
  • 您使用的是哪个 OpenCV 版本?
  • equal 在您的情况下是什么意思? 每像素精确等于或常识等于
  • 对不起,我的意思是像素相等:)
  • 除非你有一些遗留代码需要维护,否则你应该使用 C++ 语法,从使用 Mat over IplImage 开始

标签: c++ c opencv c++11 opencv3.0


【解决方案1】:

大概由于您没有提出问题,因此您给出的示例不起作用。您必须比较内容,而不是指针。你可以这样做

#include <string.h>

bool equal (Iplimage *source1, IplImage *source2) {
    if (memcmp(source1, source2, sizeof(Iplimage)) == 0)
        return true;
    return false;
}

【讨论】:

  • 感谢您的帮助,但我并不是说指针或大小相等!我的意思是像素是否相等!
  • 我的回答没有比较指针或大小。它比较两个结构。如果这些结构包含指向像素数组的指针,那么您需要改进您的问题,显示结构定义,并展示您尝试过的内容。
  • 感谢您的代码,但它总是给我错误:\ 也正确 IplImage 拼写:)
【解决方案2】:

由于您使用的是 OpenCV 3.0 和 C++,您可以(并且应该)使用Mat

bool equal (Iplimage *source1, IplImage *source2) {
    cv::Mat mat1 = cv::cvarrToMat(source1);
    cv::Mat mat2 = cv::cvarrToMat(source2);
    cv::Mat D;
    absdiff(mat1, mat2, D);
    cv::Scalar s = sum(D);
    return s == cv::Scalar::all(0);
}

更新:我不得不使用 here 找到的 cv::cvarrToMat 方法,因为在 OpenCV 3.0 中删除了 Mat(IplImage) 构造函数。还有一个完全取消 IplImages 的理由。

这适用于具有 1、3 或 4 个通道的图像,但输入必须具有相同的大小、深度和通道数。正如@Miki 在 cmets 中指出的那样,您可以轻松添加对这些条件的检查,如果不满足,则返回 false

【讨论】:

  • 如果大小或通道不相等,您可以返回 false(在 absdiff 之前)
  • @Miki 正确,但我试图(可能是错误的?)比较而不是错误检查。
  • 我同意,只是为了强调(对 OP)这样一个事实,即您可以轻松地扩展它以进行更强大的检查。已经 +1
  • 感谢您的代码,但它说我无法将 ipl 转换为 mat 并且会出错!
  • /usr/local/include/opencv2/core/mat.hpp:925:14:候选构造函数不可行:没有从“IplImage *”(又名“_IplImage *”)到“const”的已知转换cuda::GpuMat' 用于第一个参数
猜你喜欢
  • 1970-01-01
  • 2017-02-01
  • 2011-01-19
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-09
相关资源
最近更新 更多