1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Необходимо написать программу на C++ для перевода из цветовой схемы YUV в HSV. Но для этого сначала необходимо переводить в RGB, а затем в нужную цветовую схему. Я создал свой класс и объект этого класса. Затем пытаюсь присвоить полю этого объекта число. Программа компилируется (пишет что ошибок нет), но при запуске программы после нажатия кнопки перевести выдается ошибка: "Access violation at adress 00401BB1 in module Project1.exe. Write of adress 00000000" Подскажите в чем ошибка? Я не уверен что выложил нужный код, а все файлы нельзя загрузить.
И еще: непонятно, зачем двухстуенчатое преобразование через RGB, если требуется не универсальный конвертер, а лишь преобразование одного наперед заданного формата в другой наперед заданный.
И еще: непонятно, зачем двухстуенчатое преобразование через RGB, если требуется не универсальный конвертер, а лишь преобразование одного наперед заданного формата в другой наперед заданный.
Дело в том, что на лекции мы рассматривали только такой способ. Поэтому таким образом и надо сделать программу.
С прошлым вопросом я разобрался - легче использовать обычную переменную. Но при запуске программы после нажатия кнопки перевести выдается ошибка: "is not a valid floating point value" Подскажите плиз в чем дело?
В том, что на момент нажатия кнопки у тебя в Y->Text строка, которая не является правильной записью числа. Особое внимание обрати на DecimalSeparator, это очень часто упускают из виду...
В том, что на момент нажатия кнопки у тебя в Y->Text строка, которая не является правильной записью числа. Особое внимание обрати на DecimalSeparator, это очень часто упускают из виду...
Спасибо, теперь понял. Я вводил число через точку, а надо через запятую
Написал я полностью программу, а она почему-то абсолютно все неправильно считает, хотя делал все по формулам. Ошибка доже при переводе из YUV в RGB, хотя там вроде даже негде ошибиться. Может кто знает в чем проблема? Заранее спасибо!
Подправил программу, но несколько проблем осталось. При переводе из YUV в RGB если ввести максимальные значения из диапазона, т.е. Y=255,U=111,V=157, то получаются значения R=434, G=120, B=573. А значения R и B не входят в диапазон возможных значений схемы RGB. Формулы правильные, то же самое получается если использовать формулы из Википедии. А вторая проблема-неправильно вычисляется компонента H для схемы HSV. Подскажите плиз в чем дело?
1. Твои формулы явно отличаются от приведенных Википедии http://ru.wikipedia.org/wiki/YUV (кстати, если говоришь про внешний источник, приводи точные ссылки, не заставляй людей искать).
2. Откуда взяты значения, которые ты называешь максимальными? Я не спец по цветоделению, как и большинство народа тут, думаю, так что ты приводи побольше инфы, если хочешь получить помощь.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
1. Твои формулы явно отличаются от приведенных Википедии http://ru.wikipedia.org/wiki/YUV (кстати, если говоришь про внешний источник, приводи точные ссылки, не заставляй людей искать).
2. Откуда взяты значения, которые ты называешь максимальными? Я не спец по цветоделению, как и большинство народа тут, думаю, так что ты приводи побольше инфы, если хочешь получить помощь.
Мои формулы правильные, надо было при получении значения больше, чем 255, просто записать 255. Так что с этим разобрался.
Осталось только понять, почему функция atan2 возвращает неправильные значения.
Осталось только понять, почему функция atan2 возвращает неправильные значения.
atan2 возвращает неправильные значения, когда получает неправильные параметры. Я не знаю, какими тестами ты проверяешь правильность, но если хочешь - приведи значения R, G, B, при которых по-твоему происходит ошибка (не забудь также написать, что ты ожидаешь увидеть в качестве результата).
И не надо говорить, что это не работает для любых исходных данных, потому что:
Мне совсем неинтересно восстанавливать твой проект. Одно дело, когда ты его присоединяешь полностью, и можно откомпилировать и посмотреть, что там творится, а другое дело - что ты выкладываешь какие-то куски, а что там у тебя лежит на форме, как это все называется, как описано в классе формы - это я должен догадаться сам?
Вот тебе пример:
Цитата
Edit1->Text=FloatToStr®; // <--- Откуда взялась r ??? Edit2->Text=FloatToStr(G); Edit3->Text=FloatToStr(B); Okno->Color=RGB(R,G,B); max=R;
Процитирован твой же код, если ты не заметил. Так вот, собственно, вопрос: откуда взялся идентификатор r (это при том, что r и R для С++ - то же самое, что для тебя - "черное" и "белое", это тебе не Дельфи). Опечатка? Исправляй... Так и задумывалось? Но тогда я просто не смогу откомпилировать твою программу, поскольку не знаю, что именно задумывалось...
Мне еще меньше интересно бродить по интернету, и искать фразы типа: "значение YUV = ... , тогда HSV = ...", поэтому приводи конкретные значения. Повторяю: чему перед вычислением Px и Py равняются R, G, B и какие значения H, S, V ожидаются...
Lapp До того как я написал что формулы верны, я не знал, что при получении результата, не входящего в диапазон возможных значений, его надо приводить к конкретному числу. И лично я не считаю это частью формулы. Я бы назвал это примечанием.
volvo 1. Не знаю почему буква r отобразилась в нижнем регистре, у меня в программе она в верхнем регистре. 2. К примеру я ввожу значение H=359, S=255, V=255. Жму перевести, получаю значения. Затем жму перевести обратно и получаю H совсем другое. Мне преподаватель написал по этому поводу: "Hue->Text=FloatToStr((atan2(Px,Py)*180/3.14)); - неверно. Необходимо по координатам точки получить угол 0..359, читай описание atan2, что она получает и что возвращает." Я вроде как и получаю угол, передав функции atan2 координаты нужной точки. Может я не так что-то понимаю?
Я вроде как и получаю угол, передав функции atan2 координаты нужной точки. Может я не так что-то понимаю?
Вообще-то прототип функции atan2 - вот такой:
float atan2(float y, float x);
, то есть, первым параметром в любом случае должен быть Y, а вторым - X... Это первое. Второе - мало того, что функция возвращает значение угла в радианах, так еще в интервале от -pi до pi, значит, просто переводом радиан в градусы ты ничего не добьешься, нужно еще преобразовать углы из -180 .. 180 в 0 .. 360. Начерти на бумаге схему, и подумай, как это сделать...
Ну, и наконец:
Py=(sqrt(3)/2*(G-B)); // Это у меня компилироваться отказалось.
А теперь докажи, что формула У=1.5*Х - это правильная формула для этой функции.. И еще поясни, почему область Х>1 должна идти под "примечанием" . Формула для этой функции выглядит так:
Код
/ | 1.5*x, if x<1 y = < | 1.5, if x>=1 \
Примечания оставь для УК . В математике все пункты определения объекта равноправны. Не привел "примечания" - получил ошибочную функцию.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой