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}