Я тщательно искал и не нашел прямого ответа на этот вопрос.
Передача opencv-матриц (cv::Mat
) в качестве аргументов функции, мы передаем умный указатель. Любое изменение, которое мы делаем на входную матрицу внутри функции, также изменяет матрицу вне области функции.
Я читал, что, передавая матрицу в качестве ссылки на константу, она не изменяется внутри функции. Но простой пример показывает:
void sillyFunc(const cv::Mat& Input, cv::Mat& Output){
Output = Input;
Output += 1;
}
int main( int argc, char** argv ){
cv::Mat A = cv::Mat::ones(3,3,CV_8U);
std::cout<<"A = \n"<<A<<"\n\n";
cv::Mat B;
sillyFunc(A,B);
std::cout<<"A = \n"<<A<<"\n\n";
std::cout<<"B = \n"<<B<<"\n\n";
}
Ясно, что A
изменяется, даже если оно отправляется как const cv::Mat&
.
Это меня не удивляет, так как функция I2
является простой копией умного указателя I1
, и поэтому любое изменение в I2
изменит I1
.
Что меня беспокоит, так это то, что я не понимаю, какая практическая разница существует между отправкой cv::Mat
, const cv::Mat
, const cv::Mat&
или cv::Mat&
в качестве аргументов функции.
Я знаю, как переопределить это (замена Output = Input;
на Output = Input.clone();
решит проблему), но все еще не понимает вышеупомянутую разницу.
Спасибо, ребята!