IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Перевод из одной цветовой схемы в другую, Borland C++, помогите исправить ошибку
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Необходимо написать программу на C++ для перевода из цветовой схемы YUV в HSV. Но для этого сначала необходимо переводить в RGB, а затем в нужную цветовую схему. Я создал свой класс и объект этого класса. Затем пытаюсь присвоить полю этого объекта число. Программа компилируется (пишет что ошибок нет), но при запуске программы после нажатия кнопки перевести выдается ошибка: "Access violation at adress 00401BB1 in module Project1.exe. Write of adress 00000000" Подскажите в чем ошибка? Я не уверен что выложил нужный код, а все файлы нельзя загрузить.
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
//---------------------------------------------------------------------------
USEFORM("LAB1V1_9.cpp", Form1);
//---------------------------------------------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
try
{
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
catch (...)
{
try
{
throw Exception("");
}
catch (Exception &exception)
{
Application->ShowException(&exception);
}
}
return 0;
}
//---------------------------------------------------------------------------




Прикрепленные файлы
Прикрепленный файл  Project1.cpp ( 1.05 килобайт ) Кол-во скачиваний: 264
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Написал я полностью программу, а она почему-то абсолютно все неправильно считает, хотя делал все по формулам. Ошибка доже при переводе из YUV в RGB, хотя там вроде даже негде ошибиться. Может кто знает в чем проблема? Заранее спасибо!

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "LAB1V1_9.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int R,G,B,max,y,u,v;
float Px,Py;
y=StrToInt(Y->Text);
u=StrToInt(U->Text);
v=StrToInt(V->Text);
Hue->Clear();
Saturation->Clear();
Volume->Clear();
R=y+0*u+1.140*v;
G=y-0.396*u-0.581*v;
B=y+2.029*u+0*v;
Okno->Color=RGB(R,G,B);
max=R;
if (G>max) max=G;
if (B>max) max=B;
Volume->Text=IntToStr(max);
Px=R-0.5*(G+B);
Py=sqrt(3)/2*(G-B);
Saturation->Text=IntToStr((int)(sqrt(pow(Px,2)+pow(Py,2))/max));
Hue->Text=IntToStr((int)atan2(Px,Py));
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
int R,G,B,h,n,Rh,Gh,Bh,Rs,Gs,Bs;
Y->Clear();
U->Clear();
V->Clear();
h=(StrToInt(Hue->Text)%60)/60;
n=(StrToInt(Hue->Text))/60;
switch (n)
{
case 0: Rh=1; Gh=1-h; Bh=0; break;
case 1: Rh=1-h; Gh=1; Bh=0; break;
case 2: Rh=0; Gh=1; Bh=h; break;
case 3: Rh=0; Gh=1-h; Bh=1; break;
case 4: Rh=h; Gh=0; Bh=1; break;
case 5: Rh=1; Gh=0; Bh=1-h; break;
}
Rs=1*(1-StrToInt(Saturation->Text))+Rh*StrToInt(Saturation->Text);
Gs=1*(1-StrToInt(Saturation->Text))+Gh*StrToInt(Saturation->Text);
Bs=1*(1-StrToInt(Saturation->Text))+Bh*StrToInt(Saturation->Text);
R=Rs*StrToInt(Volume->Text);
G=Gs*StrToInt(Volume->Text);
B=Bs*StrToInt(Volume->Text);
Okno->Color=RGB(R,G,B);
Y->Text=IntToStr((int)(0.299*R+0.587*G+0.114*B));
U->Text=IntToStr((int)(-0.147*R-0.289*G+0.436*B));
V->Text=IntToStr((int)(0.615*R+0.515*G+0.1*B));
}
//---------------------------------------------------------------------------


Сообщение отредактировано: Neon6868 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 146
Пол: Мужской

Репутация: -  0  +


Подправил программу, но несколько проблем осталось. При переводе из YUV в RGB если ввести максимальные значения из диапазона, т.е. Y=255,U=111,V=157, то получаются значения R=434, G=120, B=573. А значения R и B не входят в диапазон возможных значений схемы RGB. Формулы правильные, то же самое получается если использовать формулы из Википедии. А вторая проблема-неправильно вычисляется компонента H для схемы HSV. Подскажите плиз в чем дело?

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <math.h>
#include "LAB1V1_9.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
int R,G,B,max,y,u,v;
float Px,Py;
y=StrToInt(Y->Text);
u=StrToInt(U->Text);
v=StrToInt(V->Text);
Hue->Clear();
Saturation->Clear();
Volume->Clear();
R=abs(y+1.14*v);
G=abs(y-0.396*u-0.581*v);
B=abs(y+2.029*u);
Edit1->Text=FloatToStr®;
Edit2->Text=FloatToStr(G);
Edit3->Text=FloatToStr(B);
Okno->Color=RGB(R,G,B);
max=R;
if (G>max) max=G;
if (B>max) max=B;
Volume->Text=IntToStr(max);
Px=(R-0.5*(G+B));
Py=(sqrt(3)/2*(G-B));
Saturation->Text=IntToStr((int)floor(255*(sqrt(pow(Px,2)+pow(Py,2))/StrToInt(Volume->Text))));
Hue->Text=FloatToStr((atan2(Px,Py))); //вот здесь неправильно вычисляется компонента H
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
float R,G,B,Rh,Gh,Bh,Rs,Gs,Bs,Sat,Vol;
int h, n;
Y->Clear();
U->Clear();
V->Clear();
Sat=(float)StrToInt(Saturation->Text)/255;
Vol=(float)StrToInt(Volume->Text)/255;
h=(StrToInt(Hue->Text)%60)/60;
n=StrToInt(Hue->Text)/60;
switch (n)
{
case 0: Rh=255; Gh=h; Bh=0; break;
case 1: Rh=255-h; Gh=255; Bh=0; break;
case 2: Rh=0; Gh=255; Bh=h; break;
case 3: Rh=0; Gh=255-h; Bh=255; break;
case 4: Rh=h; Gh=0; Bh=255; break;
case 5: Rh=255; Gh=0; Bh=255-h; break;
}
Rs=(Rh-255)*Sat+255;
Gs=(Gh-255)*Sat+255;
Bs=(Bh-255)*Sat+255;
R=Rs*Vol;
G=Gs*Vol;
B=Bs*Vol;
Okno->Color=RGB(R,G,B);
Y->Text=IntToStr((int)floor(0.299*R+0.587*G+0.114*B));
U->Text=IntToStr((int)floor(-0.147*R-0.289*G+0.436*B));
V->Text=IntToStr((int)floor(0.615*R-0.515*G-0.1*B));
}
//---------------------------------------------------------------------------


Сообщение отредактировано: Neon6868 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме
Neon6868   Перевод из одной цветовой схемы в другую   14.09.2008 16:31
volvo   А все и не надо. Ты покажи, как работаешь с классо…   14.09.2008 16:44
andriano   И еще: непонятно, зачем двухстуенчатое преобразова…   14.09.2008 18:53
Neon6868   И еще: непонятно, зачем двухстуенчатое преобразов…   15.09.2008 20:00
volvo   В том, что на момент нажатия кнопки у тебя в Y-…   15.09.2008 20:17
Neon6868   В том, что на момент нажатия кнопки у тебя в Y-…   15.09.2008 21:23
Neon6868   Написал я полностью программу, а она почему-то абс…   17.09.2008 4:26
Neon6868   Подправил программу, но несколько проблем осталось…   21.09.2008 20:33
Neon6868   Неужели никто не знает в чем причина? Если кто зна…   22.09.2008 19:54
Lapp   1. Твои формулы явно отличаются от приведенных Вик…   23.09.2008 9:57
Neon6868   1. Твои формулы явно отличаются от приведенных Ви…   24.09.2008 20:30
volvo   Осталось только понять, почему функция atan2 возвр…   25.09.2008 13:07
Lapp   Трудно и неинтересно разговаривать с человеком, ко…   25.09.2008 10:53
Neon6868   Lapp До того как я написал что формулы верны, я не…   27.09.2008 22:04
volvo   Вообще-то прототип функции atan2 - вот такой: floa…   27.09.2008 23:27
Neon6868   Volvo, большое спасибо. На самом деле надо было пр…   29.09.2008 21:53
Lapp   Я бы назвал это примечанием.Твои "формулы…   30.09.2008 8:01


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 9:48
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name