我可以以任何方式从OpenCV对象取消引用中将数据分配给双函数返回检索吗?

时间:2014-03-14 09:57:08

标签: c++ c opencv return-value return-type

这可能看起来像个傻瓜?但我刚发现一些我以为不可能用另一种语言表达的东西是可能的,所以我必须尝试。

double cv_Mat_at_double(Mat* self, int i, int j) {
  return self->at<double>(i, j);
}

是我所指的函数。在opencv中,你可以通过调用'M.at(i,j)= 1'来为Matrix M分配数据。在我上面的函数中,我想知道是否有任何方法可以进入双返回并获取它刚刚来自的对象来设置数据。无论如何,我并不反对hackery或破坏惯例。但它必须使用.at对象包装器。我试过了:

使用名为:

的函数
  double cv_Mat_at_double(Mat* self, int i, int j) {
     return self->at<double>();
  }

 //Imagine a 2x2 Matrix filled with data,  (a 1 at element 0x0) here
 double i = cv_Mat_at_double(H, 0, 0);
 cout << i; (output> 1)
 i = 2;
 cout << i; (output> 2)
 cout << cv_Mat_at_double(H, 0, 0); (output> 1)

更改为

double cv_Mat_at_double(Mat* self, int i, int j) {
  return self->at();
}

Error = .at expects an argument

Mat* cv_Mat_at_double(Mat* self, int i, int j) {
  return self->at<double>();
}
Error = can't return double as pointer

我知道我可以做到这一点

double cv_Mat_at_double_Val(Mat* self, int i, int j, double val) {
   return  self->at<double>(i,j)=val;
}

但我喜欢上面的函数cv_Mat_at_double,它只返回Mat对象的i,j元素的值,而不仅仅是读取值或矩阵元素,也是能够设置矩阵元素的值,而不是使上述3个函数更重。就像我可以使用我在顶部发布的第一个函数...并且只是破解双返回的想法并使用它来设置矩阵元素。但至少我会很高兴如果我能得到一个Mat ::的包装器,它既可以读取也可以写入一个矩阵元素,而不是比cv_Mat_at_double更重(cpu使用)。这篇文章是关于破坏惯例,只是让它发生,所以我强调黑客的想法,因为我没有读过你可以做到这一点,但也许我没有问正确的问题。 提前感谢您对此的任何帮助。

编辑:

我想知道是否有办法编写你发布的功能,如下所示......将Mat对象参数更改为Mat *。对不起,我忽略了提及之前的要求之一=)我将来会更加小心。

我所有的Mat类包装器都使用Mat *返回并接受Mat *参数,大约有2000行代码......这实际上是C ++ OpenCV函数Mat :: at的C包装器。如下所示,我收到一条错误消息,而不是在编译器中,编译得很好,但实际上我正在使用第三种语言包装,并且正在获取未处理的内存错误并在ubuntu上使用g ++编写emacs中的包装器(如下所示)值得信赖我收到了很多错误...没有发布它们因为它会很长。

不知道为什么在终端工作中使用g ++进行编译但是emacs和我的其他语言无法编译...感谢任何其他帮助

 double &cv_Mat_at_double(Mat* &M, int i, int j) { 
    return M->at<double>(i,j); }

1 个答案:

答案 0 :(得分:1)

您可以返回对double的引用而不是value:

double &cv_Mat_at_double(cv::Mat &M, int i, int j) {
    return M.at<double>(i,j);
}

然后你可以使用cv_Mat_at_double作为l值或r值:

cv::Mat M = (cv::Mat_<double>(2,2) << 1, 0, 0, 0);
std:: cout << cv_Mat_at_double(M, 0, 0) << std::endl; // prints 1
cv_Mat_at_double(M, 0, 0) = 2;
std:: cout << cv_Mat_at_double(M, 0, 0) << std::endl; // prints 2

编辑:带有指向cv :: Mat的指针的版本:

double &cv_Mat_at_double(cv::Mat* M, int i, int j) { 
    return M->at<double>(i,j); 
}

(你只需放下'&amp;')。

EDIT2:只是引用Mat对象。

cv::Mat M = (cv::Mat_<double>(2,2) << 1, 0, 0, 0);
std:: cout << cv_Mat_at_double(&M, 0, 0) << std::endl; // prints 1
cv_Mat_at_double(&M, 0, 0) = 2;
std:: cout << cv_Mat_at_double(&M, 0, 0) << std::endl; // prints 2