У меня есть функция, которая берет изображение, преобразует его в HSV и устанавливает для V значение 100. Однако, похоже, она также изменяет исходное изображение.
Mat hsvfilter(const Mat& img) {
Mat result;
cvtColor(img, result, CV_BGR2HSV);
for (int j = 0; j < img.rows; j++)
for (int i = 0; i < img.cols; i++)
result.at<Vec3d>(i, j)[2] = 100;
return result;
}
Вот как я это называю:
Mat original = imread( "pic.png" );
Mat converted = hsvfilter(original);
namedWindow( "original", CV_WINDOW_AUTOSIZE );
imshow( "original", original );
namedWindow( "converted", CV_WINDOW_AUTOSIZE );
imshow( "converted", converted );
waitKey(0);
И исходное изображение, и преобразованные изображения имеют странные черные вертикальные полосы. Я считаю, что в моем коде есть проблемы с указателями или памятью, но я не могу понять, где именно. Любая помощь будет оценена по достоинству.
РЕДАКТИРОВАТЬ: ЗДЕСЬ ИСПРАВЛЕННЫЙ КОД
Mat hsvfilter(const Mat& img) {
Mat result;
cvtColor(img, result, CV_BGR2HSV);
for (int j = 0; j < result.rows; j++) {
for (int i = 0; i < result.cols; i++) {
result.at<cv::Vec3b>(j, i)[2] = 100;
}
}
return result;
}
Mat converted = hsvfilter(original.clone());
. При клонировании функция не может получить доступ к памятиoriginal
. - person ChronoTrigger   schedule 16.03.2015