Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Что-то с памятью моей стало... / 6 сообщений из 6, страница 1 из 1
15.10.2013, 02:47
    #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
15.10.2013, 11:02
    #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
15.10.2013, 11:15
    #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
15.10.2013, 12:00
    #38427900
Cheerful Calf
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что-то с памятью моей стало...
граничные условия,

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

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

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


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