вызов функции c ++ по значению не работает

У меня проблема с этим кодом:

Проблема в том, что когда я вижу изображение оригинала, оно изменяется с помощью «borrarFondo ()», но эта функция вызывается из «plotarHoja», и здесь ввод img по значению, но img модифицируется.

void borrarFondo(Mat& img){
img = ~img;
Mat background;
medianBlur(img, background, 45);
GaussianBlur(background, background, Size(203,203),101,101);
img = img - background;
img = ~img;
}

void segmentarHoja(Mat img, Mat& imsheet){
Mat imgbw;
borrarFondo(img); //borrarFondo is called from here where img is a copy
cvtColor(img, imgbw, CV_BGR2GRAY);
threshold(imgbw, imgbw, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
Mat element = getStructuringElement(MORPH_ELLIPSE, Size(21,21));
erode(imgbw, imgbw, element);
vector<vector<Point> > contoursSheet;
findContours(imgbw, contoursSheet, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
vector<Rect> boundSheet(contoursSheet.size());
int largest_area=0;

for( int i = 0; i< contoursSheet.size(); i++ )
{
double a= contourArea( contoursSheet[i],false);
if(a>largest_area){
largest_area=a;
boundSheet[i] = boundingRect(contoursSheet[i]);
imsheet=img(boundSheet[i]).clone();
}
}
borrarFondo(imsheet);
}

int main()
{
Mat imsheet;
image= imread("c:/imagen.jpg");
segmentarHoja(image, imsheet);

imshow("imsheet",imsheet);
imshow("imagen",image); //original image by amending borrarFondo
waitKey(0);
}

Я не хочу менять исходное изображение

-2

Решение

OpenCV Mat является подсчитанной ссылкой (т.е. std::shared_ptr, за исключением другого синтаксиса), где конструкция копирования или присваивание не копирует. использовать clone метод для копирования. читать документация, всегда хорошая идея.

2

Другие решения

если вы делаете что-то вроде этого:

Mat a;
Mat b = a;

или вот так:

void func(Mat m) {...}

или же :

vector<Mat> vm;
vm.push_back(m);

все это мелкий копия. заголовок циновки будет копией, указатели внутри тоже.

так, например в первом примере б и доля так же размер и данные членов

это может объяснить, почему передача Mat по значению все еще приводит к пикселям, управляемым из «мелкой» копии.

чтобы избежать этого, вам придется вместо этого сделать «глубокую» копию:

Mat c = a.clone(); // c has its own pixels now.

и опять же, если вы не хотите манипулировать вашим матом, передать это как const Mat & будьте очень осторожны в использовании, как показано ниже.

#include <opencv2/opencv.hpp>

void foo( cv::Mat const& image )
{
cv::Mat result = image;
cv::ellipse(
result,                     // img
cv::Point( 300, 300 ),        // center
cv::Size( 50, 50 ),         // axes (bounding box size)
0.0,                        // angle
0.0,                        // startAngle
360.0,                      // endAngle
cv::Scalar_<int>( 0, 0, 255 ),  // color
6                           // thickness
);
}

auto main() -> int
{
auto window_name = "Display";
cv::Mat lenna = cv::imread( "lenna.png" );
foo( lenna );
imshow( window_name, lenna );
cv::waitKey( 0 );
}

Mat const& лгал о изменчивости, и нос Ленны соответственно длинный, здесь отмечен большой жирный круг, помещенный foo функция выше:

введите описание изображения здесь

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector