Как выполнить RGB-> преобразование YUV в C/C++?

Я играл вокруг с синтаксическим анализатором ШТЕПСЕЛЯ, чтобы сделать то, что Вы хотели (и может отправить это как отдельный ответ позже), когда я заметил, что существует очень простой алгоритм, который делает удивительно хорошее задание со стандартными формами чисел на английском, испанском и немецком языке, по крайней мере.

Работа с английским языком, например, Вам нужен словарь, который отображает слова на значения очевидным способом:

"one" -> 1, "two" -> 2, ... "twenty" -> 20,
"dozen" -> 12, "score" -> 20, ...
"hundred" -> 100, "thousand" -> 1000, "million" -> 1000000

... и т.д

алгоритм справедлив:

total = 0
prior = null
for each word w
    v <- value(w) or next if no value defined
    prior <- case
        when prior is null:       v
        when prior > v:     prior+v
        else                prior*v
        else
    if w in {thousand,million,billion,trillion...}
        total <- total + prior
        prior <- null
total = total + prior unless prior is null

, Например, это прогрессирует следующим образом:

total    prior      v     unconsumed string
    0      _              four score and seven 
                    4     score and seven 
    0      4              
                   20     and seven 
    0     80      
                    _     seven 
    0     80      
                    7 
    0     87      
   87

total    prior      v     unconsumed string
    0        _            two million four hundred twelve thousand eight hundred seven
                    2     million four hundred twelve thousand eight hundred seven
    0        2
                  1000000 four hundred twelve thousand eight hundred seven
2000000      _
                    4     hundred twelve thousand eight hundred seven
2000000      4
                    100   twelve thousand eight hundred seven
2000000    400
                    12    thousand eight hundred seven
2000000    412
                    1000  eight hundred seven
2000000  412000
                    1000  eight hundred seven
2412000     _
                      8   hundred seven
2412000     8
                     100  seven
2412000   800
                     7
2412000   807
2412807

И так далее. Я не говорю, что это идеально подходит, но для быстрого и грязного, это вполне успевает.

<час>

Обращение к Вашему определенному списку на редактировании:

  1. кардинал/номинал или ординал: "один" и "сначала" - просто помещает их в словарь
  2. английский язык/британцы: "сорок" / "сорок" - так же
  3. сотни/тысячи: 2100-> "две тысячи сто" и также "две тысячи сто" - работы, как
  4. разделители: "одна тысяча сто пятьдесят два", но также и "elevenhundred fiftytwo" или "одна тысяча сто пятьдесят два" и этажерка - просто определяют "следующее слово", чтобы быть самым длинным префиксом, который распознает определенное слово, или до следующего неслова, если ни один не делает для запуска
  5. colloqialisms: "человек тридцати с чем-то лет" - работы
  6. фрагменты: 'одна треть', 'две пятых' - мм, еще...
  7. общие названия: 'дюжина', 'половина' - работы; можно даже сделать вещи как "полдюжина"

, Номер 6 является единственным, у меня нет готового ответа для, и поэтому неоднозначности между ординалами и частями (на английском языке, по крайней мере) добавленным к тому, что моя последняя чашка кофе была многие несколько часов назад.

10
задан Mike Seymour 15 November 2009 в 15:15
поделиться

2 ответа

-5
ответ дан 3 December 2019 в 13:40
поделиться

Проверьте эту статью: http://www.fourcc.org/fccyvrgb.php Преобразование довольно простое, поэтому вы, вероятно, могли бы написать свою собственную функцию на основе этого

Y  =      (0.257 * R) + (0.504 * G) + (0.098 * B) + 16

Cr = V =  (0.439 * R) - (0.368 * G) - (0.071 * B) + 128

Cb = U = -(0.148 * R) - (0.291 * G) + (0.439 * B) + 128

Ранее отвечал для ActionScript

17
ответ дан 3 December 2019 в 13:40
поделиться