powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что-то с памятью моей стало...
6 сообщений из 6, страница 1 из 1
Что-то с памятью моей стало...
    #38427465
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В программировании не разбираюсь, в плюсах особенно.
Если добавляю строчку
Код: plaintext
1.
if(needFilter) fImg = IWSP(fImg.clone());

вылетаю с
Код: plaintext
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Вопрос: где накосячил?
Hello World
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
private: Mat IWSP(Mat inputImg){
bool needFilter = false;
int g = 0, N = 0;
for(int r = 0; r < inputImg.cols; r++){
	for(int c = 0; c < inputImg.rows; c++){
		if((inputImg.at<uchar>(cv::Point(r, c)) == 255) || (inputImg.at<uchar>(cv::Point(r, c)) == 0))
		{
			needFilter = true;
		}
		else
		{
			// For Computation of Trimmed Global Mean in case we will need to filter image
			g = g + inputImg.at<uchar>(cv::Point(r, c));
			N++;
		}
	}
}
if(!needFilter) return inputImg;
// Trimmed Global Mean
g = g / N;
Mat fImg = inputImg.clone();
// Start filtering
for(int r = 0; r < inputImg.cols; r++){
	for(int c = 0; c < inputImg.rows; c++){
		// Proceeded Pixel P(r,c), continue if pixel is not corrupted
		if(inputImg.at<uchar>(cv::Point(r, c)) != 0 && inputImg.at<uchar>(cv::Point(r, c)) != 255) continue;					 
		// Window
		std::vector<int> window;
		int sum = 0, index = 0;
		for (int wr = -1; wr < 2; wr++){
			for (int wc = -1; wc < 2; wc++)	{
				// тут ошибка
				window.push_back(inputImg.at<uchar>(cv::Point(r + wr, c + wc)));
				sum += inputImg.at<uchar>(cv::Point(r + wr, c + wc));
				index++;
			}
		}
		// Case 1: selected window contains all the elements as only 0'
		if(sum == 0){
			fImg.at<uchar>(cv::Point(r, c)) = 255;
			// we will need more iterations
			needFilter = true;
			continue;
		}
		// Case 2: selected window contains all the elements as only 255'
		if(sum == 255*9){
			fImg.at<uchar>(cv::Point(r, c)) = 0;
			// we will need more iterations
			needFilter = true;
			continue;
		}
		// Case 3: selected window contains all the elements as only 255' or 0'
		bool Case3 = true;
		for(int i = 0; i < 9; i++){
			if(window[i] != 255 && window[i] != 0) Case3 = false;
		}
		if(Case3){
			fImg.at<uchar>(cv::Point(r, c)) = g;
			continue;
		}
		// Case 4: selected window contains not all the elements as only 255' or 0'
		std::vector<int> trimmedMean;
		int median = 0;
		sum = 0;
		for(int i = 0; i < 9; i++){
			if(window[i] != 0 && window[i] != 255) trimmedMean.push_back(window[i]);
			sum++;
		}
		std::sort (std::begin(trimmedMean), std::end(trimmedMean));
		if(sum == 1){
			median = trimmedMean[0];
		}
		else if(sum%2 == 0){
			median = (trimmedMean[sum/2 - 1] + trimmedMean[sum/2])/2;
		}
		else{
			median = trimmedMean[sum/2];
		}
		fImg.at<uchar>(cv::Point(r, c)) = median;
	}
}
// из-за этого появляется ошибка
if(needFilter) fImg = IWSP(fImg.clone());
return fImg;
}

...
Рейтинг: 0 / 0
Что-то с памятью моей стало...
    #38427757
Cheerful Calf,

Несоблюдены граничные условия. Другими словами выход за диапазон значений в inputImg

Код: plaintext
1.
2.
3.
4.
// тут ошибка
				window.push_back(inputImg.at<uchar>(cv::Point(r + wr, c + wc)));
				sum += inputImg.at<uchar>(cv::Point(r + wr, c + wc));
				index++;
...
Рейтинг: 0 / 0
Что-то с памятью моей стало...
    #38427785
Cheerful Calf,

бы сделал так

Код: plaintext
1.
2.
for(int r = 1; r < inputImg.cols-1; r++){
	for(int c = 1; c < inputImg.rows-1; c++){
...
Рейтинг: 0 / 0
Что-то с памятью моей стало...
    #38427900
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
граничные условия,

ну да, действительно... стыд то какой. Тогда другой вопрос - как оно смогло у меня вчера в конце концов заработать (правда на через раз) ? :-)))
...
Рейтинг: 0 / 0
Что-то с памятью моей стало...
    #38427912
Cheerful Calfграничные условия,

ну да, действительно... стыд то какой. Тогда другой вопрос - как оно смогло у меня вчера в конце концов заработать (правда на через раз) ? :-)))

это undefined behavior. Или другими словами магия
...
Рейтинг: 0 / 0
Что-то с памятью моей стало...
    #38427975
Фотография Cheerful Calf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже, что нет. Сейчас проверил sum += inputImg.at<uchar>(cv::Point(-100,600)); (картинка 512х512) - не вываливается. Так что видать косяк был (и/или есть) не в этом...
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что-то с памятью моей стало...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]