Имам функция, която взема изображение, преобразува го в 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