Это может показаться глупым? но я только что узнал, что что-то, что я считал невозможным на другом языке, было возможно, поэтому я должен попробовать.
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); }
Вы можете вернуть ссылку на 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