Значения OpenCV RGB в шестнадцатеричном формате? - PullRequest
1 голос
/ 17 ноября 2010

Итак, я успешно получил доступ к данным пикселей во фрейме с помощью оболочки доступа к фрейму c ++ на веб-странице opencv

template<class Frame> 
class Frame_Data {
        IplImage *imgp;
        public:
        Frame_Data (IplImage *img=0) {imgp = img;}
        ~Frame_Data () {imgp = 0;}
        void operator=(IplImage *img) {imgp=img;}
        inline Frame* operator[] (int rowIndex) {
                return ((Frame*)(imgp->imageData + rowIndex*imgp->widthStep));
        }
};

typedef struct {
        unsigned char b,g,r;
} RgbPixel;
typedef struct {
        float b,g,r;
} RgbPixelFloat;

typedef Frame_Data<RgbPixel> RgbImage;

Затем я использую 2 для циклов, чтобы пройти через массив пикселей кадра, например:

for (int i = ymin; i < ymax; i++) 
{
    for (int j = xmin; j < xmax; j++) 
    {
        int r = image[i][j].r;
        int g = image[i][j].g;
        int b = image[i][j].b;

Итак, допустим, я хочу добавить оператор IF, чтобы проверить цвета данных пикселей. Я видел, как некоторые сайты перечисляют их как

image[i][j].r=0xFF;

or if g < 0x20

Я не привык к шестнадцатеричным значениям, я пытался их найти, но не могу найти никаких ссылок, я привык к cvscalars, так что это значит? Например, что означает 0x20? или как насчет 0xFF?

спасибо

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Диапазон от 0x00 ... 0xFF, который вы видите, равен одному byte, который может содержать значение в диапазоне 0 and 255, то есть как хранятся данные о цвете пикселей, как правило, в 3 или 4 байтах, состоящих из красного, синего, зеленого и по желанию Альфа.

CvScalar - это просто удобный контейнер из 1, 2, 3 или 4 двойных чисел, который можно использовать для хранения этих значений в несколько ином виде.

Например:

cv.RGB(1.0, 0.5, 0.3) устанавливает красный компонент цвета на 1.0 or 100%, зеленый компонент на 0.5 or 50% и синий компонент на 0.3 or 30%. Когда создается фактическая цветовая структура, каждый из этих компонентов будет составлять ровно один byte, так что это аналогично настройке

R (красный компонент) до 1.0 * 0xFF = 0xFF

G (зеленый компонент) до 0.5 * 0xFF = 0x7F

B (синий компонент) до 0.3 * 0xFF = 0x26

Альфа автоматически устанавливается на 1.0 or 0xFF

0 голосов
/ 17 ноября 2010

Шестнадцатеричное число - это просто другое представление числа (основание 16).

К этому не так уж сложно привыкнуть, вам просто нужно научиться преобразовывать обычные числа из 10 в базовые и обратно.Откройте ваш любимый калькулятор для Windows / Mac, переключитесь в режим Hex и введите FF.(префикс 0x просто сообщает коду, что это шестнадцатеричное число)

Переключитесь на Dec [imal], и число изменится на 255. Введите 32 в десятичном режиме, затем нажмите шестнадцатеричное, вы увидитечисло меняется на 20 (или 0x20, как в вашем коде)

Теперь вы можете переходить от шестнадцатеричного к десятичному, вы можете легко перейти от десятичного к скалярному;Просто конвертируйте диапазон;

float Scalar = static_cast<float>( Decimal ) / 255.f; // 255 being the largest value for your byte-colour

Наслаждайтесь Hex!Вы найдете это очень полезным, аккуратным и важным способом просмотра данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...