Например TDA7294

Форум РадиоКот • Просмотр темы - преобразование HSV в RGB
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Вт апр 23, 2024 23:50:43

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: преобразование HSV в RGB
СообщениеДобавлено: Ср янв 04, 2017 21:29:23 
Друг Кота
Аватар пользователя

Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Сообщений: 6296
Откуда: Ukraine
Рейтинг сообщения: 0
доброго времени суток
если кто делал подобное, подскажите пожалуйста
согласно вики https://ru.wikipedia.org/wiki/HSV_(%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)
Изображение
написал ф-цию преобразования
http://dpaste.com/2VQG4WC
но выдает она мягко говоря не то что надо
подскажите пожалуйста, как правильно написать

_________________
Tell Me The Truth


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: преобразование HSV в RGB
СообщениеДобавлено: Ср янв 04, 2017 22:07:02 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 1
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
попробуйте вот это - я накорябал сам на основе тех ссылок, которые вам рекомендовал. думаю, разберетесь...
Код:
/** \file rgb.c
 * \par \author ARV \par
 * \n \date   25 дек. 2016 г.
 * Copyright 2015 © ARV. All rights reserved.
 * \par
 * Для компиляции требуется:\n
 *    -# Atmel Toolchain 3.4.5 или более новая версия
 */

#include <avr/io.h>
#include <avr_helper.h>

/// если этот макрос есть, оттенок (HUE для HSV-модели цвета) будет в градусах
/// иначе в условных единицах от 0 до 255
//#define HUE_SMOOTH

#if defined(HUE_SMOOTH)
#define hue_t   uint16_t
#define HUE_MAX   360
#else
#define hue_t   uint8_t
#define HUE_MAX   256
#endif

#define HUE_QUADRANT   ((HUE_MAX + 5)/ 6)

typedef struct{
   uint8_t      r;
   uint8_t      g;
   uint8_t      b;
} color_rgb_t;

typedef struct{
   hue_t      h;
   uint8_t      s;
   uint8_t      v;
} color_hsv_t;

void hsv_to_rgb(const color_hsv_t *hsv, color_rgb_t *rgb);
void rgb_to_hsv(const color_rgb_t *rgb, color_hsv_t *hsv);

void hsv_to_rgb(const color_hsv_t *hsv, color_rgb_t *rgb){
   uint8_t region, fpart, p, q, t;

   if(hsv->s == 0) {
      /* color is grayscale */
      rgb->r = rgb->g = rgb->b = hsv->v;
      return;
   }

   /* make hue 0-5 */
   region = hsv->h / HUE_QUADRANT;
   /* find remainder part, make it from 0-255 */
   fpart = (hsv->h - (region * HUE_QUADRANT)) * 6;

   /* calculate temp vars, doing integer multiplication */
   p = (hsv->v * (255 - hsv->s)) >> 8;
   q = (hsv->v * (255 - ((hsv->s * fpart) >> 8))) >> 8;
   t = (hsv->v * (255 - ((hsv->s * (255 - fpart)) >> 8))) >> 8;

   /* assign temp vars based on color cone region */
   switch(region) {
      case 0:
         rgb->r = hsv->v; rgb->g = t; rgb->b = p; break;
      case 1:
         rgb->r = q; rgb->g = hsv->v; rgb->b = p; break;
      case 2:
         rgb->r = p; rgb->g = hsv->v; rgb->b = t; break;
      case 3:
         rgb->r = p; rgb->g = q; rgb->b = hsv->v; break;
      case 4:
         rgb->r = t; rgb->g = p; rgb->b = hsv->v; break;
      default:
         rgb->r = hsv->v; rgb->g = p; rgb->b = q; break;
   }
}

#define MIN(x,y)   ((x) < (y))?(x):(y)
#define MAX(x,y)   ((x) > (y))?(x):(y)

void rgb_to_hsv(const color_rgb_t *rgb, color_hsv_t *hsv){
   uint8_t min, max, delta;
   int16_t hsvh;

   min = MIN(rgb->r, MIN(rgb->g, rgb->b));
   max = MAX(rgb->r, MAX(rgb->g, rgb->b));

   hsv->v = max;                // v, 0..255
   delta = max - min;                      // 0..255, < v

   if(max != 0)
      hsv->s = (int)(delta)*255 / max;        // s, 0..255
   else {
      // r = g = b = 0        // s = 0, v is undefined
      hsv->s = 0;
      hsv->h = 0;
      return;
   }

   if(rgb->r == max)
      hsvh = (rgb->g - rgb->b)*HUE_QUADRANT/delta;        // between yellow & magenta
   else if(rgb->g == max)
      hsvh = (HUE_QUADRANT*2) + (rgb->b - rgb->r)*HUE_QUADRANT/delta;    // between cyan & yellow
   else
      hsvh = (HUE_QUADRANT*4) + (rgb->r - rgb->g)*HUE_QUADRANT/delta;    // between magenta & cyan

   if(hsvh < 0) hsvh += HUE_MAX;

   hsv->h = hsvh;
}

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: преобразование HSV в RGB
СообщениеДобавлено: Чт янв 05, 2017 12:06:09 
Друг Кота
Аватар пользователя

Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Сообщений: 6296
Откуда: Ukraine
Рейтинг сообщения: 0
Код:
const color_hsv_t *hsv

из каких соображений вы указатель сделали константой ?
значения получаются в процентах

_________________
Tell Me The Truth


Вернуться наверх
 
PCBWay - всего $5 за 10 печатных плат, первый заказ для новых клиентов БЕСПЛАТЕН

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

Онлайн просмотровщик Gerber-файлов от PCBWay + Услуги 3D печати
Не в сети
 Заголовок сообщения: Re: преобразование HSV в RGB
СообщениеДобавлено: Чт янв 05, 2017 16:42:20 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 97
Рейтинг сообщений: 2058
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18030
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
не указатель, а структуру, на которые он указывает - чтобы оптимизатор мог воспользоваться, если пожелает, тем фактом, что данные в этой струтуре меняться в функции не будут.

FreshMan писал(а):
значения получаются в процентах
мне казалось, в моем коде значения должны получаться в пределах от 0 до 255. хотя сам-то я и не проверял - на вас надеюсь :)))

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: преобразование HSV в RGB
СообщениеДобавлено: Чт фев 02, 2017 21:12:43 
Друг Кота
Аватар пользователя

Карма: 27
Рейтинг сообщений: 33
Зарегистрирован: Пн ноя 22, 2010 00:57:15
Сообщений: 6296
Откуда: Ukraine
Рейтинг сообщения: 1
после долгих поисков была найдена оптимальная ф-ция преобразования HSV в RGB для AVR которая выдает оптимальный результат :)
Спойлер
Код:
void hsv_to_rgb(volatile uint8_t *r, volatile uint8_t *g, volatile uint8_t *b, uint16_t h, uint8_t s, uint8_t v){
   uint8_t hi,fr, p, q, t;
   volatile uint8_t h_pr;

       if(s == 0) {
           /* color is grayscale */
           *r = *g = *b = v;
           return;
       }

       hi = h / 60;

       switch(hi) {
           case 0: h_pr = h;       break;
           case 1: h_pr = h - 60;  break;
           case 2: h_pr = h - 120; break;
           case 3: h_pr = h - 180; break;
           case 4: h_pr = h - 240; break;
           case 5: h_pr = h - 300; break;

       }

       fr = ( h_pr * 255 ) / 60;
       p  = v * ( 255 - s ) / 255;
       q  = v * ( 255 - ( ( s * fr ) / 255 ) ) / 255;
       t  = v * ( 255 - ( s * ( 255 - fr ) / 255 ) ) / 255;

       switch(hi) {
           case 0: *r = v; *g = t; *b = p; break;
           case 1: *r = q; *g = v; *b = p; break;
           case 2: *r = p; *g = v; *b = t; break;
           case 3: *r = p; *g = q; *b = v; break;
           case 4: *r = t; *g = p; *b = v; break;
           case 5: *r = v; *g = p; *b = q; break;
       }

   }

алгоритм
Изображение
пользуйтесь, на здоровье :))
первоисточник http://radiolaba.ru/microcotrollers/tsv ... mment-1790

_________________
Tell Me The Truth


Вернуться наверх
 
Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.

Подробнее>>
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y