001package info.kramann.vr;
002
003
004import processing.video.*;
005import processing.core.*;
006
007public class KameraPC implements iKamera
008{
009    Capture cam = null;
010    public PImage holeKamerabild()
011    {
012        if(cam!=null && cam.available()==true) 
013        {
014            cam.read();
015        }      
016        return cam;
017    }
018    public void starteKamera(PApplet pap)
019    {
020        starteKamera(pap,0,640,480,30);
021    }
022    public void starteKamera(PApplet pap, int video_nr, int breite, int hoehe, int fps)
023    {
024        String[] cameras = Capture.list();
025
026        if (cameras == null) 
027        {
028          PApplet.println("Failed to retrieve the list of available cameras, will try the default...");
029          cam = new Capture(pap, 640, 480);
030        } 
031        else if (cameras.length == 0) 
032        {
033          PApplet.println("There are no cameras available for capture.");
034          return;
035        } 
036        else 
037        {
038          PApplet.println("Available cameras:");
039          PApplet.printArray(cameras);
040          PApplet.println("Suche nach passender Kameraeinstellung:");
041          int inx = findeKameraIndex(cameras);
042          PApplet.println("Am besten passende kamera Nr.:"+inx);             
043          cam = new Capture(pap, cameras[inx]);
044          cam.start();
045        }
046        
047    }
048    public void stoppeKamera()
049    {
050        if(cam!=null)
051        {
052             cam.stop();
053             cam.dispose();
054        }
055    }
056    
057    /**
058    *   Hilfsmethoden
059    */    
060    public int findeIndexNachWort(String text, String wort)
061    {
062      int index = -1;
063      if(text!=null && wort!=null && wort.length()<text.length())
064      {
065           for(int i=0;i<text.length()-wort.length();i++)
066           {
067               if(text.substring(i,i+wort.length()).equals(wort))
068               {
069                     return i+wort.length();
070               }
071           }
072      }
073      
074      return index;
075    }
076
077    public int extrahiereNaechsteZahl(String text, int ab_stelle)
078    {
079      if(ab_stelle<0)
080          return -1;
081      for(int i=ab_stelle;i<text.length();i++)
082      {
083            if(i==text.length()-1 || !Character.isDigit(text.charAt(i)))
084            {
085                int ende = i;
086                if(i==text.length()-1)
087                    ende++;
088                String szahl = text.substring(ab_stelle,ende);
089                
090                return (int)Double.parseDouble(szahl); 
091            }
092      }
093      return -1;
094    }
095
096    /**
097    *  Beispielzeile:
098    *  [0] "name=/dev/video0,size=1920x1080,fps=5"
099    */
100    public int[] extrahiereEigenschaften(int[] eigenschaften, String zeile)
101    {
102     if(eigenschaften==null)
103         eigenschaften = new int[4];
104         
105     //0. Video Nr.:
106     int inx = findeIndexNachWort(zeile,"video");
107     eigenschaften[0] = extrahiereNaechsteZahl(zeile, inx);
108     //1. Breite des Videobildes
109     inx = findeIndexNachWort(zeile,"size=");
110     eigenschaften[1] = extrahiereNaechsteZahl(zeile, inx);
111     //2. Höhe des Videobildes
112     inx = findeIndexNachWort(zeile,"size="+eigenschaften[1]+"x");
113     eigenschaften[2] = extrahiereNaechsteZahl(zeile, inx);
114     //3. Bilder pro Sekunde
115     inx = findeIndexNachWort(zeile,"fps=");
116     eigenschaften[3] = extrahiereNaechsteZahl(zeile, inx);
117     
118     return eigenschaften;
119    }
120
121    public int bestimmeUebereinstimmungsgrad(int[] eigenschaften, int[] wunsch_eigenschaften)
122    {
123      int ue_grad = 0;
124      if(eigenschaften[0]==wunsch_eigenschaften[0])
125          ue_grad+=10; //video nr am höchsten werten
126      for(int i=1;i<eigenschaften.length;i++)
127          if(eigenschaften[i]==wunsch_eigenschaften[i])
128            ue_grad++;
129      return ue_grad;        
130    }
131
132    public int findeKameraindex(String[] cameras, int video_nr,int breite, int hoehe, int pps)
133    {
134        int index = 0;
135        //                     videoNr., Breite, Höehe, fps
136        int[] eigenschaften = {-1,-1,-1,-1};
137        int[] wunsch_eigenschaften = {video_nr,breite,hoehe,pps};
138        int ue_grad_best = -1;
139        if(cameras!=null && cameras.length>1)
140        {
141          for(int i=0;i<cameras.length;i++)
142          {
143               extrahiereEigenschaften(eigenschaften,cameras[i]);
144               int ue_grad_neu = bestimmeUebereinstimmungsgrad(eigenschaften,wunsch_eigenschaften);
145               if(ue_grad_neu>ue_grad_best)
146               {
147                   ue_grad_best = ue_grad_neu;
148                   index = i;
149                 
150                   PApplet.println("Bisher am besten passend: "+cameras[i]);
151                   PApplet.println("Eigenschaften hier: "+eigenschaften[0]+" "+eigenschaften[1]+" "+eigenschaften[2]+" "+eigenschaften[3]);
152               }
153          }
154        }
155    
156        return index;
157      }
158
159      public int findeKameraIndex(String[] cameras)
160      {
161        int video_nr = 0;
162        int breite   = 640; 
163        int hoehe    = 480;
164        int pps      = 30;
165        return findeKameraindex(cameras,video_nr,breite,hoehe,pps);
166      }    
167}