正如berak在评论中所说,这段代码似乎已被弃用
在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
的方法?
答案 0 :(得分:3)
cvmget
函数返回单通道数组的元素。此功能是GetReal2D
在EmguCV中,您可以使用cvGetReal2D
类的CvInvoke
方法
因此,您提供的链接中的代码应该是:
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