Могу ли я присвоить данные двойной функции return retrievd из разыменования объекта OpenCV ЛЮБЫМ способом?

0

Это может показаться глупым? но я только что узнал, что что-то, что я считал невозможным на другом языке, было возможно, поэтому я должен попробовать.

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

это функция, о которой я говорю. В opencv вы можете назначить данные матрице M, например, путем вызова 'M.at(i, j) = 1'. На моей выше функции мне было интересно, есть ли способ змеироваться в двойное возвращение и получить объект, из которого он только что пришел, чтобы установить данные. Во всяком случае, я не против хакерства или нарушения конвенции. Но он должен использовать обертку.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, выше, та, которая просто возвращает значение из элемента i, j объекта Mat, также вместо того, чтобы просто считывать значение или элемент матрицы, также иметь возможность устанавливать значение матричного элемента, хотя и не делает его более тяжелым вышеупомянутые 3 функции. Например, если я могу взять первую функцию, которую я разместил наверху, и просто взломать идею двойного возврата и использовать ее для установки элемента матрицы. Но, по крайней мере, я был бы счастлив, если бы смог получить оболочку Mat :: at, которая может читать и писать матричный элемент, не будучи тяжелее (использование процессора), чем cv_Mat_at_double. Это сообщение о нарушении конвенции и просто в том, чтобы это произошло, поэтому я подчеркиваю идею взлома, потому что я не читал, что вы можете это сделать, но, возможно, я не задавал правильных вопросов. заранее спасибо за любую помощь по этому поводу.

Редактировать:

Мне было интересно, если бы был способ написать функцию, которую вы опубликовали, как показано ниже... изменение параметра объекта Mat, на Mat *. Мне жаль, что я забыл упомянуть, что в качестве одного из требований перед =) я буду более осторожен в будущем.

Все мои оболочки класса Mat используют Mat *, возвращают и принимают параметры Mat *, и есть код из 2000 строк... Это было фактически предназначено для использования в C-оболочке для функции C++ OpenCV Mat :: at. Обертка, как показано ниже, я получаю сообщение об ошибке, а не компилятор, который компилируется отлично, но я фактически обертываю на третьем языке и получаю необработанную ошибку ошибки памяти и компилирую оболочку, как это показано ниже (в emacs с g++ на ubuntu trusty Я получаю много ошибок... Не отправлял их, потому что это было бы долго.

Не знаю, почему компиляция с g++ в терминале работает, но emacs и мой другой язык не компилируются... Любая дополнительная помощь приветствуется

 double &cv_Mat_at_double(Mat* &M, int i, int j) { 
    return M->at<double>(i,j); }
  • 0
    @ Эдвард Монни? это должно быть ты;)
  • 0
    что здесь подразумевается? «Но я бы хотел, чтобы функция, которая возвращает значение в 0x0, также могла установить значение»
Показать ещё 2 комментария
Теги:
opencv
return-value
return-type

1 ответ

1
Лучший ответ

Вы можете вернуть ссылку на double вместо значения:

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

EDIT: Версия с указателем на cv :: Mat:

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

(вы просто отбрасываете "&").

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
  • 0
    Я принял ваш ответ, прежде чем забыл, я не упомянул о необходимости, касающейся кода. Не могли бы вы взглянуть на мое последнее изменение, я очень ценю вашу помощь до сих пор.
  • 0
    сделано, я отредактировал свой ответ
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню