Chemist 0 Жалоба Опубликовано February 7, 2013 Я так понимаю что в этом параметре расположены значения RGB каждого пикселя? Но не пойму как к ним добраться. Разясните? Есть пример из книги: // Пример 3-11. Установка "S" и "V" частей HSV изображения в 255. void saturate_sv( IplImage* img ) { for( int y=0; y<img->height; y++ ) { uchar* ptr = (uchar*) ( img->imageData + y * img->widthStep // Получаем указатель на начало строки 'y' ); for( int x=0; x<img->width; x++ ) { ptr[3*x+1] = 255; // Устанваливаем S и V в 255 ptr[3*x+2] = 255; } } } Не понимаю вот эти строки: uchar* ptr = (uchar*) (img->imageData + y * img->widthStep // Получаем указатель на начало строки 'y' ptr[3*x+1] = 255; // Устанваливаем S и V в 255 ptr[3*x+2] = 255; ///////////////////// т.е. ptr - это массив? и каждая его ячейка несет какойто определенный параметр? п.с. в коде плоховато разбираюсь ( Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 7, 2013 ptr[3*x] //H ptr[3*x+1]//S ptr[3*x+2]//V ptr это указатель на массив в котором всё лежит как HSVHSV...HSV Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Chemist 0 Жалоба Опубликовано February 7, 2013 ptr[3*x] //H ptr[3*x+1]//S ptr[3*x+2]//V ptr это указатель на массив в котором всё лежит как HSVHSV...HSV с 3-ой вроде то же понятно, так как используется 3-х канальное изображение. А вот как задавать нужный пиксель? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано February 7, 2013 uchar* ptr = (uchar*) (img->imageData + y * img->widthStep); // Получаем указатель на начало строки 'y' и топаем по ней через 3 ступеньки for( int x=0; x<img->width; x++ ) { ptr[3*x+1] = 255; // Устанваливаем S и V в 255 ptr[3*x+2] = 255; }[/code] Нарисуйте на листочке в клетку эту раскладку, и все будет понятно. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Chemist 0 Жалоба Опубликовано February 11, 2013 Не получается подобрать красный цвет, использую вот такой код: for(x = 0; x<frame->width; x++){ for (y = 0; y<frame->height; y++){ if (((ptr[3*x+y*frame->widthStep] > this->hScrollBar1->Value-10) && (ptr[3*x+y*frame->widthStep] < this->hScrollBar1->Value+10)) && ((ptr[3*x+1+y*frame->widthStep] > this->hScrollBar2->Value-10) && (ptr[3*x+1+y*frame->widthStep] < this->hScrollBar2->Value+10)) && ((ptr[3*x+2+y*frame->widthStep] > this->hScrollBar3->Value-10) && (ptr[3*x+2+y*frame->widthStep] < this->hScrollBar3->Value+10))) { ptr[3*x+y*frame->widthStep] = 255; //H ptr[3*x+1+y*frame->widthStep] = 255; //S ptr[3*x+2+y*frame->widthStep] = 255; //V } else { ptr[3*x+y*frame->widthStep] = 0; ptr[3*x+1+y*frame->widthStep] = 0; ptr[3*x+2+y*frame->widthStep] = 0; } } } Для простоты подбора использую вот такую картинку: Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 11, 2013 http://ru.wikipedia.org/wiki/HSV_%28%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D1%8C%29 Hue — цветовой тон Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Chemist 0 Жалоба Опубликовано February 11, 2013 про HSV уже гуглил, видел модели и прочее. не пойму в каких пределах опрашивать: от 0 до 255 все или H:0-360, S:0-1, V:0-1? ptr[3*x+y*frame->widthStep] //H ptr[3*x+1+y*frame->widthStep] //S ptr[3*x+2+y*frame->widthStep] //V Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано February 11, 2013 OpenCV uses H: 0 - 180, S: 0 - 255, V: 0 - 255 http://stackoverflow.com/questions/10948589/choosing-correct-hsv-values-for-opencv-thresholding-with-inranges http://dsp.stackexchange.com/questions/5922/how-to-determine-range-of-hsv-values-of-the-image Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Chemist 0 Жалоба Опубликовано February 11, 2013 все оказалось проще ) ptr[3*x+y*frame->widthStep] // Синий ptr[3*x+1+y*frame->widthStep] // Зеленый ptr[3*x+2+y*frame->widthStep] // Красный вот такое условие для нахождение красного цвета у меня получилось: if ((ptr[3*x+y*frame->widthStep] < 40) && (ptr[3*x+1+y*frame->widthStep] < 30) && (ptr[3*x+2+y*frame->widthStep] > 150)) Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах