CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Rozmycie obrazu metodą Gaussa

Rozmycie obrazu metodą Gaussa

dział ogólny

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez xredom » sobota, 20 kwietnia 2013, 19:00

Cyfrowy Baron napisał(a):Po pierwsze na którą linię w kodzie wskazuje błąd? Po wtóre w swoim przedostatnim poście podałem prostszy kod!


Bardzo dziękuję myślę że innym też się przyda kod, tylko na Pana forum można znaleźć dobrze wytłumaczoną pomoc do Bulidera C++ 8-) i mnóstwo ciekawych rozwiązań. Trafiłem tu z Google więc nie tylko ja tu zaglądam.

Zastosowałem prostszy kod i dalej zwraca mi błąd na to linie:
Kod: Zaznacz cały
return Bitmap;



[C++ Error] Unit1.cpp(82): E2015 Ambiguity between 'auto_ptr<TBitmap>::operator auto_ptr<TGraphic>()' and 'auto_ptr<TGraphic>::auto_ptr(auto_ptr<TBitmap> &)'

Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez Cyfrowy Baron » sobota, 20 kwietnia 2013, 19:03

Zrób więc tak:

KOD cpp:     UKRYJ  
return (std::auto_ptr<TGraphic>) Bitmap;
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez xredom » sobota, 20 kwietnia 2013, 19:22

Niestety brak zmian więc aby nie zajmować Panu więcej czasu podziękuje za pomoc. Być może mam jakiś wadliwy program, dałem jeszcze
KOD cpp:     UKRYJ  
return (std::auto_ptr<TGraphic>) Bitmap.get();
się skompilował program ale pewnie nie o to chodzi bo podczas uruchomienia rozmycia dostałem błąd. :roll:
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez Cyfrowy Baron » sobota, 20 kwietnia 2013, 19:33

Coś namieszałeś w kodzie. Podaj cały kod z tymi funkcjami i z deklaracją w pliku nagłówkowym.
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez xredom » sobota, 20 kwietnia 2013, 19:45

Plik .cpp:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#include <vcl.h>
#include <math.h>
#pragma hdrstop

#include "Unit1.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
}
//---------------------------------------------------------------------------
auto_ptr<TGraphic> TForm1::BlurImage(TImage *Image, int fValue)
{
 if(fValue <= 0)
 {
  ShowMessage("Wprowadź wartość większą od 0!");
  return (auto_ptr<TGraphic>) Image1->Picture->Graphic;
 }

 int Div = 6;

 int flt[] = {
                           1, 1, 1,
                           0, 0, 0,
                           1, 1, 1
                         };

 int XX[3];

 BYTE   *ptr, *ptru, *ptrd, *ptr1;

 auto_ptr<Graphics::TBitmap> Bitmap (new Graphics::TBitmap());
 auto_ptr<Graphics::TBitmap> tmpBitmap (new Graphics::TBitmap());


 Bitmap->Assign( (TPersistent*)Image->Picture->Graphic );

 Bitmap->PixelFormat = pf24bit;

 tmpBitmap->Assign( (TPersistent*)Image->Picture->Graphic );
 tmpBitmap->PixelFormat = pf24bit;

 for(int f = 0; f <= fValue; f++)
{
 for(int y = 1; y < tmpBitmap->Height - 1; y++)
 {
  ptr  = (BYTE *) Bitmap->ScanLine[y];
  ptr1 = (BYTE *) tmpBitmap->ScanLine[y];
  ptru = (BYTE *) tmpBitmap->ScanLine[y-1];
  ptrd = (BYTE *) tmpBitmap->ScanLine[y+1];

  for(int x = 3; x < (tmpBitmap->Width - 1) * 3; x += 3)
  {
   XX[0] = 0; XX[1] = 0; XX[2] = 0;

   for (int i1 = -1; i1 <= 1; i1++)
        for(int j1 = 0; j1 < 3; j1++)
        {
         XX[j1] += ptr1[x + 3 * i1 + j1] * flt[4 + i1];
         XX[j1] += ptru[x + 3 * i1 + j1] * flt[1 + i1];
         XX[j1] += ptrd[x + 3 * i1 + j1] * flt[7 + i1];
        }

   for(int i4 = 0; i4 < 3; i4++)
   {
        XX[i4] = XX[i4] / Div;
        XX[i4] = max(XX[i4], 0);
        XX[i4] = min(XX[i4], 255);
        ptr[x + i4] = XX[i4];
   }
  }
 }
 tmpBitmap->Assign(Bitmap.get());
}
 return (auto_ptr<TGraphic>) Bitmap;
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
        Image2->Picture->Graphic = BlurImage(Image1, 50).get();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
       if(OpenPictureDialog1->Execute())
  {
        Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
  }

}

 

Plik .h:
KOD cpp:     UKRYJ  
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Dialogs.hpp>
#include <ExtDlgs.hpp>
#include <memory>


using namespace std;
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
        TImage *Image1;
        TOpenPictureDialog *OpenPictureDialog1;
        TButton *Button1;
        TButton *Button2;
        TImage *Image2;
        void __fastcall Button2Click(TObject *Sender);
        void __fastcall Button1Click(TObject *Sender);
private:        // User declarations
              auto_ptr<Graphics::TGraphic> BlurImage(TImage *Image, int fValue);

public:         // User declarations
        __fastcall TForm1(TComponent* Owner);


};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Chrome

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez Cyfrowy Baron » sobota, 20 kwietnia 2013, 22:30

TBitmap używasz z przestrzeni nazw Graphics, ale TGraphic nie pochodzi chyba z tej przestrzeni, aczkolwiek nie jestem pewien, więc albo w pliku nagłówkowym zrób tak deklarację:

KOD cpp:     UKRYJ  
private:
              auto_ptr<TGraphic> BlurImage(TImage *Image, int fValue);


albo zostaw tak jak jest, ale wtedy definicja w pliku źródłowym powinna się zgadzać z deklaracją, czyli powinno być:

KOD cpp:     UKRYJ  
auto_ptr<Graphics::TGraphic> TForm1::BlurImage(TImage *Image, int fValue) /* zabrakło Graphics::*/


Bibliotekę math includujesz w niewłaściwym miejscu! Powinno być:

KOD cpp:     UKRYJ  
#pragma hdrstop

#include "Unit1.h"
#include <math.h>
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez xredom » niedziela, 21 kwietnia 2013, 00:18

Zmieniłem co sugerowałeś, brak efektów.
TBitmap używasz z przestrzeni nazw Graphics, ale TGraphic nie pochodzi chyba z tej przestrzeni,

No właśnie chyba nie pochodzi z tej przestrzeni, wyrzucając Graphics z
KOD cpp:     UKRYJ  
auto_ptr<TBitmap> bitmap (new Graphics::TBitmap);
mam dodatkowy błąd

[C++ Error] Unit1.cpp(40): E2015 Ambiguity between 'TBitmap' and 'Windows::TBitmap'


więc nie wiem co robić z tym, poszukam jeszcze w google innych rozwiązań do efektu rozmycia, dzięki za poświęcony czas ;)
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Firefox

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez Cyfrowy Baron » niedziela, 21 kwietnia 2013, 08:25

Odnoszę wrażenie, że Ty nie myślisz przy tym programie. TBitmap pochodzi z przestrzeni Graphics, mi chodziło o TGraphic. Poza tym skoro pochodzi z tej przestrzeni to zarówno deklaracja funkcji w pliku nagłówkowym:

Plik nagłówkowy np. Unit1.h
KOD cpp:     UKRYJ  
private:
              auto_ptr<Graphics::TGraphic> BlurImage(TImage *Image, int fValue);


jak i definicja muszą ją zawierać:

Plik źródłowy np. Unit1.cpp
KOD cpp:     UKRYJ  
auto_ptr<Graphics::TGraphic> TForm1::BlurImage(TImage *Image, int fValue)
{


Bo u ciebie jest tak:

xredom napisał(a):
KOD cpp:     UKRYJ  
auto_ptr<TGraphic> TForm1::BlurImage(TImage *Image, int fValue)
{


Brakuje w definicji tej przestrzeni nazw!
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    Windows XPFirefox

Re: Rozmycie obrazu metodą Gaussa

Nowy postprzez xredom » niedziela, 21 kwietnia 2013, 09:12

Odnoszę wrażenie, że Ty nie myślisz przy tym programie.

Dzięki program już działa, nie jestem programistą więc czasami ciężko mnie zrozumieć :roll: .Czytam w wolnym czasie trochę o cpp ale jak widać raczej daleko mi do profesjonalnego kodera.

Dziękuję jeszcze raz za pomoc. ;)
Avatar użytkownika
xredom
Bladawiec
Bladawiec
 
Posty: 22
Dołączył(a): niedziela, 14 kwietnia 2013, 20:00
Podziękował : 12
Otrzymał podziękowań: 0
System operacyjny: windows 7
Kompilator: C++ Bulider 6
Gadu Gadu: 0
    Windows 7Firefox

Poprzednia strona

  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 9 gości