【问题标题】:OpenCv & EmguCv equavalent method?OpenCv & EmguCv 等价方法?
【发布时间】:2014-08-31 22:49:41
【问题描述】:

正如 berak 在 cmets 中所说,这段代码似乎已被弃用

在Opencv中有一个方法“cvmget”,示例用法是:

bool niceHomography(const CvMat * H)
{
  const double det = cvmGet(H, 0, 0) * cvmGet(H, 1, 1) - cvmGet(H, 1, 0) * cvmGet(H, 0, 1);
  if (det < 0)
    return false;

  const double N1 = sqrt(cvmGet(H, 0, 0) * cvmGet(H, 0, 0) + cvmGet(H, 1, 0) * cvmGet(H, 1, 0));
  if (N1 > 4 || N1 < 0.1)
    return false;

  const double N2 = sqrt(cvmGet(H, 0, 1) * cvmGet(H, 0, 1) + cvmGet(H, 1, 1) * cvmGet(H, 1, 1));
  if (N2 > 4 || N2 < 0.1)
    return false;

  const double N3 = sqrt(cvmGet(H, 2, 0) * cvmGet(H, 2, 0) + cvmGet(H, 2, 1) * cvmGet(H, 2, 1));
  if (N3 > 0.002)
    return false;

  return true;
}

EmguCV 中是否有类似cvmget 的方法?

【问题讨论】:

  • 嗯,这是过去十年的代码。避免它。
  • @berak,你为什么投反对票?
  • 因为任何与已弃用的 c-api 相关的东西在 2015 年都不再有效。你不应该使用它,看到这个的菜鸟不应该误入歧途。 (顺便说一句,没有什么对你不利的。)
  • 我不是 ac 程序员,或者对 cvmget 和贬低的 c-apis 一无所知,我只是有上面的代码,想要 EmguCv 方法,以及这样一个蹩脚且没有建设性的理由来投票。
  • StackOverflow 是问答的地方,我问了我的问题并得到了我的答案,我没有提供任何人使用我的方法,我只是想要一个 answers.opencv.org/question/2588/check-if-homography-is-good 的 emgucv 版本,但是你根本没有看到问题,您只是看到了 cvmget (或其他任何内容)并告诉自己,“是的,一个愚蠢的弃用问题,让我们对问题和答案投反对票”,我看到你的个人资料有 1400 次投反对票,所以很容易在没有解决方案的情况下投反对票,下次而不是那样,想出一个像 GeorgeChond 那样的解决方案。

标签: opencv emgucv


【解决方案1】:

cvmget 函数返回单通道数组的元素。这个函数是GetReal2D的快速替换

在 EmguCV 中,您可以使用 CvInvoke 类的 cvGetReal2D 方法

所以,您提供的链接中的代码应该是这样的:

    bool niceHomography(Image<Gray, byte> H)
    {
        double det = CvInvoke.cvGetReal2D(H, 0, 0) * CvInvoke.cvGetReal2D(H, 1, 1) - CvInvoke.cvGetReal2D(H, 1, 0) * CvInvoke.cvGetReal2D(H, 0, 1);
        if (det < 0)
            return false;

        double N1 = Math.Sqrt(CvInvoke.cvGetReal2D(H, 0, 0) * CvInvoke.cvGetReal2D(H, 0, 0) + CvInvoke.cvGetReal2D(H, 1, 0) * CvInvoke.cvGetReal2D(H, 1, 0));
        if (N1 > 4 || N1 < 0.1)
            return false;

        double N2 = Math.Sqrt(CvInvoke.cvGetReal2D(H, 0, 1) * CvInvoke.cvGetReal2D(H, 0, 1) + CvInvoke.cvGetReal2D(H, 1, 1) * CvInvoke.cvGetReal2D(H, 1, 1));
        if (N2 > 4 || N2 < 0.1)
            return false;

        double N3 = Math.Sqrt(CvInvoke.cvGetReal2D(H, 2, 0) * CvInvoke.cvGetReal2D(H, 2, 0) + CvInvoke.cvGetReal2D(H, 2, 1) * CvInvoke.cvGetReal2D(H, 2, 1));
        if (N3 > 0.002)
            return false;

        return true;
    }



PS。确保您的数组(图像)只有一个通道(灰度),否则会引发运行时错误。如果您的阵列有多个通道,请改用cvGet2D 方法。

OpenCV 文档:mGet

【讨论】:

  • 关于 emgu 的悲伤故事是,它仍然主要使用已弃用的 c-api 结构/功能
  • 哦,cvGetReal*DcvGet*D 是否已弃用?
  • 再说一遍,从基于 c++ 的 official 版本开始,是的。自 2010 年以来,他们正试图摆脱 IplImage 和所有重复的东西。
  • 那我应该用什么来代替它们呢?
  • 因为你不能改变底层的实现,所以对它持保留态度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-02
  • 1970-01-01
  • 2018-08-15
  • 2020-04-19
  • 2010-12-13
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多