» »

C# in slika iz kamere

C# in slika iz kamere

ql000 ::

Imam eno zanimivo situacijo. Ko definiram kamero, gre za industrijsko kamero od Firei-ja, definiram format slike 640x480. To naredimltakole:

public void CameraSetup(FiCamera myCamera)
{
    myCamera.PixelFormat = FiPixelFormat.Y_MONO;
    myCamera.Resolution = FiResolution.res_640x480;
    myCamera.FrameRate = FiFrameRate.fps_30;
    myCamera.InitStream(0,0);
}


Sliko iz kamere pobiram v konzoli z uporabo kazalca IntPtr, preko metode, ki se aktivira vsakič ko slika prileti v računalnik:

public static void OnFrameArrived(IntPtr frameData)
        {
            Marshal.Copy(frameData, FrameBuffer, Counter*FrameSize, FrameSize);          
            System.Console.WriteLine(" Counter = {0}", Counter);

            Counter = Counter + 1;                      // Iteracija Counterja!
            
            if (Counter == FrameNo)                     // XX framov poberem in zaključim
            {
                CAM1.CameraStop(Camera1);
            }
        }


Slike nalagam v vektor FrameBuffer tipa byte, velikosti 640*480*3. In ravno ta trojka me moti. Če te trojke ni noter, ko preverjam kakšno sliko dobim samo tretjino velikosti slike. V čem je finta, če je pa velikost slike pri kameri jasno definirana 640x480, kar pomeni, da bi moral biti vektor, v katerega shranjujem sliko velik natančno toliko, ne pa faktor tri večji.

Kakšna ideja?

BlueRunner ::

Slikovni element je sestavljen iz treh zlogov: vrednost rdeče komponente, vrednost zelene komponente in vrednost modre komponente. RGB triplet. Kar pomeni, da potrebuješ za svojo barvno sliko 640 stolpcev * 480 vrstic * 3 zloge.

RGB

Zgodovina sprememb…

ql000 ::

Potem, če prav razumem vsak pixel v vektorju zastopan z tremi byti: R1G1B1R2G2B2,... prav razmišljam?

BlueRunner ::

Po občutku bi rekel, da bodisi nekje nekaj delaš narobe, bodisi knjižnica, ki si jo dobil, ne deluje tako, kot piše, da bi morala. Še enkrat preberi dokumentacijo, ker glede na tvoj opis dobivaš za vsak piksel 24 bitov (3 zloge), kar ustreza RGB formatu, čeprav si v nekem drugem delu programa rekel, da želiš mono sliko (8 bitov - 1 zlog).

ql000 ::

Sumim krivca in sicer je to callback funkcija, ki se sproži, ko slika prileti v računalnik:

try
{
    Camera1.CallbackFormat = FiPixelFormat.RGB_24;  // Callback format --> ta mi nagaja
    Camera1.onFrameArrived += new FiCamera.OnFrameArrived(OnFrameArrived);
}
    catch (System.NullReferenceException)
{
}



Se bom še malo poigral. Mimogrede, ima kdo kakšen link do kode za pretvarjanje slike z 24bitno globino v monokromatsko?

BlueRunner ::

Google ti takoj pove formulo...

Y = 0.3*R + 0.59*G + 0.11*B

ql000 ::

Sem spremenil:

Camera1.CallbackFormat = FiPixelFormat.RGB_24;


v

Camera1.CallbackFormat = FiPixelFormat.Y_MONO;


Potem sem priredil še velikosti vektorjev, in zadeva deluje.

Hvala, BlueRunner!


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

kako narediti program ki bere drugi program

Oddelek: Programiranje
465464 (3777) imagodei
»

[C#] IndexOutOfRange Exception

Oddelek: Programiranje
81255 (1100) ql000
»

[C#] Sesutje aplikacije

Oddelek: Programiranje
111537 (1372) Jean-Paul
»

C++ programirane v Open GL oz. Direct x

Oddelek: Programiranje
242894 (2165) Vesoljc
»

OpenGL problem

Oddelek: Programiranje
212392 (1958) Gundolf

Več podobnih tem